No description
  • Dart 79.9%
  • PLpgSQL 11.4%
  • TypeScript 2.5%
  • C++ 2%
  • CMake 1.6%
  • Other 2.6%
Find a file
2026-10-23 16:04:42 -04:00
.agents/skills chore: add supabase agent skills 2026-08-21 11:48:16 -04:00
android style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
assets/fonts feat(theme): bundle Inter and scale text for TV mode 2026-10-14 15:25:31 -04:00
docs Release 1.8.1: Windows update fix 2026-10-23 16:04:42 -04:00
ios style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
lib Release 1.8.1: Windows update fix 2026-10-23 16:04:42 -04:00
license_server fix(security): require Vault for control-plane service-role keys 2026-10-22 18:45:30 -04:00
linux style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
macos style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
supabase/migrations feat(branding): rename the app to Tapestry 2026-10-21 21:37:16 -04:00
test fix(update): make the Windows zip updater robust 2026-10-23 16:03:08 -04:00
tool style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
web style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
windows style(assets): apply the new woven Tapestry logo 2026-10-23 15:32:01 -04:00
.gitignore fix(android): real release signing config and disable backups 2026-10-13 19:04:59 -04:00
.metadata chore: include flutter create platform scaffolding 2026-07-17 15:31:36 -04:00
analysis_options.yaml Add automatic self-update system from Forgejo releases 2026-08-25 16:14:20 -04:00
DEVELOPER_GUIDE.md fix(update): make the Windows zip updater robust 2026-10-23 16:03:08 -04:00
pubspec.lock chore(deps): tighten constraints and raise SDK floor after Flutter 3.47.7 2026-10-19 11:15:38 -04:00
pubspec.yaml Release 1.8.1: Windows update fix 2026-10-23 16:04:42 -04:00
README.md feat(branding): surface Keyworks Technology as the publisher 2026-10-23 10:58:03 -04:00
skills-lock.json chore: add supabase agent skills 2026-08-21 11:48:16 -04:00
supabase_setup.sql feat(branding): rename the app to Tapestry 2026-10-21 21:37:16 -04:00

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) and supervisor (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