Skip to main content
We’ve created a Neptune compatibility layer that enables dual-logging to both Neptune and Pluto simultaneously. This allows you to gradually migrate your experiment tracking without disrupting existing workflows.
We are working on a tool to migrate your existing runs from Neptune to Pluto. Interested? Please contact us at [email protected]

Quick Start

Enable dual-logging by adding a single import to your existing Neptune scripts:
import pluto.compat.neptune  # Add this line
import neptune  # Your existing Neptune import

# Your existing Neptune code works unchanged
run = neptune.init_run(project="my-workspace/my-project")
run["parameters"] = {"lr": 0.001, "batch_size": 32}
run["train/loss"].log(0.5)
run.stop()
That’s it. Your metrics will now log to both Neptune and Pluto.

Configuration

Required Environment Variable

VariableDescription
PLUTO_PROJECTMaster switch that enables dual-logging. Set to your Pluto project name.
export PLUTO_PROJECT="my-pluto-project"

Optional Environment Variables

VariableDescription
PLUTO_API_KEYAuthentication credentials. Falls back to keyring if not set.
PLUTO_URL_APPApp endpoint for self-hosted instances
PLUTO_URL_APIAPI endpoint for self-hosted instances
PLUTO_URL_INGESTIngest endpoint for self-hosted instances
DISABLE_NEPTUNE_LOGGINGSet to true to disable Neptune logging entirely (post-sunset mode)

Supported Operations

The compatibility layer wraps Neptune API calls and translates them to the equivalent pluto calls. Below are the Neptune Run APIs and the corresponding pluto API we monkeypatch against.
import pluto.compat.neptune should be sufficient for sending data to both Neptune and Pluto. The information below is purely informational about which APIs we have wrapped.
These were tested against neptune-scale==0.30.0

Initialization

Neptunepluto
neptune.init_run(project="workspace/project")run.init(project="project")

Configs

Neptunepluto
run.log_configs({"lr": 0.001})run.update_config({"lr": 0.001})

Metric Logging

Neptunepluto
run["train/loss"].log(0.5)run.log({"train/loss": 0.5})
run["train/loss"].log(0.5, step=100)run.log({"train/loss": 0.5}, step=100)
run["parameters"] = {"lr": 0.001}pluto.log({"parameters": {"lr": 0.001}})

File and Image Logging

Neptunepluto
run["images"].upload("path/to/image.png")run.log({"images": pluto.Image("path/to/image.png")})
run["artifacts"].upload_files("path/to/file")run.log_file("path/to/file")

Tags

Neptunepluto
run.add_tags(tags=["experiment-v1"])run.add_tags(["experiment-v1"])
Tags are synchronized to the Pluto server and can be used to filter and organize runs in the dashboard.

Histograms

Neptunepluto
run["distributions/weights"].log(histogram_data)run.log({"distributions/weights": pluto.Histogram(histogram_data)})

Post-Sunset Mode

When you’re stop sending data to Neptune, set the kill switch:
export DISABLE_NEPTUNE_LOGGING=true
This converts your code to Pluto-only mode without requiring any code changes. All Neptune API calls will be intercepted and redirected to Pluto.