Piyush Grover

iOS — Personal Product · Live on the App Store

Shagunly — Tracking Tradition, One Gift at a Time

A private ledger for shagun — the gifts and cash exchanged at Indian celebrations — with a reciprocity engine at its heart. Designed end-to-end in Figma, then built AI-directed without writing code. Live on the App Store.

Role
Product & design lead — solo founder
Platform
iOS 17+ · SwiftUI · Supabase · Android in development
Status
Live on the App Store ↗
Design & build
Designed in Figma, built AI-directed — zero hand-written code
Shagunly Home screen on iPhone — balance summary and upcoming occasion
Shagunly New Shagun entry screen on iPhone
Shagunly app icon
01Overview

A Culturally-Native Ledger

Shagunly is an iOS app for tracking shagun — the cash and gift exchanges that are a core part of Indian weddings, festivals, and birthdays. It replaces the mental math, scattered notebooks, and "who gave what" guesswork with a simple, culturally-native ledger.

I designed it end to end in Figma — the theme, the design system, every component and flow — then directed the entire technical build without writing a line of code, using Claude as the engineering partner. This case study covers both halves: the design decisions, and what it actually takes to hand a finished design to an AI and ship it to the App Store.

02The Problem

A Real, Ongoing Social Obligation

At Indian occasions — weddings, Diwali, birthdays — cash and gifts change hands constantly, and tracking who gave what (and what's owed in return) is a real, ongoing social obligation. Families still do this with pen-and-paper registers or fragmented memory. There was no lightweight, culturally-specific tool built for this — generic expense trackers don't understand the shagun mental model of reciprocity, occasions, and relationships.

This was a problem I understood firsthand, which shaped both the product's name (a playful spin on "shagun") and its tone throughout.

The idea came from my father — tech-savvy, and done with the paper registers. He wanted the record off paper and onto a phone, where it could be pulled up in seconds instead of leafed through.

03Design Process

Insight-Driven, Then a Hard Platform Call

Research & Framing

Rather than a formal research phase, this was insight-driven design — grounded in direct, lived experience of the problem and validated early with family as real users. That closeness to the user became a strength: every design decision could be pressure-tested against "would my own family actually use this at a wedding?"

From PWA to Native

Shagunly began life as Sagan Tracker, a progressive web app. It worked, but a PWA has real ceilings for this use case — no App Store presence, weaker offline reliability, and a "second-class" feel for something meant to be used mid-celebration, one-handed, often with spotty venue wifi.

I made the call to rebuild native in SwiftUI. That's a significant product decision — trading faster iteration for a proper install, TestFlight distribution, and a path to the App Store — and it's the kind of build-vs-rebuild tradeoff any product designer has to own.

Structure before style

Before any colour or type, I resolved layout and hierarchy as greyscale wireframes in Figma — one primary question per screen, balance and next action above the fold, direction chosen before amount. The visual language came later, on top of a structure that already worked.

Low-fidelity wireframes — Home, People and New Shagun core screens with structural annotations
Lo-fi core screens — Home, People, New Shagun
Low-fidelity capture flow — four steps from home to updated home
Capture path, four taps
Low-fidelity wireframes — sign in, occasions list and occasion detail
Auth, occasions, detail
04Design System

A Token Set, Not a Pile of Screens

Because I'd be handing this to an AI rather than an engineer, the system had to be unambiguous: every colour, size and spacing step named and fixed in Figma first. Vague intent produces vague code — a defined token set produces the screen you drew.

Two decisions drive the whole palette: a deep night base so celebratory colour can glow without shouting, and a serif display voice that brings warmth to what is, underneath, a money app.

Colour tokens — surfaces, brand and semantic colours, text tokens with hex values
Colour tokens
Type scale — serif display through mono tabular numerals
Type scale — serif display, mono numerals
Spacing scale on a 4pt base with radius rules
Spacing — 4pt base
Theme board — night base with festive gradient treatment
Theme — night + festive

Components & states

Each component was drawn with its states before it was built — default, pressed, disabled, selected — so the build had nothing left to invent.

Button components — primary gradient with default, pressed and disabled states, secondary and contextual variants
Buttons — all states
Segmented controls for direction and gift type, plus the show/hide switch
Segmented controls & switch
Auspicious amount chips in default and selected states
Auspicious amount chips
Occasion row and person balance row cards with balance states
Cards — occasion & person rows
05Key Screens & Flows

Calm by Default, Fast Mid-Celebration

  • Home (Root view) — the day-to-day dashboard, scannable at a glance
  • Entry detail — tap an entry for a clean read-only view; a pencil icon surfaces editing, keeping the default state calm and low-friction
  • Add/edit entry — fast capture during a live event, minimal required fields, with auspicious-amount presets (₹501, ₹1,100, ₹2,100, ₹5,100)
  • Occasions — entries are grouped by real-world context (a wedding, Diwali, a birthday), not just a flat list
  • People — every relationship tracked as a running balance, with an at-a-glance "your turn" or "their turn" cue instead of a flat transaction list
  • Auth — email/password with a forgot-password flow; Apple/Google Sign-In designed and scaffolded, gated on Apple Developer enrollment

Shipped as a responsive iPad layout too — same flows, same data, adapted to a wider canvas rather than just stretched.

Shagunly iPhone Home screen — balance summary, upcoming occasion, recent entries Shagunly iPhone People screen — relationships with running balance and whose turn it is Shagunly iPhone Occasions screen — upcoming and past occasions Shagunly iPhone New Shagun entry form — amount, person, date, occasion
Shagunly iPad Home screen, adapted for a wider layout Shagunly iPad People screen Shagunly iPad Occasions screen Shagunly iPad New Shagun entry, shown as an overlay panel

The home screen surfaces what matters first: net balance, the next occasion needing a gift, and recent activity. Every relationship is a running balance, not a transaction log — a glance tells you whose turn it is. Occasions split into Upcoming and Past, each carrying its own gift-tracking status — drilling into one totals what was given and received, and lists every gift logged against it. Logging a shagun takes seconds: given or received, an auspicious-amount preset, a person, and an optional occasion link.

The two journeys it turns on

Capture flow — home, new shagun, preset and person, confirm, updated home
Capture — logging a gift in the moment
Reciprocity flow — people tab to person to entry history to decision
Reciprocity — reading a relationship over time
06Design Principles

Principles I Held To

  • Calm by default, powerful on demand — read-only detail views with edit as a deliberate second step, not the default
  • Culturally specific copy — placeholder text like "Diwali, a wedding…" instead of generic examples, so the product feels made for this context, not adapted to it
  • Free first, monetize later — I made the call to strip the paywall entirely during the validation phase (premium logic hardcoded on, payment provider removed) so nothing gets in the way of real usage feedback
07Design Decisions & Trade-offs

The Calls Behind the Screens

Every screen above is the survivor of a set of options drawn out in Figma. The decisions that shaped Shagunly weren't visual polish — they were product calls about what the app should feel like to a family mid-celebration. What was on the table, what shipped, and why:

D1 Amount entry

Considered A plain numeric field — fastest to build, culturally blind.

Shipped One-tap auspicious presets — ₹501, ₹1,100, ₹2,100, ₹5,100 — above the keyboard.

Why Shagun amounts conventionally end in ₹1. Presets make the culturally correct amount the path of least resistance and cut mid-event entry to a single tap.

D2 The People screen

Considered A transaction log per contact — accurate, but reads like accounting.

Shipped A running balance per relationship, with a "Your turn / Their turn" cue.

Why Shagun is reciprocity, not bookkeeping. Framing each person as a relationship state answers the real question — "where do we stand?" — at a glance.

D3 Entry detail

Considered Editable-by-default detail views — powerful, but noisy and risky.

Shipped Read-only by default; editing sits behind a deliberate pencil tap.

Why Most opens are checks, not changes. A calm read state keeps the record safe from accidental edits in the middle of a crowded function.

D4 Direction first

Considered Amount-first forms, with given/received as an afterthought toggle.

Shipped Received / Given as the first, color-coded choice — green in, red out.

Why Direction is the meaning of the transaction. Committing it first keeps every later field — preset, person, occasion — in the right mental frame.

D5 Occasion linking

Considered Requiring an occasion on every entry — cleaner data, slower capture.

Shipped Occasion is optional at capture, linkable when there's time.

Why At a live event, speed beats structure. Optional linking keeps the ledger usable in the moment without giving up organization afterwards.

D6 Visual identity

Considered Default system typography on a light canvas — native, but generic.

Shipped A serif display voice over a deep night palette with festive gradient accents.

Why The serif brings warmth and sense of occasion to a money app; the dark canvas lets celebratory color glow without shouting.

The alternates, side by side

Each fork was drawn out in Figma before committing — the rejected option on the left, what shipped on the right.

Exploration — plain numeric field versus auspicious amount presets
D1 — plain field vs auspicious presets
Exploration — transaction log versus running relationship balance
D2 — transaction log vs running balance
Exploration — editable by default versus calm read-only detail
D3 — editable by default vs calm read state
Exploration — amount-first capture versus direction-first capture
D4 — amount first vs direction first
Exploration — system light identity versus serif night identity
D6 — system/light vs serif/night identity
New Shagun entry screen — direction-first choice, auspicious presets, optional occasion
D1 · D4 · D5 — direction-first entry, auspicious presets, optional occasion
People screen — running balances with your-turn / their-turn cues
D2 — relationships as running balances, not transaction logs
08Product Decisions

The Calls That Made It a Product

Beyond the screen-level trade-offs, a handful of decisions shaped what Shagunly actually is — each a product call before it was a design or engineering one.

P1 The reciprocity engine

One shared lookup answers "what did this person last give us?" everywhere — home banner, gift suggestions, reminders. It prefers a same-occasion match (their wedding → your wedding) before falling back to most recent, and every name comparison flows through one normalisation rule, so "Anita", "anita " and "ANITA" are one person.

Why it matters When grouping logic lives in five places, it disagrees in five ways. Here it can't.

P2 Hosted occasions — flipping the book

Tracking apps assume you're always the giver. But when you host Dad's 60th, gifts flow toward your family. Marking an occasion "My family's" flips the perspective: the CTA becomes Log gifts received, entries default to incoming, the "no gift yet" urgency disappears, and the reciprocity line hides — the guest of honour is not a prior giver.

Why it matters One boolean, but it required rethinking every screen's assumptions.

P3 Family sharing, with manners

A household keeps one gift book. Anyone joins with a six-letter share code, and every entry shows who logged it. The rule that makes it work socially: only the author can edit a record — everyone else can ask. Change requests queue on the author's home screen to approve or decline.

Why it matters Enforced twice — in the UI, and in Postgres row-level security with a SECURITY DEFINER function that verifies ownership server-side. A hacked client changes nothing.

P4 Wedding-season speed

Batch entry ("Save & Add Another" keeps the occasion and date, resets the person), live Indian digit grouping (₹1,00,000 as you type), one-tap auspicious amounts, camera capture at the door, and a picker that turns a typed one-off occasion into a saved one without leaving the form.

Why it matters The app is used standing up, in a crowd, mid-celebration — or not at all.

P5 Shagun Wrapped

The year in gifts — totals, closest exchange, most generous moment — as a full-screen story.

Why it matters A ledger app that earns a screenshot.

P6 Privacy as a feature

No analytics SDKs, no ads, no tracking. Photos never leave the user's account; export ships every record as spreadsheets in two taps; delete-account removes everything atomically. The privacy policy is plain language on purpose, with a section explaining exactly what family members can and cannot see.

Why it matters For a record of family gift-giving, discretion is the product.

09Handoff

Figma → Spec → AI Build

This is the join between the two halves of the project. I redlined each screen in Figma the way I'd spec it for an engineer — component, size, radius, token, state, edge case — and that spec became the brief for the build.

The discipline mattered more here than it would with a human engineer: a person asks when something's ambiguous, an AI just picks. Anything I left vague came back as something I didn't design, so the spec had to carry the decision, not just the look.

Design decided in Figma. The build followed the spec.

Annotated redline spec of the New Shagun sheet — component sizes, radii, token references and state rules
Redlined spec — the New Shagun sheet, as handed to the build
10Building It

Directing the Build, Not Designing in Code

With the design settled in Figma, the build became an execution problem — the part of the story most portfolios don't tell, and increasingly the part hiring managers ask about.

I have no coding background. Every screen, flow, and backend interaction was built by directing Claude against the Figma spec — describing intent, reviewing output, iterating — the same way I'd direct an engineer, but faster and entirely in my own hands.

How I actually worked

  • I thought in components and states — the same mental model as the Figma library I'd already built: "this view has a read state and an edit state," not "write a SwiftUI struct"
  • Every change followed the same loop: describe the change → review the code → paste it into Xcode → build → test on my own device
  • Changes were batched and reviewed as complete file overwrites, not tiny patches — closer to reviewing a full component than debugging a line

What this actually produced

Not just prototypes:

  • A working auth system with a real forgot-password flow via Supabase
  • A new read/edit view architecture (EntryDetailView) built and wired into the app's root navigation
  • A backend on Supabase, with admin accounts, a dedicated reviewer test account, and a hosted privacy policy for App Store compliance
  • A build that cleared Apple's Beta App Review, then full App Review — live on the App Store today
  • An app icon designed across all three iOS appearance modes — default, dark, and tinted
Shagunly sign-in screen — email/password with Apple and Google sign-in
Shipped auth — email/password, Apple & Google sign-in
Shagunly app icon — default appearance
Default
Shagunly app icon — dark appearance
Dark
Shagunly app icon — tinted appearance (iOS 18 icon tinting)
Tinted
11Engineering Judgment

Real Problems, Solved Without Writing Code

Directing a build doesn't mean skipping the hard parts — it means understanding them well enough to catch them. The bugs that mattered were the quiet ones:

  • The nil that wasn't null. Swift's synthesized Encodable omits nil keys, so clearing a photo or a note silently survived in Postgres — the classic PATCH-semantics trap. Fixed with explicit update payloads that encode every field, writing SQL NULL on purpose. That discipline now covers all five mutating tables.
  • Scope-aware data, scope-blind reminders. Family sharing filters every query by the active book. The reminder scheduler cancels all pending notifications before re-adding — so feeding it the filtered list silently wiped the other book's reminders. Caught in review; reminders now reschedule from an unscoped fetch.
  • Making Google say "Shagunly." Supabase's web-redirect OAuth shows users the raw backend domain on Google's account picker. Rebuilt sign-in on the native GoogleSignIn SDK — the same signInWithIdToken path as Apple — so auth is branded, in-app and browser-free.
  • The deployment-target backlash. Early users on older iPhones couldn't install at all: the target was accidentally pinned to the newest OS. Audited the real API floor, dropped it to iOS 17, shipped a same-day fix — newer devices kept the Liquid Glass look, older users finally got in.
  • Deletion without data loss. Deleting an occasion unlinks its gifts rather than destroying them; deleting a family unlinks members' entries; deleting an account runs one atomic edge function. Every destructive path answers "what happens to everyone else's data?" first.

These aren't things I coded — they're things I had to understand well enough to direct, and to catch when the build got them subtly wrong.

12Testing & Validation

Real Testers, Real Feedback Loop

Shagunly was tested on TestFlight with family as real, external testers — not synthetic QA. Build 2 cleared Apple's Beta App Review, and that feedback loop directly shaped Build 3 (the read/edit view split and forgot-password flow both came out of it). The app has since cleared full App Review and is live on the App Store ↗.

13What's Next

Beyond the Launch

  • Calendar sync — occasions where people already look for them
  • A shareable Wrapped card — the year in gifts, built to send
  • Per-relationship insights — patterns across a single relationship over time
  • Home-screen widgets — the next occasion at a glance
  • Hindi localisation
  • Android — already scaffolded in Flutter against the same Supabase backend
14Reflection

Product Judgment, End to End

Shagunly is as much a case study in product judgment as it is in interface design. The interesting decisions weren't about corner radii — they were things like: rebuild native or stay web? Strip the paywall or protect revenue during validation? Ship a calm read-only view or a more powerful but noisier editable one by default?

Directing an AI to build the app didn't replace design thinking — it removed the traditional bottleneck between having a decision and seeing it live in a real, installable product that real people could test. It let me stay end-to-end: the same person who decided what to build also shipped how it works.

Shagunly is out in the world. Get it on the App Store ↗

Shagunly on iPad — Home screen
Shagunly on iPhone — New Shagun entry form
Shagunly on iPhone — Occasion detail with gifts logged