HandoffMar 2026 to now7 min read
Handoff, the class pitch I kept building until it was real
I co-founded Handoff in a USC entrepreneurship class to help students take over each other's leases. When the class ended, I rebuilt it from zero on my own server, with the savings on every listing at its center.
- Role
- Co-Founder, built the product
- Period
- Mar 2026 to now
- Team
- Two co-founders
- Stack
- React, TypeScript, Express, SQLite, MapLibre, Caddy on a VPS
- AI in the loop
- Claude Code, Codex, parallel agents on one design brief, OpenAI Responses API in the product
- Live
- handofflease.com
01 · Why
I wanted to stop saying someday
Most of what I have built since high school has been about getting students access to something. Swire was internships. HYRE was tutoring at a price students could pay. Handoff is housing.
College leases run twelve months and students do not. Internships, semesters abroad and graduation all leave someone paying rent on a room they no longer use, while someone else is looking for a place for exactly those months. BUAD 301, the Technology Entrepreneurship class at USC, asked me to pick a problem and build a company around it. I picked that one.
The class changed how I talked about myself. I stopped treating the project as an assignment and started treating it as a company I was responsible for, with a co-founder, a product and real questions about distribution and money.
02 · Evidence
Forty-seven students told me the problem was real
I surveyed 47 students about subleasing. 81% had struggled to find a sublessor. 64% had fallen back on Facebook Marketplace or Craigslist. 59% had a bad experience.
Those numbers shaped the pitch. Checking that everyone on the platform is a student came first.
The positioning followed from the same research. Rental sites cover everyone and social marketplaces check no one. Nobody was building for verified students looking specifically for a sublease, planned around a semester.
My first prototype went into the midterm in March. I built it in Lovable, a map of listings near campus where every listing already showed how much the taker would save against the original lease. That detail became the idea I kept coming back to.
For the final I moved to Claude Code and Cursor and rebuilt it in Next.js with Supabase and Leaflet, with campus email checks, map browsing, listing creation and handoff requests.
The final package was a 45 page playbook, a 15 slide investor deck, a P&L model, two ad creatives and an A/B test plan. The business model was to keep everything free and let listers pay to be seen first.
The biggest lesson I wrote down that semester was that working code beats working slides every time, including inside pitches.
03 · Rebuild
Starting over on a server I control
When I came back to Handoff in September, the class prototype's database host no longer resolved. I could have waited on it or patched around it. I started over instead, with a fresh codebase and a fresh database, and no imported users or listings.
I kept the look I liked from the class version, the plain wordmark, one blue, white surfaces, cards beside a map. Everything under it is new.
I chose a stack I could run end to end myself. React, TypeScript and Vite on the front. Express and SQLite on the back, with photos on local disk. It runs on the same Hostinger VPS as my other products, as its own service user bound to localhost, with Caddy handling HTTPS.
The trade is fewer managed services and more for me to run, in exchange for owning every layer of the product.
Because I wanted to ship often, the deploy works like a checklist. It runs the integration tests and a production build, stages a new release, backs up the database and photos, switches atomically, then checks health and the release id. A failed start restores the previous release and its matched backup.
That made speed safe. The first two days produced 52 commits and nine releases, from the core app to the phone layout, legal pages and a new homepage.
I split the September UI pass across four agents in Claude Code, each owning its own pages, all working from one design brief. The brief fixed the tokens, spacing scale, motion rules and which shared files nobody could touch, so four parallel builders still shipped one product.
Codex worked a separate branch for private referrals, which I merged in. The release was checked in a browser at desktop and phone sizes before it went out.
Then I had an agent review the rendered app like a critic, measuring real pixels instead of reading code. It found white text on the brand blue at 4.33 to 1, under the 4.5 to 1 accessibility floor, and phone controls smaller than 44 pixels. I shipped the fixes in the next release.
04 · Product
The savings number is the product
The best reason to take over a lease is that it is usually cheaper than the going rate, because the student leaving just wants to stop paying. So I made that number the center of the product.
Listers can enter what they pay on the original lease. From then on the card, the map pin and the listing page all show the monthly difference, and browse can sort by biggest savings.
Browse is a full screen split. I moved the map to MapLibre GL on the OpenFreeMap style because Carto basemaps now watermark tiles without a paid key, and OpenFreeMap needs none.
The list follows the map. Hovering a card lights its pin, tapping a pin opens a preview and scrolls the list to the same place, and nearby pins slide into cluster bubbles as you zoom out.
Every card shows the walk or drive time to campus, and the USC DPS patrol zone is drawn on the map, so a student knows where a place sits before visiting. A first visit starts with a campus picker, and posting is open at 22 campuses across Los Angeles.
The phone took two tries. The first release put the list in a draggable bottom sheet over the map. I had it cut the same night.
The version that shipped is a full map with a card carousel along the bottom. Swiping a card recenters the map, tapping a pin brings its card into view, and a Map or List toggle covers the rest.
05 · Trust
Strict where it matters, invisible everywhere else
Trust was the first thing the pitch promised. I wanted verification to be strict at the moment it matters and absent before that. Signup takes three steps and the account works right away. Confirming a campus email, by a six digit code or a link, is required only to publish a listing or send a request.
Signed out visitors see photos, price, savings and dates. The address, description, lister and exact pin stay locked until they confirm they are a student.
Contact details move last. A request carries a short message and nothing else until the lister accepts. Students can add a phone number, Instagram or Facebook and choose per channel what gets shared on accept. Email is always shared, because it is the verified identity.
Listers of a shared room can state a roommate gender preference. Fair housing rules allow that for shared homes and never for an entire place, so the form only offers it for shared rooms.
Supply is the hard side of any marketplace, and most students who need to sublease have already written the post somewhere. Retyping it into a form is where listings die. So listing starts with a choice, paste a post or screenshots, talk it through in a short chat, or fill in six steps.
Smart import sends the text or images to the OpenAI Responses API with a strict schema, so the answer always has the shape of a listing. It never publishes. It hands a draft to the same form, marks what it could not fill in amber and validates like a hand typed listing.
I treated the model like any other cost. The key lives only on the server, screenshots are resized before they are sent, a cheaper model is the fallback, and every call is logged so I can see tokens per day. A measured text import used 1,010 input and 438 output tokens, well under a cent.
06 · Business
One paid product, and a homepage made of the real app
I kept the business model from the pitch and cut the price. Browsing and listing stay free and Handoff never takes a cut of rent. The only paid product is Boost, which puts a listing at the top of any sort, fills its pin and shows the owner views and requests.
I set it at $9 for seven days. A typical room near USC lists around $1,200 a month, so one empty week costs a lister about $280. A boost costs less than one empty day. Until payments connect, every listing gets one free launch boost.
I did not want a homepage that promised more than the app could show. It is a static replica of the app, same wordmark, type and blue, with scroll driven motion that plays the product instead of describing it.
To pick a structure I had an agent screen all 772 SaaS templates in the Framer marketplace, render the 22 closest ones as full pages and rank four. I rebuilt the page from the winner and added what no template had, a comparison table against five named student housing products, every cell taken from their public pages.
| Class pitch, May 2026 | Live product, September 2026 | |
|---|---|---|
| Build | Lovable, then Next.js and Supabase on Vercel | React, Express and SQLite on my own VPS |
| Map | Leaflet | MapLibre GL on OpenFreeMap, patrol zone, clusters |
| Listing | A form with photo upload | Smart import, a chat, or six steps |
| Campuses | USC as the launch campus | 22 Los Angeles campuses open for posting |
| Paid product | Boost at $20 a week | Boost at $9 for seven days, free at launch |
| Releases | CLI deploys to Vercel | Tested, backed up, atomic, health checked |
Results
Where it stands
Handoff is live at handofflease.com, open to every student to sign up and to 22 campuses for posting. What I can measure honestly today is the work, not traction. There are no imported users or listings, and Boost payments are not connected yet.
07 · Growth
What the class taught me, and what it did not
In the spring I learned that a prototype persuades better than a deck, and that marketplaces are won one campus at a time. In September I learned the part a class never grades, owning the server, the backups, the release process and the price.
I also learned how I want to build with AI. Agents let me run a UI pass in parallel and research templates at a scale I could not do alone. The judgment stays with me, one brief they all follow, a critic that measures, and my call on what merges.
One lesson I wrote down in May still applies. Validating willingness to pay before writing code is cheaper than writing code first. Boost is built, so the next job is the one no feature solves, getting the first real listings at USC and finding out whether students will pay to be seen.

