Case Study
SkillIssue — A Full-Stack Social App, Shipped Solo
A live social challenge app where friends stake real money on dares, submit photo proof, and approve or reject each other. Built solo end-to-end — UX, design system, frontend, backend, database, deployed. Agentic coding is the execution layer; every meaningful decision is mine.
Client
Role
Timeline
Industry

Most designers ship Figma files. I ship apps. SkillIssue is a live social challenge app where friends stake real money on dares, submit photo proof, and approve or reject each other. Every rupee tracked forever. Stake it, or shut up.
Full-Stack
End to End
Solo
Built
Live
In Production
Not a Prototype. A Product.
SkillIssue is a complete, shipped product with everything a real app needs — and I designed and built all of it.
74
React Components
11
Database Tables
12
SQL Migrations
- Frontend — 74 React components across 20 routed pages, dark-themed, fully responsive
- Backend — 11-table Postgres schema with foreign keys, indexes, triggers, and RLS on every table
- Auth — Google OAuth + email/password via @supabase/ssr
- Realtime — Subscriptions on every key table, no refresh buttons anywhere
- Storage — Structured buckets for proof uploads (photos, payment receipts)
- Scheduled jobs — Edge function processes expired challenges on a cron
- Deployed — Vercel with full CI/CD, auto-deploys on every push



The Designer Made the Calls
Agentic coding writes code, but every UX decision — every layout, every interaction, every empty state, every micro-delight — is a designer's call. Here's what I decided:
Realtime as a Design Feature
Every key page subscribes to Supabase realtime. Your dashboard updates the moment a friend sends you a dare. Your approval inbox updates when new proof lands. The notification bell never needs a refresh. It's not a technical flex — it's a design principle. The app feels alive because I designed it to.
Deterministic Player Identity
Every user gets a unique color hashed from their user ID. Their nickname renders in that color everywhere in the app — in challenge cards, notifications, comparisons, ledgers. You recognize your friend at a glance without reading the name. Design system thinking applied to user data.
Empty States That Speak
"Your squad is empty — add a friend to start daring." The product voice runs through every empty state, every loading state, every error. The app has a personality, and it shows up everywhere.
Auto-Completion Without Clicks
When all tasks in a challenge get approved, the challenge flips to "completed" automatically — no "Mark Complete" button. The system just knows. UX invisibility is the goal: the fewer decisions users have to make, the better the product feels.

The Design System
Not generated defaults. A real design system, intentional from the first token to the last component.
Typography
Three typefaces, each with a job: Fraunces (display) with SOFT axis tweaks for headings — warm, slightly unusual, never generic SaaS. Inter (body) for readable, boring-in-the-best-way paragraph text. JetBrains Mono for timestamps and amounts — so numbers always feel mechanical and trustworthy.

Color

Dark theme by default. Brand accent for "ISSUE" in the wordmark. Status colors for challenge states (pending, active, completed, failed, rejected). Every user gets a unique hash-derived color that persists across every screen.
Component Vocabulary
Built on shadcn/ui + Radix primitives, extended with product-specific components: StakeAmount, Rupees, StatusBadge, CountdownTimer, ChallengeCard, ApprovalCard, PaymentApprovalCard, FriendCard, SharedFundCard. Each designed for a specific role, composable throughout the app.

The Product Has a Voice
SKILLISSUE. One word. SKILL in regular, ISSUE in brand accent. Tagline: "Stake it, or shut up." The voice is witty, direct, confrontational-but-friendly. It had to feel like the group chats it replaces.

The Stack
I pick tools the way I pick design systems — intentionally. Every piece was chosen for a reason:
Frontend
- Next.js 15 (App Router, Turbopack)
- React 19 + TypeScript
- shadcn/ui + Radix primitives
- Tailwind CSS
- React Hook Form + Zod
- Recharts for data viz
Backend & Infra
- Supabase (Postgres, Auth, Storage, Realtime)
- Row-Level Security policies
- Supabase Edge Functions (cron jobs)
- Resend for transactional email
- Vercel (hosting + CI/CD)
- GitHub integration
Production-grade stack
No toy frameworks, no experimental DBs

Agentic Coding, the Actual Skill
Agentic coding isn't "asking ChatGPT for code." It's closer to being a tech lead who manages AI engineers than a developer who types. Here's how I actually build:
PRD-First, Always
Before a single line of code, I write the PRD. Every flow, every page, every edge case — specified down to field lengths and error states. That document becomes the constitution. Every AI conversation references which section it's touching. No guessing, no drift.
Convention Files as Force Multipliers
A CLAUDE.md at the project root encodes every rule — brand name, currency format, auth pattern, realtime hook, naming conventions, component structure. Every new session starts with that context loaded. Every feature built the same way, without re-explaining the project ten times.
Describe, Don't Prescribe
I don't tell Claude what code to write. I describe what the feature should DO. The AI proposes the implementation — React Hook Form schema, Zod validators, UI, database column constraints. I review, point out what feels off, iterate.
Parallel Agents for Speed
Multiple features built in parallel sessions. One agent on the approval flow, one on the friend graph, one on the comparison page. Each with clear scope, clear context, clear output.
Read Every Line
I review every generated line before commit. Not to edit it — to understand it. That's how I learned Postgres RLS, realtime subscriptions, server components, middleware auth. I don't need to write SQL from scratch. I need to know what my app is doing.
Engineering Decisions
Shipping real products means making engineering tradeoffs — not just design ones. Here are the calls I made:
Not a Payment Processor
Every app in this space tries to hold money — which means compliance, KYC, reconciliation, support, refunds. Weeks of work. I consciously didn't. SkillIssue tracks the agreement and the receipt. Money moves via UPI or bank transfer outside the app, screenshot gets uploaded, recipient approves, logged to the shared ledger. 90% of the value, 10% of the complexity.
Scope reduction is a superpower
Business Logic in the Database
When all tasks in a challenge get approved, the challenge flips to completed automatically — via a Postgres trigger, not app code. When a challenge fails, a trigger creates the fund obligation, notifications, and updates the shared ledger — all in one transaction. The app layer stays thin; the database does the heavy lifting reliably.



The Personality Page
The /compare view shows head-to-head stats between you and any friend — sent, received, completed, failed, approval rate, net ledger. Who owes whom. Who's winning. Who's a coward. This page doesn't add functionality — it adds reason to come back. Designed to be the most-shared screenshot from the app.

Results
Shipped
In Production
In Use
With Real Friends
Loop Active
Learning From Use
- A working, monetized, realtime social product — built solo, deployed to production
- Used with real friends on real dares with real money
- Full stack owned — design, UX, system, frontend, backend, database, infrastructure
- A repeatable workflow for shipping future products the same way, faster
What I Learned
- Designers can ship full-stack products. The key isn't learning to code — it's learning to direct agentic coding like a tech lead.
- The designer makes all the meaningful calls. AI writes the code. I design the product, the UX, the system, the voice.
- The PRD is the constitution. Write it before writing anything else.
- Scope reduction beats feature engineering. The decision NOT to hold money was worth more than any feature I shipped.
- Convention files are the difference between AI-assisted chaos and production-grade consistency.
- Reading generated code is how I learned the stack. Not writing. Reading.
- The ceiling on what a designer can build is higher than anyone realizes.
I don't wait for engineering. I don't hand off. I design the product — voice, UX, system, interactions — and I ship it. Agentic coding is how.