# vs n8n

Source: https://routineos.org/compare/n8n

> An n8n alternative: convert a workflow to a Claude routine. Writes sit behind an approval gate. Free (MIT). Needs a paid Claude plan.

Compare / n8n

# Convert an n8n workflow to a Claude routine. Anything it cannot carry over is listed, not guessed.

RoutineOS is an n8n alternative for jobs where a person reads something and decides. It is free (MIT) and needs a paid Claude plan. One command turns your workflow into a routine pack, and a file called MIGRATION.md lists what it could not carry over.

[Get started](https://routineos.org/#start)[Convert your workflow](https://docs.routineos.org/guides/migrate/n8n)[Browse templates](https://routineos.org/templates)[All comparisons](https://routineos.org/compare)

Converter builtFree (MIT). Needs a paid Claude plan.Converted routines are unpiloted

Side by side

## An n8n alternative, side by side

The docs describe n8n with an AI step as a fixed flow you build and maintain. A routine is a Claude agent on a schedule that makes the call, with a Desk and a gate around it.

| Topic | n8n, as the docs describe it | RoutineOS |
|---|---|---|
| Shape | A fixed flow you build and maintain. | A routine. Claude does the reading and judging, and code applies the rules you can edit. |
| Changing itself | You edit the flow. | It proposes setting changes from your keep, drop and reject decisions. Nothing applies until you say yes. |

The docs do not compare approvals, workspace, triggers, hosting or licence, so this page does not either. For those, read n8n's own pages. For RoutineOS: a schedule in UTC at most hourly, no hosting of its own, MIT licence, and a paid Claude plan to run it.

Source: docs.routineos.org, [How it compares](https://docs.routineos.org/introduction/comparison).

What converts

## What the converter carries over

The converter is deterministic Python. It reads your workflow and writes a pack plus a report. The same workflow gives the same pack every time.

| In n8n | In RoutineOS |
|---|---|
| Schedule Trigger | The routine's schedule, written as a cron in UTC. |
| AI Agent and LLM chain nodes | A skill stage, with a generated skill file. Chat model, memory, tools and output parser sub-nodes are read too. |
| Nodes for a known app (Gmail, Slack, Sheets and others) | A stage that uses a connector, marked read or write. |
| IF, Switch, Filter, Merge, Loop, Set | A stage that states the condition or the step in words. |
| Code and Function nodes | A stub file that exits with "not translated yet". Your original source is kept beside it. Nothing is ever run. |
| Credentials | Listed by type and name. You reconnect each one yourself. No secret value is copied. |
| Expressions such as `$json.a.b` | Rewritten as "a.b from the previous step". Anything it does not recognise is kept and flagged. |
| Error handling and Wait approval | Failure rules, and an approval gate. |
| Sticky Notes | Text in the pack's readme. |

**Any step that writes is gated**If a step sends, posts or writes to an app, the converted routine is approval-gated and that step moves after the gate. Do not remove the gate to match the original. A converted routine starts report-only and unpiloted.

Source: [Migrate from n8n](https://docs.routineos.org/guides/migrate/n8n) and the 0.6.0 changelog.

What gets slower or needs you

## What gets slower, and what a person finishes

### Slower

- **Event triggers become a schedule.** A webhook, form, chat or manual trigger becomes the default schedule (weekdays at 22:00 UTC) plus the Desk action queue. You can change it.
- **App triggers become hourly polls.** RoutineOS runs at most once an hour.
- **Seconds and minutes become hourly.** The converter adds an issue to say so.
- **Schedules are UTC.** The converter keeps your timezone in the plan and reports it. It does not shift the hours.
- **A delay becomes "on the next run".**

### A person finishes

- **Code nodes.** Translate the stub, or replace the step with a model stage.
- **Flagged expressions.** Each becomes an explicit input you confirm.
- **Unknown nodes.** They become a "Needs a person" stage, visible in the list.
- **Vector stores and embeddings.** Reported only, because RoutineOS has no vector store.
- **Credentials.** Reconnect each one on claude.ai yourself.

The first thing to read is MIGRATION.md. Each item marked Needs a person should have an owner before you turn the routine on.

The command

## Convert an n8n workflow with one command

Give it a file or one https link, and a folder that does not exist yet. Or paste the workflow into Claude Code and ask Claude to run it, and it will show you what it plans to write first.

$ python3 skills/routineos/scripts/routineos.py migrate n8n <file-or-url> --out <dir>

1. **You get two files**`pack.json` and `MIGRATION.md`, in the folder you named. The command will not overwrite a folder that is not empty.
2. **Read the exit code**0 means nothing needs a person. 1 means the pack was written and the report lists items for a person. 2 means it failed and nothing was written.
3. **Check, then install**Validate the pack, install it, then run it once report-only before you trust it.

**Imported workflows are treated as data**Every source is untrusted by default. The prompt tells the routine to treat fetched text as data, proposals only accept plain-word values, and emails, keys and Slack-style ids are replaced with [removed]. The report names the field, never the value.

No workflow yet? The free docs MCP has `search_n8n` and `convert_n8n`, which read n8n's public template gallery. Nothing from n8n.io is stored. The reuse licence for gallery templates is unclear, so convert for your own use. See [migrate limits](https://docs.routineos.org/guides/migrate/limits).

When to keep n8n

## When to keep n8n

- **Nothing in the job needs a judgment call.** A fixed rule runs fine as a fixed flow.
- **You need it to react in seconds.** A routine runs on a schedule of an hour or more.
- **You do not use Claude.** A routine runs on a Claude plan.
- **You need a settled platform.** Claude scheduled tasks are a research preview.

You can also keep n8n for the plumbing and move only the step that reads and decides. See [all comparisons](https://routineos.org/compare), the [n8n to routine guide](https://docs.routineos.org/guides/n8n-to-routine), or start from a [template](https://routineos.org/templates).

## Convert your workflow

Read the n8n migrate guide, run the command, and read MIGRATION.md before you turn anything on.

[Get started](https://routineos.org/#start)[Read the migrate guide](https://docs.routineos.org/guides/migrate/n8n)
