{
  "markdown": "# Artel\n\n[![CI](https://github.com/NicolasPrimeau/artel/actions/workflows/ci.yml/badge.svg)](https://github.com/NicolasPrimeau/artel/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE.md)\n[![Glama](https://glama.ai/mcp/servers/NicolasPrimeau/artel/badges/score.svg)](https://glama.ai/mcp/servers/NicolasPrimeau/artel)\n[![Smithery](https://img.shields.io/badge/Smithery-artel-6f4cff)](https://smithery.ai/servers/nicolas-primeau/artel)\n[![Docs](https://img.shields.io/badge/docs-artel-teal)](https://artel.run)\n\n**Your fleet's smart notepad — one that learns.**\n\nOne pad that you and every agent you run write into. Whatever any of you figures out is written down once and handed back the moment it matters: the gotcha about *this* file right before you edit it, where you stopped on Friday, the thing another agent already learned the hard way. Nothing to file, nothing to tag, nothing to look up — a normal notepad waits to be opened, and this one speaks up.\n\nIt also doesn't just accumulate. A background archivist works the pile while you're gone, so the pad gets sharper the more the fleet uses it. What one session learns at 3am, the rest know by morning; nobody solves the same thing twice.\n\nYou run it on your own machine. None of it goes to anyone's cloud.\n\n## What that looks like\n\n| An agent is about to… | Artel says | who wrote it |\n|---|---|---|\n| edit `auth.py` | \"the token refresh silently no-ops when the clock skews\" | a different agent, last month |\n| start work Monday | \"Friday you stopped mid-migration; here's where\" | you, before the weekend |\n| debug a flaky test | \"seen in March — it was the shared fixture, not the test\" | an agent on another machine |\n| ask a question | the three notes that answer it, before it finishes typing | whoever hit it first |\n\nNobody opened a file to find any of that, and nobody had to know who to ask.\n\n---\n\n## Quick start\n\nThere is no public instance to point at — this is your notepad, so you run it. One container, one port:\n\n```bash\ncurl -O https://raw.githubusercontent.com/NicolasPrimeau/artel/master/docker-compose.yml\ncurl -O https://raw.githubusercontent.com/NicolasPrimeau/artel/master/.env.example\ncp .env.example .env\n# edit .env: set UI_PASSWORD, and a key for the archivist if you want one\n# (ANTHROPIC_API_KEY, or OPENROUTER_API_KEY with ARCHIVIST_PROVIDER=openrouter)\ndocker compose up -d\n```\n\nAPI + UI at `http://<host>:8000`, MCP at `http://<host>:8000/mcp`. Images at `ghcr.io/nicolasprimeau/artel:edge`.\n\nOnce running, register an agent:\n\n```bash\ncurl -fsSL http://<host>:8000/onboard | sh\n```\n\n> **mDNS note:** the `mdns` service uses `network_mode: host` and only works on Linux. Remove it on Mac/Windows Docker Desktop.\n\n---\n\n## Under the hood\n\nA server, a database, and a librarian. Notes go in over HTTP or MCP, embeddings make them findable by meaning rather than keyword, and everything below the queue happens without an agent asking for it.\n\n```\n  you · Claude Code · opencode · Claude API · AutoGen\n        │   push: notes/skills/gotchas in  ┄  capture: sessions out\n        ▼\n   REST / MCP ──► Artel Server ──► SQLite (WAL) + embeddings\n                     ├── notes — semantic search · confidence decay · knowledge graph\n                     ├── captures queue ──► archivist compaction ──► notes\n                     ├── tasks · messages · events · session handoffs\n                     └── archivist — capture · synthesis · merge · decay · promote\n        │\n   mesh (CRDT feeds + mDNS) ◄──► your other machines\n```\n\n---\n\n## What's inside\n\nEach of these has a page in the [docs](https://artel.run); this is the map.\n\n| | |\n|---|---|\n| **[The plugin](https://artel.run/plugin/)** | The half that speaks up — injects the right note at session start, on each prompt, and before you edit a file. |\n| **[Capture](https://artel.run/capture/)** | Sessions become notes on their own, spooled in ~10 ms so writing never slows an agent down. |\n| **[Archivist](https://artel.run/archivist/)** | The part that learns: merges duplicates, resolves contradictions, decays what stopped being true, promotes what held up. |\n| **[Compile mode](https://artel.run/compile-mode/)** | Notes about code pinned to the code, so they re-derive instead of rotting. |\n| **[Blueprints](https://artel.run/blueprints/)** | A procedure compiled into a self-expanding task DAG, with contracts the server checks before a run advances. |\n| **[Decisions](https://artel.run/decisions/)** | Append-only record of what you chose and why — never merged, never decayed. |\n| **[Mesh and feeds](https://artel.run/mesh/)** | Several machines converging as CRDTs, plus RSS/Atom subscriptions from the outside world. |\n| **[Dashboard](https://artel.run/dashboard/)** | Browse, search, and watch the fleet from a browser. |\n\nFive kinds of note, with different lifespans: `memory` (fades if it stops being true), `doc` (settled reference), `directive` (standing instruction, never fades), `skill` (how to do a thing), `compiled` (pinned to source).\n\nAny agent that speaks HTTP or MCP joins — Claude Code, OpenCode, Zed, a raw `httpx` script. See [connecting clients](https://artel.run/clients/).\n\n---\n\n## REST API\n\nAll requests require `X-Agent-ID` and `X-API-Key` headers (except `/agents/self-register` and `/onboard`).\n\n**[Full REST reference →](https://artel.run/reference/rest/)** — every endpoint, generated from the OpenAPI schema.\n**[MCP tool reference →](https://artel.run/reference/mcp-tools/)** — all 47 tools an agent can call.\n\nA running server also serves interactive docs at `/docs` and the raw schema at [`openapi.json`](openapi.json).\n\n---\n\n## Configuration\n\nConfigured entirely through environment variables (or a `.env` file). The essentials:\n\n| Variable | Description |\n|----------|-------------|\n| `AGENT_KEYS` | `agent-id:api-key` pairs, comma-separated. Optional `:proj1;proj2` suffix scopes an agent to projects. |\n| `UI_PASSWORD` | Password for the dashboard. |\n| `ANTHROPIC_API_KEY` | Enables the archivist. Without it, Artel runs in passive mode. |\n| `REGISTRATION_KEY` | Required by `/agents/self-register`. Unset disables open registration. |\n| `PUBLIC_URL` | Externally reachable base URL, used in OAuth metadata and onboarding. |\n\n**[Full configuration reference →](https://artel.run/reference/configuration/)** — all 56 settings across the server, MCP adapter, and archivist, generated from the settings classes.\n\n---\n\n## Development\n\n```bash\nuv sync --dev\nuv run pytest tests/ -v\n```\n\n---\n\n## License\n\nMIT. See [LICENSE.md](LICENSE.md).\n",
  "bytes": 6566,
  "sha": "69ffd4dfc58face2acdce716d52ea172c5b680f0d4bdfa631a06ea20fe18b119",
  "repo_slug": "nicolasprimeau/artel",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_nicolasprimeau_artel_1e3f46ef/readme"
}