- This is a collaborative realtime todo app built on Jazz.
- Collaboration is org-centric: people work together by joining the same organization.
- Canonical flow: User A creates an org, invites User B, User B accepts, and both are members of that org.
- Membership is symmetric after joining: User A can assign todos to User B, and User B can assign todos to User A.
- Membership can overlap across orgs; do not assume users belong to only one collaboration group.
- Assignment follows shared-org relationships: if A+B are in Org Z and A+C are in Org M, A can assign to B or C, and both B and C can assign to A.
- Non-goal: do not model collaboration as one global team or one-org-per-user.
- Keep todo collaboration intentional: users should primarily see their own work plus work explicitly shared/assigned with them.
- Preserve these product behaviors when refactoring; optimize for collaboration outcomes, not any single storage implementation.
- Single-package SvelteKit app; the root importer is the only workspace package (
pnpm-workspace.yamlonly setsonlyBuiltDependencies). - Main wiring lives in
src/routes/+layout.svelte: imports@drop-in/graffiti, wraps app withJazzSvelteProvider, and usesPasskeyAuthBasicUI. - Collaboration model and account migration logic are centered in
src/lib/schema.ts; start there when changing org/todo behavior.
pnpm dev- run Vite dev server (default Vite port unless overridden).pnpm check- runsvelte-kit syncthensvelte-check.pnpm lint- run Prettier check first, then ESLint.pnpm build- production build.pnpm format- write Prettier formatting.- There is no test script in this repo right now.
- Package manager is pinned to
pnpm@10.33.0(packageManagerfield). .npmrcsetsengine-strict=true; dependency installs fail on unsupported Node engines.- Svelte runes mode is forced for project files in
svelte.config.js. - TS is strict, and JS is type-checked too (
allowJs: true,checkJs: trueintsconfig.json).
- The app is configured to sync against
ws://127.0.0.1:4200insrc/routes/+layout.svelte; if that peer is unavailable, sync/collab flows will be limited. sync-db/storage.db*are local SQLite runtime files; do not hand-edit them.- Use Jazz mcp to understand Jazz best practices
- Prefer this local sequence before handoff:
pnpm lint->pnpm check->pnpm build.
DO NOT use any and do not rely on casting unless absolutely necessary. this is a code smell and an indication you are doing something wrong.
Don't name functions handle* that could just be named *. For instance always name a function save() instead of handleSave()