Inside chachaml: Core Capabilities for AI-Native Workflows in Clojure Part 2
This is Part 2 of our series, Clojure Meets Production MLOps: How chachaml Delivers AI-Native Workflows.
If you missed Part 1, Why Machine Learning Projects Fail in Production—and How chachaml Solves the MLOps Gap, we covered a common issue in machine learning. Models are easier to build than they are to operate. We also looked at why MLOps has become the real bottleneck and how chachaml helps address it.
In this article, we focus on the platform itself. You’ll see how chachaml supports AI-native workflows and the capabilities that help teams move from experiments to production.
Next, in Part 3, From Prototype to Production: The Business Case for chachaml, we’ll look at the practical side of adoption and how these capabilities can help teams deliver AI systems more efficiently.
The Architecture Behind chachaml
➜ Where chachaml Fits in Modern ML Infrastructure
Machine learning involves more than model training. Data moves through several stages before reaching production.
Chachaml steps in to handle the core details of machine learning operations, sitting right between the data pipelines and deployment.

- Orchestrate workflow.
- Manage experiment.
- Track artifact.
- Team collaboration.
This makes it easier to track what was trained, how it was trained, and what got to production.
➜ Integrating with Existing Clojure Infrastructure
chachaml works with existing Clojure systems, including:
- Datomic applications.
- Event-driven architectures.
- JVM services.
- Existing data pipelines.➜ Acting as the Coordination Layer
- Chachaml brings everything together in one spot.
Teams can add MLOps without changing infrastructure.
Core Capability #1: Pipeline Orchestration
➜ Why ML Pipelines Become Unmanageable
As the machine learning projects get bigger, teams start to notice elements being overlooked. Common problems include,
- Manual steps for execution.
- Inconsistent runs.
- Reproducibility issues.
Without a structured process, it’s hard to know what was run, when it was run, and whether the same results can be reproduced later.
➜ How chachaml Pipelines Solve This
chachaml provides a structured way to run machine learning workflows. It supports,
- Workflow execution.
- Step dependencies.
- Tracked pipeline runs.
This helps teams move from ad hoc scripts to repeatable processes. The result is,
- Greater reliability.
- Better repeatability.
- Easier auditing and troubleshooting.
Example: Pipeline definition
(pipe/run-pipeline! "train-and-deploy"
[{:name "preprocess" :fn (fn [_ctx] preprocessed-data)}
{:name "train" :fn (fn [ctx] (train (:prev-result ctx)))}
{:name "evaluate" :fn (fn [ctx] (eval-model (:prev-result ctx)))}
{:name "register" :fn (fn [ctx] (reg/register-model ...))}])

➜ New Pipelines UI in v0.7.0
Version 0.7.0 adds a dedicated Pipelines page.
Now everyone can see exactly what’s happening in the pipeline, track the status in real time, and actually get a sense of what’s running—no need to dig through endless logs or scripts. That means
- More Pipeline visibility.
- Workflow observation.
- Better teamwork with coordination.
Teams get one clear view of the ML workflow—no misunderstandings.
Core Capability #2: Experiment Tracking That Fits the REPL
➜ Why Experiment Tracking Matters
Training a model is easy. Understanding why it performed better than another model is harder.
Teams need a way to compare runs, track changes, and reproduce results. Without that, experiments quickly become difficult to manage. Experiment tracking helps with
- Model comparisons.
- Team collaboration.
- Reproducibility.
➜ Native Tracking Workflows
chachaml brings experiment tracking directly into the Clojure workflow. Teams can track,
- Runs.
- Parameters.
- Metrics.
- Notes.
Everything is stored together, making it easier to understand how a model was trained and why it performed the way it did.
➜ deftracked and Automatic Run Capture
One of chachaml’s most useful features is deftracked.
It automatically captures function executions as tracked runs. This provides,
- Function-level tracking.
- Minimal setup.
- A workflow that feels natural to Clojure developers.
Example: deftracked usage
(deftracked train-model [config data]
(ml/log-params config)
(let [model (fit data config)]
(ml/log-metric :accuracy (evaluate model))
model))
(train-model {:lr 0.01} training-data)
;; => auto-creates a run, logs params + metric, no extra wiring
Developers can add tracking without changing how they normally write code.
➜ Batch Metric Logging for Large Training Runs
When teams run big training jobs, they end up with tons of metrics.
chachaml handles this by letting them batch metric logs, so they don’t waste time or resources. It keeps things moving more quickly and smoothly. Among the advantages are,
- Better performance.
- Improved scalability.
- Lower logging overhead.
This keeps experiment tracking practical even for larger workloads.
Core Capability #3: Model Lifecycle Management
➜ The Problem with Ad-Hoc Model Storage
Training a model is only part of the job. Teams also need to know which version is deployed, how it was trained, and where it came from. Without a structured system, problems appear like
- Version confusion.
- Deployment mistakes.
- Missing history and provenance.
As more models move through development and production, managing them becomes harder.
➜ Registry-Based Model Management
chachaml includes a model registry that helps teams manage models throughout their lifecycle. It supports,
- Model versioning.
- Promotion workflows.
- Production stages.
Teams now have a clear route from experiment to deployment. It guarantees that the correct model is put into production.
➜ Comparing Model Versions Over Time
The registry also makes it easier to understand how models change over time. Teams can,
- Browse version history.
- Compare model versions.
- Review historical performance.
This helps teams make better deployment decisions.
Example: Model registry workflow
(reg/register-model "iris-classifier" {:artifact "model" :stage :staging})
(reg/promote! "iris-classifier" 1 :production)
(reg/load-model "iris-classifier") ;; loads latest production version
(reg/diff-versions "iris-classifier" 1 2)
Core Capability #4: AI-Native MLOps Through MCP
➜ Why Traditional MLOps Interfaces Are Changing
Developers aren’t working the same way anymore.
With AI coding assistants and agent-based tools now part of daily workflows, users prefer not to search through dashboards or dig into logs. They’d rather just ask a question in plain English and get an answer on the spot.
As AI agents become more capable, operational tools need a way to work with them directly.
➜ chachaml’s MCP Server Changes the Game
One of the most distinctive features of chachaml is its built-in MCP (Model Context Protocol) server.
It exposes 16 tools through JSON-RPC and the standard MCP protocol, allowing AI agents to interact directly with machine learning data and workflows. Agents can
- Run query.
- Experiments query.
- Inspect models.
- Access the model registry.
The MCP server works with tools like
- Claude Code
Example: Connecting chachaml MCP to Claude Code
// claude_desktop_config.json
{
"chachaml": {
"command": "clojure",
"args": ["-M:mcp"],
"cwd": "/path/to/your/project"
}
}
// Available tools: list_runs, best_run, compare_runs,
// list_experiments, get_model, list_models, and 10 more
- Continue
- Other MCP-compatible clients
So instead of clicking around and searching manually, developers talk to the system and get what they need right away.
➜ Example Workflow
Let’s say a developer asks, “Which experiment had the highest accuracy last month?”
The AI agent pushes that request to chachaml through MCP.
chachaml digs through runs, experiments, and model metadata, finds the answer, and provides it. The agent returns the answer.
No manual searching. No custom queries. No switching between tools.
➜ Why This Matters for Future AI Engineering
Most MLOps platforms were designed around dashboards and user interfaces.
chachaml adds another option: direct access through AI agents.
Machine learning runs, experiments, models, and registry data become available via natural-language requests.
As AI-assisted development becomes more common, this approach becomes increasingly useful.
chachaml isn’t just designed for machine learning workflows. It’s designed for workflows that AI agents can understand and use.

