Skip to main content

corparius: self-hosted autonomous AI micro-companies you run yourself

CI Python 3.10+ PyPI MIT Self-hosted first Runs offline, no keys

corparius

Describe a business in plain language. corparius runs it as ten scheduled agents (a CEO and nine operational roles) that pursue one signal, revenue, behind a budget and a loop firewall. Everything stays on your machine: the config, the state, and the models. Cloud LLMs are an opt-in escalation, never a requirement.

Working MVP. The orchestrator, the firewall, the approval gate, the console and the ten-agent roster run end to end against a deterministic mock LLM: a full company day, offline, with no keys. Live providers are wired in and selected by config, and corparius preflight proves by one real call which of them your account can actually reach.

Quick start · How it works · The roster · Console · Routing · Guards · Teaching a company · Settings · Structure · Compliance · Docs · Support · Contributing · License

Quick start

Runs offline out of the box (mock LLM, SQLite). No keys, no models, no accounts.

No Python, no terminal, no clone. Download one file and open it. From the latest release:

System Download Then
Windows x64 corparius-windows-x64.exe double-click (SmartScreen: More info → Run anyway)
macOS (Apple Silicon) corparius-macos-arm64.zip unzip, right-click corparius.app → Open
macOS (Intel, 15+) corparius-macos-x64.zip unzip, right-click corparius.app → Open
Linux x64 corparius-linux-x64 chmod +x corparius-linux-x64 && ./corparius-linux-x64

The builds are unsigned, so the OS shows a first-run warning; the steps above get past it. Your data lives in a per-OS folder, so a newer build keeps every company and setting. docs/install.md has the exact screens.

From source instead, double-click start-windows.bat, start-macos.command or start-linux.sh (Python 3.10+ is the only prerequisite; it makes the venv, installs, prepares the example company and opens the console). Or a terminal:

pip install corparius && corparius ui                    # the console on :8600, no clone
git clone https://github.com/MariusYvard/corparius.git && cd corparius
python start.py                                          # venv, deps, example company, browser
docker compose up -d                                     # or Docker, console on :8600 + Ollama
docker run -d -p 127.0.0.1:8600:8600 -v corparius_data:/app/data ghcr.io/mariusyvard/corparius

The wheel carries the built console, so pip install needs no Node, and that is asserted on every release rather than assumed. Two runtime dependencies, requests and PyYAML; everything else is stdlib.

The console walks you through your first company; corparius doctor diagnoses the installation and says what to fix.

The CLI does everything the console does: corparius <command> --help explains each one
Run a company new delete init run status board flow tasks task docs
Decide ceo approvals approve reject rules inbox memory
Ship site deploy repo apps
Models bench preflight claude
Extend plugin skills
Keep it running doctor ui set mail backup restore update secrets
Let a device in pair clients revoke

How it works

One tick: company.yaml feeds the Scheduler, which picks the agents due; each Agent turn routes through the HybridRouter (local first, cloud on escalation); Tool calls are guarded by TokenBudget, LoopGuard and CircuitBreaker; money and production code wait at the human gate; everything lands in the SQLite store; and the CLI, operator console, MCP server and any paired client read it back.

A tick advances the clock, runs whatever is due, records every action and token, and stops the moment a guard trips.

The roster

The ten agents and when each runs across a day, each from its own starting hour: the CEO every six hours from midnight, design and social every eight, support every three, outreach every six, ads and the two daily readers once a day, and the coder on demand. Ads, outreach, support and finance are held until the company has a published site, a mailbox or a way to be paid.

Each role has a narrow toolset, its own cadence, and its own hour to start from. The day has a shape: the CEO opens it alone and returns every six hours, design lands right after each of its reviews, and the two daily readers sit in the afternoon where nothing else is. Nothing shares hour 0, because a company that woke every agent at once would spend its whole budget in one burst.

And four of them wait. Ads, outreach, support and finance are worth nothing until the company has something: a page to send people to, a mailbox to answer, a way to be paid. They are not scheduled until it does, and corparius run reports which ones it held and what each is waiting for. Before this, the shipped example config carried ads: false # off until there is budget to spend, which was an operator maintaining by hand a fact the runtime could read.

The console

corparius operator console, Overview: the approval queue first, each request showing what it will do and the values it will run with, then the day's pulse (simulated hour, actions taken, tokens used, tasks delivered), the recent agent activity log and the go-live checklist

corparius ui serves it on http://127.0.0.1:8600. Svelte, built in CI, and served with no Node installed anywhere. English and French, dark and light.

It leads with what needs you. The approval queue is first on the page, and each request shows what is about to happen, the drafted sentence and the values it will run with, rather than the tool's description of itself. Being asked to press Approve on a verb is not consent.

Nothing here needs a text editor. Seven tabs cover the backlog as a kanban you can arbitrate, run control, per-agent spend, the sales site, documents, every provider key, the mail account, Stripe, and a chat with the CEO. And when you do not know what to do next, the CEO tab derives it from the store: decisions waiting, a question in the inbox, drafts nobody has read. Every one of them is a button that takes you there rather than a sentence telling you where to go.

The console binds to localhost, and keys posted from it are write-only: stored, never displayed back. corparius pair issues a credential per device (scrypt, constant-time compare, shown once, read or act). A versioned JSON API lives at /api/v1 with one error envelope and an ETag on every GET. There is deliberately no TLS. The honest answer for a stdlib server is loopback plus a tunnel, and the doctor fails if a device credential exists while the listener is off loopback. docs/console.md.

Routing

The three difficulty tiers each map to a provider target, and a failed call walks the fallback chain in order until it reaches the local model, which needs no network.

Flip a prefix to move a tier between providers; keep any tier fully on-prem.

CORP_TRIVIAL_MODEL=local:gemma4:e4b
CORP_NORMAL_MODEL=groq:llama-3.3-70b-versatile
CORP_HARD_MODEL=openrouter:deepseek/deepseek-r1-0528:free
CORP_LLM_FALLBACK=cerebras:gpt-oss-120b,mistral:mistral-small-latest
Every target, and what each one needs
Target Serves Needs
local: Ollama on your machine nothing but the model
cloud: Anthropic API ANTHROPIC_API_KEY (paid credits)
claudecode: Claude Code CLI, subscription auth the CLI logged in, no API credits
groq: cerebras: openrouter: mistral: gemini: nvidia: github: cohere: huggingface: ovh: zhipu: siliconflow: cloudflare: alibaba: 14 OpenAI-compatible providers on a free tier or a free trial quota one API key each, free
openai: OpenAI, OpenAI-compatible OPENAI_API_KEY (billed from the first call)
custom: any OpenAI-compatible gateway (OmniRoute, LiteLLM, vLLM, LM Studio) CORP_CUSTOM_LLM_URL

Limits, signup links and privacy notes per provider: docs/llm-providers.md.

Measured, not declared. A catalogue lists models that exist, not models your account may call, and a card advertising structured output is not proof the model can produce JSON. corparius preflight settles it with one real 8-token call and stores the verdict. On a real key: 10 of 18 sampled NVIDIA entries answer 404, and two of four models in a working fallback chain cannot produce JSON. The recommended routing refuses a model measured dead, and verdicts age so a provider blocked six months ago gets another chance.

The guards

Three automatic guards in front of every agent turn (a token budget, a loop guard and a circuit breaker), and then the human gate, where money and production code wait for the operator.

Any tool named in CORP_HITL_TOOLS (send_financial_transaction, publish_production_code and deploy_site by default) pauses the run and files an approval. Decide from the console, the CLI or the MCP server; a rejection is handed back to the agent as a normal, recoverable tool error. docs/securite.md has the thresholds.

Teaching a company

Four ways to teach a company: plugins add code, skills add prose, documents are the files it already has, and apps are what it runs for its own visitors.

Plugins add providers, tools or templates without touching the core. They are off by default and curated: verified means listed in the reviewed plugins/registry.json, and unverified third-party code loads only behind an explicit opt-in. corparius plugin install <name> downloads at a pinned ref and verifies the SHA-256. docs/plugins.md

Skills are what your company knows in prose: the objection your market raises, the price you never discount below. A SKILL.md folder with frontmatter, and allowed-tools decides everything: the body enters a prompt only when the tool about to run is one it names, so a turn pays for the skills that apply to it and nothing else. docs/skills.md

Documents are the files it already has. A PDF, .docx, .pptx, .xlsx, CSV, Markdown and plain text are read with the standard library. No new dependency, and nothing invented: a scanned PDF says "no text layer this build can read" rather than returning noise. A picture is sent, not described, and only to a model preflight has measured can read one. Every readable file is reduced to its headings, and that map rides on every prompt; the budget decides which sections get quoted, ranked against what the agent is about to do. docs/documents.md

Apps put the providers you already configured behind something other than the roster: a FAQ on the sales site, a form that understands what a visitor wrote. A YAML file with its own token ceiling, rate limit and origin list, and its spend shows up in the console under app:<name>. No second API key. docs/apps.md

Where settings live

Every setting resolves through four layers, first hit wins:

Layer Source Set it from
1 the real process environment your shell, systemd, docker environment:
2 the settings saved from the console the console
3 .env a text editor
4 the default in the code (nothing to set)

The console can set everything in layer 2, and it says which layer answers for each field: a value pinned by the process environment is shown read-only rather than accepting an edit that would do nothing. Bootstrap keys (CORP_DATA_PATH, CORP_LOG_LEVEL, CORP_UI_HOST, CORP_UI_PORT, CORP_UI_TOKEN) must be readable before the database opens, so they live in .env and apply on restart.

Keys saved from the console land in data/corparius.sqlite, in the clear by default, which the panel and the doctor both say. corparius secrets on encrypts them at rest; CORP_SECRET_KEY is the passphrase and is a bootstrap key, so it never lives in the database it protects. A backup zip never carries a plaintext secret either way.

Structure

Seven directories, seven ranks, and a rule held by a test rather than by good intentions: a module of rank n imports only ranks ≤ n, deferred imports included. tests/test_layers.py reads the import graph with the AST and fails on a new upward edge, and equally on a violation that was fixed and not struck off the list.

kernel/ 0   stdlib only        providers/ 3   the outside world
config/ 1   settings resolver  domain      4   agents, tools, documents, sitegen
store/  2   the only sqlite3   app/       5   use cases, no transport
                               api/ cli/  6   HTTP, CLI, MCP. Nothing imports these

Reading a setting no longer loads requests or subprocess, and the domain cannot touch the network, sqlite or a subprocess: a gate rather than an observation. docs/architecture-code.md has the table and the measurements; docs/adr/ has one decision per file.

Compliance (France / EU)

Self-hosting the operations does not exempt the business from the law. docs/conformite-fr.md covers the parts that bite: e-invoicing through an approved PDP (Factur-X, the 2027 B2B mandate), the legal notice a commercial site must carry, ten-year archival, the choice of legal form, and where the EU AI Act classifies an agent as high-risk. Read it before you point this at real customers.

Two things corparius does rather than claims. The notice fields are typed once in the console and the page renders only what was filled, because a heading over a blank says the company looked and found nothing. And connecting a bank (Qonto, alongside a Stripe link) proves the credentials and nothing else: no invoice is created, nothing is transmitted, and corparius does not assert that any bank is an approved platform. That fact lives in a public register, not in this code.

Documentation

Doc Covers
docs/architecture.md orchestration topology, tiered router, durable execution
docs/architecture-code.md seven directories, seven ranks, and the test that enforces the rule
docs/adr/ architecture decisions, one per file, each carrying its measurement
docs/console.md the operator console (API, security model)
docs/llm-providers.md every free LLM provider: limits, keys, privacy notes
docs/securite.md the safety firewall and the Agent SRE mapping
docs/conformite-fr.md e-invoicing (PDP, Factur-X), the legal notice, legal forms, EU AI Act
docs/backlog.md docs/lean.md the CEO-governed backlog; pull flow, WIP limits, kaizen
docs/integrations.md the real-or-mock backend pattern (Stripe, SMTP)
docs/site.md docs/deploiement.md sales-site generator and multi-provider publishing
docs/leads.md docs/pipeline.md lead research, enrichment, deliverability, signals
docs/mcp.md driving corparius from any MCP host
docs/plugins.md docs/skills.md writing plugins; teaching a company its trade in prose
docs/documents.md docs/apps.md the company's own files; its own apps on its own providers
docs/memoire.md yesterday vs what stays true: durable memory
docs/install.md docs/versionnement.md download/run per OS; how a version is decided
docs/roadmap-90j.md the 90-day build cycle
docs/reverse-engineering/ teardowns of NanoCorp, Polsia, Uclic, OpenWorker and others

Support

corparius is free, MIT-licensed and self-hosted; there is no paid tier and no telemetry. If it earns its keep in your homelab, you can support the work through GitHub Sponsors.

Contributing

Issues and pull requests are welcome. Keep changes surgical, match the existing conventions (dataclass config, provider registries with a local fallback, mock mode must keep working offline) and make sure python -m pytest stays green. New providers belong in the OPENAI_COMPAT_PROVIDERS registry with a documentation row in docs/llm-providers.md.

License

MIT. See LICENSE.

Reference implementation for research and self-hosting. Autonomous outreach, billing and publishing carry legal and reputational risk; you are the operator and the agent acts on your behalf. Keep the HITL gate on anything that spends money or ships code.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

corparius-0.5.1.tar.gz (1.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

corparius-0.5.1-py3-none-any.whl (820.0 kB view details)

Uploaded Python 3

File details

Details for the file corparius-0.5.1.tar.gz.

File metadata

  • Download URL: corparius-0.5.1.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for corparius-0.5.1.tar.gz
Algorithm Hash digest
SHA256 2f5e8d0b8e2c1b24b8dcb04b58733d22c5ea5b02839a918f2bc23c9764dd1aa7
MD5 03c6edfad05546e752baff2c161f32a3
BLAKE2b-256 84522a379a4183aa4519a967009558f6c3805c30dee3a8430ee7e128307c0761

See more details on using hashes here.

Provenance

The following attestation bundles were made for corparius-0.5.1.tar.gz:

Publisher: release.yml on MariusYvard/corparius

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file corparius-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: corparius-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 820.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for corparius-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 057d2e3514a208f9ff1ccc05a8b2f1ddb3712102263da2daeafd23cadef78d5b
MD5 12a53f025dd2e52540d45f7f845b3564
BLAKE2b-256 d7f8b36898f1ee9d3396ca8dcde8983faf2122c5bb46427f1f34ee4807c8c4d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for corparius-0.5.1-py3-none-any.whl:

Publisher: release.yml on MariusYvard/corparius

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page