- Dart 86.5%
- PLpgSQL 6.6%
- C++ 3.4%
- CMake 2.6%
- Swift 0.4%
- Other 0.5%
Restyled the app with a modern indigo/violet identity and a distinct warm-amber 'today' accent: - New palette (dark + light): indigo primary, refreshed neutrals/contrast - Today column now stands out with an amber tint, border, and header pill - Header uses a violet gradient band - Task cards: slightly larger radius, indigo accent bar, softer shadows - App bar gets a subtle bottom divider Set version to 1.0.0. |
||
|---|---|---|
| .agents/skills | ||
| android | ||
| docs | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| test | ||
| tool | ||
| web | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| DEVELOPER_GUIDE.md | ||
| notification_diagnostic.sql | ||
| PRICING_GUIDE.md | ||
| PRICING_SHEET.md | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
| rls_ownership.sql | ||
| skills-lock.json | ||
| supabase_analyst_name_migration.sql | ||
| supabase_audit_migration.sql | ||
| supabase_due_date_migration.sql | ||
| supabase_migration.sql | ||
| supabase_notification_migration.sql | ||
| supabase_reorder_migration.sql | ||
| supabase_roles_migration.sql | ||
| supabase_security_cleanup.sql | ||
| supabase_security_fix.sql | ||
| tmp_rls.sh | ||
| tmp_rls.sql | ||
Task Tracker
A collaborative weekly work schedule tracker built with Flutter, powered by Supabase (auth, Postgres, realtime, row-level security).
Modeled after the AppFlowy database/field/cell pipeline, but rendered as a week-per-analyst grid with inline editors, drag-and-drop, comments, notifications, and an activity audit trail.
Features
- Weekly schedule grid — one row per analyst, seven day columns
- Tasks with typed fields: text, number, date, checkbox, select, multiselect, and checklist
- Inline editors — checklist and multiselect render directly in the task popover with tappable checkboxes/tags, add-item inputs, and hover-red delete buttons (AppFlowy-style, no separate editor view)
- Recurring tasks (RFC 5545 subset) with repeat icon indicator
- Drag & drop — move tasks between days and analysts; drag a "+ New Task" pill onto a cell to create one
- Draggable analyst rows — reorder analysts via a dedicated drag handle on each row label (closed-fist cursor on hover), persisted atomically via a Postgres RPC; the current user's own row is pinned to the top
- Bulk selection — multi-select tasks for batch delete and batch move (pick a target analyst + date)
- Comments — per-task threaded comments with realtime sync
- Notifications — in-app bell with unread badge, swipe-to-dismiss, clear-all, and a right-side sidebar panel
- Roles —
analyst(own rows) andsupervisor(all rows, manage users) - Users panel — assigned per-user colors (view + change via picker), roster status, role management, name editing, add-to/remove-from schedule, search filter, live online indicator on the user's avatar, and a user-count header
- Activity audit trail — semantic history of every task/cell change with collapsible view
- Search — filter tasks by text with amber highlights and a live match count
- Keyboard shortcuts — Ctrl+N (new task, on hovered date), Ctrl+D (duplicate the open task), Ctrl+T (today), ← → (navigate weeks)
- Loading skeletons — animated placeholder cards during week load
- Presence — live online indicator on analyst rows and as a badge on each user's avatar in the Users list, resilient to auth token refresh
- TV display mode — read-only kiosk view that auto-rotates through analysts that don't fit on screen (cascade slide-in)
- Themes — light/dark
- 12-hour clock — live clock in the app bar with AM/PM
- Auto-update — while the app is open it periodically checks Forgejo for a newer release, notifies the user, then automatically downloads, applies and relaunches if needed. Release notes are shown on the next launch.
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/
Configuration
Supabase connection is configured in lib/main.dart:
const _supabaseConfig = SupabaseConfig(
url: 'https://supabase.sladertech.cloud',
publishableKey: 'sb_publishable_...',
);
Set your own URL and publishable key to point at your Supabase project.
Database setup
Apply these migrations in the Supabase SQL Editor (in order):
supabase_migration.sql— core schema + RLSsupabase_notification_migration.sql— notifications table + triggerssupabase_roles_migration.sql— analyst/supervisor roles + RLSsupabase_audit_migration.sql— activity audit trailsupabase_due_date_migration.sql— due-date notificationssupabase_analyst_name_migration.sql— analyst name columnsupabase_security_cleanup.sql— remove legacy anon policiessupabase_reorder_migration.sql— atomicreorder_analystsRPCsupabase_security_fix.sql— revoke trigger functions + tighten insert policies (resolves Security Advisor warnings)
Promote your first supervisor:
update public.profiles set role = 'supervisor' where email = 'admin@example.com';
Releases & self-update
The app self-updates from Forgejo releases on the configured remote. While the app is open it checks periodically (every 30 minutes) for a newer release; when one is found it notifies the user, then automatically downloads the platform binary, applies it, and relaunches if needed. Release notes are shown once on the next launch.
Building a release
-
Bump the version in
pubspec.yaml(e.g.1.1.0) to match the tag. -
Build the binaries for each platform you ship:
flutter build linux --release # build/linux/x64/release/bundle flutter build windows --release # build/windows/x64/runner/Release flutter build macos --release # build/macos/Build/Products/Release -
Create a Forgejo release tagged like
vX.Y.Z, attach the platform binaries as release assets, and write the release notes in the body.
Asset naming
The updater picks the asset for the running platform by keyword in the
filename/URL: linux / .AppImage, windows / .exe / .msi, macos /
.dmg, android / .apk. Name your assets accordingly, e.g.
task_tracker-linux.AppImage, task_tracker-windows.zip, task_tracker-macos.dmg.
How the client decides
The client compares the release tag (v1.2.0) against its own running version
(package_info_plus). A strictly newer tag triggers the update. Version
comparison and release parsing are covered by tests in test/domain/update/ and
test/data/update_service_test.dart.
Architecture
lib/
├── domain/ # Pure-Dart models: field types, cell codecs, task,
│ # analyst, comment, notification, audit entry
├── data/
│ ├── storage/ # drift schema (local fallback), AppPrefs
│ ├── repositories/ # interfaces + Drift/Supabase implementations
│ └── bootstrap/ # AppBootstrap — wires the active backend
├── logic/ # BLoCs: schedule, field, analyst, auth, comments,
│ # notification, profiles, theme, display-mode, presence
└── ui/ # screens, widgets, theme
The app runs primarily on Supabase. A local SQLite (Drift) backend still exists behind the same repository interfaces for offline/testing use.
Documentation
DEVELOPER_GUIDE.md— in-depth architecture and implementation notes for AI-assisted development.docs/RESEARCH.md— AppFlowy architecture study and original design decisions.