Everything you need to build, plan, and ship
A complete workspace — resources, views, sync, collaboration, and structured data — built on a local-first architecture that makes every interaction feel instant.
See pricing →Resources
Nested tree
Every resource — folder, doc, table, project, chat, drawing, form, file — lives in one unified sidebar tree. Drag to reorganize, nest without limits.
Folders
Group any mix of resource types. No forced hierarchy, no special cases. Folders support custom icons, colors, and per-resource visibility.
Documents
Rich text built on Lexical with block-level formatting, inline mentions, embeds, and real-time collaborative editing backed by CRDT binary state.
Tables
Structured databases with rich column types, cross-table relations, composable filters and sorts, and multiple named views per table.
Projects
Task containers with kanban, gantt, table, grid, and calendar views. Tasks have priority, status, assignee, estimates, subtasks, and milestone grouping.
Chats
Threaded rooms — DM, group, or AI-powered. Messages support reactions, pins, edits, mentions, file attachments, and per-resource comment threads.
Drawings
Collaborative whiteboard with persistent CRDT state. Draw, annotate, and embed diagrams directly in the resource tree alongside other content.
Forms
Form builder with configurable field types, submission tracking, thank-you messages, redirect URLs, close dates, and per-submission response records.
Files
Upload and attach files to any resource. All uploads go to a central S3-backed store with soft-delete, GC cleanup, and preview support.
Shortcuts
Lightweight aliases that point to any resource. Show the same item in multiple tree locations without duplication or sync complexity.
Views
Kanban
Drag tasks between status columns. Group by any field, apply per-board filters, and configure the board without leaving the view.
Gantt
Timeline view with milestone markers, date drag-to-reschedule, and dependency tracking across tasks and milestones.
Data grid
Spreadsheet-style grid with inline editing, bulk selection, column resize, and per-view sort and filter state.
Grid
Card mosaic for visual browsing — useful for image-heavy content or status-at-a-glance project overviews.
Calendar
Monthly and weekly views scoped to due dates or start dates. Drag tasks to reschedule directly on the calendar.
View config
Each view stores its own filters, sorts, column order, row height, and column visibility. Switching views never resets your state.
Sync
Local-first reads
Every read comes from IndexedDB — never the network. The workspace is instant regardless of connection quality or latency.
Optimistic writes
UI updates before the server confirms. On push failure the state automatically rolls back to the pre-write snapshot stored in Dexie.
Atomic persistence
Each mutation writes to IndexedDB and the mutation queue in a single transaction. No partial state, no orphaned queue entries.
Offline queue
Writes made while offline are queued locally and pushed automatically when connectivity is restored, preserving causal order.
Idempotent push
Every mutation carries a UUIDv7 key. Re-pushing after a network failure is safe — duplicates are discarded server-side.
Dead-letter handling
Mutations that exceed the retry limit are moved to a dead-letter queue. Inspect and retry them explicitly from the UI.
Collaboration
Real-time presence
See who is online, which resource they have open, and where their cursor is — across every tab and browser session.
Broadcast sync
Changes from teammates appear instantly via server-sent relay. No polling, no refresh, no stale data.
Workspace invites
Invite by email with role assignment. Invites expire automatically and can be revoked before acceptance.
Custom roles
Owner, admin, editor, viewer — assigned per workspace member. Roles cascade to all resources unless overridden at the resource level.
Resource visibility
Each resource can be private, workspace-visible, or public. Visibility is independent of role and applies recursively to nested items.
Watchers
Subscribe to any task to track its updates. Watcher lists are per-task and editable by anyone with resource access.
Data
Column types
Text, number, date, datetime, boolean, select, multi-select, relation, member, resource reference, URL, email, phone, and more.
Cross-table relations
Link rows across tables bidirectionally. Navigate and filter by related records inline. Rollup aggregations available on relation columns.
Composable filters
Stack filter rules per view with configurable operators per column type. Filters are saved with the view, not the table.
Multi-column sort
Sort by multiple columns with drag-to-reorder priority. Sort state is scoped to the current view and persisted.
Cell-level merge
On sync pull, cell values merge at the field level — not the row level. Last-write-wins per cell, no row-level conflicts.
Infrastructure
PostgreSQL
Neon-hosted serverless Postgres. The server is the canonical source of truth; IndexedDB is a synchronized replica, never the primary.
tRPC
Fully type-safe API layer shared between client and server. No REST guessing, no schema drift, no manual validation duplication.
Drizzle ORM
Schema-first ORM with explicit, version-controlled migrations. The Drizzle schema is the canonical source of truth for all table shapes.
Better Auth
Email, Google, and GitHub sign-in with session-based identity. The session is the single source of user data — no user cache in IndexedDB.
UUIDv7 keys
All entities use time-ordered UUIDs generated client-side. Collision-free, naturally sortable, and safe to create while offline.