monstersMNSTR.0A18ITStar, GitHub stars 2
All monsters stoppedNothing runs until you resume.

Your AI.Your machine.Your monsters.

An orchestrator and a squad of AI agents that work on your computer. Any model, your keys, one red lever.

Press / for the shell of this page. Try: summon <your name>

Fig. 1Titan, god of monsters. Poke him.

The action log of one request, replayed: Titan searches the vault, delegates to Rhea and Dione, the instinct holds a web call, a note is committed, a receipt is printed.

Not a chatbot. A squad.

Titan plans and splits the work. The little monsters do it, each with its own model, tools and permissions. Rename them, add more, retire them.

titan

Slot 00

Largest moon, orange haze. Largest monster, a crown of nubs.

Role
Orchestrator
Hue
62°
Shape
BLOB
Seed
0xE6BED33D

rhea

Slot 01

Icy and cratered. Lilac, long ears.

Role
Agent
Hue
280°
Shape
EGG
Seed
0x4B329874

dione

Slot 02

Wispy ice cliffs. Mint, a striped plume of a tail.

Role
Agent
Hue
160°
Shape
BLOB
Seed
0x73525324

tethys

Slot 03

One huge canyon. Coral, the widest grin, two fangs.

Role
Agent
Hue
22°
Shape
DOME
Seed
0x66319BF9

enceladus

Slot 04

Geysers at the south pole. Ice blue, eyes on stalks.

Role
Agent
Hue
222°
Shape
EGG
Seed
0xD5A1AC3D

hyperion

Slot 05

Spongy and lopsided. Mustard, never symmetric.

Role
Agent
Hue
100°
Shape
LUMPY
Seed
0x43CD3819

mimas

Slot 06

One crater like a giant eye. The smallest, a cyclops.

Role
Agent
Hue
315°
Shape
BLOB
Seed
0x61A77CE9
tree ~/.monsters/agents/rhea
rhea/
├── AGENTS.md      # role and rules, from a template
├── agent.yaml     # name, models, tools, vault, limits
└── genome.json    # its look (optional)

0 directories, 3 files

Each monster is a folder: AGENTS.md, agent.yaml, genome.json. This is Rhea, as the onboarding writes her.

