No description
  • Dart 86.5%
  • PLpgSQL 6.6%
  • C++ 3.4%
  • CMake 2.6%
  • Swift 0.4%
  • Other 0.5%
Find a file
SirSlader faf897f708 Release 1.0.0: visual overhaul
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.
2026-08-25 19:22:54 -04:00
.agents/skills chore: add supabase agent skills 2026-08-21 11:48:16 -04:00
android chore: include flutter create platform scaffolding 2026-07-17 15:31:36 -04:00
docs chore: initial Flutter project skeleton + research notes 2026-07-17 15:22:55 -04:00
ios chore: include flutter create platform scaffolding 2026-07-17 15:31:36 -04:00
lib Release 1.0.0: visual overhaul 2026-08-25 19:22:54 -04:00
linux chore(deps): add supabase_flutter ^2.8.1 2026-08-10 21:52:21 -04:00
macos Add automatic self-update system from Forgejo releases 2026-08-25 16:14:20 -04:00
test Add automatic self-update system from Forgejo releases 2026-08-25 16:14:20 -04:00
tool feat(popover): End Date toggle + lint cleanup 2026-07-21 00:13:38 -04:00
web chore: include flutter create platform scaffolding 2026-07-17 15:31:36 -04:00
windows chore(deps): add supabase_flutter ^2.8.1 2026-08-10 21:52:21 -04:00
.gitignore chore: initial Flutter project skeleton + research notes 2026-07-17 15:22:55 -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 Add automatic self-update system from Forgejo releases 2026-08-25 16:14:20 -04:00
notification_diagnostic.sql debug: add raise notice logging to notification trigger + diagnostic SQL 2026-08-12 14:13:33 -04:00
PRICING_GUIDE.md Docs: add commercial pricing guide and customer-facing price sheet 2026-08-19 11:30:37 -04:00
PRICING_SHEET.md Docs: add commercial pricing guide and customer-facing price sheet 2026-08-19 11:30:37 -04:00
pubspec.lock Add automatic self-update system from Forgejo releases 2026-08-25 16:14:20 -04:00
pubspec.yaml Release 1.0.0: visual overhaul 2026-08-25 19:22:54 -04:00
README.md Add automatic self-update system from Forgejo releases 2026-08-25 16:14:20 -04:00
rls_ownership.sql feat: enforce row-level task ownership via Supabase RLS + UI read-only for other analysts 2026-08-11 18:13:53 -04:00
skills-lock.json chore: add supabase agent skills 2026-08-21 11:48:16 -04:00
supabase_analyst_name_migration.sql feat: fix analyst names + recurring task indicator 2026-08-12 14:19:22 -04:00
supabase_audit_migration.sql feat: due-date notifications + task audit trail 2026-08-12 14:24:03 -04:00
supabase_due_date_migration.sql fix: prevent duplicate notification triggers on task insert 2026-08-12 16:03:13 -04:00
supabase_migration.sql perf: N+1 fix, buildWhen popover, schema improvements, code cleanup 2026-08-12 13:22:50 -04:00
supabase_notification_migration.sql fix: prevent duplicate notification triggers on task insert 2026-08-12 16:03:13 -04:00
supabase_reorder_migration.sql fix: atomic analyst reorder via Postgres RPC 2026-08-20 16:40:33 -04:00
supabase_roles_migration.sql fix: add drop if exists for all policy recreations in roles migration 2026-08-12 11:55:36 -04:00
supabase_security_cleanup.sql fix: resolve all Supabase security advisory warnings 2026-08-12 11:49:59 -04:00
supabase_security_fix.sql db: v3 security fix — restore RLS helpers to SECURITY DEFINER 2026-08-20 15:47:44 -04:00
tmp_rls.sh fix: replace shrinkWrap ListView with fixed 300px height to avoid intrinsic dimension crash in AlertDialog 2026-08-11 16:35:09 -04:00
tmp_rls.sql fix: replace shrinkWrap ListView with fixed 300px height to avoid intrinsic dimension crash in AlertDialog 2026-08-11 16:35:09 -04:00

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
  • Rolesanalyst (own rows) and supervisor (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):

  1. supabase_migration.sql — core schema + RLS
  2. supabase_notification_migration.sql — notifications table + triggers
  3. supabase_roles_migration.sql — analyst/supervisor roles + RLS
  4. supabase_audit_migration.sql — activity audit trail
  5. supabase_due_date_migration.sql — due-date notifications
  6. supabase_analyst_name_migration.sql — analyst name column
  7. supabase_security_cleanup.sql — remove legacy anon policies
  8. supabase_reorder_migration.sql — atomic reorder_analysts RPC
  9. supabase_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

  1. Bump the version in pubspec.yaml (e.g. 1.1.0) to match the tag.

  2. 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
    
  3. 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.