Skip to content
All work
SaaS · Visual FeedbackLivePakistan

FeedSnap

Collecting pixel-accurate website feedback usually means messy screenshots and email threads. FeedSnap is a multi-tenant Marker.io competitor: an embed widget pins screenshot-annotated comments at exact coordinates for owners to triage in a dashboard.

Role
Solo Developer
Timeframe
2025

Stack

Next.js 16React 19TypeScriptSupabasePostgres RLSUpstash RedisLemon SqueezyVercel

Architecture

Embed widgeton the client site
Screenshot servicePlaywright + Chromium, SSRF-guarded
Postgres RLSmulti-tenant store
Dashboardowner triage
Embed widget → serverless Playwright+Chromium screenshot (SSRF-guarded) → Postgres RLS multi-tenant store → dashboard triage.

Key decisions

Chose

A monolithic Next.js App Router app: dashboard, public widget API, and billing sync all in one codebase, deployed serverless on Vercel.

Rejected

Splitting into a separate API server and a standalone frontend SPA from the start.

Why

For a lean, mid-stage SaaS, one codebase kept routes, components, and Lemon Squeezy billing sync co-located and shipping fast on serverless. A distributed split would have added operational overhead before the core feedback-capture workflow was proven. The tradeoff is deferred boundaries: multi-tenant limits and cross-region scale will eventually force service seams, but that cost is paid later and deliberately, not up front.

Chose

Cross-instance rate limiting on Upstash Redis, with an in-memory Map fallback when Upstash credentials are absent.

Rejected

Relying only on per-instance in-memory counters.

Why

Serverless functions scale to many isolated instances, so a per-instance counter alone lets an abuser slip past limits by hitting different instances. Upstash gives one shared counter across every instance. The in-memory fallback keeps local dev and un-provisioned environments running instead of hard-failing when the dependency is missing.

Try it

Screen recording of the live product. Loads only on play.

Screens

FeedSnap screenshot 1
FeedSnap screenshot 2
FeedSnap screenshot 3