# Orbit Free, realtime, keyboard-first task manager. The UX polish of the best paid task managers with the breadth of the open-source ones, plus docs, files, notifications, GitHub, and an MCP server. No pricing, no billing, no paid tiers anywhere. ## Hard rules 1. **Bun is the package manager and the script runner.** There is no pnpm, no npm, no yarn, no Turbo, and no `node_modules` produced by anything but `bun install`. Every command in this file starts with `bun`. The deployed runtime is node, so shipped code must not import a Bun built-in. 2. **No comments in code.** Ever. `bun run check-comments` fails the build on any comment that is not a functional directive (`@ts-*`, `biome-ignore`, `eslint-*`, `/*! license */`). Make names and structure carry meaning. 3. **No AI attribution.** Never mention Claude, Anthropic, Codex, or AI tooling in commits, branches, PRs, code, or docs. 4. **No em-dash characters** in code, copy, docs, or commit messages. Use commas, colons, or separate sentences. 5. **Strict types only.** `any` is a lint error. Non-null assertions are a lint error. `noUncheckedIndexedAccess` and `exactOptionalPropertyTypes` are on. Validate every external input with Zod. 6. **Every check green before you finish.** `bun run verify` runs lint, comment policy, typecheck, and tests. ## Bun is the toolchain, not the runtime Bun installs, runs scripts, and runs tests. Shipped server code must not call a Bun built-in, because the web app runs on Vercel's node runtime: that is the only runtime where a Vercel function can upgrade a websocket, and `/api/ws` needs it. Anything imported from `bun` fails there with `Cannot find module 'bun'`. | Need | Use | Never use | | --- | --- | --- | | Postgres | `postgres.js` through `drizzle-orm/postgres-js` | `Bun.SQL`, `drizzle-orm/bun-sql`, `pg` | | Redis and pub/sub | `ioredis` | `Bun.RedisClient`, `node-redis` | | Object storage | `@aws-sdk/client-s3` and `@aws-sdk/s3-request-presigner` | `Bun.S3Client` | | Reading and writing files | `node:fs/promises` | `Bun.file()`, `Bun.write()` | | Hashing passwords | `@node-rs/argon2` (argon2id) | `Bun.password`, `bcrypt` | | Sortable ids | `randomUUIDv7()` from `@orbit/shared/utils` | `Bun.randomUUIDv7()`, `ulid`, `nanoid` | | WebSocket server | `ws`, upgraded by `@vercel/functions` | `Bun.serve({ websocket })` in shipped code | | Running TypeScript | `bun file.ts` | `tsx`, `ts-node` | | Tests | `bun test` | `vitest`, `jest` | | Subprocesses | `Bun.spawn`, `Bun.$` | `node:child_process` | | Workspace script running | `bun run --filter ''