agent-friendly task manager

The task manager for developers and their agents.

Local-first CLI with a native iOS companion. JSON output everywhere. No accounts. No cloud. Just a SQLite database on your machine and an oplog that syncs.

$ npm install -g oru-cli
View on GitHub

See it work.

A task manager should be fast enough to disappear. oru runs against a local SQLite database with WAL mode. Every operation is a single-digit millisecond write. No spinners. No loading states. No network requests between you and your tasks.

~/.oru
$ oru add "Refactor auth middleware" --priority high --due friday zj9rESjT Refactor auth middleware Status: todo Priority: high Due: 2026-02-20 $ oru list ID PRI DUE TITLE [ ] zj9rESjT high 2026-02-20 Refactor auth middleware [~] fj6EmFhu medium Write migration tests [ ] yX9K9UbF low Update API docs $ oru update zj9rESjT --status done zj9rESjT Refactor auth middleware Status: done Priority: high Due: 2026-02-20

Built for agents. Not retrofitted.

Your AI agents generate tasks, track progress, and need structured output to reason about what to do next. oru treats them as first-class participants — not afterthoughts bolted onto a human-only interface.

Every command returns JSON. Creates are idempotent. Metadata is arbitrary. There is no interaction model to work around.

Human-friendly
oru list
$ oru list ID PRI DUE TITLE [ ] zj9rESjT high 2026-02-20 Refactor auth middleware [~] fj6EmFhu medium Write migration tests [ ] yX9K9UbF low Update API docs
Agent-friendly
oru list --json
$ oru list --json [ { "id": "zj9rESjT-7b1a-...", "title": "Refactor auth...", "status": "todo", "priority": "high" } ]

Idempotent creates. Safe retries.

Agents retry. Network calls fail. oru's --id flag lets agents supply their own UUIDv7, making creates idempotent. Run it twice, get one task.

idempotent creates
$ oru add "Deploy to staging" --id 019414a3-... 019414a3 Deploy to staging Status: todo Priority: medium $ oru add "Deploy to staging" --id 019414a3-... 019414a3 Deploy to staging Status: todo Priority: medium

Arbitrary metadata.

Agents need to stash context — which PR spawned a task, which model created it, which run it belongs to. The --meta flag takes arbitrary key-value pairs.

metadata
$ oru add "Review PR feedback" \ --meta agent=claude-code \ --meta pr=142 \ --meta run=a1b2c3 019414a4 Review PR feedback Status: todo Priority: medium Metadata: agent: claude-code pr: 142 run: a1b2c3

Your data never leaves your machine.

oru stores everything in a single SQLite database at ~/.oru/oru.db. No accounts. No cloud. No third-party servers between you and your tasks.

This is a deliberate architecture choice, not a limitation. Your task data is yours — readable, portable, queryable with any SQLite client.

No sign-up. No login. No tokens.

Install it. Use it. There is no onboarding flow, no email field, no OAuth redirect. The database is created on first run. That is the entire setup.

getting started
$ npm install -g oru-cli $ oru add "First task" 019414a5 First task Status: todo Priority: medium

Two commands from install to first task.

CLI oru commands
SQLite ~/.oru/oru.db
oru server Local HTTP
iOS App Native companion

Terminal-first. Phone when you need it.

oru is a CLI tool. That is its primary interface and it always will be. But tasks follow you. The native iOS app exists for those moments.

Pair with a QR code. No accounts required.

Run oru server start. A QR code appears in your terminal. Scan it with the iOS app. You are connected over your local network. That is the entire pairing flow.

No cloud relay. No account creation. No sync service to configure. The phone talks directly to your machine.

oru server start
$ oru server start Server running on http://192.168.1.42:3000 Scan this QR code with the oru iOS app: ▄▄▄▄▄▄▄ ▄▄ ▄ ▄▄▄▄▄▄▄ █ ▄▄▄ █ ▄▀▀█▄ █ ▄▄▄ █ █ ███ █ ▀█▄▀▄ █ ███ █ █▄▄▄▄▄█ █ █ █ █▄▄▄▄▄█ ▄▄ ▄ ▄▄▄▀▀▄▄▄ ▄▄ ▄ ▄ ▄▀▀▄▀▄▄▀▄█ ▀▄▄▀▄▄▀ █▀ ▄▀█ ▀▄ ▀▄ █▀▄▄█ █▀▄▄▀ ▄▄▄▄▄▄▄ ▄▀▄▄▀▄▀▀▄▀▄▄▀ █ ▄▄▄ █ ▀█ ▄▀▄▀▀▄▀▄▄▀ █ ███ █ ▀ █▄▀▄▄▀▄▀ ▄▀ █▄▄▄▄▄█ █▀ ▄▀▄▄█▄▀▀▄▀ Waiting for connection...

Native iOS, not a web view.

SwiftUI components. SF Symbols. System colors. Haptic feedback. The app is built with Expo and React Native but renders native controls.

Tasks 3 items
Refactor auth middleware high · Fri Feb 20
Write migration tests medium
Update API docs low
Tasks
Settings

Sync that actually works offline.

oru does not sync tasks. It syncs operations. Every create, update, and delete is appended to an oplog — an ordered, immutable log of everything that happened.

create CLI
update CLI
update Mobile
note CLI
note Mobile
delete CLI
update Mobile
CLI Mobile

Last-write-wins per field

Change the title on your phone and the priority on your laptop. Both edits survive. Conflicts are resolved at the field level, not the task level.

Updates beat deletes

If one device deletes a task and another updates it, the task comes back. Intent to modify is stronger than intent to remove.

Sequence-based cursoring

Sync uses monotonic sequence numbers, not timestamps. No same-millisecond bugs. No clock drift issues. Each device tracks exactly where it left off.

Details matter.

A tool you use dozens of times a day earns the right to be opinionated about small things.

$ oru add "Ship v2" --due tomorrow

Natural language dates

Parse "tomorrow", "friday", "next week", or any date string. No rigid formats required.

~/.oru/config.toml

TOML config

Set default priority, preferred date format, and display preferences in a human-readable config file.

$ oru list --label backend

Labels

Tag and filter tasks. Labels are freeform strings — no predefined categories to manage.

$ oru note 3 "Blocked on API review"

Task notes

Append context to any task. Notes are append-only and sync safely across devices.

$ oru edit 1 --title "Ship v1.0" --priority low

Edit anything

Update title, priority, status, due date, or labels in a single command.

$ oru show 1 --json | jq '.due'

Pipe-friendly

Compose with the Unix tools you already know. JSON output works with jq, grep, and scripts.

Get started in one command.

$ npm install -g oru-cli

Requires Node 22+. That is the only dependency.

GitHub · npm

Your data. Your machine. Your agents. Your tasks.