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.
There is nothing to set up: it is ~/CMETA
(%USERPROFILE%\CMETA on Windows) unless one of the variables
below says otherwise. cMeta picks it each time it starts, 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 only when you
would rather they shared one, or want the home somewhere other than
~/CMETA. 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 --version says how cMeta was installed, prints the command
that updates it, and warns when a newer release is out (cMeta 0.32.2 and
later). Or pick Update above, with the route cMeta was installed with.
The common cases:
uv tool upgrade cmeta # installed with "uv tool install" or the script
uv pip install -U cmeta # uv, inside the virtual environment
pip install -U cmeta # pip, inside the virtual environment
cx repo pull ctuninglabs@cmeta-aops # a repository from "cx repo get": git pull + reindex
An install from git keeps the same version number between commits, so it is
reinstalled rather than upgraded (uv tool install --force ...,
pip install --force-reinstall ...). A specific version:
uv tool install --force "cmeta[server]==0.32.2". If
cx --version still shows the old version afterwards, another
cx comes first on PATH: which -a cx
(where cx on Windows). Every route in
Updating cMeta.
cx: command not foundPATH
is only read when a window starts. Otherwise Python's
Scripts (Windows) or bin (Linux, macOS)
directory is not on PATH. Either activate the virtual
environment, or call the module directly with
python -m cmeta.
'rem' is not recognized, or A parameter cannot be found that matches parameter name 'fLO'PS: pick Windows · PowerShell
above and copy the block again. ('#' is not recognized is
the same mix-up the other way round.)
0x8a15005e: The server certificate did not match any of the expected values--source winget, which leaves the Store out; add it to
any other winget install that fails this way.
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
in a terminal opened as administrator — and run the command again.
An Application Control policy has blocked this fileImportError: DLL load failed while importing unicodedata
from cx, git failing to load libcurl-4.dll,
or cxt.exe blocked by your organization's Device Guard
policy. Smart App Control, on by default on new Windows 11 PCs,
refuses every binary that is neither signed nor known to Microsoft:
the interpreter uv downloads, uv's command shims, the DLLs of Git for
Windows, and every program you compile. The fix is to turn it
off: Settings > Privacy & security > Windows Security
> App & browser control > Smart App Control settings >
Off. The switch is one-way and the normal state of a development
machine; afterwards cx, cxt and git work as
installed. To keep it on instead, stay with signed components: install
Python from the Microsoft Store and put cMeta on it —
uv tool install "cmeta[server]" --python python.exe
(the --python matters once uv has downloaded its own
interpreter, which it prefers) — and fetch repositories without
git:
curl.exe -fLo cmeta-aops.zip https://github.com/ctuninglabs/cmeta-aops/archive/refs/heads/main.zip
then cx repo unzip cmeta-aops.zip (the same two commands
update it later). uv's command shims (cx.exe,
cxt.exe) are unsigned launchers and can be blocked as
well (blocked by your organization's Device Guard policy): the
signed way in is the tool environment's own interpreter,
"%APPDATA%\uv\tools\cmeta\Scripts\python.exe" -m cmeta ...
— a cx.cmd on PATH with
@"%APPDATA%\uv\tools\cmeta\Scripts\python.exe" -m cmeta %*
gives cx back, and cxt <task> is
cx task run <task>.
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.