~/.monsters/agents/rhea/agent.yamlpid 4826
id: rheaname: Rhearole: ricerche online e sintesi con fontikind: subagentcolor: "#4f8df7"models:  - provider: openrouter    model: nvidia/nemotron-3-super-120b-a12b:free  - provider: openrouter    model: poolside/laguna-s-2.1:free  - provider: openrouter    model: openrouter/freetools:  - web_search  - web_fetch  - vault_search  - vault_read  - vault_list  - vault_links  - vault_tags  - vault_write  - vault_editvault:  read:    - "**"  write:    - Agenti/Rhea/**    - Inbox/**    - Risorse/Ricerche/**limits:  maxSteps: 30  maxOutputTokens: 4000

Type a name. Get a monster.

Same name, same monster, every time. A seeded genome drawn in 255 LEDs, by the same kit the app uses.

Expression

phoebe/genome.json
{
  "version": 1,
  "id": "phoebe",
  "seed": 1676619163,
  "body": {
    "shape": "dome",
    "w": 0.96,
    "h": 0.9,
    "lean": -0.02
  },
  "palette": {
    "hue": 8.2,
    "chroma": 0.129,
    "lightness": 0.676,
    "belly": "light",
    "accent": "cream"
  },
  "eyes": {
    "kind": "cyclops",
    "size": 1.14,
    "spacing": 1,
    "iris": "amber",
    "asym": 0
  },
  "mouth": {
    "kind": "canyon",
    "width": 0.98,
    "teeth": "buck"
  },
  "horns": {
    "kind": "spike",
    "count": 5,
    "size": 0.93,
    "stripes": false
  },
  "ears": null,
  "tail": null,
  "arms": "long",
  "feet": "stubby",
  "marks": null,
  "topper": null,
  "personality": {
    "bounce": 0.62,
    "speed": 0.92
  }
}
00000000: 7b0a 2020 2276 6572 7369 6f6e 223a 2031  {.  "version": 1
00000010: 2c0a 2020 2269 6422 3a20 2270 686f 6562  ,.  "id": "phoeb
00000020: 6522 2c0a 2020 2273 6565 6422 3a20 3136  e",.  "seed": 16
00000030: 3736 3631 3931 3633 2c0a 2020 2262 6f64  76619163,.  "bod
00000040: 7922 3a20 7b0a 2020 2020 2273 6861 7065  y": {.    "shape
00000050: 223a 2022 646f 6d65 222c 0a20 2020 2022  ": "dome",.    "
00000060: 7722 3a20 302e 3936 2c0a 2020 2020 2268  w": 0.96,.    "h
00000070: 223a 2030 2e39 2c0a 2020 2020 226c 6561  ": 0.9,.    "lea
00000080: 6e22 3a20 2d30 2e30 320a 2020 7d2c 0a20  n": -0.02.  },. 
00000090: 2022 7061 6c65 7474 6522 3a20 7b0a 2020   "palette": {.  
000000a0: 2020 2268 7565 223a 2038 2e32 2c0a 2020    "hue": 8.2,.  
000000b0: 2020 2263 6872 6f6d 6122 3a20 302e 3132    "chroma": 0.12
000000c0: 392c 0a20 2020 2022 6c69 6768 746e 6573  9,.    "lightnes
000000d0: 7322 3a20 302e 3637 362c 0a20 2020 2022  s": 0.676,.    "
000000e0: 6265 6c6c 7922 3a20 226c 6967 6874 222c  belly": "light",
000000f0: 0a20 2020 2022 6163 6365 6e74 223a 2022  .    "accent": "
00000100: 6372 6561 6d22 0a20 207d 2c0a 2020 2265  cream".  },.  "e
00000110: 7965 7322 3a20 7b0a 2020 2020 226b 696e  yes": {.    "kin
00000120: 6422 3a20 2263 7963 6c6f 7073 222c 0a20  d": "cyclops",. 
00000130: 2020 2022 7369 7a65 223a 2031 2e31 342c     "size": 1.14,
00000140: 0a20 2020 2022 7370 6163 696e 6722 3a20  .    "spacing": 
00000150: 312c 0a20 2020 2022 6972 6973 223a 2022  1,.    "iris": "
00000160: 616d 6265 7222 2c0a 2020 2020 2261 7379  amber",.    "asy
00000170: 6d22 3a20 300a 2020 7d2c 0a20 2022 6d6f  m": 0.  },.  "mo
00000180: 7574 6822 3a20 7b0a 2020 2020 226b 696e  uth": {.    "kin
00000190: 6422 3a20 2263 616e 796f 6e22 2c0a 2020  d": "canyon",.  
000001a0: 2020 2277 6964 7468 223a 2030 2e39 382c    "width": 0.98,
000001b0: 0a20 2020 2022 7465 6574 6822 3a20 2262  .    "teeth": "b
000001c0: 7563 6b22 0a20 207d 2c0a 2020 2268 6f72  uck".  },.  "hor
000001d0: 6e73 223a 207b 0a20 2020 2022 6b69 6e64  ns": {.    "kind
000001e0: 223a 2022 7370 696b 6522 2c0a 2020 2020  ": "spike",.    
000001f0: 2263 6f75 6e74 223a 2035 2c0a 2020 2020  "count": 5,.    
00000200: 2273 697a 6522 3a20 302e 3933 2c0a 2020  "size": 0.93,.  
00000210: 2020 2273 7472 6970 6573 223a 2066 616c    "stripes": fal
00000220: 7365 0a20 207d 2c0a 2020 2265 6172 7322  se.  },.  "ears"
00000230: 3a20 6e75 6c6c 2c0a 2020 2274 6169 6c22  : null,.  "tail"
00000240: 3a20 6e75 6c6c 2c0a 2020 2261 726d 7322  : null,.  "arms"
00000250: 3a20 226c 6f6e 6722 2c0a 2020 2266 6565  : "long",.  "fee
00000260: 7422 3a20 2273 7475 6262 7922 2c0a 2020  t": "stubby",.  
00000270: 226d 6172 6b73 223a 206e 756c 6c2c 0a20  "marks": null,. 
00000280: 2022 746f 7070 6572 223a 206e 756c 6c2c   "topper": null,
00000290: 0a20 2022 7065 7273 6f6e 616c 6974 7922  .  "personality"
000002a0: 3a20 7b0a 2020 2020 2262 6f75 6e63 6522  : {.    "bounce"
000002b0: 3a20 302e 3632 2c0a 2020 2020 2273 7065  : 0.62,.    "spe
000002c0: 6564 223a 2030 2e39 320a 2020 7d0a 7d    ed": 0.92.  }.}
ewogICJ2ZXJzaW9uIjogMSwKICAiaWQiOiAicGhvZWJlIiwKICAic2VlZCI6IDE2NzY2MTkxNjMsCiAgImJvZHkiOiB7CiAgICAic2hhcGUiOiAiZG9tZSIsCiAgICAidyI6IDAuOTYsCiAgICAiaCI6IDAuOSwKICAgICJsZWFuIjogLTAuMDIKICB9LAogICJwYWxldHRlIjogewogICAgImh1ZSI6IDguMiwKICAgICJjaHJvbWEiOiAwLjEyOSwKICAgICJsaWdodG5lc3MiOiAwLjY3NiwKICAgICJiZWxseSI6ICJsaWdodCIsCiAgICAiYWNjZW50IjogImNyZWFtIgogIH0sCiAgImV5ZXMiOiB7CiAgICAia2luZCI6ICJjeWNsb3BzIiwKICAgICJzaXplIjogMS4xNCwKICAgICJzcGFjaW5nIjogMSwKICAgICJpcmlzIjogImFtYmVyIiwKICAgICJhc3ltIjogMAogIH0sCiAgIm1vdXRoIjogewogICAgImtpbmQiOiAiY2FueW9uIiwKICAgICJ3aWR0aCI6IDAuOTgsCiAgICAidGVldGgiOiAiYnVjayIKICB9LAogICJob3JucyI6IHsKICAgICJraW5kIjogInNwaWtlIiwKICAgICJjb3VudCI6IDUsCiAgICAic2l6ZSI6IDAuOTMsCiAgICAic3RyaXBlcyI6IGZhbHNlCiAgfSwKICAiZWFycyI6IG51bGwsCiAgInRhaWwiOiBudWxsLAogICJhcm1zIjogImxvbmciLAogICJmZWV0IjogInN0dWJieSIsCiAgIm1hcmtzIjogbnVsbCwKICAidG9wcGVyIjogbnVsbCwKICAicGVyc29uYWxpdHkiOiB7CiAgICAiYm91bmNlIjogMC42MiwKICAgICJzcGVlZCI6IDAuOTIKICB9Cn0=

How it is wired.†

One core on your computer. Windows into it: the desktop app, the browser, Telegram, SSH. Everything it does goes through the same log and the same kill switch.

~/monsters/docs/ARCHITECTURE.md · asciipid 4747

Architecture diagram. Desktop app, web UI, Telegram and SSH connect to the core on 127.0.0.1:4747. The core holds Titan and the squad, the instinct, the event log and the kill switch, which aborts a tree of AbortControllers and child processes. Below the core: providers, the Markdown vault with git, the tools, and monsters mcp for Claude Desktop, Codex and Cursor.

Datasheet

neofetch, more or lesspid 4747

you@localhost

OS:
yours: Linux, macOS, Windows
Host:
127.0.0.1:4747 (loopback only)
Kernel:
Node 24 · TypeScript · SQLite
Version:
monsters 0.1.0-alpha.18
Shell:
monsters chat, also over SSH
Squad:
7 monsters: 1 orchestrator, 6 agents
Providers:
6 cloud APIs · 2 local · 2 subscriptions
Memory:
Markdown vault + git, opens in Obsidian
Remote:
Telegram · SSH
Brake:
instinct, on outbound actions
Caps:
daily · monthly
License:
Apache-2.0
Kill switch:
ARMEDPULLED
Uptime:
0m (this tab)
  1. Runs on your PC. The core listens on 127.0.0.1:4747.LOCAL
  2. OpenRouter, Anthropic, OpenAI, Google, Mistral, Groq. Your key.APIS
  3. Ollama and LM Studio, nothing leaves the room.OFFLINE
  4. Claude via Claude Code, ChatGPT Plus or Pro with Codex.SUBS
  5. A model chain per monster, with fallback.CHAIN
  6. Second brain in Markdown. Opens in Obsidian.VAULT
  7. Every monster edit is a git commit.UNDO
  8. Every action, on the record.LOG
  1. MCPMCP servers and a gallery of services.
  2. CHROMEA real browser, on its own profile.
  3. PERMSTerminal and files off by default. Granted per monster.
  4. REMOTETelegram, or SSH with monsters chat.
  5. EXPOSEmonsters mcp serves the vault to Claude Desktop, Codex, Cursor.
  6. INSTINCTA small model that brakes actions leaving your computer.
  7. CAPSDaily and monthly spend caps.
  8. DRAFTSProjects and automations arrive as drafts you confirm.
  1. 1Free models on OpenRouter. Bring the key, keep the change.
  2. 2Six cloud APIs, two local runtimes, two subscriptions.
  3. 3UI, Telegram /stop or monsters kill. Same switch.
  4. 4Plain files on your disk, git underneath.

Every edit is a commit.‡

The vault is a folder of Markdown with git underneath. Each action of a monster is one commit, with the agent and the action in the message. Undo is a real revert.

~/.monsters/vault · git log --onelinepid 4791
9b27e51 vault_edit: Inbox/week-42.md [agent=titan action=01M5D6GD28EE06AZ191SKPAJTQ]c2e9d47 vault_write: Inbox/week-42.md [agent=dione action=01M5D6FZH48T4F0NWP35DNNMJE]5a0e8f2 vault_write: Risorse/Ricerche/notes-tools.md [agent=rhea action=01M5AM31J09SQ5S1TXRJS7HXSX]31c7b9d vault_create: nuovo vault

git show 9b27e51 -- Inbox/week-42.md
diff --git a/Inbox/week-42.md b/Inbox/week-42.md--- a/Inbox/week-42.md+++ b/Inbox/week-42.md@@ -1,5 +1,6 @@ # Week 42  - Kill switch on Telegram: /stop-- Two drafts waiting for review+- Two drafts waiting for review: the newsletter, the quote+- Ask Rhea for sources - Next: [[Risorse/Ricerche/notes-tools]]

Plug the vault into Claude Desktop.

monsters mcp is a stdio MCP server with the vault tools. Same log, same permissions, same undo.

vault_search · vault_read · vault_write · vault_edit · vault_move · vault_delete · vault_history · vault_undo

claude_desktop_config.json
{  "mcpServers": {    "monsters-vault": {      "command": "/path/to/node24/bin/node",      "args": ["/path/to/monsters/packages/cli/bin/monsters.js", "mcp"]    }  }}

Pull it. Everything stops.§

The same lever as the app. Runs abort, processes die, and nothing starts again until you say so. Go on, try it on this page.

Kill switch
ArmedStopped
  • App: the red lever
  • Telegram: /stop
  • Terminal: monsters kill
packages/core/src/kill
  async kill(params: { by: Channel; reason?: string | undefined }): Promise<KillReport> {    const started = this.#now();    const halt: HaltState = {      halted: true,      at: started,      reason: params.reason ?? null,      by: params.by,    };    this.#halt = halt;    this.#state.set(HALT_KEY, halt);     const runs = [...this.#runs.values()];    this.#runs.clear();    const processes = this.#root.countProcesses();    const oldRoot = this.#root;    this.#root = this.#newRoot();    const aborting = oldRoot.abort(new KilledError('global', params.reason));
  #abortTree(reason: unknown, pending: Promise<void>[]): void {    if (!this.#controller.signal.aborted) this.#controller.abort(reason);    for (const t of this.#processes) pending.push(terminateProcess(t, this.#graceMs));    this.#processes.clear();    for (const c of this.#children) c.#abortTree(reason, pending);    this.#children.clear();  }

Or skip the installer.

Node 24 and pnpm. Clone, build, start, then open 127.0.0.1:4747.

tty0 · monsters0.1.0-alpha.18
monsters help
monsters 0.1.0-alpha.18 - local agentic hub

Usage: monsters <command> [options]

Commands:
  start      Start the core in the foreground (Ctrl+C to stop)
  status     Show whether the core is running and what it is doing
  kill       Stop every agent now (kill switch); nothing runs until resume
  resume     Allow agents to run again after a kill
  chat                    Interactive chat in the terminal (also over SSH): answers as they are
                          written, questions with numbered options, /stop, /nuova, /stato
  chat <text>             Send a message (to the orchestrator, or --to / @Name) and follow the run
  chat /nuova [@Name]     Start a new conversation (alias /new): the agents no longer see
                          the earlier messages, which stay in the log
  answer <id> <n|text>    Answer a question of an agent
  vault reindex           Rebuild the search index of the vault
  automations [list]      The automations: schedule, next run, last run
  automations run <id>    Run an automation now (or as soon as its capo is free)
  log [status]            The archive of the event log: where it is, the monthly files
  log archive             Move the bulky old events (usage, tool results, streamed text…)
                          to ~/.monsters/archive/events-YYYY-MM.jsonl.gz now, then VACUUM
                          (--dry-run: only count them). The core does it once a day by itself
  log read --month YYYY-MM
                          Print the archived events of a month (--type t1,t2; --json)
  secrets                 Where keys and tokens are kept: system keychain or protected files
  secrets export          Decrypt them back to plain files (core stopped; e.g. before moving
                          the data directory to another computer)
  secrets reset           The keychain lost the key of this data directory for good: set the
                          encrypted secrets aside and make a new key (core stopped)
  password                Set a new password for the account, on this computer, with
                          Monsters stopped (asks it twice; every browser session is
                          logged out)
  mcp        MCP server (stdio) with the vault tools, for Claude Desktop, Codex, Cursor…
             (needs the core running; see docs/mcp-vault.md)
  help       Show this help
  version    Print the version

Options:
  --home <dir>            Data directory (default: $MONSTERS_HOME or ~/.monsters)
  --port <n>              Port of the core (default: 4747)
  --host <addr>           Address to bind (start only, default: 127.0.0.1)
  --allow-non-loopback    Allow binding to a non-loopback address (start only)
  --dev                   Also trust the web UI dev server on port 5173 (start only;
                          same as MONSTERS_DEV=1)
  --reason <text>         Why you are stopping (kill only)
  --to <name>             Agent to talk to (chat only)
  --month <YYYY-MM>       Month of the archive to read (log read only)
  --type <t1,t2>          Only these event types (log read only)
  --dry-run               Only count what would move (log archive only)
  --client <name>         Name of the MCP client in the log (mcp only; default: the
                          name the client gives)
  --json                  Machine-readable output (status, kill, resume, automations, log)
Build from sourcegit clone https://github.com/Saturday-Company/monsters && cd monsters && pnpm install && pnpm --filter @monsters/web build && pnpm --filter @monsters/cli exec monsters start

Download

v0.1.0-alpha.17, released 19 October 2026

Open source. Apache-2.0.

Read it, fork it, fix it. Every contributor gets a monster, hatched from their GitHub name.

2★ stars on GitHub
manifesto.b64Hover, focus or tap to decode

WW91ciBjb21wdXRlciBpcyBub3QgYSB0aGluIGNsaWVudCBmb3Igc29tZW9uZSBlbHNlJ3MgY2xvdWQuIE1vbnN0ZXJzIHJ1bnMgaGVyZSBhbmQgYW5zd2VycyB0byB5b3UuIEl0IHdyaXRlcyBwbGFpbiBmaWxlcyB5b3UgY2FuIHJlYWQsIGxvZ3MgZXZlcnkgYWN0aW9uLCBhbmQgc3RvcHMgdGhlIG1vbWVudCB5b3Ugc2F5IHN0b3AuIEJyaW5nIGFueSBtb2RlbC4gS2VlcCB5b3VyIGtleXMuIFVuZG8gYW55dGhpbmcu

Contributors

man monsters

NAME

monsters - your AI squad, on your machine

SYNOPSIS

monsters <command> [options]

Asked by monsters

  • Titan asksDo I actually live on your computer?

    Yes. The core runs on your machine and serves the app at 127.0.0.1:4747. Notes, logs and settings stay on your disk. Only the model calls you choose go out.

  • Rhea asksWhich brain do I get?

    Whichever you plug in. OpenRouter (free models to start), Anthropic, OpenAI, Google, Mistral or Groq with your key; Ollama or LM Studio fully local; or the Claude and ChatGPT subscriptions you already pay for. Each monster gets a chain of models with fallback.

  • Dione asksCan I touch your files?

    Not by default. Terminal and files stay off until you grant them, monster by monster. Every edit to the vault is a git commit you can undo.

  • Tethys asksWhat if I go rogue?

    You pull the lever: the app, /stop on Telegram or monsters kill. Every run aborts, every process dies. Before that, Instinct, a small model, brakes anything that would leave your computer.

  • Enceladus asksWhere do my memories go?

    Into a Markdown vault you can open with Obsidian. monsters mcp also serves it over MCP, so Claude Desktop, Codex or Cursor can read it too.

  • Hyperion asksHow much do I cost?

    The app is free and open source. Models cost what their providers charge, and you set daily and monthly caps. With the free models on OpenRouter, starting costs nothing.

  • Mimas asksCan you talk to me from your phone?

    On Telegram, or over SSH with monsters chat. Projects and automations I come up with arrive as drafts: nothing starts until you confirm.

SEE ALSO

README.mddocs/mcp-vault.mddocs/security-model.mddocs/ARCHITECTURE.md

Monster invadersArrows move. Space fires. Esc quits.
monsters shelltty1

Type help. Tab completes, Esc closes.