- Dart 79.9%
- PLpgSQL 11.4%
- TypeScript 2.5%
- C++ 2%
- CMake 1.6%
- Other 2.6%
| .agents/skills | ||
| android | ||
| assets/fonts | ||
| docs | ||
| ios | ||
| lib | ||
| license_server | ||
| linux | ||
| macos | ||
| supabase/migrations | ||
| test | ||
| tool | ||
| web | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| DEVELOPER_GUIDE.md | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
| skills-lock.json | ||
| supabase_setup.sql | ||
Tapestry
Many threads. One view.
Published by Keyworks Technology.
A collaborative weekly work schedule for small teams, built with Flutter and powered by Supabase (auth, Postgres, realtime, row-level security).
One row per analyst, seven day columns. Click an empty cell to add a task; click a card to edit it inline. Tasks carry typed fields (text, number, date, checkbox, select, multiselect, checklist), can recur, and can be dragged between days and analysts. Comments, notifications, roles, and a full activity history make it a real multi-user tool.
Features
- Weekly schedule grid — one row per analyst, seven day columns
- Typed task fields — text, number, date, checkbox, select, multiselect, checklist
- Inline editors — checklist and multiselect edit right in the task popover
- Recurring tasks (RFC 5545 subset) with a repeat indicator
- Drag & drop — move tasks between days/analysts; drag "+ New Task" onto a cell to create one
- Draggable analyst rows — reorder via a drag handle, persisted atomically; your own row is pinned to the top
- Bulk selection — batch delete and batch move
- Comments — per-task threads with realtime sync
- Inbox — one badged icon combining notifications + conversations
- Roles —
analyst(own rows) andsupervisor(all rows, manage users) - Users panel — per-user colors, roster status, role management, name editing, add/remove from schedule, search, and live presence
- Activity audit trail — semantic history of every task/cell change
- Search — filter tasks with a highlight and a live match count
- Keyboard shortcuts — Ctrl+N (new), Ctrl+D (duplicate), Ctrl+T (today), ← → (weeks), Esc (close)
- Task editor — popover + full panel showing the owner, every field, recurrence, and a comment preview
- Presence — live online indicators on rows and avatars
- TV display mode — read-only kiosk that auto-rotates through analysts
- Themes — light/dark (a modern slate + sage palette)
- Auto-update — checks Forgejo for newer releases and updates itself
Quick start
flutter pub get
dart run build_runner build # generate app_database.g.dart
flutter run # macOS / Linux / Windows desktop
flutter test
dart analyze lib/
Database setup
For a fresh Supabase project, paste the generated supabase_setup.sql into
the SQL Editor once — it's every migration in supabase/migrations/,
concatenated in order — or run it with psql:
psql "$DATABASE_URL" -f supabase_setup.sql
The script is idempotent, so it's safe to re-run. Then promote your first supervisor:
update public.profiles set role = 'supervisor' where email = 'admin@example.com';
Create users in the Supabase Auth dashboard — the app has no sign-up UI, and
the handle_new_user trigger auto-creates the matching profiles row.
See DEVELOPER_GUIDE.md for the migration list and how to
regenerate the setup script.
Configuration
Supabase backends are managed in-app — no code edits needed. A supervisor can
add, edit, remove, and switch connections from the app-bar options menu →
Supabase connections; the login screen has a settings icon that opens the
same manager before sign-in. The active connection is remembered across
launches. A built-in default is seeded on first run (edit
SupabaseConnectionStore.defaultConnection to change it).
Licensing
Each site (a customer deployment) can carry a signed, time-limited license that gates the self-updater: a valid license keeps releases flowing, an expired one pauses updates (the app keeps working). Licenses are signed by the vendor (RSA-2048/SHA-256) and bound to a site id, so they can't be forged or copied.
Vendor tooling lives in tool/license_cli.dart; the optional self-hosted control
plane is in license_server/. See
DEVELOPER_GUIDE.md for the full model.
Documentation
DEVELOPER_GUIDE.md— architecture, conventions, git & release process, and everything a developer or agent needs.docs/RESEARCH.md— AppFlowy architecture study and the original design decisions.docs/ICON_CONCEPTS.md— logo/icon directions.docs/command_center/README.md— the planned license-admin dashboard.docs/releases/— release notes per version.