Resolv
A non-conformity reporting app that turns “something is wrong” into a tracked, triaged, resolvable record. Internal and live.
Resolv turns “something is wrong” into one tracked record instead of a lost email thread. Log an issue with enough context to triage it, then route the follow-up through investigations, corrective actions, notifications, attachments, and exports. A dashboard summarizes open, in-progress, and resolved work by severity, scoped to what an admin, region lead, or site user can see.
The report has one clear status at all times, and the log flow is staged: incident details first, then severity, then the response. State is the spine of the interface: anyone can see where a thing stands at a glance, and filing never turns into one long form.
Severity is advisory, never a gate. A configurable scoring model pre-hints a severity from the incident details, but the moment the user touches the picker their judgment wins, and logging is never blocked on getting the score right. The suggestion helps; it doesn't decide.
Cross-region browsing shows patterns without leaking records. Summary cards let anyone spot recurring issues beyond their own site, but a card only links to full detail when the viewer's role permits it, keeping discovery and access control separate.
A Next.js App Router front end over Supabase, which provides auth, Postgres, storage, and edge functions. The schema spans the whole workflow: profiles, regions and sites, reports, investigations, notes, attachments, corrective actions, notifications, and root-cause factors, and row-level security enforces who can see and change which report at the database, not just the client. UI helpers mirror that access model for the cross-region summaries. Around the core sit Upstash Redis rate limiting, an edge function that sends assignment emails through Resend, attachments in Supabase Storage, and CSV and PDF export.
Live and in internal use. Non-conformities now have one home, a clear owner, and a resolution that is recorded rather than remembered. The shipped surface covers the whole loop: dashboard, logging, a triage queue, cross-region browse, detail with investigations and corrective actions, role-aware onboarding, notifications, and CSV and PDF export.
The schema is honest about its weak points: the baseline migration was reconstructed from the live database rather than dumped, so it needs a rebuild check before I trust it as the source of truth, and one report-to-site link is missing the foreign key its siblings have. The severity weights and keywords are still provisional defaults waiting on real validation, and the keyword matcher is deliberately naive, fine while scoring is low-weight but a refactor waiting to happen. I'd also move the edge function's hardcoded URLs and sender into environment config. The advisory-not-mandatory severity decision is the one I'd keep as it is.