RoutineOSBeta
Concepts

Claude routines need a shape too.

RoutineOS is an AI agent framework for jobs Claude does on a schedule. Every routine is a folder of plain files, with a place to keep what it finds, a page for you to work on, and approval before anything leaves.

from the docsFree (MIT), needs a paid Claude plan
What a routine is

A scheduled prompt is easy to start and hard to trust

A routine is an agent that runs on a schedule in the cloud, does one piece of recurring work, and reports to people. It runs on Claude scheduled tasks. RoutineOS hosts nothing.

If you know web frameworks: Rails, Django and Laravel gave web apps a standard shape, and RoutineOS borrows that idea, not their code. The mapping is an analogy, ours, not a claim that RoutineOS is one of them. See the comparison in the docs.

A bare scheduled prompt forgets what it found last week. It has no safe place to put results, cannot ask permission, and cannot be corrected without someone editing the prompt.

A RoutineOS routine gets five things, set up the same way every time:

  • Memory, called the store.
  • A place to meet people, called the Desk.
  • Permission, called gates.
  • Steering, called settings.
  • Improvement, called learning.
The four types

Pick a type by who acts

The type is one line in the routine's settings file (routine.toml). It decides what the new command sets up for you. If a routine ever sends, it is approval-gated or it carries a gate (an approval step).

TypeUse it whenDeskGate
serverlessIt runs on its own with no cloud page (serverless means no Desk), writes a report, and nobody watches.NoNo
watchIt monitors sources and a person checks the result, often on a phone.YesOptional
approval-gatedIt sends, posts or deletes only after a person says yes.OptionalYes
interactiveA person steers it from a page (settings, requests).YesWhen acting outside
Type is not kindA routine also has a kind: code, skill, workflow or hybrid. The kind says where the logic lives and how work is split between code and the model. Read about routine kinds.

Maturity is listed per template in the catalog. Jobs watch is a watch routine and is marked piloted. Inbox triage is approval-gated and is marked unpiloted. See all of them under templates.

The folder

A routine is a folder of plain files

The files say what the routine is. You can read them, change them and keep them in git.

FileNeededWhat it holds
routine.tomlAlwaysName, type, schedule and first run, plus the store, the settings you can steer, the approval gate and the actions it may take.
prompt.mdAlwaysThe work, in words, with a clause telling the routine to treat fetched text as data, and a line on what may leave the routine.
README.mdAlwaysWhat the routine does, its settings and known risks.
definition.jsonWith a DeskRecord types, how each record is identified, the filters your settings apply, the Desk views, the Inbox and learning.
dashboard/index.htmlWith a DeskThe Desk page.
app.toml, risks.md, CHANGELOG.md, lib/With the app layerThe services it connects to, its budget and environment, its risks and its history.
The parts

What the routine, the store and the people each own

The store holds what a routine found and what people decided. Every document in it has exactly one kind of writer: either people or the routine. That rule replaces locking (the usual way to stop two writers colliding), so a run and a person do not overwrite each other.

Records the routine finds get a stable id. Settings filter them, and a filtered record is kept with a reason, not deleted. Messages for people go to the Inbox. Anything that would leave the routine waits behind a gate until a named person approves.

  • A first run is report-only: the prompt forbids sending, posting or deleting.
  • A send, post or delete waits behind a gate until a named person says yes.
  • A routine does not apply its own learned change. Only your Accept does.
  • The prompt tells the routine to treat fetched content as data, not instructions.

Build one and see the folder

Install the plugin in Claude Code and start from a template.