px0 - An agent that works the way you work.

· px0

8 min read Original article ↗

local-first · open source

px0 is a local, open-source agent built around the way you work. Tell it a chore in plain English and it writes, schedules, and runs the workflow itself, wired to 1,000+ apps you already use. No server. No dashboard. Nothing hosted.

$curl -fsSL https://px0.ai/install.sh | sh

  • macOS & Linux
  • MIT licensed

workflows

Say it once.
Watch it get built.

Describe a recurring job once and it gets written as a workflow you can run, schedule, and edit, wired to 1,000+ apps you already use.

$

answer in your own words; press Enter on a blank line to stop

What do you want px0 to do for you?

everyday at 9pm summarize all the commits I made and PRs I reviewed and post it to #eng-standup

Checking the request for gaps

a few questions

Which Slack channel should the digest go to? #eng-standup

Which repositories should it look at? px0-ai/px0

Searching Composio's catalogue (3 queries)

Choosing from 18 candidates

tools selected (3)

read GITHUB_LIST_PULL_REQUESTS

read GITHUB_LIST_REVIEWS_FOR_A_PULL_REQUEST

write SLACK_SEND_MESSAGE

! this workflow could change things outside px0

keep all? y

created friday-pr-digest

schedule 0 17 * * 5

guidelines summarization.md

output output/digests/pr-{date}.md


one sentence in

The chores you keep doing by hand

Every line below is one sentence you type into px0 workflows new. Pick one to see what px0 writes: the schedule it pulled out of your words, the tools it went looking for, and which of them can change something outside px0.

workflows/friday-pr-digest.mdscheduled

trigger
0 17 * * 5every Friday, 17:00 local

inputs
readgithub: list pull requestsreadgithub: list pull request reviews

tools
writeslack: send message to a channel

output
file · output/digests/pr-{date}.md

px0 workflows run friday-pr-digestwrite tools are stubbed under --dry-run

workflows/morning-brief.mdscheduled

trigger
30 7 * * 1-5weekdays, 07:30 local

inputs
readcalendar: list events in a windowreadgmail: search messages

tools
none: this one only reads

output
file · output/brief-{date}.md

px0 workflows run morning-brief

workflows/spike-to-ticket.mdscheduled

trigger
0 9 * * *daily, 09:00 local

inputs
readsentry: list recent issues

tools
writelinear: create an issue

output
file · output/triage-{date}.md

px0 workflows run spike-to-ticketwrite tools are stubbed under --dry-run

workflows/sprint-status.mdscheduled

trigger
0 10 * * 1every Monday, 10:00 local

inputs
readjira: search issues in a sprint

tools
writeslack: send message to a channel

output
file · output/sprint-{date}.md

px0 workflows run sprint-statuswrite tools are stubbed under --dry-run


your machine, your files

A bare directory that you can access

Everything px0 knows is stored as plain Markdown in a directory you fully control. You can access all files as-is in your favorite editor, open your knowledge base in Obsidian, grep them, or back them up. Edit a workflow by hand and the next run picks it up, with no compile step in between.

  • Runs locally. The model backend is a coding agent CLI you already sign into.
  • No account. Nothing to create, nothing to cancel, no seat to pay for.
  • Portable. px0 store export copies content and history anywhere.
  • Traceable. px0 runs why retraces a result to the guidelines, passages, and tool calls behind it, and a fire your laptop slept through still runs when it wakes.

~/.px0plain markdown

~/.px0your store, move it with PX0_HOME

├──workflows/the jobs px0 can run

│ ├──friday-pr-digest.md

│ └──morning-brief.md

├──guidelines/how you work

│ ├──commit-messages.md

│ └──code-review/go.md

├──brain/what you have read and kept

│ ├──blogs/ papers/ docs/

│ └──work/never leaves this machine

├──output/what runs produced

└──config.toml

guidelines/

It writes in your voice

Guidelines are Markdown files describing your conventions: how you word a commit message, what your Go reviews check. A workflow that needs one inlines it verbatim, so output comes back sounding like you instead of like a model.

px0 guidelines edit
brain/

A library you can question

Add posts, papers, docs, and video transcripts as you read them. Text is extracted locally and indexed, so you can ask questions across everything you kept, with the passages it used cited back.

px0 brain ask "…"
.state/

Its own history, no git

Every version of every file is kept by px0 itself, so the store works as a bare directory. Hand-edit a workflow and the next run picks it up; the edit still shows up in the log, and still reverts.

px0 changes revert <id>

guardrails

Nothing goes out
that you did not approve

A workflow that can post to Slack is a workflow that can embarrass you. px0 treats the boundary between reading and changing things as the important one, and puts you at every crossing of it.

tools selected (3)
  1.  read   composio:GITHUB_LIST_PULL_REQUESTS
  2.  read   composio:GITHUB_LIST_REVIEWS_FOR_A_PULL_REQUEST
  3.  write  composio:SLACK_SEND_MESSAGE

! this workflow could change things outside px0  SLACK_SEND_MESSAGE

Enter accepts all; list numbers to drop (e.g. 2,3); n aborts
 keep all? 
  • Access comes from the provider, not a guess

    Every tool is labelled read, write, or destructive using Composio’s own metadata. px0 never infers access from a tool’s name.

  • You approve the tool list first

    The build stops and shows you what it picked. Drop anything by number. Nothing is authorized until you say keep.

  • Consent happens in your browser

    px0 preparing an authorization URL grants it nothing. Access exists only after you approve it at the provider.

  • Dry runs stub every write

    px0 workflows run --dry-run resolves the real inputs and calls nothing that could post, send, or change anything.

  • work/ never leaves the machine

    Anything under brain/work/ is excluded from every retrieval (a hard exclusion, not a ranking penalty), so it never reaches a model, a connector, or a workflow output.


what else is in the box

Small surface. Long reach.

One CLI, one directory, one API key for the outside world, and everything else is already on your machine.

connections

Reaches the apps you already live in

Tools route through Composio, so there is exactly one key to set up and no per-app connect command to hunt for. Apps authorize themselves: the first time a workflow needs Gmail, px0 prepares Gmail’s authorization and hands you the URL. You never connect a service you turn out not to need.

model backend

Runs on the agent CLI you already sign into

px0 shells out to a coding agent CLI in non-interactive mode, reusing its login, its model choice, and its rate limits. There is no separate API key to add and no bill to split.

claudegeminipiopencode

px0 config model

It invokes the backend before saving, so a typo’d model name fails there instead of mid-workflow.

guidelines

Guidelines you never write from scratch

When a build leans on a convention you have not written down (a commit format, a review rubric), px0 drafts the guideline from the workflow itself and shows it to you before saving. Reword it once and every run inlines your version, verbatim.

px0 mcp serve

Speaks MCP, not just CLI

Point Claude Code, or any MCP client, at px0 and it can ask your brain a question, list your workflows, and run one, all over stdio with no SDK involved. Running a workflow stays off until you pass --allow-runs.

retrieval

Keyword by default, semantic when you want it

SQLite FTS5 with BM25 ships built in, nothing to install. Switch the backend to qmd for hybrid vector search with reranking. It prints the model download size and waits for a yes.


how it stacks up

Not another agent framework

px0 isn’t trying to out-orchestrate CrewAI or out-chat Hermes. It occupies a narrower spot: turn one sentence into a scheduled, editable, local Markdown workflow.

factorpx0Hermes AgentCrewAI / LangGraphn8n / DifyKhoj / PKM Copilot
Natural language workflow creation
Human-editable Markdown workflows
Zero-server, local-first operation
Native unattended scheduler
Local vault / second-brain ingest
Dry-run mode for verification
Workflow change history & rollback
Multi-agent orchestration

the whole surface

Entity first, then the verb

Twenty-odd commands, all shaped the same way, and --help on every one of them.

workflows

  • px0 workflows newTurn a sentence into a workflow
  • px0 workflows runRun one now, or pick from a list
  • px0 workflows editRevise the request and rebuild it
  • px0 workflows listEverything you can run

brain

  • px0 brain addSave a URL, PDF, doc, or transcript
  • px0 brain askAnswer a question from your library
  • px0 brain searchRetrieve the matching passages
  • px0 brain reindexRebuild the retrieval index

guidelines

  • px0 guidelines listEvery convention, numbered
  • px0 guidelines editReword a draft into your voice
  • px0 guidelines showPrint one, verbatim
  • px0 guidelines logOne claim’s edit history

runs & changes

  • px0 runsBrowse, filter, and re-run past runs
  • px0 runs whyHow a run reached its result
  • px0 changes listWhat changed, across the store
  • px0 changes revertUndo a recorded change

the install

  • px0 daemon installRun workflows on a schedule
  • px0 tools list --statusWhat can be called, and what is ready
  • px0 statusWhether anything needs attention
  • px0 doctorCheck that everything is wired up

install

Your next recurring chore
should write itself.

One command to install. One sentence to your first workflow. Everything it creates stays on your machine, in files you can read.

$curl -fsSL https://px0.ai/install.sh | sh

What you need

  • Python 3.11+the installer bootstraps pipx if you do not have it
  • A coding agent CLIclaude, gemini, pi, or opencode, whichever you already sign into
  • A Composio API keyonly for workflows that reach other apps; add it whenever

First four commands

  1. 1px0 initscaffolds ~/.px0 and asks for your Composio key
  2. 2px0 workflows newanswer "what do you want px0 to do?"; it writes the file
  3. 3px0 workflows run <id> --dry-runresolve every input, call nothing
  4. 4px0 daemon installlet the schedule fire on its own

Want to try it without connecting anything? The brain needs nothing beyondpx0 init. Add a post withpx0 brain add <url> and ask it a question.