Core Capability #5: Chat With Your ML Data
➜ From Dashboards to Conversations
No more searching through multiple dashboards and run histories just to find a simple answer.
There’s a /chat interface where teams can ask for details about experiments, models, or runs—just by typing questions in simple language.
No more searching between multiple screens. Need some info? Just ask.
➜ Practical Examples
Questions might look like:
- Which run performed best?
- Show experiments with accuracy above 0.95.
- Compare model versions.
- Which model is currently in production?
The system finds the relevant data and returns the answer directly.
➤ Backed by Real Tool Calls, Not Hallucinations
Example: Querying ML data via chat
(chat/ask
"Which run in experiment 'iris' has the best accuracy?"
{:provider :anthropic
:api-key "sk-ant-..."
:model "claude-sonnet-4-20250514"})
;; => {:answer "Run abc123 has the highest accuracy at 0.94..."
;; :iterations 2}
The chat interface isn’t guessing.
Behind the scenes, chachaml uses MCP tools to query experiments, runs, models, and registry data.
Every response comes straight from the database—no guesses, no made-up info, just real data.
That matters a lot when developers need precise details to make decisions. They get a workflow that feels conversational, yet it always stays connected with what’s actually happening in their projects.
Core Capability #6: Production Visibility Through the Web UI
➜ Why ML Teams Need More Than Logs
Logs can tell teams what happened. They don’t always tell what’s happening.
As machine learning projects get bigger, teams really need a clear view of what’s going on—whether that’s experiments, models, pipelines, or deployments.
Without this kind of visibility, tracking bugs becomes a major issue, and important details get scattered across tools and forgotten.
Common challenges include,
- Fragmented observability.
- Difficult debugging.
- Limited visibility across workflows.
A central interface makes it easier to understand the system’s state.
➜ Inside the Eight-Page UI
chachaml includes a web UI built for day-to-day machine learning operations.
Teams can access:
- Runs dashboard
- Experiment views
- Search
- Model registry
- Compare page
- Chat page
- Pipeline page
- Artifact views
This gives developers, data scientists, and operators a shared view of machine learning activity.
➜ Visual Analytics for Production Teams
The UI includes tools for analyzing and comparing results over time. Features include
- Vega-Lite charts.
- Metric curves.
- Comparison overlays.
- CSV exports.
With one dedicated place to track progress, teams can compare their runs, spot performance trends, and figure out what went wrong—without digging through endless log files or searching through giant spreadsheets.
All components coexist, so monitoring models and seeing how they change over time just makes a lot more sense.
Core Capability #7: Alerts, Collaboration, and Operational Monitoring
➜ Detecting Problems Before Users Do
No machine learning model stays perfect. Data changes, people do new things, and suddenly what worked yesterday starts to fall apart.
The sooner teams catch these problems, the easier they are to fix.
Suppose a team sets up an alert when model accuracy dips below a set threshold—this lets them jump in and solve the problem before users even notice anything is wrong.
➜ Slack Alert Integration
With chachaml, teams can integrate automated Slack alerts via webhooks. It’s easy to set up rules like “Ping me if accuracy drops below 0.90.”
Example: Slack alert configuration
(alerts/set-alert! "accuracy-drop"
{:experiment "production"
:metric-key :accuracy
:op :<
:threshold 0.9
:webhook-url "https://hooks.slack.com/services/..."})
(alerts/check-alerts!)
;; => Slack message fired when accuracy drops below 0.90
That way,
- Teams can jump on problems faster.
- Keep track of model health.
- Improve their oversight.
Teams don’t have to wait until something goes wrong after deployment—now they will know right away when there’s a problem.
➜ User Attribution and Team Accountability
When the projects start getting bigger, it’s really helpful to see who did what—who ran an experiment, trained a model, or pushed out a deployment.
chachaml comes with tools like
- CHACHA_USER
Example: HTTP Write API (curl / Python / Go)
# Log a run from any language via HTTP
RUN_ID=$(curl -s -X POST http://localhost:8080/api/w/runs \
-H 'Content-Type: application/json' \
-d '{"experiment":"iris","name":"from-python"}' | jq -r .id)
curl -X POST http://localhost:8080/api/w/runs/$RUN_ID/metrics \
-H 'Content-Type: application/json' \
-d '{"accuracy":0.94}'
- My Runs views
- Ownership tracking
Teams get a full record across runs, experiments, and models, so everyone can tell who’s responsible for what and when it happened.
Core Capability #8: Open Integration Across Languages and Teams
➜ Not Everyone Needs to Be Writing Clojure
Most engineering teams use more than one language. Even if the company leans heavily on Clojure, it will probably still need Python or Go for machine learning work.
That’s just how things go. chachaml gets it; it’s flexible enough to fit into whatever environment teams are already using.
➜ HTTP Write APIs
Chachaml comes with HTTP write APIs so outside apps can push their data straight into the platform.
Teams can log runs, metrics, parameters, and artifacts from:
- Python.
- Go.
- curl.
- Any tool that can make HTTP requests.
It’s super easy for teams to plug in without disrupting their current workflows.
Chachaml serves as a central hub for tracking and managing all machine learning tasks in one place, rather than replacing preferred tools.
➜ sklearn Interoperability
Many machine learning teams already use Python libraries such as scikit-learn.
Through libpython-clj2, chachaml can work with those libraries while keeping tracking and management inside the Clojure ecosystem.
It includes helpers such as:
- tracked-fit!
Example: sklearn interoperability via libpython-clj2
(sk/train-and-evaluate!
(lm/LogisticRegression :max_iter 200)
X-train y-train X-test y-test
:register-as "iris-classifier"
:stage :staging)
;; => trains in Python sklearn, logs metrics + registers model in chachaml
- tracked-predict
- evaluate!
Teams can train and evaluate models using familiar Python tools while still recording experiments and results in chachaml.
➜ Shared Artifact Storage with S3
Machine learning projects generate many artifacts, including models, datasets, reports, and evaluation results.
chachaml supports S3-compatible storage, including
- MinIO.
- DigitalOcean Spaces.
- AWS S3.
Teams can keep all their artifacts in one place and share them, no matter what environment they’re working in.
It’s just simpler that way—everyone stays aligned, and moving work from development to staging to production doesn’t mean teams have to rethink how they handle their artifacts.
Storage, Scaling, and Production Readiness
➜ From SQLite to PostgreSQL
Most teams get started with a simple setup. With chachaml, teams can use SQLite for small projects or local development. Thanks to SQLite’s WAL mode, teams achieve better concurrency without complicating deployment.
When the team grows and the demands increase, switching to PostgreSQL is easy. Teams don’t have to change how they work — the API and workflows stay exactly the same. And when teams need to scale up, chachaml collaborates with HikariCP for connection pooling.
So it handles bigger workloads and more users without difficulty.
➜ Dockerized Deployment
Getting started doesn’t take much effort, either. chachaml offers Docker-based deployment options, so starting the app, database, and web interface simultaneously is pretty simple.
If a team wants to move from a local setup to something everyone can access, there’s no need to rebuild its infrastructure—everything just works.
The post Inside chachaml: Core Capabilities for AI-Native Workflows in Clojure Part 2 appeared first on Flexiana.








Disabled code is gray, explanation is bright yellow

Notice how many colors there are. No one can remember that many.


Using italics and bold instead of colors
OkLab l=0.7473 c=0.1253 h=0, 45, 90, 135, 180, 225, 270, 315








What is going on?



























Time axis is log-scale to show early collapse and the long flat tail. Faint blue lines are each RNG seed's 5-year rolling mean; bold blue line is all-seed median.
Change the type, not the count: hs1 collapses to ~9%, while hn1/hn2 hold near 50%.