Short answers to common questions. For setup walkthroughs see the how-to guides; for failure modes see Troubleshooting.
No. The shapes are deliberately Clojure-shaped (plain maps, dynamic vars, REPL-friendly). There's no wire-compatibility with MLflow's REST or proto APIs. Most concepts translate (run, experiment, model, stage), but you can't point an MLflow client at a chachaml store.
For solo and small-team use, yes. v0.6 has 202 tests and 471
assertions, lint and format gates, ≥85% coverage, dual deps.edn +
project.clj builds, and is in active use. For multi-tenant SaaS or
hostile multi-user environments, no — there's no auth or row-level
security. Run it on a trusted network or behind an SSO proxy.
Because the primary interface is the REPL. Threading a store handle
and run id through every helper makes one-liners unusable. Dynamic
vars give the same scoping guarantees as with-open for the cost of
remembering bound-fn when you fork to a new thread. The full
discussion is in
ADR-0004.
Not as a built-in backend. The store protocol is small enough that
you could implement one yourself — see
chachaml.store.protocol
and the SQLite/Postgres implementations. We won't ship more backends
ourselves until there's clear demand; SQLite + Postgres covers solo
and team use, and most "I want a different DB" requests turn out to
be "I want shared state", which Postgres already provides.
Comfortably tens of GB. SQLite has been verified on much larger
workloads, but ML-tracking writes are small and frequent, which is
SQLite's sweet spot. The constraint isn't usually DB size — it's
artifact disk usage. Use
archive-runs! / delete-archived! to
prune.
Yes — SQLite supports it via WAL mode, which chachaml enables on open. Concurrent writers serialise at the SQLite level. For more than ~3 active writers (or any cross-machine setup), switch to Postgres.
Only for the sklearn interop layer (chachaml.interop.sklearn),
which uses libpython-clj2. Everything else — tracking, registry,
pipelines, alerts, web UI, MCP, chat — is pure Clojure. The interop
layer uses requiring-resolve, so it compiles fine without Python on
the classpath; it just throws if you call it.
On disk, in a directory paired with the SQLite file:
./chachaml.db
./chachaml-artifacts/
└── <run-id>/
└── <artifact-name>
The DB stores metadata only. This is deliberate
(ADR-0005) — it lets you
tar them, copy them, or upload them with standard tooling. Backups
must capture both the .db and the artifact directory.
No. Production is exclusive
(ADR-0006). Promoting a
new version atomically demotes the previous one to :archived.
History is preserved; the previous artifact is still loadable by
explicit version number.
:tags different from :notes?Tags are key/value metadata, structured, queryable
((ml/runs {:tag :reviewed})). Notes are free-form markdown
attached to one run, intended for "explanation in prose, including
LaTeX math if you want." Tags are typed and filterable; notes are
human-readable.
with-run and deftracked?with-run is a macro you wrap any block of code in; the run starts
when the macro fires and ends on body completion. deftracked is a
defn-shaped wrapper — every call to the function opens its own run.
Use with-run for ad-hoc REPL work, deftracked for production code
where the function should always be tracked.
It works, but it's not the design centre. SQLite needs a writable
filesystem, which most serverless runtimes don't durably provide. For
Lambda-style usage, point chachaml at a managed Postgres + use S3 for
artifacts (set :artifact-store in the store config).
Set CHACHA_USER in the user's shell profile (or pass :created-by
explicitly to start-run!). The library captures it at run start and
exposes it on every run map. (ml/my-runs) and (ml/my-last-run)
filter by the current value.
No. The library makes zero outbound network calls of its own. The chat feature and Slack alerts are user-initiated and the destination is configured by you.
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |