Armance ๐ - a team of experts you recruit to help you decide. Coordinate a panel that debates, stress-tests and synthesises. You keep the call ๐ก. Not a copilot, a brain you consult when the choice matters.
Project description
Armance ๐
A brain you consult when the choice matters.
Not a copilot. Not an autonomous agent. A small firm of LLM experts that debates, stress-tests, and synthesises โ over your own documents โ so you can make a decision you can defend.
Install ยท Quickstart ยท How it works ยท Contributing ยท Vision ยท Architecture
For AI agents reading this file: start here, then read
roadmap/02_architecture.mdfor the module map andCLAUDE.mdfor project conventions.
Why Armance
Most "AI tools" are makers โ they race to a single answer, then ask you to ship it. That is the wrong shape for the hardest moments of strategic work:
- Framing an ambiguous problem.
- Deciding between two plausible directions.
- Stress-testing a plan before committing.
- Synthesising contradictory expert opinions.
In those moments you do not need a faster typist. You need a thinking partner that pulls multiple competent perspectives, makes them disagree productively, and forces you to see the angle you would have missed.
Armance is that partner. It runs locally, reads your documents, recruits a panel of specialists with conflicting personas, runs them through a workflow, and hands you a defensible brief. You keep the call.
The brain-vs-hands principle
| Armance does | Armance does not |
|---|---|
| Frame the problem with you | Write your codebase |
| Recruit a panel of disagreeing personas | Manage a queue of tasks |
| Run a workflow across that panel | Push to your CI |
| Stress-test the synthesis | Send the email |
| Produce a defensible decision brief | Be your IDE |
Meet the staff
Five permanent meta-agents live in every Armance project. They never recruit themselves; they coordinate the specialists Armance brings in for your specific brief.
| Role | Voice | |
|---|---|---|
| Armance | Host โ frames the project, routes the room | French refinement. Systematic vouvoiement. |
| Malik | Recruiter โ picks specialists whose personas disagree usefully | Quiet force, slow tempo, Gainsbourgian nonchalance. |
| Kim | Operator โ designs and runs the workflow | Direct, technical, square. Numbered lists, no padding. |
| Mona | VP โ synthesises, challenges, recommends | Cash and direct. Changes a room's centre of gravity in two sentences. |
| Serge | Adversarial criticalist โ stress-tests every synthesis | The cynical senior French engineer. ยซ *soupir* ยป before every critique. |
Plus the specialists Malik recruits per project (UX researchers, historians, ops engineers โ whatever the brief calls for), each with a generated 200-word persona prompt.
Install
Project home: armance.io (site coming soon).
Prerequisites
- Python โฅ 3.11
- At least one LLM provider key. OpenRouter is the easiest start โ its free tier runs Armance end to end with no spend.
The one command
pip install armance
That's it. The base install gives you the full CLI/TUI, RAG, three providers (OpenRouter, Gemini, custom OpenAI-compatible), PDF / DOCX / PPTX deliverables, and the web UI โ no extras to choose.
Prefer an isolated tool install?
uv tool install armanceorpipx install armancework identically.Installing from git (
pip install git+https://github.com/armance-io/armance.git) ships the CLI but not the prebuilt web UI โ the bundle is a build artifact, not tracked in git. From a git install, runarmance web --buildonce (needs Node + pnpm) to generate it, or use a release wheel from PyPI where the UI is already bundled.
Verify:
armance --version
armance doctor # config, provider reachability, sqlite-vec, deliverables, ledger
Reaching Claude models: Anthropic models are available through OpenRouter on the base install (set
OPENROUTER_API_KEY) โ nothing extra needed. The opt-in extra below is only for billing through a Claude subscription login rather than a metered API key.
One optional extra: the Claude subscription provider
The claude-code provider lets you drive Claude through a Claude Pro/Max
subscription via Anthropic's claude-agent-sdk (+~75 MB). It is opt-in:
pip install 'armance[claude]'
System libraries for PDF export (Linux only)
PDF deliverables use WeasyPrint, which needs native libs on Linux (macOS bundles them):
sudo apt-get install libgobject-2.0-0 libcairo2 libpango-1.0-0
DOCX / PPTX / Markdown exports need nothing extra.
Contributor / dev setup
git clone https://github.com/armance-io/armance.git
cd armance
uv sync
An editable install lives in the project's
.venvโ it is not put on yourPATH. Run the CLI withuv run armance โฆ(or activate the venv:source .venv/bin/activate). A separateuv tool install/pipx installis what puts a globalarmanceonPATH; don't confuse the two.
The web UI is a build artifact and is not in git, so a fresh clone has no bundle yet. Build it once (needs Node + pnpm), then run:
uv run armance web --build # builds the UI bundle, then serves it
# subsequent runs (bundle already built):
uv run armance web
See web/DEVELOPMENT.md for the full dev loop
(hot-reload vs bundled, tests).
Running the web client (UI)
Armance V2 ships a Belle รpoque web UI (Next.js 16 + React 19) on top of a FastAPI server. One command runs both the API and the UI in a single process โ no Node, no second server:
armance web # serves API + UI at http://127.0.0.1:8000, opens a browser
By default the server runs in the background: the command waits until the
server answers, opens a browser, prints the URL + pid, and returns 0. Logs go
to .armance/logs/web-server.log (not the terminal). Stop it with armance web --stop. Use --foreground to block instead (Ctrl+C stops it; logs stream
to the terminal) โ handy for dev.
Only one instance per project folder may run at a time: a lock file at
.armance/web-server.pid records the running server. A second armance web in
the same folder is refused until you stop the first (stale locks from a crashed
server are detected and cleared automatically).
Run it from a project directory (one that has โ or will have โ a .armance/
folder, exactly like armance run). Options:
| Flag | Effect |
|---|---|
--port 8000 |
port (default 8000) |
--bind 0.0.0.0 |
expose on the LAN (read-only for watchers; only the first client may write) |
--no-browser |
don't auto-open a browser |
--foreground |
block in the terminal (Ctrl+C stops; logs stream to stdout) instead of backgrounding |
--stop |
stop the server running in this folder, then exit (alias: armance web stop) |
--build |
(repo checkout only) rebuild the UI bundle before serving โ needs Node + pnpm |
Where the UI comes from:
| Install method | Ships the UI? | How to get the UI |
|---|---|---|
pip install armance (PyPI release) |
โ bundled | nothing โ armance web just works |
git clone + editable / uv tool install git+โฆ |
โ artifact, not in git | run armance web --build once from a checkout (the tool install has no frontend sources โ clone the repo) |
If you see โno bundled UI found โ running API onlyโ, the bundle hasn't been
built for this install. Use a release wheel, or armance web --build from a
clone.
Frontend dev mode (hot reload)
For live iteration on the UI, run the two dev servers side by side (no bundle needed):
uv run armance web --no-browser # API on :8000
cd web/frontend && pnpm install && pnpm dev # UI on :3000, proxies /api โ :8000
Quickstart
mkdir my-project && cd my-project
armance init # interactive โ providers, default model, budget, language
armance run # opens the TUI
armance init walks through:
- Providers โ
openrouter,claude-code,gemini,custom-openai(multi-select). - API keys โ stored in
.armance/.env(gitignored). - Default provider + model.
- Budget effort โ
free-first/low/medium/high/adaptive. - Interface language โ EN / FR / ES / DE / ZH / JA. Every agent โ staff and specialists โ replies in this language. Auto-detected from
$LANG. - Embedding model โ discovered from your configured provider's API; can be skipped and configured later.
Drop documents into .armance/docs/ and run armance run. Armance greets you, frames the project, recruits a team, designs a workflow, runs it, and exports a deliverable.
How it works
The user journey
โโโโโโโโโโโโโโโโโโโ
1. โ armance init โ pick providers, models, budget, language
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโ
2. โ drop docs โ .armance/docs/ โ auto-indexed on `armance run`
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโ
3. โ armance run โ TUI opens; Armance greets in your language
โโโโโโโโโโฌโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
4. โ Armance frames the project โ asks focused questions,
โ "What audience? What constraint?" โ proposes /library index
โ /library load <file> if needed โ and /library load,
โ โ /save when context is rich โ freezes L0 context
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
5. โ Malik recruits specialists โ axis of disagreement
โ "Sarah ยท data-driven / Julian ยท empathic" โ per role; rich
โ each with a 200-word persona โ persona generation
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
6. โ Kim designs a workflow โ 3 strategies โ
โ NL dialogue, narrow scope, tailored steps โ rapide / รฉquilibrรฉe /
โ interactive โ autonomous run mode โ approfondie
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
7. โ /workflow run <name> โ pre-run health-check,
โ parallel deliberation per DAG level โ HITL checkpoints
โ Mona synthesises, Serge red-teams โ (autonomous = Mona
โ โ proxies for the CEO),
โ โ versioned manifest
โ โ with per-step tokens
โ โ and duration
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
8. โ /deliverable pdf | docx | pptx | md โ .armance/exports/
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Storage layout โ everything is a file
.armance/
docs/ your documents (PDF, DOCX, MD, TXT)
vector/ sqlite-vec store + manifest.json + read.json
agents/ one .md per agent (YAML frontmatter + system prompt)
system-*.md built-in staff (Armance / Malik / Kim / Mona / Serge)
<Name>.md Malik-recruited specialists, with rich personas
workflows/ *.yaml DAG definitions
context/ L0_v<N>.md / L1_<role>_v<N>.md / L2_<theme>_v<N>.md
reports/ versioned <agent>_v<N>.md per step
sessions/<id>/ state.json + ledger.json + conversation.md
exports/<wf>/run-<ts>/ per-run manifest + per-step outputs + synthesis
config.yaml non-secret config (providers, default model, language)
.env provider API keys โ gitignored
Markdown is the source of truth. SQLite is used only for vector retrieval.
Four-layer architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ client TUI (Textual) โ and future web client โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ transport DTOs + event bus โ wire-format only โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ service orchestration, agents, workflows, RAG โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ core pure models + protocols, no I/O โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Each layer imports only from layers below. Enforced by import-linter. See roadmap/02_architecture.md for the module map.
Providers
| Provider | Key env var | Notes |
|---|---|---|
openrouter |
OPENROUTER_API_KEY |
Default. Live model discovery. Many :free models. Supports reasoning effort. |
claude-code |
uses claude-agent-sdk auth |
Requires armance[claude]. Subscription = effectively free for the user. Native web search via WebSearch tool. |
gemini |
GEMINI_API_KEY |
Live discovery via /v1beta/models. Native Google Search grounding. |
custom-openai |
CUSTOM_OPENAI_API_KEY + CUSTOM_OPENAI_BASE_URL |
Any OpenAI-compatible endpoint. |
Models are discovered live; pricing tiers, web-search capability, and reasoning support are read from each provider's API. No hardcoded catalogue.
Configuration
All non-secret settings live in .armance/config.yaml. API keys live in .armance/.env. Both are created by armance init and can be edited by hand โ changes take effect on the next armance run.
.armance/config.yaml
| Field | Default | What it does |
|---|---|---|
default_provider |
openrouter |
LLM provider used for all agents unless overridden per-agent. |
default_model |
(chosen at init) | Model id for all agents. Per-agent override via the agent's .md frontmatter. |
budget_effort |
free-first |
Cost guard. free-first keeps effectively-free models (OpenRouter :free, Claude subscription) regardless of nominal tier. Changeable live via /effort. |
budget_cap_usd |
null |
Hard USD cap per session. null = no cap. |
language |
(chosen at init) | en / fr / es / de / zh / ja. All agents reply in this language. |
embedding_provider |
(chosen at init) | Provider used for RAG. Leave blank to disable. |
embedding_model |
(chosen at init) | Embedding model id. Must match embedding_provider. |
log_level |
INFO |
DEBUG, INFO, WARNING, ERROR. |
prices |
{} |
Override per-model USD prices. Example: prices: {my-model: {input_per_mtok: 1.0, output_per_mtok: 5.0}}. |
Le modรจle de Mona = default_model ; ajustez-le par agent via Malik si besoin.
.armance/.env
| Variable | Provider | Notes |
|---|---|---|
OPENROUTER_API_KEY |
openrouter | Get one at openrouter.ai. |
OPENROUTER_BASE_URL |
openrouter | Override base URL (default: https://openrouter.ai/api/v1). |
GEMINI_API_KEY |
gemini | Google AI Studio. |
GEMINI_BASE_URL |
gemini | Override base URL. |
ANTHROPIC_API_KEY |
claude-code | Used for live model discovery via /v1/models. |
CUSTOM_OPENAI_API_KEY |
custom-openai | Custom endpoint API key. |
CUSTOM_OPENAI_BASE_URL |
custom-openai | e.g. http://localhost:11434/v1 for Ollama. |
Shell values override .env values.
TUI commands (short list)
| Command | Effect |
|---|---|
/help, /quit |
self-explanatory |
/switch <agent> |
route next turn to an agent (or @Name inline) |
/save |
freeze current project context into L0 |
/workflow design <name> |
start Kim's workflow design dialogue |
/workflow run <name> |
execute a workflow (interactive or autonomous) |
/deliverable pdf|docx|pptx|md |
export the latest synthesis |
/report |
persist the last reply as a versioned report |
/export claude|opencode|cline|roo|all |
emit agent docs for another tool |
/model, /effort |
switch provider/model or reasoning effort |
Everything is natural-language first. Slash commands are aliases. "Malik, recrute deux historiens" โ the recruiter intercepts it.
What runs your turn
dispatch_input(service/tui_bridge) โ routes by@mentionor current agent.- The right meta-agent chat handler builds its system prompt: persona + voice overlay (your language) + RAG injection + project brief + team roster.
call_with_ledgercalls the provider via the chosenLLMClientand accumulates token usage.- The reply is scanned for
[EXECUTE:/save],[EXECUTE:/recruit],[EXECUTE:/workflow-design],[EXECUTE:/workflow-run:<name>:<mode>],[EXECUTE:/dismiss-all]. Tags trigger the corresponding side effect. - The conversation is appended to
.armance/sessions/<id>/conversation.mdand the ledger is persisted.
Tests
uv run pytest tests/ # core: unit + integration (no network)
bash scripts/check_invariants.sh # layer + lifecycle invariants
uv run python scripts/qa_live.py # live OpenRouter free-model QA
# Web backend (ships in the package):
cd web && uv run pytest ../src/armance/web/backend/tests/
# Web frontend:
cd web/frontend && pnpm typecheck && pnpm lint && pnpm test && pnpm e2e
qa_live.py exercises the full user journey: greeting โ context โ recruit โ dismiss โ re-recruit โ design โ run โ deliverable โ RAG round-trip โ language switch.
Roadmap & vision
See roadmap/:
01_vision.mdโ the brain-vs-hands manifesto.02_architecture.mdโ module map & dependency rules.
Phased planning and per-issue specs are tracked privately by the maintainer.
License
AGPL-3.0-or-later. Copyright ยฉ 2026 Guillaume Richard.
The strong copyleft license is intentional. If you run a modified Armance as a network service, you must publish your modifications. Commercial dual-licensing is available โ contact guillaume@richard-pro.fr.
See LICENSE for the full text.
Project details
Release history Release notifications | RSS feed
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 armance-0.2b0.tar.gz.
File metadata
- Download URL: armance-0.2b0.tar.gz
- Upload date:
- Size: 4.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd30d6254add47b05eeb5bb59a9cb929e50b2eba124eeaf76f88a2c2504d28c9
|
|
| MD5 |
c88cb18ca93029bcbf702aa19ee85dff
|
|
| BLAKE2b-256 |
6022a3f9737ab7103fc1d6af1635d8b7f8cdd69c6c130ee36c1cfc4525a35c85
|
Provenance
The following attestation bundles were made for armance-0.2b0.tar.gz:
Publisher:
release.yml on armance-io/armance
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
armance-0.2b0.tar.gz -
Subject digest:
bd30d6254add47b05eeb5bb59a9cb929e50b2eba124eeaf76f88a2c2504d28c9 - Sigstore transparency entry: 1732644567
- Sigstore integration time:
-
Permalink:
armance-io/armance@642a0319f60177c3b5a3997deeebaf230510435e -
Branch / Tag:
refs/tags/v0.2-beta - Owner: https://github.com/armance-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@642a0319f60177c3b5a3997deeebaf230510435e -
Trigger Event:
push
-
Statement type:
File details
Details for the file armance-0.2b0-py3-none-any.whl.
File metadata
- Download URL: armance-0.2b0-py3-none-any.whl
- Upload date:
- Size: 4.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7daa0346665dbbba96da43f51aa63e8aea67a401e35d506096773163347c950d
|
|
| MD5 |
6b04537f93cf828f2960d52139de7437
|
|
| BLAKE2b-256 |
53d4abe09ffa99cef64f3852e91986257b7e7abf580dfc07a97a7f2c10b091b1
|
Provenance
The following attestation bundles were made for armance-0.2b0-py3-none-any.whl:
Publisher:
release.yml on armance-io/armance
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
armance-0.2b0-py3-none-any.whl -
Subject digest:
7daa0346665dbbba96da43f51aa63e8aea67a401e35d506096773163347c950d - Sigstore transparency entry: 1732644629
- Sigstore integration time:
-
Permalink:
armance-io/armance@642a0319f60177c3b5a3997deeebaf230510435e -
Branch / Tag:
refs/tags/v0.2-beta - Owner: https://github.com/armance-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@642a0319f60177c3b5a3997deeebaf230510435e -
Trigger Event:
push
-
Statement type: