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 Speed
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.
Agent-native
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.
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.
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.
Local-first
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.
Two commands from install to first task.
CLI + Mobile
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.
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.
Sync
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.
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.
Developer experience
Details matter.
A tool you use dozens of times a day earns the right to be opinionated about small things.
Natural language dates
Parse "tomorrow", "friday", "next week", or any date string. No rigid formats required.
TOML config
Set default priority, preferred date format, and display preferences in a human-readable config file.
Labels
Tag and filter tasks. Labels are freeform strings — no predefined categories to manage.
Task notes
Append context to any task. Notes are append-only and sync safely across devices.
Edit anything
Update title, priority, status, due date, or labels in a single command.
Pipe-friendly
Compose with the Unix tools you already know. JSON output works with jq, grep, and scripts.