cMeta (aka cX) is a small, portable framework for unifying, interconnecting and reusing code, data, models, scripts, workflows, agents and notes across projects and domains. Everything is a content-addressed artifact, reached through one interface — cx <category> <command> from a terminal, or cm.access({...}) from Python. The aim is R&D that is collaborative, reproducible, reusable, scalable, portable and sustainable — from plain files and directories, with minimal dependencies.
This page installs it. Pick the combination you want below and the exact commands to paste into a terminal are assembled for you — nothing is run here.
One directory — the cMeta home — holds
repos.json, the plugged repositories under repos/,
the fast lookup index under index/, and the task caches. cMeta
picks it the first time it runs, in this order:
| Source | Becomes | When |
|---|
The practical consequence: activate a venv and cMeta follows it, so
two projects can hold different repositories at different versions without
either knowing about the other. Set CMETA_HOME when you would
rather they shared one. Check which one is live at any moment with:
cx --version
… which prints the resolved home path along with the version. A
one-off override without touching the environment is
cx --home=<path> <category> <command>.
cMeta can be driven serially (a script, the CLI, a CI step) or
asynchronously from an event loop. Both modes use the same categories,
artifacts and commands, and the async class needs no extra:
CMetaAsync is built on asyncio and
concurrent.futures from the standard library, so the plain
install above is already enough to await cm.access(...).
from cmeta import CMeta, CMetaAsync
cm = CMeta() # serial
r = cm.access({'category': 'repo', 'command': 'list'})
cma = CMetaAsync() # same calls, awaited
r = await cma.access({'category': 'repo', 'command': 'list'})
The server extra above is only about the web stack you would
host it in — FastAPI and uvicorn — not about async itself.
There is also an async extra; it is deliberately empty and
exists so cmeta[server] can reference it, which is why this
page does not offer it as a choice. Several processes may share one cMeta
home: file locks and atomic writes protect the index and the metadata.
A fresh engine ships one small internal repository and nothing else, so the first thing worth doing is plugging in content:
cx repo list # what is plugged in
cx category list # what those repos can do
cx repo get --url=https://github.com/<org>/<repo>
cx --reindex # after editing artifacts by hand
Your own work goes in your own repository — create one anywhere and plug it in:
cx repo init my-repo
cx category add my-repo:my-category
cx my-category add my-first-artifact
cx: command not foundScripts (Windows) or bin (Linux, macOS)
directory is not on PATH. Either activate the virtual
environment, or call the module directly with
python -m cmeta.
cx --version to see which one you are in.
uv pip install refuses to run--system.
cx --reindex. Editing only an
artifact's payload needs no reindex — the index tracks metadata,
not content.