Local-first CreatureOS runtime for persistent Codex creatures
Project description
CreatureOS
CreatureOS is a local-first runtime for persistent Codex creatures.
It gives you a small ambient habitat of specialized creatures that can:
- watch a workspace over time
- keep durable notes, memory, and activity reports
- chat in a web UI
- practice habits on a schedule and surface useful things without needing a fresh prompt every time
- work with local documents, attachments, and browser flows as part of their normal job
- keep private workshop scripts, files, templates, and reports that make repeated work easier
CreatureOS is intentionally opinionated:
- chats get fresh Codex threads
- habit runs stay on a persistent creature thread
- state lives locally in SQLite
- creatures use purpose and habits as their authority rather than a matrix of manual capability grants
- The Keeper helps summon and shape the rest of the habitat
Prerequisites
CreatureOS itself is a Python app, but it wraps the Codex CLI.
You should have:
- Python
3.12+ - the
codexCLI available on yourPATH - Codex authenticated locally
SQLite uses Python's built-in sqlite3 module. There is no separate database server to install.
Optional:
- Tailscale, if you want private cross-device access with
--tailscale
Install
Install from a checkout:
python3 -m pip install -e .
Once published to PyPI, the install command will be:
pip install creatureos
Start
Initialize the database once:
creatureos init-db
Start CreatureOS in safe local-only mode:
creatureos serve --workspace /path/to/workspace
That binds to:
127.0.0.1:404by default
Serve on localhost plus the detected Tailscale IPv4:
creatureos serve --workspace /path/to/workspace --tailscale
That binds to:
127.0.0.1:404- the detected Tailscale IPv4 on the same port
If no Tailscale IPv4 is detected, it falls back to localhost-only.
Force a fresh onboarding environment scan on boot:
creatureos serve --workspace /path/to/workspace --force-scan
Working Root And Data
If you do not pass --workspace, CreatureOS uses your current working directory as the primary working root for creature file work.
The onboarding scan is broader than that. It looks across likely work directories on the machine so The Keeper can form a first impression of the kind of work you do.
For repeatable launches, prefer setting the workspace explicitly with:
creatureos --workspace /path/to/workspace serve
or with:
CREATURE_OS_WORKSPACE_ROOT
Runtime state lives under:
~/.local/state/creatureos
on Linux by default.
On macOS the default is:
~/Library/Application Support/CreatureOS
On Windows the default is:
%LOCALAPPDATA%\CreatureOS
Override that explicitly with:
creatureos --data-dir /path/to/data serveCREATURE_OS_DATA_DIRCREATURE_OS_DB_PATH
Environment
CREATURE_OS_WORKSPACE_ROOT: primary working root for creature file workCREATURE_OS_DATA_DIR: runtime data directoryCREATURE_OS_DB_PATH: SQLite path overrideCREATURE_OS_HOST: bind host override for single-bind serve modeCREATURE_OS_PUBLIC_HOST: display host used in generated URLsCREATURE_OS_PORT: port overrideCREATURE_OS_CODEX_BIN: Codex CLI binaryCREATURE_OS_MODEL: model overrideCREATURE_OS_REASONING_EFFORT: reasoning effort overrideCREATURE_OS_TIMEOUT_SECONDS: read-only run timeoutCREATURE_OS_WRITE_TIMEOUT_SECONDS: write-enabled run timeoutCREATURE_OS_PYTHON_BIN: Python interpreter used by helper scripts
Development
Common commands:
python3 -m py_compile creatureos/cli.py creatureos/web.py creatureos/service.py creatureos/storage.py creatureos/config.py creatureos/codex_cli.py
node --check creatureos/static/creature_os.js
python3 -m creatureos.cli --help
python3 -m creatureos.cli serve --help
Health check:
curl http://127.0.0.1:404/healthz
Testing:
python3 -m pytest
Browser smoke test:
CREATURE_OS_RUN_BROWSER_SMOKE=1 python3 -m pytest -m browser
Storage-focused guardrails:
python3 scripts/check_storage_sql.py
python3 scripts/storage_smoke.py
Packaging
Build an sdist and wheel:
python3 -m pip install build twine
python3 -m build
python3 -m twine check dist/*
CreatureOS wheels bundle:
- templates
- static assets
so the installed app can run outside a source checkout.
Publishing
CreatureOS is set up for trusted publishing with GitHub Actions.
Test phase on TestPyPI:
- add this GitHub repo as a trusted publisher in TestPyPI
- run the
Publish Packageworkflow manually with targettestpypi
Real release on PyPI:
- add this GitHub repo as a trusted publisher in PyPI
- create a GitHub release
- the same workflow publishes to PyPI automatically on
release.published
The CI workflow also smoke-installs the built wheel so packaging regressions get caught before release.
Repo Layout
- runtime package:
creatureos/ - UI assets:
creatureos/templates/,creatureos/static/ - helper scripts:
scripts/ - tests:
tests/
Notes
serveruns a small supervisor that restarts the worker when core runtime files change.- Static JS and CSS are served with revalidation headers to avoid stale browser state.
- If a server is already running for the same CreatureOS data directory, a second
serveexits instead of starting a duplicate process.
License
CreatureOS is licensed under Apache 2.0. See LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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 creatureos-0.1.0.tar.gz.
File metadata
- Download URL: creatureos-0.1.0.tar.gz
- Upload date:
- Size: 2.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8ac1eebebc80020000c1ddabbc71cc15755198e4154cf4f175708b6f69826d1
|
|
| MD5 |
73643b68dfad514f576f65d7f35b37fa
|
|
| BLAKE2b-256 |
e30b43aeb5945ec8c03ddcd394420220d75379f488ddaef8e57f110ff33f2b46
|
Provenance
The following attestation bundles were made for creatureos-0.1.0.tar.gz:
Publisher:
publish.yml on CreatureOS/creatureos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
creatureos-0.1.0.tar.gz -
Subject digest:
c8ac1eebebc80020000c1ddabbc71cc15755198e4154cf4f175708b6f69826d1 - Sigstore transparency entry: 1193467612
- Sigstore integration time:
-
Permalink:
CreatureOS/creatureos@e0250020fd0f19a164270eab8a564ef5a3fc46c4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/CreatureOS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e0250020fd0f19a164270eab8a564ef5a3fc46c4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file creatureos-0.1.0-py3-none-any.whl.
File metadata
- Download URL: creatureos-0.1.0-py3-none-any.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0f3bbc5cbe12cdc2b6bcf628bd445fc5056a38011e0f5fca88f933d6cfcf9e9
|
|
| MD5 |
58be37b2108106714e8f1b9ad673bf99
|
|
| BLAKE2b-256 |
ae2b26bc185d45767ddcd06a034f142e0b9fa6ca739684c57bb9491a9e48c0e6
|
Provenance
The following attestation bundles were made for creatureos-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on CreatureOS/creatureos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
creatureos-0.1.0-py3-none-any.whl -
Subject digest:
b0f3bbc5cbe12cdc2b6bcf628bd445fc5056a38011e0f5fca88f933d6cfcf9e9 - Sigstore transparency entry: 1193467651
- Sigstore integration time:
-
Permalink:
CreatureOS/creatureos@e0250020fd0f19a164270eab8a564ef5a3fc46c4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/CreatureOS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e0250020fd0f19a164270eab8a564ef5a3fc46c4 -
Trigger Event:
release
-
Statement type: