DreamUni
BrownbrickA marketplace where verified university students share their winning personal statements with applicants, with admin approval of offer letters and Stripe Connect split payouts.
About this project
DreamUni connects students applying to university with students who already got in. Current undergraduates publish the personal statements that won them their offers, and applicants pay to read them for inspiration.
It has three sides. Sellers are verified university students, buyers are applicants, and admins vet everyone. The frontend is SvelteKit with Tailwind, the backend is FastAPI on PostgreSQL, files are stored in DigitalOcean Spaces, and payments run through Stripe Connect. It was an early-stage product built quickly by a small team. Over about six weeks I wrote more of its commits than anyone else, covering most of the frontend and the API integration.
A marketplace for proof of success only works if the proof is real.
Verifying sellers
I rebuilt the seller verification form. It collects the university, course, A-level results, a student ID, and the offer letter itself, with searchable dropdowns over a seeded list of universities, majors, and subjects. On the admin side there is an approval table where the team can download each attachment, look at the offer letter, and approve or reject the profile. A seller only appears to buyers once they're approved. The FAQ explains to buyers that every profile is checked by hand.
Buying and getting paid
Buyers browse approved profiles with filters, preview a statement, and buy it through a Stripe Checkout session. Purchased documents are served by the API only after it confirms a paid order for that buyer, and buyers can download them from their dashboard. Sellers are paid through Stripe Connect. I built the onboarding link flow that sets up a seller's connected account and the payout tables that show what they've earned. Each sale is split at checkout: the platform keeps its fee and the rest goes straight to the seller's account.
The rest of the product
Beyond the main flows I built the shared pieces: modal and table components, file upload, inline form validation and errors, profile and password updates, account deletion, a contact form, and the navigation for desktop and mobile. There was also a steady stream of layout fixes as the design changed.
At a glance
- — Three roles: seller, buyer, admin
- — Verified sellers via offer letter and student ID
- — Admin approval with attachment review
- — Stripe Checkout with access checked on the server
- — Stripe Connect split payments and payouts
- — Shared components: tables, modals, uploads, forms
This was the first time I wired a marketplace to Stripe Connect, and it showed me how much of a payments feature is onboarding and trust rather than the charge itself.