03 / Project Management Tool
OPPA / Progress Tracker
A project tracker designed to preserve context — not just tasks.
Built around activity history, pause/resume context, and a deterministic recommendation engine that helps surface what to work on next.
- Role
- Personal Project
- Type
- Project Management Tool
- Maturity
- Functional MVP · Active Development
- Stack
- Next.js 16 · Supabase · PostgreSQL
The Problem
Resuming work is often harder than starting it.
Projects become difficult to resume when the useful context lives outside the tracker: what changed, why work paused, and what would be reasonable to do next.
A normal task list can show what exists. OPPA is built around preserving the surrounding project state, so active work does not restart from memory every time.
Context OPPA keeps visible
- What was last worked on
- Why a project was paused
- What changed in recent activity
- What the next action might be
Core Loop
A workflow for continuity.
01
Create project
02
Log activity
03
Work progresses
04
Pause with context
05
Resume later
06
Evaluate recent state
07
Surface What's Next
Verified Capabilities
Small pieces, connected as a product loop.
Project state
Project CRUD, activity logging, and pause/resume are treated as one working loop rather than separate record-keeping screens.
Domain rules
Pause reason is required at the database layer through a PostgreSQL CHECK constraint, so the rule survives UI changes or regressions.
Next-work guidance
A deterministic scoring engine evaluates project state and produces inspectable suggestions without a network call or LLM dependency.
Guest sharing
Read-only share links expose a narrow shared dashboard view without granting anonymous users direct table access.
Engineering Focus
The recommendation layer is deterministic on purpose.
The project's lib/scoring.ts module is a pure scoring function. It evaluates project state and returns next-work suggestions without calling a network service or depending on an LLM.
That makes the output predictable, inspectable, fast, and easier to reason about than opaque recommendation output.
The optional narration layer exists as a future extension; it is currently a stub.
Safe Guest Sharing
Public sharing uses a narrow database function.
Guest
- 1Share link
- 2get_shared_dashboard()
- 3Filtered project view
Authenticated Owner
- 1Supabase Auth
- 2RLS-protected tables
- 3Full private workspace
Instead of opening tables to anonymous reads, OPPA exposes a PostgreSQL SECURITY DEFINER RPC designed specifically for the shared dashboard use case. The function returns only appropriate shared data and strips private fields.
Data Boundary
Protection lives at the data layer.
OPPA uses Supabase, PostgreSQL, Supabase Auth, and Row Level Security. Data access is ultimately enforced through PostgreSQL Row Level Security, rather than relying solely on client-side route handling.
Pause reason is also enforced through a database CHECK constraint. Application validation can be bypassed or regress; the database keeps that domain rule intact.
Architecture
A compact full-stack system.
Auth
Supabase Auth
Data
PostgreSQL + Row Level Security
Sharing
SECURITY DEFINER get_shared_dashboard RPC
Local application logic
deterministic scoring engine
- Next.js 16
- TypeScript
- Supabase
- PostgreSQL
- Supabase Auth
- Row Level Security
Current Scope
Functional core, honest boundaries.
Currently implemented
- projects
- activity logging
- pause/resume
- deterministic suggestions
- guest sharing
- auth/RLS protection
Being developed or refined
- epics/tasks exist in the database schema but have no UI
- optional AI narration is currently only a stub
- suggestion_cache and /api/suggestions/refresh exist but are not wired into the active product flow
- automated test suite has not yet been introduced
- CI has not yet been introduced
Reflection
Context became part of the product state.
OPPA became an exercise in treating context as product data. The most useful parts of the implementation are not necessarily the largest features: deterministic recommendations, database-enforced domain rules, and a deliberately narrow guest-sharing boundary make the application easier to reason about.