Selected works
2025 — SaaS

Tagtics

Client feedback pinned to the exact UI element — built for agencies and freelancers.

React 19 TypeScript Zustand Tailwind CSS Supabase PostgreSQL RLS Vercel

Why it exists

Agencies and freelancers collect client feedback in screenshots, Slack threads, and vague “the button on the left” comments. Context gets lost; bugs get mis-triaged.

Tagtics pins feedback to the DOM element the client clicked — with browser context — so the ticket points at a real UI target, not a description of one.

  1. Click the widget
  2. Select the element
  3. Submit the note — DOM target + browser context in one ticket

What I engineered

I designed and built the product surface and the multi-tenant data model that makes agency workflows safe.

  • Interactive element-selection feedback flow on the client review site
  • Admin dashboard for centralized feedback per project
  • PostgreSQL Row-Level Security so each tenant only sees its own data
  • Supabase Auth for secure access
  • Lightweight, non-blocking embeddable widget for client review builds
  • React frontend shipped to production on Vercel; Supabase-backed API work continues alongside the live UI

Architecture

Decoupled serverless shape: embed widget + admin dashboard on Vercel; auth, Postgres, storage, and edge functions on Supabase.

Client review browser
Frontend · Vercel
Embed widget
Admin dashboard
Backend · Supabase
Supabase Auth
PostgreSQL + RLS
Object storage
Edge functions
  • Client review browserEmbed widget· Loads widget
  • Client review browserAdmin dashboard· Manages feedback
  • Embed widgetPostgreSQL + RLS· Submits feedback
  • Embed widgetObject storage· Uploads screenshots
  • Admin dashboardSupabase Auth· Authenticates
  • Admin dashboardPostgreSQL + RLS· Reads data
  • PostgreSQL + RLSEdge functions· DB webhooks
  • Edge functionsPostgreSQL + RLS· AI / integrations (roadmap)

Engineering decisions

Why pin feedback to the DOM instead of freeform comments?

Agencies lose hours translating vague notes into tickets. Element selection plus browser context turns feedback into a fixable target without changing the client’s app code.

Why PostgreSQL Row-Level Security for multi-tenancy?

Tenant isolation belongs in the database, not only in application filters. RLS enforces “each tenant only sees its own rows” even if a query path is wrong — critical for agency multi-client data.

Why Supabase instead of a custom Nest API first?

Auth, Postgres, storage, and RLS ship as one platform so the MVP could prove the feedback loop fast. Edge functions and webhooks leave room for AI summarization and integrations without rewriting the core.

Why a lightweight embed script?

Review builds must stay non-blocking. A small widget loads on the client site, captures selection, and posts feedback without owning the host app’s stack.

What shipped

The React frontend is live in production. Agencies can run the click → select → submit loop and manage feedback from the admin dashboard.

  • Interactive element selection
  • Admin dashboard per project
  • Supabase authentication
  • Embeddable review widget
  • Tenant-aware data model with RLS

Hardest problems

Trustworthy multi-tenancy and a feedback UX that works on arbitrary client sites — without requiring those sites to adopt a heavy SDK.

  • Designing RLS policies that match agency project boundaries
  • Keeping the embed small and non-blocking on third-party pages
  • Capturing enough DOM/browser context to make tickets actionable

Lessons learned

For SaaS that holds client data, isolation strategy is a product feature — not an afterthought. Shipping the feedback loop early validated demand; hardening RLS and API surfaces is the next engineering chapter.

Roadmap (not shipped)

Clearly separated from production scope so recruiters see honesty about maturity.

  • AI summarization to group similar feedback
  • Webhooks for Slack, Discord, Jira, and Linear
  • Deeper agency workflows for multi-client organization