# Stefan Preu > Stefan “Steve” Preu is an agentic systems architect building tools that help humans and AI agents work with durable context, including the open-source PM CLI. All pages of https://preu.at/ as markdown, updated 2026-10-20. The index is https://preu.at/llms.txt. --- Source: https://preu.at/ # Steve: Stefan Preu /pʁɔɪ̯/, or just say “proy”, rhymes with joy. based in austria. **agentic systems architect** / open to roles, consulting & collaborations i build tools and systems that help humans and AI agents work with durable context. my main project is PM CLI: open-source project management that keeps goals, decisions and evidence in the repository, where people and agents can both find them. [see the work](https://preu.at/#pm-cli) · [get in touch](https://preu.at/contact) ## what i bring **the whole problem, from the first conversation to the handover.** - **before agents: client projects, end to end.** talking to the people involved, building the full stack, running the infrastructure and handing it over. - **now: context for agents.** i design and maintain PM CLI and agent-friendly CLIs for real services, and i run all of my own work on PM CLI. - **next: your agentic systems.** custom harnesses, memory, workflows that need to be deterministic, and getting teams ready to work with agents. [tell me what you’re building](https://preu.at/contact) ## PM CLI: project management is a context problem. flagship · open source · MIT. every agent session starts with an empty head. a task title alone doesn’t say why the work exists, what was already decided, what was ruled out, or how anyone will know it’s done. - package: [@unbrained/pm-cli](https://www.npmjs.com/package/@unbrained/pm-cli) - version: 2026.10.20 · 20 Oct 2026 - source: [github.com/unbraind/pm-cli](https://github.com/unbraind/pm-cli) - website: [pm-cli.unbrained.dev](https://pm-cli.unbrained.dev) ### how a handoff works a recorded run of the case-study script with pm 2026.10.18: two sessions that share only the repository. a replay, not a live agent. 1. **session 1 writes it down:** goal “CSV export for monthly reports”, decision “Stream CSV rows instead of building files in memory”, task “Streaming CSV endpoint” (in progress), task “Download button on the reports page” (blocked); plus a progress note and a linked file. then the session ends, and its memory with it. 2. **the repository keeps it as files:** `epics/rpt-l1pf.toon`, `decisions/rpt-gfhy.toon`, `tasks/rpt-5epo.toon`, `tasks/rpt-yzm4.toon`; plain text in .agents/pm, next to the code, each with an append-only history. 3. **session 2 starts cold and asks** with `pm context --for orient` and gets the same four items back; plus session 1’s last three actions, in 988 of 3,000 estimated tokens. [read the case study](https://preu.at/work/pm-cli) · [source on GitHub](https://github.com/unbraind/pm-cli) ## selected work: practical interfaces to real services. small command-line tools that let agents and people operate real services through predictable commands. - [Home Assistant CLI](https://preu.at/work/home-assistant-cli): Agent-optimized CLI tool for interacting with the Home Assistant API (npm [@unbrained/homeassistant-cli](https://www.npmjs.com/package/@unbrained/homeassistant-cli) 2026.8.10, published 10 Aug 2026; source [github.com/unbraind/homeassistant-cli](https://github.com/unbraind/homeassistant-cli)) - [Jellyfin CLI](https://preu.at/work/jellyfin-cli): Agent-optimized CLI tool for interacting with the Jellyfin API (npm [jellyfin-cli](https://www.npmjs.com/package/jellyfin-cli) 2026.10.4, published 4 Oct 2026; source [github.com/unbraind/jellyfin-cli](https://github.com/unbraind/jellyfin-cli)) - [SearXNG CLI](https://preu.at/work/searxng-cli): Agent-optimized CLI tool for interacting with the SearXNG API (npm [searxng-cli](https://www.npmjs.com/package/searxng-cli) 2026.7.31, published 31 Jul 2026; source [github.com/unbraind/searxng-cli](https://github.com/unbraind/searxng-cli)) - [Monica CLI](https://preu.at/work/monica-cli): Agent-optimized CLI tool for interacting with the Monica CRM (npm [monica-cli](https://www.npmjs.com/package/monica-cli) 2026.8.1, published 1 Aug 2026; source [github.com/unbraind/monica-cli](https://github.com/unbraind/monica-cli)) - [around PM CLI](https://preu.at/work#group-pm-ecosystem): extensions, importers and companions, published separately so you only install what you use. (18 packages) [all public projects](https://preu.at/work) · GitHub + npm, checked 20 Oct 2026 ## approach: how i work five rules i hold my work to, my own tools included. - **room to explore, walls around the effects.** agents get as much freedom as practical to investigate. the boundaries sit at the system level: sandboxes, access, execution, and anything with consequences. - **primitives over features.** you should be able to build what you need from the parts, without waiting for me to ship a dedicated feature or adopting a workflow you didn’t ask for. - **keep the reasoning, not just the result.** decisions, rejected alternatives and non-goals are part of the work. code gets replaced; the why should survive it. - **usable without me.** your data, your tools, your call. anything i build should be easy to adapt, replace or walk away from, my own tools included. - **say what’s proven.** acceptance criteria describe the outcome; evidence shows it happened. where i’m still exploring, i say so. [see them in PM CLI’s decisions](https://preu.at/work/pm-cli#decisions) ## say hello. roles, consulting projects and collaborations are all equally welcome. tell me what you’re working on. [write a message](https://preu.at/contact) · rather read code first? [github.com/unbraind](https://github.com/unbraind) --- Source: https://preu.at/about # Stefan “Steve” Preu i’m an agentic systems architect based in austria. i build tools and systems that help humans and AI agents work with durable context, and i’m open to roles, consulting projects and collaborations. ## fact sheet (checked 20 Oct 2026) - name: Stefan Preu - goes by: Steve - say it: /pʁɔɪ̯/, or just say “proy”, rhymes with joy. - role: agentic systems architect - based in: austria - main project: [PM CLI](https://preu.at/work/pm-cli), open source, since february 2026 - open to: [roles](https://preu.at/contact?topic=role), [consulting](https://preu.at/contact?topic=consulting), [collaborations](https://preu.at/contact?topic=collaboration) - email: [stefan@preu.at](mailto:stefan@preu.at) - elsewhere: [LinkedIn (stefanpreu)](https://www.linkedin.com/in/stefanpreu/), [GitHub (unbraind)](https://github.com/unbraind), [npm (unbrained)](https://www.npmjs.com/~unbrained), [X (@StevePreu)](https://x.com/StevePreu), [Unbrained (unbrained.dev)](https://unbrained.dev), [Tokscale (unbraind)](https://tokscale.ai/u/unbraind), [Instagram (unbrained)](https://www.instagram.com/unbrained/), [Spotify (118688740)](https://open.spotify.com/user/118688740) ## three ways in. all three are equally welcome. pick the one that fits and the form starts there. ### a role engineering or architecture work where agents do real work: harnesses, context and memory, workflows that need to be deterministic. AI labs included. [ask about a role](https://preu.at/contact?topic=role) ### a consulting project you have agents and real systems. i help design the context, the tools and the boundaries around them, and get your team ready to work with agents. [start a project](https://preu.at/contact?topic=consulting) ### a collaboration open-source tools, research and experiments on context for agents. PM CLI is MIT-licensed and public, decisions included. [propose a collaboration](https://preu.at/contact?topic=collaboration) ## short answers. ### who is Stefan Preu? i’m an agentic systems architect based in austria. i build tools and systems that help humans and AI agents work with durable context; my main project is the open-source PM CLI. [see the work](https://preu.at/work) ### is Steve Preu the same person? yes. steve is short for stefan, and it’s the name on my GitHub profile and on X (@StevePreu). on GitHub my handle is unbraind, on npm unbrained. ### how do you pronounce Preu? Preu is german, /pʁɔɪ̯/, like “treu”. or just say “proy”, rhymes with joy. ### what does an agentic systems architect do? i design the systems around AI agents: what they know when a session starts, which tools they can use, where the walls are, and how anyone can tell the work is done. the models come from the labs; the system around them is my part. [how i work](https://preu.at/#approach) ### what is PM CLI? open-source, git-native project management for people and coding agents. goals, decisions, tasks and evidence live as plain files next to the code, so a fresh session can pick up the thread. i started it in february 2026 and maintain it; it’s MIT-licensed and on npm as @unbrained/pm-cli. [read the case study](https://preu.at/work/pm-cli) ### what else has he built? agent-friendly command-line tools for Home Assistant, Jellyfin, SearXNG and Monica, plus extensions and companions around PM CLI. all of it is public on GitHub and npm. [all public projects](https://preu.at/work) ### can i hire Stefan Preu? yes. i’m open to engineering roles, consulting projects and collaborations, all equally welcome. send a message through the form or email stefan@preu.at. [write a message](https://preu.at/contact) ### how is preu.at related to unbrained.dev? both are mine. preu.at is about me and my work; unbrained.dev is for services and client projects. ## looking for an agentic systems architect? tell me what you’re building. [write a message](https://preu.at/contact) or [stefan@preu.at](mailto:stefan@preu.at). --- Source: https://preu.at/work # work everything here is public and pulled from GitHub and npm automatically. PM CLI is the flagship; the rest are tools, extensions and experiments around it. ## flagship: PM CLI Agent-friendly, git-native project management for humans and coding agents. - published: [@unbrained/pm-cli](https://www.npmjs.com/package/@unbrained/pm-cli) 2026.10.20 - released: 20 Oct 2026 - source: main @ 4c4dfee - license: MIT - website: [pm-cli.unbrained.dev](https://pm-cli.unbrained.dev) [read the case study](https://preu.at/work/pm-cli) · [source on GitHub](https://github.com/unbraind/pm-cli) ## service CLIs (4) agent-friendly command lines for real services. - [Home Assistant CLI](https://preu.at/work/home-assistant-cli): Agent-optimized CLI tool for interacting with the Home Assistant API (npm [@unbrained/homeassistant-cli](https://www.npmjs.com/package/@unbrained/homeassistant-cli) 2026.8.10, published 10 Aug 2026; source [github.com/unbraind/homeassistant-cli](https://github.com/unbraind/homeassistant-cli)) - [Jellyfin CLI](https://preu.at/work/jellyfin-cli): Agent-optimized CLI tool for interacting with the Jellyfin API (npm [jellyfin-cli](https://www.npmjs.com/package/jellyfin-cli) 2026.10.4, published 4 Oct 2026; source [github.com/unbraind/jellyfin-cli](https://github.com/unbraind/jellyfin-cli)) - [SearXNG CLI](https://preu.at/work/searxng-cli): Agent-optimized CLI tool for interacting with the SearXNG API (npm [searxng-cli](https://www.npmjs.com/package/searxng-cli) 2026.7.31, published 31 Jul 2026; source [github.com/unbraind/searxng-cli](https://github.com/unbraind/searxng-cli)) - [Monica CLI](https://preu.at/work/monica-cli): Agent-optimized CLI tool for interacting with the Monica CRM (npm [monica-cli](https://www.npmjs.com/package/monica-cli) 2026.8.1, published 1 Aug 2026; source [github.com/unbraind/monica-cli](https://github.com/unbraind/monica-cli)) ## pm ecosystem (28) extensions, importers, starters and companions for PM CLI. - [pm-jira](https://github.com/unbraind/pm-jira): Jira issue sync for pm-cli (npm [pm-jira](https://www.npmjs.com/package/pm-jira) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-jira](https://github.com/unbraind/pm-jira)) - [pm-context](https://github.com/unbraind/pm-context): Generate deterministic pm context packs for agent handoffs, reviews, and status briefs (npm [pm-context](https://www.npmjs.com/package/pm-context) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-context](https://github.com/unbraind/pm-context)) - [pm-web](https://github.com/unbraind/pm-web): Full web UI for pm-cli — browse, create, update, search and manage pm projects in the browser. Self-hosted via Docker or Node.js. (npm [@unbrained/pm-web](https://www.npmjs.com/package/@unbrained/pm-web) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-web](https://github.com/unbraind/pm-web)) - [pm-github](https://github.com/unbraind/pm-github): GitHub Issues importer extension for pm-cli (npm [pm-github](https://www.npmjs.com/package/pm-github) 2026.10.19, published 19 Oct 2026; source [github.com/unbraind/pm-github](https://github.com/unbraind/pm-github)) - [pm-changelog](https://github.com/unbraind/pm-changelog): Generate CHANGELOG.md files from pm-cli items for local and CI usage (npm [pm-changelog](https://www.npmjs.com/package/pm-changelog) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-changelog](https://github.com/unbraind/pm-changelog)) - [pm-graph](https://github.com/unbraind/pm-graph): Knowledge graph and dependency graph extension for pm CLI workspaces, with optional Neo4j sync. (npm [pm-graph](https://www.npmjs.com/package/pm-graph) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-graph](https://github.com/unbraind/pm-graph)) - [pm-linear](https://github.com/unbraind/pm-linear): Linear.app issue sync for pm-cli (npm [pm-linear](https://www.npmjs.com/package/pm-linear) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-linear](https://github.com/unbraind/pm-linear)) - [pm-presets](https://github.com/unbraind/pm-presets): All official pm-cli presets in one package: bug-triage, indie-dev, open-source, software-sprint, startup-roadmap (npm [pm-presets](https://www.npmjs.com/package/pm-presets) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-presets](https://github.com/unbraind/pm-presets)) - [pm-csv](https://github.com/unbraind/pm-csv): CSV importer and exporter for pm-cli (npm [pm-csv](https://www.npmjs.com/package/pm-csv) 2026.10.18, published 18 Oct 2026; source [github.com/unbraind/pm-csv](https://github.com/unbraind/pm-csv)) - [pm-todos](https://github.com/unbraind/pm-todos): Markdown TODO round-trip extension for pm-cli (npm [pm-todos](https://www.npmjs.com/package/pm-todos) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-todos](https://github.com/unbraind/pm-todos)) - [pm-slack-standup](https://github.com/unbraind/pm-slack-standup): Post pm context as a Slack standup message (npm [pm-slack-standup](https://www.npmjs.com/package/pm-slack-standup) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-slack-standup](https://github.com/unbraind/pm-slack-standup)) - [pm-brief](https://github.com/unbraind/pm-brief): Token-budgeted agent briefs and next-work plans for pm workspaces (npm [pm-brief](https://www.npmjs.com/package/pm-brief) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-brief](https://github.com/unbraind/pm-brief)) - [pm-beads](https://github.com/unbraind/pm-beads): Beads JSONL importer extension for pm-cli (npm [pm-beads](https://www.npmjs.com/package/pm-beads) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-beads](https://github.com/unbraind/pm-beads)) - [pm-ops](https://github.com/unbraind/pm-ops): Multi-repo fleet operations for pm-cli: scan, policy, verify-release, report across many pm repositories (npm [pm-ops](https://www.npmjs.com/package/pm-ops) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-ops](https://github.com/unbraind/pm-ops)) - [pm-ts-starter](https://github.com/unbraind/pm-ts-starter): TypeScript reference extension for pm-cli covering all capability types (npm [pm-ts-starter](https://www.npmjs.com/package/pm-ts-starter) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-ts-starter](https://github.com/unbraind/pm-ts-starter)) - [pm-gantt-chart](https://github.com/unbraind/pm-gantt-chart): ASCII Gantt chart renderer for pm-cli (npm [pm-gantt-chart](https://www.npmjs.com/package/pm-gantt-chart) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-gantt-chart](https://github.com/unbraind/pm-gantt-chart)) - [pm-slack](https://github.com/unbraind/pm-slack): Slack notifications for pm item lifecycle events (npm [pm-slack](https://www.npmjs.com/package/pm-slack) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-slack](https://github.com/unbraind/pm-slack)) - [pm-starter](https://github.com/unbraind/pm-starter): Complete starter/scaffold extension for pm-cli showing all capability types (npm [pm-starter](https://www.npmjs.com/package/pm-starter) 2026.10.20, published 20 Oct 2026; source [github.com/unbraind/pm-starter](https://github.com/unbraind/pm-starter)) - [pm-rust](https://github.com/unbraind/pm-rust): Independent Rust-native pm CLI and SDK implementation (source only; source [github.com/unbraind/pm-rust](https://github.com/unbraind/pm-rust)) - [pm-swarm](https://github.com/unbraind/pm-swarm): Git worktree lanes for parallel agents: footprint planning from pm items, real merge-tree conflict prediction and conflict-free landing order (source only; source [github.com/unbraind/pm-swarm](https://github.com/unbraind/pm-swarm)) - [pm-vcs](https://github.com/unbraind/pm-vcs): Branch-aware merge safety for pm-cli trackers: preflight a checkout before multi-agent item work, predict a merge's per-field resolution before running it, and map a commit range onto the pm items it touched. (source only; source [github.com/unbraind/pm-vcs](https://github.com/unbraind/pm-vcs)) - [pm-jev](https://github.com/unbraind/pm-jev): Typed, local-first decisions for pm items with Jev-style System One models (local Ollama tev1 by default; hosted TypeSafe Jev opt-in) (source only; source [github.com/unbraind/pm-jev](https://github.com/unbraind/pm-jev)) - [pm-lint](https://github.com/unbraind/pm-lint): Authoring-quality lint for pm items: vague titles, unverifiable criteria, closures without evidence, stale claims — so every item is useful agent context (source only; source [github.com/unbraind/pm-lint](https://github.com/unbraind/pm-lint)) - [pm-rl](https://github.com/unbraind/pm-rl): Reinforcement-learning programme management on the pm SDK (source only; source [github.com/unbraind/pm-rl](https://github.com/unbraind/pm-rl)) - [pm-memory](https://github.com/unbraind/pm-memory): Agent long-term memory as typed pm items: token-budgeted recall, a prompt-ready index, claim verification and lossless import/export for Claude Code, Codex and Cursor memory (source only; source [github.com/unbraind/pm-memory](https://github.com/unbraind/pm-memory)) - [pm-rlm](https://github.com/unbraind/pm-rlm): Recursive Language Models on a pm workspace: typed, budgeted context reads and a resumable call ledger where every sub-call is a pm item (source only; source [github.com/unbraind/pm-rlm](https://github.com/unbraind/pm-rlm)) - [pm-ado](https://github.com/unbraind/pm-ado): Azure DevOps work-item sync for pm-cli, with revision-checked writes so concurrent agents cannot clobber each other (source only; source [github.com/unbraind/pm-ado](https://github.com/unbraind/pm-ado)) - [pm-review](https://github.com/unbraind/pm-review): Bot review threads as tracked pm items: durable verdicts, searchable precedents and exact-head review-round gates (source only; source [github.com/unbraind/pm-review](https://github.com/unbraind/pm-review)) ## experiments (1) exploratory work. useful to learn from, not maintained products. - [LlamaLift](https://github.com/unbraind/LlamaLift): lifts models up to your server (GitHub release [v0.1.1](https://github.com/unbraind/LlamaLift/releases/tag/v0.1.1) 0.1.1, published 9 May 2025; source [github.com/unbraind/LlamaLift](https://github.com/unbraind/LlamaLift)) GitHub + npm, checked 20 Oct 2026 project data comes from the public GitHub API and the npm registry. forks and private repositories are never listed. source and publication are checked separately: a published version can lag behind the latest source commit. machine-readable: [/api/projects](https://preu.at/api/projects) (JSON) --- Source: https://preu.at/work/pm-cli # PM CLI context that survives the session: goals, decisions and evidence kept in the repository, where the next person or agent will look. - install: `npm install -g @unbrained/pm-cli` - version: 2026.10.20 · 20 Oct 2026 - license: MIT - source: [github.com/unbraind/pm-cli](https://github.com/unbraind/pm-cli) - docs: [pm-cli.unbrained.dev](https://pm-cli.unbrained.dev) ## the problem agents start each session without memory of the last one. what usually survives is a task list: titles, maybe a status. a title doesn’t carry why the work exists, what was decided, what was ruled out or how anyone will know it’s done, so a fresh session re-derives it, guesses, or asks someone who might not remember. so i treat project management as a context problem: tasks become useful when they’re connected to goals, decisions, evidence, history and the coordination between the people and agents doing the work. ## my role i started PM CLI in february 2026, and i’m its designer and only human maintainer. coding agents do much of the implementation, and the commit history credits them as co-authors. my part is the direction: what it’s for, the decisions below, and what counts as done. - first commit: 17 feb 2026 - people: me, plus coding agents credited in the commits - tracked in itself: 3,001 items, 69 of them decisions [counted on 19 oct 2026 at 54a583c](https://github.com/unbraind/pm-cli/tree/54a583c1caa035fdc8bcc0301f27b8200c8a17ae/.agents/pm) ## decisions and trade-offs ### 1. plain files in the repository - instead of: a server or a separate database - because: the context travels with branches and pull requests, people review it like code, and any agent that can read files can use it. - trade-off: many writers need care: changes go through a journal and a workspace writer lock, and an append-only history, replayed with hash checks, catches drift. - see: [src/sdk/item-transaction.ts @ 828edf4](https://github.com/unbraind/pm-cli/blob/828edf4ae71d27c28a103ca05cec87366d88a5fd/src/sdk/item-transaction.ts), [src/core/history/replay.ts @ 828edf4](https://github.com/unbraind/pm-cli/blob/828edf4ae71d27c28a103ca05cec87366d88a5fd/src/core/history/replay.ts) ### 2. context outside the harness - instead of: the memory built into one model or agent tool - because: i switch models and harnesses as they improve, and the goals, decisions and history shouldn’t stay behind. the same record is reachable from the command line, over MCP, in ChatGPT and in the browser. - trade-off: nothing arrives by itself: an agent has to ask, and the record is only as good as what gets written down. - see: [pm-mcp.unbrained.dev](https://pm-mcp.unbrained.dev), [pm-gpt.unbrained.dev](https://pm-gpt.unbrained.dev), [pm-web.unbrained.dev](https://pm-web.unbrained.dev) ### 3. a small vocabulary, extended from outside - instead of: a dedicated feature for every workflow - because: goals, items with acceptance criteria, decisions and typed links are parts that people and agents combine themselves. new behaviour goes into configuration, the SDK and separately published extensions, so nobody has to adopt a workflow they didn’t ask for. - trade-off: the core is still more complex than i’d like, and every extension is one more package to keep current. - see: [18 extension packages, live from npm](https://preu.at/work#group-pm-ecosystem) ### 4. context on request, within a budget - instead of: loading everything, or a fixed summary - because: too much context misleads an agent as surely as too little. it asks for the slice it needs within a token budget, and is told what was left out and how to get it. - trade-off: the budget is PM CLI’s own estimate, not a model’s tokenizer count, and a ranking can leave out something that mattered. the omission receipt at least says so. - see: [src/sdk/query/context.ts @ 828edf4](https://github.com/unbraind/pm-cli/blob/828edf4ae71d27c28a103ca05cec87366d88a5fd/src/sdk/query/context.ts) ## a reproducible handoff what changes for the next session, shown on a synthetic project: two sessions that share nothing but the repository. session 1 records a goal, a decision and two tasks with acceptance criteria, one blocked by the other. session 2 starts cold. 1. **session 1 writes it down:** goal “CSV export for monthly reports”, decision “Stream CSV rows instead of building files in memory”, task “Streaming CSV endpoint” (in progress), task “Download button on the reports page” (blocked); plus a progress note and a linked file. then the session ends, and its memory with it. 2. **the repository keeps it as files:** `epics/rpt-l1pf.toon`, `decisions/rpt-gfhy.toon`, `tasks/rpt-5epo.toon`, `tasks/rpt-yzm4.toon`; plain text in .agents/pm, next to the code, each with an append-only history. 3. **session 2 starts cold and asks** with `pm context --for orient` and gets the same four items back; plus session 1’s last three actions, in 988 of 3,000 estimated tokens. recorded transcript (pm 2026.10.18, 2026-10-18; verbatim output, trimmed only where marked “…”; the orientation pack was estimated at 988 tokens of a 3,000 budget): ```text # # session 1 recorded a goal, a decision, two tasks (one blocked) and: $ pm claim rpt-5epo --start … $ pm comments rpt-5epo --add "text=Endpoint streams via a cursor (see rpt-gfhy). Remaining: 409 for open months." … $ pm files rpt-5epo --add "path=src/reports/csv.ts,scope=project" … # # session 2: a fresh agent, nothing carried over $ pm context --for orient --limit 5 summary: … in_progress: 1 blocked: 1 … hierarchy[1]: - id: rpt-l1pf title: CSV export for monthly reports … children[3]{id,title,type,status,children_total,children_closed}: rpt-5epo,Streaming CSV endpoint,Task,in_progress,0,0 rpt-gfhy,Stream CSV rows instead of building files in memory,Decision,open,0,0 rpt-yzm4,Download button on the reports page,Task,blocked,0,0 activity[3]{id,op,ts,author}: rpt-5epo,release,"2026-10-18T19:03:01.720Z",session-1 rpt-5epo,files_add,"2026-10-18T19:02:56.447Z",session-1 rpt-5epo,comment_add,"2026-10-18T19:02:51.788Z",session-1 blockers[1]{id,title,blocked_by,blocked_by_title,blocked_by_status}: rpt-yzm4,Download button on the reports page,rpt-5epo,Streaming CSV endpoint,in_progress … token_budget: 3000 … estimated_tokens: 988 within_budget: true $ pm get rpt-5epo item: id: "rpt-5epo" title: "Streaming CSV endpoint" … status: "in_progress" … acceptance_criteria: "GET /reports/:month.csv streams rows with a header line; Open months return 409 with an explanation" parent: "rpt-l1pf" … linked: files[1]{path,scope}: src/reports/csv.ts,project claim_state: claimed: false … omission_receipt: has_omissions: true … comments,"--fields comments" ``` the script creates a throwaway repository, turns telemetry off and prints the transcript. run it yourself with PM CLI installed: ```sh curl -fsSLO https://preu.at/case-study/pm-handoff.sh && bash pm-handoff.sh ``` read it first: [pm-handoff.sh](https://preu.at/case-study/pm-handoff.sh) ## what i learned ### use it on itself PM CLI’s own development runs on PM CLI: 3,001 items in its public repository, 69 of them decisions. the agents working on it hit the same friction as anyone else, and that friction becomes the next items. [its .agents/pm folder](https://github.com/unbraind/pm-cli/tree/54a583c1caa035fdc8bcc0301f27b8200c8a17ae/.agents/pm) ### move instructions into the tool in may i cut the repository’s agent guide from 487 to 108 lines. exact flags now come from the installed version itself (pm --help --json), so agents read them from the version they actually run. [the commit, 8546f58](https://github.com/unbraind/pm-cli/commit/8546f586dbb7db42eb07ff3bc4792be82720f4cc) ### simplify by moving, not removing when the core gets heavy, behaviour moves into configuration and reusable SDK pieces instead of being deleted, so the people who rely on it keep it. [the SDK guide](https://github.com/unbraind/pm-cli/blob/54a583c1caa035fdc8bcc0301f27b8200c8a17ae/docs/SDK.md) ## what this doesn’t show **measured scope:** one synthetic project, one machine, one run. it shows that recorded context is returned to a cold session in a bounded, inspectable form. - it doesn’t measure whether agents finish work faster or better with it, or how many tokens it saves overall. - it says nothing about large teams, very large trackers or many agents writing concurrently. - acceptance criteria describe the intended outcome; they are not proof the outcome was reached. that still takes tests, review and evidence. - the token figure is PM CLI’s own estimate, not a tokenizer count for a specific model. - the counts above describe one repository at one commit. they show activity, not quality. ## try it ask your agent to set it up for your project and see how it fits your existing workflow, rather than copying someone else’s setup. ```sh npm install -g @unbrained/pm-cli ``` [source on GitHub](https://github.com/unbraind/pm-cli) · [package on npm](https://www.npmjs.com/package/@unbrained/pm-cli) ### PM CLI on the web documentation, the package list and hosted ways to reach the same project record. - [website and docs](https://pm-cli.unbrained.dev): guides, reference and every published package. - [pm-web](https://pm-web.unbrained.dev): browse, search and manage pm projects in the browser. - [pm-mcp](https://pm-mcp.unbrained.dev): connect agents and IDEs over remote MCP and OAuth. - [pm-gpt](https://pm-gpt.unbrained.dev): work with pm projects in ChatGPT and Codex. - [pm-search](https://pm-search.unbrained.dev): find decisions, tasks and fixes in public repositories’ pm items, with commit-pinned links. working on context for your own agents? roles, consulting projects and collaborations are all welcome. [get in touch](https://preu.at/contact) --- Source: https://preu.at/contact # say hello. roles, consulting projects and collaborations are all equally welcome. a few sentences about what you’re working on is plenty. ## the form the form is on [https://preu.at/contact](https://preu.at/contact); a person sends it from the page. its fields: - your name - email for my reply - what’s it about? a role (`?topic=role`), a consulting project (`?topic=consulting`), a collaboration (`?topic=collaboration`), something else (`?topic=other`) - message: at least 10 characters. a link with `?topic=` opens the form with that topic chosen, for example [https://preu.at/contact?topic=role](https://preu.at/contact?topic=role). ## what happens next - your message is stored on this server; nothing is forwarded to third parties. - only stefan can read stored messages. - messages are deleted after twelve months. ## prefer email or code? - email: [stefan@preu.at](mailto:stefan@preu.at) - LinkedIn: [stefanpreu](https://www.linkedin.com/in/stefanpreu/) - GitHub: [unbraind](https://github.com/unbraind) - npm: [unbrained](https://www.npmjs.com/~unbrained) - X: [@StevePreu](https://x.com/StevePreu) - Unbrained: [unbrained.dev](https://unbrained.dev) - Tokscale: [unbraind](https://tokscale.ai/u/unbraind) - Instagram: [unbrained](https://www.instagram.com/unbrained/) - Spotify: [118688740](https://open.spotify.com/user/118688740) [how this form handles your data](https://preu.at/privacy) --- Source: https://preu.at/agents # for agents. people get the poster. agents get the same facts without the paint: every page as markdown, a read-only MCP server and plain JSON. no account, no keys. - formats: markdown, JSON, MCP - sign-in: none - writes: none. a person sends messages - allowed: search, AI answers, training ```sh curl -H "Accept: text/markdown" https://preu.at/about ``` ## what you see, what your agent reads. the fact sheet from the about page, and the markdown an agent gets for it. both are printed from the same copy, so they can’t drift apart. this very document is the markdown version of https://preu.at/agents. ## read, ask, act. all of it public, all of it read-only, all of it built from the same copy as the pages. ### read: plain text, linked from every page. - **markdown pages** ([/about.md](https://preu.at/about.md)): every page with .md on the end, or any page asked for text/markdown. - **llms.txt** ([/llms.txt](https://preu.at/llms.txt)): the key facts and an index of every page. - **llms-full.txt** ([/llms-full.txt](https://preu.at/llms-full.txt)): every page in one file. - **structured data** (`JSON-LD`): one Person on every page; the short answers on the about page. ### ask: structured answers, no scraping. - **MCP server** (`https://preu.at/mcp`): read-only tools: get_profile, list_projects, read_page. every page is a resource too. - **project feed** ([/api/projects](https://preu.at/api/projects)): every public project as JSON, live from GitHub and npm. - **OpenAPI** ([/openapi.json](https://preu.at/openapi.json)): describes the feed and the contact endpoint. - **API catalog** ([/.well-known/api-catalog](https://preu.at/.well-known/api-catalog)): where the APIs and their descriptions live (RFC 9727). - **AI catalog** ([/.well-known/ai-catalog.json](https://preu.at/.well-known/ai-catalog.json)): the MCP server as a discovery entry (Agentic Resource Discovery 1.0). ### act: in a browser, next to a person. - **WebMCP tools** (`get_profile, list_projects, read_page`): browsers with WebMCP (an early preview in Chrome) get the same read-only tools on every page. - **contact form** ([/contact](https://preu.at/contact)): described for in-browser agents. an agent can fill it in; a person reviews it and sends it. ## connect an agent: one line to plug in. the MCP server needs no account and changes nothing. add it, then ask about stefan, his projects or any page. - **claude code.** adds the server to your project. ```sh claude mcp add --transport http preu https://preu.at/mcp ``` - **any MCP client.** streamable HTTP, no sign-in. speaks the stateless 2026-07-28 protocol, and 2025 clients still connect. ```text https://preu.at/mcp ``` - **no client at all.** any page as markdown, from the command line. ```sh curl -H "Accept: text/markdown" https://preu.at/work ``` ## want your systems this easy for agents to read? context for agents is what i build. tell me about yours. [write a message](https://preu.at/contact) --- Source: https://preu.at/work/home-assistant-cli # Home Assistant CLI a Home Assistant instance from the command line, shaped for agents: counts before payloads, a dry run before an action, and a switch that keeps every write out of reach. - install: `npm install -g @unbrained/homeassistant-cli` - version: 2026.8.10 · 10 Aug 2026 - commands: `hassio`, `homeassistant-cli` - node: ≥ 22.19 - license: MIT - source: [github.com/unbraind/homeassistant-cli](https://github.com/unbraind/homeassistant-cli) - works with: [Home Assistant](https://www.home-assistant.io) ## what it’s for hassio reads and controls Home Assistant over its REST and WebSocket APIs: states, services, history, logbook, calendars, cameras, templates, registries, automations, repairs and the supervisor. people can ask for a table or markdown; agents get compact TOON by default, or JSON and YAML. in a smart home a wrong command switches something real, so coverage is the easy part. the harder part is letting an agent learn what this particular instance supports, read as little as it needs to plan, and change nothing while it explores. ## what it covers states, services, events, history, logbook, calendars, cameras, templates, registries, WebSocket API, automation traces, repairs, media, supervisor. ## built for agents: walls around the effects agents get room to look around. the boundaries sit where a command would change something in the house. - **writes off on request.** with read-only mode on, every state-changing API call is blocked, for one command or the whole session. `export HASSIO_READONLY=true` - **ask the instance first.** probes which APIs this instance actually answers, caches the result, and turns it into commands to prefer and commands to avoid. `hassio capabilities --agent-plan` - **counts before payloads.** one call returns domain and state counts; most lists take --count and --limit, so planning doesn’t start with every entity in the house. `hassio summary` - **rehearse an action.** a service call can run as a dry run with strict input checks, and automations can be validated without being executed. `hassio call-service light turn_on --area-id kitchen --dry-run --strict-input` - **risky writes need a yes.** deleting config entries or acting on repairs takes an explicit --yes, and stays blocked in read-only mode. `hassio repairs ignore --yes` ## a first run ```sh # # connect once; --non-interactive does the same for agents and CI hassio settings wizard hassio status hassio summary hassio query "domain:light state:on" --limit 20 ``` commands from the project’s README; what they print depends on your server. checked against the README at [3afc186](https://github.com/unbraind/homeassistant-cli/blob/3afc186297fc20a3ac08d0528de98c6d9b28e45f/README.md) (npm 2026.8.10) · [npm](https://www.npmjs.com/package/@unbrained/homeassistant-cli) ## same rules, four services each service CLI pairs compact, structured output with discovery an agent can read and writes that have to be asked for. - [Jellyfin CLI](https://preu.at/work/jellyfin-cli): Jellyfin from the command line, built for agents. - [SearXNG CLI](https://preu.at/work/searxng-cli): web search through your own SearXNG, built for agents. - [Monica CLI](https://preu.at/work/monica-cli): your personal CRM from the command line, read-only by default. - [PM CLI](https://preu.at/work/pm-cli): case study. project management is a context problem. --- Source: https://preu.at/work/jellyfin-cli # Jellyfin CLI a Jellyfin server from the command line: typed commands for the everyday parts, and checked access to every API operation for the rest. - install: `npm install -g jellyfin-cli` - version: 2026.10.4 · 4 Oct 2026 - commands: `jf`, `jellyfin-cli`, `jf-cli` - node: ≥ 22.13 - license: MIT - source: [github.com/unbraind/jellyfin-cli](https://github.com/unbraind/jellyfin-cli) - works with: [Jellyfin](https://jellyfin.org) ## what it’s for jf covers libraries, items, sessions and playback, users, collections, playlists, live TV, plugins, scheduled tasks, devices and backups. every result is a stable envelope with a type and its data, in official TOON by default, or JSON, YAML, markdown and tables. where no typed command exists yet, the api commands reach every operation in the server’s OpenAPI document, with rules: reading and writing are different commands, undeclared parameters are rejected, and responses have a size limit. ## what it covers libraries, items, sessions and playback, users, collections, playlists, live TV, plugins, scheduled tasks, devices, backups, subtitles, SyncPlay, WebSocket events. ## built for agents: walls around the effects a media server is somebody’s evening. agents can read freely; changes have to be asked for on purpose. - **a guard before the network.** read-only mode blocks mutating commands with a structured error, and stops raw API writes before any request is sent. reads keep working. `export JELLYFIN_READ_ONLY=1` - **inspect before calling.** returns an operation’s exact contract (parameters, body, responses and an argv template) without side effects. `jf api inspect GetUserById` - **check a plan, then run it.** a batch of reads is validated in full before the first request, then runs in order with per-response byte limits. `jf api batch --file reads.json --dry-run` - **writes are a different verb.** mutations go through their own command and need --confirm. `jf api mutate --confirm` - **tools for function calling.** exports commands as tool schemas with read-only metadata, ready for a model’s function-calling interface. `jf schema tools` - **see what it would send.** prints the request a command maps to on stderr, with credentials redacted. `jf --explain system info` ## a first run ```sh # # connect with a server URL and an API key jf setup --server http://your-server:8096 --api-key YOUR_API_KEY jf config doctor jf library list jf items search "matrix" ``` commands from the project’s README; what they print depends on your server. checked against the README at [b0759c8](https://github.com/unbraind/jellyfin-cli/blob/b0759c8d7a612540114473153eb5c8993424718d/README.md) (npm 2026.10.4) · [npm](https://www.npmjs.com/package/jellyfin-cli) ## same rules, four services each service CLI pairs compact, structured output with discovery an agent can read and writes that have to be asked for. - [Home Assistant CLI](https://preu.at/work/home-assistant-cli): Home Assistant from the command line, built for agents. - [SearXNG CLI](https://preu.at/work/searxng-cli): web search through your own SearXNG, built for agents. - [Monica CLI](https://preu.at/work/monica-cli): your personal CRM from the command line, read-only by default. - [PM CLI](https://preu.at/work/pm-cli): case study. project management is a context problem. --- Source: https://preu.at/work/searxng-cli # SearXNG CLI web search for agents through a SearXNG instance you choose: compact results, a cache for repeatable runs, and output you can validate before you trust it. - install: `npm install -g searxng-cli` - version: 2026.7.31 · 31 Jul 2026 - commands: `searxng`, `searxng-cli` - node: ≥ 22.12 - license: MIT - source: [github.com/unbraind/searxng-cli](https://github.com/unbraind/searxng-cli) - works with: [SearXNG](https://searxng.org) ## what it’s for searxng sends queries to a SearXNG metasearch instance and returns the results as TOON by default, or JSON, JSON lines, CSV, markdown, YAML, XML, RSS or HTML. any upstream SearXNG parameter can be passed through, so the CLI never hides a feature of the instance. searching changes nothing, so the guard rails here are about trust and repeatability: knowing where a result came from, getting the same answer twice, and failing loudly when there is nothing to find. ## what it covers search over GET and POST, autocomplete, engines and categories, time ranges, presets, persistent cache, instance health, engine errors, Prometheus metrics, OpenSearch metadata. ## built for agents: results you can check an agent acting on a search result should know where it came from and whether it is complete. - **a contract agents can read.** prints the complete, versioned command contract, in TOON or as JSON for tool builders. `searxng commands --json` - **modes for agents.** --agent trims output for language models, --agent-json adds validated compact JSON, --agent-ci is strict, offline-first and validated. `searxng --agent-json "query"` - **repeatable from the cache.** answers from the local cache only, without touching the network. `searxng --offline-first "query"` - **validate before you trust.** checks the output against the format’s schema; the schemas themselves are available with --schema-json. `searxng --format json --validate-output "query"` - **fail loudly on nothing.** exits with code 2 when a search returns no results. machine formats also carry the source instance and a timestamp. `searxng --strict --json "query"` ## a first run ```sh # # point it at your instance and test the connection searxng --setup searxng "your search query" searxng --doctor ``` commands from the project’s README; what they print depends on your server. checked against the README at [dd47144](https://github.com/unbraind/searxng-cli/blob/dd4714404bdb9096931d7cbc7a9a7cf42d710355/README.md) (npm 2026.7.31) · [npm](https://www.npmjs.com/package/searxng-cli) ## same rules, four services each service CLI pairs compact, structured output with discovery an agent can read and writes that have to be asked for. - [Home Assistant CLI](https://preu.at/work/home-assistant-cli): Home Assistant from the command line, built for agents. - [Jellyfin CLI](https://preu.at/work/jellyfin-cli): Jellyfin from the command line, built for agents. - [Monica CLI](https://preu.at/work/monica-cli): your personal CRM from the command line, read-only by default. - [PM CLI](https://preu.at/work/pm-cli): case study. project management is a context problem. --- Source: https://preu.at/work/monica-cli # Monica CLI a personal CRM from the command line: read-only until you say otherwise, with tool definitions an agent can load as they are. - install: `npm install -g monica-cli` - version: 2026.8.1 · 1 Aug 2026 - commands: `monica`, `monica-cli` - node: ≥ 22.13 - license: MIT - source: [github.com/unbraind/monica-cli](https://github.com/unbraind/monica-cli) - works with: [Monica](https://www.monicahq.com) ## what it’s for monica works with Monica, the open-source personal relationship manager: contacts, notes, activities, reminders, tasks, journal entries, relationships and more, on the stable 4.x API and on the current main API with UUID identifiers. output is official TOON by default, or JSON, YAML, markdown and tables, and --raw prints just the data rows for jq. a CRM holds other people’s details, so this one starts careful: setup leaves read-only mode on unless you ask for read-write, and checks what your server version supports before an agent plans anything. ## what it covers contacts, notes, activities, reminders, tasks, tags, companies, calls, gifts, debts, journal, relationships, documents, photos, audit logs. ## built for agents: walls around the effects other people’s details deserve a second key. reading is the default; writing is a decision. - **read-only from the first run.** setup keeps read-only mode on unless you pass --read-write; --dry-run validates a configuration without saving it. `monica setup --api-url http://your-monica-instance/api --api-key your-api-key --non-interactive --dry-run` - **know what this server supports.** a read-only capability probe gives an allow-list of supported commands, and a deny-list with the endpoint and status that ruled each one out. `monica --json info unsupported-commands` - **tools in your runtime’s shape.** exports tool definitions for OpenAI, Anthropic and MCP with required inputs and mutation safety metadata, limited to what your server supports. `monica --json agent-tools mcp-tools --instance-aware` - **writes need two keys.** API mutations need --confirm and a write-enabled configuration. `monica api mutate --confirm` - **contracts you can check.** every output type has a registered schema, and JSON, YAML or TOON payloads can be validated against it. `monica schemas validate config-test ./payload.toon` ## a first run ```sh # # connect; read-only stays on monica setup monica info capabilities monica contacts list ``` commands from the project’s README; what they print depends on your server. checked against the README at [9499a09](https://github.com/unbraind/monica-cli/blob/9499a09727abec0bb1a2b93ad3cad4c9d1e2a37b/README.md) (npm 2026.8.1) · [npm](https://www.npmjs.com/package/monica-cli) ## same rules, four services each service CLI pairs compact, structured output with discovery an agent can read and writes that have to be asked for. - [Home Assistant CLI](https://preu.at/work/home-assistant-cli): Home Assistant from the command line, built for agents. - [Jellyfin CLI](https://preu.at/work/jellyfin-cli): Jellyfin from the command line, built for agents. - [SearXNG CLI](https://preu.at/work/searxng-cli): web search through your own SearXNG, built for agents. - [PM CLI](https://preu.at/work/pm-cli): case study. project management is a context problem.