Cept is a Notion clone with multiple storage backends: browser (IndexedDB), local folder, or Git repo. Git adds collaboration, history, and sync — but the full editor/database/graph experience works on any backend. See the full spec in .claude/prompts/init.md (the bootstrap prompt).
- Remote: github.com/nsheaps/cept
- Default branch: main
- All work happens on
main. Commit and push directly tomain. Do NOT create feature branches, develop branches, or PR workflows. The only exception iswip/T<X>.<Y>branches for interrupted sessions (see below), which get rebased ontomainimmediately in the next session.
- mise manages all tool versions (see
.mise.toml) - Bun is the JS runtime, package manager, bundler, and test runner
- Nx orchestrates monorepo tasks (with Bun workspaces)
- TypeScript strict mode everywhere — no
any, no@ts-ignore
mise install # Install all tool versions
bun install # Install dependencies
bun run dev # Dev mode (all packages)
bun run dev:web # Dev mode (web only)
bun run dev:desktop # Dev mode (desktop only)
bun run build # Production build
bun run test # All unit + integration tests
bun run test:unit # Unit tests only
bun run test:integration # Integration tests only
bun run test:e2e # Playwright E2E tests
bun run test:e2e:screenshots # E2E with screenshot capture
bun run lint # ESLint + Prettier
bun run typecheck # tsc --noEmit
bun run validate # lint + typecheck + test (full gate)
nx graph # Visualize project dependency graph
nx affected -t test # Test only affected packages
nx affected -t build # Build only affected packages| Package | Path | Purpose |
|---|---|---|
@cept/core |
packages/core/ |
Business logic, StorageBackend (browser/local/git), DB engine, CRDT, parsers, graph |
@cept/ui |
packages/ui/ |
React components, hooks, stores (no platform deps) |
@cept/web |
packages/web/ |
Vite SPA + PWA service worker |
@cept/desktop |
packages/desktop/ |
Electrobun (macOS) + Electron (Win/Linux) shells |
@cept/mobile |
packages/mobile/ |
Capacitor iOS + Android |
@cept/signaling |
packages/signaling-server/ |
Yjs WebSocket signaling server |
@cept/docs |
docs/ |
Starlight/VitePress documentation site |
@cept/e2e |
e2e/ |
Playwright E2E tests + screenshot capture |
@cept/uiand@cept/coremust NEVER import platform-specific modules (electron, @capacitor/*, node:fs direct)- All persistence goes through the
StorageBackendinterface — NEVER read/write files directly @cept/coreand@cept/uidepend ONLY onStorageBackend, NEVER on a specific backend implementation- Git-specific UI is gated by
backend.capabilitieschecks, NEVER bybackend.type === "git" - NO module outside of
GitBackendmay importisomorphic-gitdirectly - The app MUST boot to a fully functional state with
BrowserFsBackendalone — zero Git, zero filesystem - All auth goes through
AuthProviderabstraction (only needed for Git remotes) - Prefer isomorphic-git over GitHub API for all Git operations
- Markdown files use HTML comments (
<!-- cept:block -->) for extended blocks - Database schemas are YAML files in
.cept/databases/ - Opening a local folder MUST NOT modify existing files unless the user explicitly edits them in Cept
Current progress is tracked in TASKS.md. Always:
- Check
TASKS.mdfor current phase and next task - Follow the task execution protocol (Spec & Research -> Red -> Green -> Refactor -> Validate -> Document & Review Spec -> Commit)
- Mark tasks complete when done
- Never skip to a later phase without completing the current one
When resuming work (user says "continue"):
- Ensure you are on
mainbranch. If awip/branch exists from a previous interrupted session, rebase it ontomain, fast-forward merge, delete the WIP branch, and push. git pullto get latest changes- Read
TASKS.mdto determine current phase and last completed task - Run
bun run validateto verify the repo is in a clean state - If tests fail, fix them before starting new work
- Pick up the next incomplete task
- Follow the task execution protocol
- Commit and push to
mainafter each completed task
- Every new function/class gets unit tests
- Every new UI component gets component tests
- Every new user-visible feature gets E2E tests with screenshots
bun run validatemust pass before committing- Screenshots go to
docs/screenshots/for documentation
- Container is ephemeral — all work must be committed to Git
- Run
session-start.shautomatically at session start (it handles tool installation) - Use
git pushfrequently to preserve work - If
miseorbunare not available, the session-start script installs them - Network access is limited to allowed domains — see
.claude/settings.json