An honest accounting of what Project Hub actually does, verified against the
code in lib/ (not against the README or the old process docs, both of which
overstate the feature set). Development stopped after Phase 8A; the drag-and-drop
work of Phase 8B was started but never finished, and Phases 9–13 were never
begun.
README / pubspec disclaimer.
README.mdand thepubspec.yamldescription advertise "seamless cross-platform sync via Google Drive API" and imply search and undo/redo. None of these are implemented (see below). Treat those documents as aspirational marketing, not a feature list.
- Local SQLite persistence. Full CRUD for items, metadata field definitions,
and user settings via
DatabaseService. WAL journaling, foreign keys on, integrity check available. - Universal hierarchical items. Create/edit/delete Projects, SubProjects, Features, and Steps through one model and one set of dialogs. Deleting an item cascades to its whole subtree via the self-referential FK.
- Hierarchy navigation. Tree view (
hierarchy_tree_view,HierarchyScreen) with expand/collapse and type icons, plus breadcrumb navigation. Recursive tree building and ancestor/descendant/sibling queries inHierarchyService. - Project list with responsive grid. Auto-column layout that adapts to
window width (
responsive_project_grid,ColumnManager), configurable column count, loading skeletons, and error-recovery/retry UI. - The metadata system. Predefined field catalog, three-tier + scope-based
organization, metadata editor/display/tag-selector widgets, and comprehensive
value + dependency validation. This is the most complete part of the app — see
metadata-system.md. - User settings. Persisted
UserSettingswith a three-tab settings screen: General, Fields, Validation. Settings are cached and applied at runtime (theme, columns, field visibility/starring/ordering, defaults). - Material 3 UI throughout, with a three-tab bottom navigation shell.
- Drag-and-drop reordering (Phase 8B, incomplete). The project grid uses a
ReorderableWrapand cards render drag handles (isDraggable: true), so items visibly reorder on screen. But the new order is never persisted —_reorderProjectsonly mutates the in-memory list and shows a snackbar, with an explicitTODOnoting order persistence was deferred. There is noordercolumn inproject_itemsto store it. Cross-level dragging (moving an item to a new parent) and the horizontal-first/vertical-first ordering preference were never built. - Search (backend only).
DatabaseServiceimplementssearchProjectItemsFullText(name/description/metadataLIKEwith ranking),searchProjectItemsByMetadata,filterProjectItemsByMetadataField,getProjectItemsWithMetadataFilters, and usage statistics. None of it is reachable from the UI — there is no search bar, noSearchService, and no screen calls these methods. - Sync scaffolding (schema/config only). The pieces for Google Drive sync
exist as inert scaffolding:
sync_enabled/google_drive_account_email/last_sync_atcolumns onuser_settings;sync_loganddevice_registrytable definitions inDatabaseSchema(never created at runtime); sync-related constants. There is noGoogleDriveService, no authentication, and no sync code (the unusedgoogleapis/googleapis_auth/url_launcherdependencies have been removed and should be re-added when sync is built). The Settings Data tab, which would host sync/export, renders only the placeholder text "Data Settings - Coming in next update". - Data export/import. Placeholder only (the Data tab above).
| Feature | Intended phase |
|---|---|
| Google Drive cloud sync | Phase 9 |
| Search & filter UI | Phase 10B |
| Data-integrity monitoring & automatic backups | Phase 11A |
| Undo/redo (action history) | Phase 11B |
| Smart / context-aware deletion, soft-delete, recovery | Phase 12 |
| Multi-select + bulk operations (delete, bulk metadata edit) | Phases 8D–8E |
| Keyboard shortcuts & right-click context menus | Phase 8F (only dialog-level shortcuts exist) |
| Metadata templates / bulk metadata editing | Phase 7B (advanced) |
| Performance profiling & production polish | Phase 13 |
These features were never coded, but the retired work orders contain design decisions worth keeping if development ever resumes.
The intended model was deliberately simple:
- Two modes: a Local-Only mode (no cloud, the app's current behavior) and a Cloud Sync mode, chosen via a toggle in settings.
- Single-button sync: in Cloud mode, one prominent Sync button triggers a complete round-trip; the UI shows sync status and the last-sync timestamp. No continuous/background syncing.
- Data format: export the whole database to a standardized JSON file
(
project_hub_sync.json) in an app folder ("Project Hub Data"), including each record'sdevice_idand timestamps — which is exactly why those columns and thesync_log/device_registryscaffolding already exist. - Conflict resolution (mostly automatic):
- newer
last_modifiedwins when the two sides differ by more than ~1 hour; - when one side deleted an item and the other modified it, keep the non-deleted version;
- merge non-overlapping changes automatically;
- only fall back to a user dialog ("Keep Local / Keep Cloud / Keep Both") for genuinely ambiguous cases, with batch resolution for many conflicts.
- newer
- Auth: Google Sign-In / OAuth 2.0 with a Drive scope, tokens refreshed automatically.
The unfinished reorder feature was meant to let the user choose how a linear
drop position maps onto the 2-D responsive grid: horizontal-first (fill row
by row) vs. vertical-first (fill column by column), selectable as a
preference. Completing it requires adding a persisted order/position column
to project_items and writing the reorder through to the database (the current
TODO), then extending drops to cross-level moves with the hierarchy-validation
rules described in architecture.md.