Live product
Progress report · August 2026
iSell Back is a device recommerce platform for India. People sell their MacBook or iPad
from home: they get a price in seconds, an agent collects the device at their door, and the
payout is transferred after inspection.
This page is the engineering and product record behind it. Every number below is
countable in the source repository — it is not a pitch deck estimate.
The Android app is still listed on Google Play as
BuyBack Elite:
that listing and the package id com.buybackelite.app are deliberately
preserved so existing installs keep updating, while the product name moved to
iSell Back.
Summary in one paragraph
iSell Back started as a single-business prototype with one Android app and a basic sell
flow. It was rebuilt through AI-assisted, spec-driven development, and the system is now
six shipped surfaces — three web applications and three Android applications
—
on a backend of 47 database migrations, ~77 tables,
119 Postgres functions and 139 row-level-security policies,
with 116 hand-written test files and a 6-job CI pipeline that
gates every push.
Pricing became fully server-authoritative, the schema became multi-tenant, and the customer
bundle dropped from 297 KB to 134.8 KB gzipped. The current focus is launch
infrastructure for the India rollout.
01
What changed since the first grant
The most useful way to read this project is as a delta. Here is the state of the system at
the end of the prototype phase, against the state of the system today.
02
By the numbers
Every figure here is a direct count from the repository — migration files, SQL statements,
route declarations, test files. They are reproducible, not rounded up.
116
Hand-written test
files
Backend surface
- 62 database triggers
- 13 serverless API handlers
- 1 Supabase Edge Function
- 14 server-authoritative pricing RPCs
Test breakdown
- 68 JavaScript / JSX (Vitest)
- 43 Dart (flutter test)
- 5 Deno (Edge Function)
- Plus a separate generated
end-to-end suite
Device catalog
- 35 seeded models
- 21 MacBook · 14 iPad
- 56 condition-deduction rules
- ~70 model spec entries on mobile
03
The six surfaces
Three sides of the business each need their own interface: the customer selling a device,
the field agent collecting it, and the operator running pricing and payouts. Each exists on
both web and Android.
Customer
isellback.com ·
Android
About 30 routes on web. A 7-step sell wizard, store discovery by pincode, offer
comparison across stores, refurbished listings and per-request lifecycle tracking.
- Guests finish the whole quote before any login wall
- Android
com.buybackelite.app v1.0.4
- 100 Dart files · 26 screens
Field agent
agent.isellback.com
·
Android
8 pages for the person at the customer's door: assigned pickups, on-site condition
verification, photo capture, customer signature and history.
- Offline queue for patchy field connectivity
- Android
com.buyback.agent v1.0.1
- Agents have no payout-initiation path by design
Operator
control.isellback.com
· Android
22 pages of back office: the price engine and its governance, condition deductions,
competitor price sync, agent management, fraud alerts, payout administration and store
verification.
- Super-admin guard on platform-wide screens
- Android
com.buyback.app v1.0.1
- Hosts the 13 serverless API handlers
How one sale moves through the
system
-
Quote
The customer picks a model, storage and condition. The server — never the device
—
calculates the price through canonical_calculate_pricing and issues a
quote.
-
Compare and choose a store
A pincode resolves which stores actually serve that area, and each returns a fresh
server-issued offer. Customers never see a pre-deduction headline number that later
shrinks.
-
Doorstep pickup
An agent self-assigns the pickup, verifies the device on site, captures photos and a
signature, and the inspection result produces a revised quote the customer accepts or
declines.
-
Payout
Payout is reserved in SQL with an idempotency key, executed via Razorpay, and confirmed
by a fail-closed webhook that re-fetches the authoritative record from the provider.
04
How the credits were spent
The credits funded AI-assisted development in Kiro, and specifically its spec workflow:
requirements first, then a design, then a task list that gets worked through and checked off.
Six specs live in the repository under .kiro/specs/, each with a requirements
document, a design document and a tracked task list. That is where the money went, and the
artifacts are auditable.
Spec tasks closed across the
four specs
that carry task lists.
Every spec was written
before its
implementation, not reverse-engineered afterwards.
A full internal audit in
July 2026
reviewed the code against those specs and logged 11 findings.
05
The parts that are hard to fake
Anyone can ship screens. These are the invariants underneath, which is where a money-handling
product either holds up or does not.
The server owns every price
14 canonical_* database functions are the only thing allowed to produce a
number. The audit found one Flutter screen still recomputing a price locally and that
code was deleted. Clients display prices; they never derive them.
Tenant isolation, proven in
CI
Every push spins up a throwaway PostgreSQL 16, applies all 47 migrations in order,
verifies checksums and ordering, then runs a two-tenant harness that asserts one
business cannot read another's rows.
Payments fail closed
The Razorpay webhook verifies a timing-safe HMAC over the raw body, de-duplicates events
with payload-hash conflict detection, re-fetches the authoritative record from the
provider, cross-checks amount, currency and fund account, and only permits monotonic
status transitions.
No secret in any client
bundle
Both web source trees were swept: no service-role key and no webhook secret is exposed
through a browser-visible variable. Privileged work happens in serverless handlers, not
the client.
Identity documents get their
own path
ID proofs, verification photos and signatures move to a receipt-based private pipeline:
an insert-only capability scoped to the uploader's own user id, with retention rules and
an access audit trail. It ships behind a flag, currently off, ahead of the data cutover.
Lifecycle as independent
domains
Request, pickup, inspection and inventory each own their state, coordinating through an
outbox/inbox with idempotent command middleware. The customer lifecycle screen adds no
authority of its own — labels and permitted actions come from a versioned server
contract.
Performance is a build gate,
not a
wish
The customer site went from a single 1,112 KB bundle with zero code-split points to a
route-split app at 134.8 KB gzipped on first load. CI fails the build if first-load
JavaScript crosses 250 KB gzipped, so it cannot quietly regress.
This matters commercially: the audience is on Indian mobile networks, and the database
currently sits in Seoul at roughly 150–250 ms per round trip.
Before — 297 KB gz
1 chunk
Now — 134.8 KB gz
route-split
CI budget ceiling
250 KB gz
06
Current stack
Stated plainly, with no aspirational entries. This is what the system runs on today.
Data
& auth
- Supabase — PostgreSQL
- Supabase Auth + Google OAuth
- Supabase Storage
- 1 Deno Edge Function
Web
- React 18 + Vite 5
- TailwindCSS 3
- Zustand, React Router 6
- Leaflet maps
Mobile
- Flutter, Dart 3.10
- 3 Android apps
- 1 shared internal package
- Firebase Cloud Messaging
Ops
- Vercel hosting + serverless
- Razorpay payouts
- GitHub Actions — 6 jobs
- Kiro spec-driven development
07
How the work is governed
A platform that holds someone's device and their payout details cannot ship on optimism.
Two habits keep this system honest with itself: nothing sensitive goes live until it has been
reviewed, and anything not yet verified stays switched off rather than switched on and hoped for.
Staged rollout by default
- New subsystems ship behind environment flags and are enabled only after their data path
has been verified end to end.
- Notifications are complete and tested, and stay dormant until delivery credentials are
provisioned in the target environment.
- Schema changes are additive: with one business present, every screen, query result and
price is identical to before the change.
Reviewed, then merged
- A full internal audit in July 2026 reviewed the codebase against its own specs and
logged every finding with an owner and a fix status.
- Changes touching pricing, access control or payments are drafted as written proposals
and reviewed before they enter the migration chain.
- Each finding is tracked to closure in a dedicated spec rather than in someone's head.
On the July 2026 audit: it was a static code review. The sandbox it ran in failed to start, so
no build, linter or test runner was executed during that pass. It is cited here as a review,
not as a green test run.
08
What the next phase needs
The build phase is largely done. The remaining distance to a marketed launch in India is
mostly infrastructure and verification rather than new features, and here is exactly what
that consists of, in priority order.
-
1
Move the data layer into an
India region
The single largest user-facing problem. Every request from an Indian customer currently
crosses to Seoul and back at 150–250 ms. The designs already minimise round
trips
to compensate, but the real fix is regional. This means standing up a parallel
environment, replaying all 47 migrations, migrating storage objects and cutting over.
-
2
Execute the launch gate
against live
infrastructure
The canonical-pricing and two-tenant isolation harnesses run green on ephemeral
Postgres in CI on every push. Re-running them against the provisioned India
environment is the sign-off step for the regional cutover.
-
3
Turn on notifications and
complete the
media cutover
Both are finished code sitting behind flags. Enabling them requires provisioned
credentials, a storage migration for existing objects, and a reconciliation pass to
confirm nothing was orphaned.
-
4
Finish the Android release
track
Route the eleven built marketplace screens, close out the mobile launch readiness spec,
and get all three apps onto a repeatable release process rather than manual builds.
-
5
Onboard real partner stores
The multi-tenant schema, store verification flow and offer-comparison engine are built
and currently exercised by fixtures. The next phase replaces fixtures with actual
merchants, which is what turns this from a buyback shop into a marketplace.
Infrastructure, not features
Every item above is infrastructure and verification work. The product surface is built; what
remains is putting it on the right regional footing, signing off the cutover, and replacing
fixture data with real partner stores. That is the whole distance to a marketed launch in
India.
09
Founders
Anwar Rao
Co-Founder
& CEO
Business roadmap, store partnerships, pricing strategy and operations.
Abdul Mannan
Co-Founder
& CTO
System architecture, the web and Flutter applications, database schema and row-level
security, payments integration and the CI pipeline.
See it running
The fastest way to check any claim on this page is to use the product. Get a quote on a
MacBook or iPad without creating an account.