Local-first training metrics tracker backed by Rust, PyO3, DuckDB, and DuckLake.
Project description
PulseOn
PulseOn is a local-first training metrics tracker backed by Rust, PyO3, DuckDB, and DuckLake.
[!IMPORTANT] Experimental. PulseOn is in the 0.x line. Pre-1.0 releases do not promise store, API, or machine-output compatibility; breaking changes between 0.x releases will not preserve compatibility, and compatibility and migration commitments begin with the future 1.x line.
PulseOn 0.1.1 / frozen headless read surface:
- discover projects, runs, metrics, and persisted metric points
- query running runs from the writer client after reports reach storage
- return Python objects or Arrow PyCapsule-compatible tables
- inspect existing stores through a dependency-free, read-only CLI
- use DuckDB or SQLite catalogs with local or S3-compatible Parquet data
- keep the Parquet schema as the long-term compatibility boundary
Install with pip install pulseon.
Known limit: with the default DuckDB catalog, an independent client may not attach or refresh while a writer is active. Use the writer client for live queries or open independent readers after writer shutdown. See the 0.1.1 release notes for validation details and other deferred capabilities.
Quickstart:
import pulseon
client = pulseon.init()
project = client.create_project("local training")
run = client.create_run(project.project_id, "baseline")
run.log("train/loss", 0, 0.25)
client.finish_run(run.run_id)
projects = client.list_projects()
runs = client.list_runs(project.project_id, status="finished", limit=20)
metrics = client.list_metrics(run.run_id)
points = client.query_metric(
run.run_id,
"train/loss",
start_step=0,
end_step=100, # Exclusive: the query range is [0, 100).
)
table = client.query_metric_table(run.run_id, "train/loss")
client.shutdown()
ArrowTable does not require PyArrow, pandas, or Polars. Consumers that support
the Arrow PyCapsule protocol can import it through __arrow_c_stream__.
The pulseon command opens an existing store and never creates a missing one:
pulseon --path runs projects list
pulseon --path runs runs list <project-id> --status finished --limit 20
pulseon --path runs metrics list <run-id>
pulseon --path runs --format json metrics query <run-id> train/loss --all
By default, PulseOn stores local state under ./.pulseon. Pass an explicit
root path when a project should use a different local store:
client = pulseon.init("runs")
The existing storage keywords remain available: data_path,
catalog_backend, catalog_path, and metric_queue_capacity. catalog_path
must be a local filesystem path. data_path may be local, or it may use an
S3-compatible URI such as s3://bucket/prefix.
Project-local storage settings can live in ./.pulseon/config.toml. Relative
data_path and catalog_path values in this file are resolved from the project
root passed to pulseon.init(...) or pulseon --path:
data_path = "s3://example-bucket/pulseon/demo"
[s3]
endpoint = "https://s3.example.com"
region = "us-east-1"
access_key_id = "<access-key-id>"
secret_access_key = "<secret-access-key>"
path_style = true
use_ssl = true
Do not commit real S3 credentials. Explicit pulseon.init(...) keyword
arguments override values from config.toml:
client = pulseon.init(
data_path="s3://example-bucket/pulseon/demo",
s3_endpoint="https://s3.example.com",
s3_access_key_id="<access-key-id>",
s3_secret_access_key="<secret-access-key>",
s3_path_style=True,
)
For bounded teardown, stop active logging threads before calling
client.shutdown(timeout=...); PulseOn keeps admission open while bounded
shutdown is draining, so concurrent run.log(...) calls can prevent that drain
from completing before the timeout.
Architecture entry points:
Runtime extensions:
- DuckLake is installed and loaded by the native engine because it is required for native storage.
- DuckDB LTTB is optional and is not bundled into PulseOn wheels. Downsampling
first uses an already installed
lttbextension. The CLI automatically runs the officialINSTALL lttb FROM community; LOAD lttb;flow when its default 200-point limit first requires downsampling. Python SDK queries remain download-free unlessPULSEON_LTTB_AUTO_INSTALL=1is set explicitly. - PulseOn embeds DuckDB 1.5.4 and delegates signed community-extension
compatibility to DuckDB and the community extension repository rather than
duplicating their platform matrix in PulseOn's generated CI. DuckDB extension
binaries are specific to a DuckDB version and platform; for offline
deployment, set
PULSEON_LTTB_EXTENSION_PATH=/path/to/lttb.duckdb_extensionto a compatible, signed binary rather than reusing one built for another DuckDB version. If no upstream build exists, use--all. CLI JSON failures use thelttb_extension_unavailablecode and include machine-readable guidance for the local-extension and--allrecovery paths.
See DuckDB's LTTB extension page and extension installation guide for the upstream commands and compatibility rules.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pulseon-0.1.1.tar.gz.
File metadata
- Download URL: pulseon-0.1.1.tar.gz
- Upload date:
- Size: 154.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf6713f60dfbdfc6f15f583cb989db442aa1a0a11a2f81d88327f0cd651f988a
|
|
| MD5 |
ca45998393b103008789f404c483832d
|
|
| BLAKE2b-256 |
63384237da6ae01d3b73997e4ab88a1925e16ad9b34f19079d28b511caf3cdbe
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-win_arm64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-win_arm64.whl
- Upload date:
- Size: 10.9 MB
- Tags: CPython 3.11+, Windows ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
236164e144fa89f940653769eb5e1174f0cbc262bccee492d0e7b28e1bea264d
|
|
| MD5 |
e9e0e93a07b249ed7ee42062084ee19a
|
|
| BLAKE2b-256 |
f6fe5e794830185b709df745bd881fa3311067b72296141337f76c32b476a764
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 9.9 MB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79b0273d87a0d0df660bb27725c4910a5eeb814ae0eb0713929ee2e60128499b
|
|
| MD5 |
d50d1b89644eb560a78521c8b34ffe29
|
|
| BLAKE2b-256 |
b93fa9db6a52fe8ba7ea426c8e366be9b2c89f3dd5611d1541f9f221ff8c4b74
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-win32.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-win32.whl
- Upload date:
- Size: 9.4 MB
- Tags: CPython 3.11+, Windows x86
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c870debcc649db9cdbb673ab6cfce8f1b165d1cf02b4eed0aae2af241f1ff3c5
|
|
| MD5 |
68bb232bee69ca0bdfa7074af86f4fe9
|
|
| BLAKE2b-256 |
ce507823a418831459be3decc70ec4a04bb7123ffaf9a50018eb0acc4d4efd3c
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 20.5 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c0c2edac5593588d18b0dc6d49de92bb9077d1c86aa8e9d77e92e3465ff65bd
|
|
| MD5 |
b3092e55cbf3723580daea2766a10659
|
|
| BLAKE2b-256 |
bef28b033bdd9dd5a08780eb4d659749a2f9ce26376fff07638946d37ee7d6a1
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-musllinux_1_2_i686.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-musllinux_1_2_i686.whl
- Upload date:
- Size: 22.9 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ i686
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4c83e0d2749f3b12c8c0479abbbc870882ec226255e6609d3a749a2db9d6445
|
|
| MD5 |
34257faa60d6f60f962c4cb4750f0663
|
|
| BLAKE2b-256 |
5b14b71061c8461305aa06d4af7910b34dc13d87cb6c3792e510cd7621ba40b2
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-musllinux_1_2_armv7l.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-musllinux_1_2_armv7l.whl
- Upload date:
- Size: 19.6 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ ARMv7l
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35c1d833da6a7a29c27ed96a5a199d5d2d6704d850203ee0e54a29f2f0a7884a
|
|
| MD5 |
c9ca68dcc8827c5811a01d0939263938
|
|
| BLAKE2b-256 |
0a34a664874f9a07247819ba4f0e13ce13ea98d859ed5392e2295bc9570e09b4
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 18.8 MB
- Tags: CPython 3.11+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e2f24219fb190868c16ffe7dc73a691303bcaca20d9170d0d9d0cc1bdb6313a
|
|
| MD5 |
5865f4729637050b77a6d31c81ad09b9
|
|
| BLAKE2b-256 |
a3d5d137d35ea6801fcef163e41e95d31306f0ecb85600c8925a2e13e113c9cf
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 14.5 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a4106d33d663f89be4b264d462bc83bd34e1b786725478615b41da55842470c
|
|
| MD5 |
35ddb3626f10ff8bcf5697d7aa1b8f13
|
|
| BLAKE2b-256 |
3675e5cb6a7c788bd871887a5fef851fb40adfd6e66fa6c63317e00fd055c170
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-manylinux_2_28_s390x.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-manylinux_2_28_s390x.whl
- Upload date:
- Size: 12.8 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ s390x
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0febbe8a545bf55d1e6e36a50d287b7420f65d7393b54e3b5f41a6cf7a38291
|
|
| MD5 |
178336c8cd926257485c6d05cf535689
|
|
| BLAKE2b-256 |
332cd5b18cd4ec5f308b9a78fb8a7015b236bdb5eb231d30aed064dc581c64b0
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-manylinux_2_28_ppc64le.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-manylinux_2_28_ppc64le.whl
- Upload date:
- Size: 14.4 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ ppc64le
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5826cc81050571576f2b045d4a40eb95d98c394100ca17563ec92aa030d5fc6
|
|
| MD5 |
cf2acf68f4cc7551f1e4697ade683cfe
|
|
| BLAKE2b-256 |
13cf842c2a9231277d44a6344cd6c6b802e42422ec6e6254a84eed350e51c54f
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-manylinux_2_28_i686.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-manylinux_2_28_i686.whl
- Upload date:
- Size: 17.2 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ i686
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6c2fcebba5cef4ecb29ee8928d779e8e9c16fad8f350a1f39a7e0873bbcbb76
|
|
| MD5 |
04136981c81b94a06c1a1ee8726a57b6
|
|
| BLAKE2b-256 |
de363da7fd76ba946b4088a41888cf6813a339ef3ad1864e5a0a0064f61e5f4e
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-manylinux_2_28_armv7l.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-manylinux_2_28_armv7l.whl
- Upload date:
- Size: 11.7 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ ARMv7l
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96d7db8cb6515670096319919e4346314410fe6b2e6b03caf4d09225621ecd89
|
|
| MD5 |
08844e4a4d049a6d86d6966fcd67ca85
|
|
| BLAKE2b-256 |
5e33394139e0e127fba1a41e351da4e0c3d9934106a2b7f76aafe40f4ec7a1d4
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 12.2 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d0a26344d07b2b8e3eb58aa514fa9de068217594c05e2be8672088573f6dde7
|
|
| MD5 |
19a4b03a4438e03c1a3b2efde6af935d
|
|
| BLAKE2b-256 |
3f1bbb2818aa32c5a5c5ed0e239c0d5fe703694c026495126186494f9a4ecb4f
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 11.4 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e59ca20e8385318bc7b2c694d591f9282703fcd1fc4a93b91c82e438ec979bca
|
|
| MD5 |
d43d6b1bcec03a0551f03ad5127ca167
|
|
| BLAKE2b-256 |
fd1e73412ba474f6ff3a70c7b1b6b1becc6a62ad13eed9715ec893e0cd926320
|
File details
Details for the file pulseon-0.1.1-cp311-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: pulseon-0.1.1-cp311-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 12.1 MB
- Tags: CPython 3.11+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a75e36fd3283cb5e1b11350df372cfd2edb6c88afd4884d6811072892f577a5
|
|
| MD5 |
5acb9b0657a28886021a2509b799f341
|
|
| BLAKE2b-256 |
ceeca4bb4c0275adacbaa350ed53e5d33e09e162cca657f187c7d431807cafc5
|