# Rails map

Source: https://routineos.org/concepts/rails-map

> Records are models, producers are jobs, gates are before_action checks and the Desk is the view. Where the Ruby on Rails analogy holds and where it breaks.

Concepts

# How RoutineOS maps to Rails, Django and Laravel

Web frameworks gave apps a standard shape. RoutineOS gives Claude routines one, and borrows the idea, not the code. This map shows which RoutineOS part matches which framework idea, and where the match stops.

[Get started](https://routineos.org/#start)[How RoutineOS works](https://routineos.org/concepts)

an analogy, ours

The map

## Models, jobs, views and the rest

Only the Rails, Django model and Laravel queued jobs and scheduling mappings come from the repo's references/rails-map.md. The other cells are our own analogy, unchecked, and not a claim made by any of those frameworks.

| RoutineOS | Rails | Django | Laravel |
|---|---|---|---|
| Routine type | App template | Project template | Starter kit |
| Records and the store | Models, database | Models, ORM | Eloquent |
| Settings | Config, credentials | Settings | Config, .env |
| Producers (the prompt or a script) | Jobs | Management commands | Queued jobs |
| Gates | before_action, approvals | Permissions, admin actions | Policies, gates |
| The Desk | Views | Templates | Blade views |
| The command line | rails g, console | manage.py | artisan |

In RoutineOS terms: a [Desk](https://routineos.org/concepts/desk) is the view, and a [gate](https://routineos.org/concepts/approvals) is the check before an action leaves. A routine's schedule is a cron in UTC, and its settings and connectors hold the config. Connectors hold authentication, so no secrets go in the store or the prompt.

Where it holds

## Convention over configuration

- **Conventions.** A routine has a `routine.toml`, a prompt, typed settings and a README, the way an app has config, routes and views.
- **Generators.** `routineos.py new` scaffolds the same files every time.
- **A linter as the guard rail.** It fails on a setting with no default, a schedule faster than hourly, or a prompt without the untrusted-data clause.
- **Checks before actions.** A gate works like a before_action: a pending record, then a later run resumes.

For the console idea, `lint` and `doctor` check a routine and your setup. A dry-run mode is planned, not built.

Generators and checks are the part a Rails person finds familiar first. Try `routineos.py new my-watch --from-template watch`.

Where it breaks

## Five places the analogy stops

- No schema enforcement. The artifact database has no joins and does not validate shape, so the prompt and lint carry the schema.
- No migrations tool. Version a record shape with a schema field and have the prompt tolerate older shapes.
- No long-running process. Every run is a fresh sandbox with no in-memory state and no documented overlap guard, so design reruns to be safe to repeat.
- Coarse scheduling. One hour is the minimum interval, in UTC.
- The runtime is a model. A run can misread a page, so health records compare parsed counts with claimed counts.

**A moving base**Claude scheduled tasks are a research preview and may change. A framework on top inherits that.

RoutineOS does not borrow an ORM, migrations, a package ecosystem or a server, and does not claim parity with any of them. For the other tools people weigh it against, see [compare](https://routineos.org/compare).

## Try the generator

Install the plugin in Claude Code and scaffold a routine with `new`. Then read the folder it writes.

[Get started](https://routineos.org/#start)[Read the docs](https://docs.routineos.org/introduction/comparison)
