No description
  • Dart 75.9%
  • PLpgSQL 9.6%
  • C++ 7.5%
  • CMake 5.4%
  • Swift 0.8%
  • Other 0.8%
Find a file
SirSlader 54a710122e feat(ui): close the UI caveats
- export the tracker CSV through the OS save dialog (file_selector)
- add a shared comment field to bulk remove
- default "Removed by" to the signed-in analyst via an email heuristic
- add a tray icon whose tooltip shows the due count (tray_manager)
- document the save dialog, bulk comment, and removed-by default
2026-10-24 19:05:56 -04:00
.agents/skills chore: add supabase agent skills 2026-10-19 17:44:31 -04:00
android refactor: move the app id to the keyworks namespace 2026-10-23 12:45:39 -04:00
assets feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
ios refactor: move the app id to the keyworks namespace 2026-10-23 12:45:39 -04:00
lib feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
linux feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
macos feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
supabase/migrations fix(db): fill out times with a trigger and enable rls on profiles 2026-10-20 11:32:00 -04:00
test feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
tool feat(db): add incubation schema and reference seed 2026-10-19 17:44:24 -04:00
web chore: scaffold flutter app 2026-10-19 15:20:36 -04:00
windows feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
.gitignore docs: capture incubation domain from legacy workbook 2026-10-19 16:07:26 -04:00
.metadata chore: scaffold flutter app 2026-10-19 15:20:36 -04:00
analysis_options.yaml chore: tighten the lint baseline 2026-10-20 09:43:16 -04:00
DEVELOPER_GUIDE.md feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
pubspec.lock feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
pubspec.yaml feat(ui): close the UI caveats 2026-10-24 19:05:56 -04:00
README.md docs: document auth, saved connections, and the realtime fallback 2026-10-20 10:07:39 -04:00
skills-lock.json chore: add supabase agent skills 2026-10-19 17:44:31 -04:00
supabase_setup.sql fix(db): fill out times with a trigger and enable rls on profiles 2026-10-20 11:32:00 -04:00

Incubation Tracking App

A Flutter (Windows desktop) replacement for the microbiology lab's Incubation Project Tracking Tool Excel workbook. Analysts record samples placed into incubators, see when each is due out, record dispositions, and print 3 × 2 in labels for the shared Zebra GK420d.

Data lives in Supabase, so the team collaborates in realtime the way they did on the shared workbook. Sign-in is required; analysts can edit everything, as they could in the shared workbook.

Features

  • Sign in — email/password accounts managed in Supabase Auth. The session is kept in the OS keychain.
  • Saved connections — point the app at a Supabase project once; it remembers the URL and publishable key and reconnects on launch.
  • Enter Incubation Data — pick an incubator (temperature and room fill in), choose min/max incubation hours, and the earliest/latest out times are computed. Save and print the label in one step.
  • Project Tracker — every open sample, with due-soon and overdue rows highlighted (the workbook's 30-minute red rule).
  • Daily Removal — samples due today or overdue; record the disposition, who removed it, and comments.
  • Label Printing — search any open sample, preview its label, and print.
  • Theme — system, light, or dark, remembered between launches.

Setup

  1. Apply the schema to your Supabase project (SQL editor, or psql "$DATABASE_URL" -f supabase_setup.sql). It creates the tables, seeds the lab's incubators/analysts/dispositions/periods, enables realtime, adds the profiles/role tables, and sets up RLS.

  2. Create the lab's users under Authentication → Users in Supabase. Each user gets a profiles row automatically.

  3. Promote the first supervisor (optional; analysts can already edit everything):

    update public.profiles set role = 'supervisor' where email = 'you@example.com';
    
  4. Run the app and add the connection on first launch:

    flutter pub get
    flutter run -d windows
    

    Or seed the connection at build time (it can still be changed in the app):

    flutter run -d windows \
      --dart-define=SUPABASE_URL=https://your-project.supabase.co \
      --dart-define=SUPABASE_ANON_KEY=your-anon-key
    

    SUPABASE_PUBLISHABLE_KEY is accepted as an alias.

Development

flutter test
dart analyze lib/
dart format .
dart run tool/build_supabase_setup.dart   # regenerate supabase_setup.sql

See DEVELOPER_GUIDE.md for the domain model, architecture, and conventions.