Yardsale
A self-hosted online garage sale for one seller: buyers browse used things and send a request, no checkout, no payment, no accounts.
At a glance
- A request, not a purchase
- Expectations before the button
- AI drafts, I decide
The question
When you clear out a flat, the hard part isn't finding buyers, it's the back and forth: is it still available, what's wrong with it, can I pick it up on Sunday. Could one calm page answer most of that up front, and turn the rest into a single tidy message instead of a checkout?
What I built
A public catalog in Romanian and English where every item has clear photos, a condition scale, honest notes on defects, what's included and what isn't, and a price in RON with a euro estimate. Buyers add things to a request list and send it with a short message, or ask a question about one item. I confirm availability, pickup and the final total by message.
Behind it, an admin that installs on a phone. I take a photo, write or dictate a quick note, and an AI step drafts the title, description, category, condition and price. Every drafted field shows how sure it is and stays editable, and nothing is published until I press Publish.
Inside
How it looks in use.
- Role
- Sole designer, developer and owner
- Built with
- Next.js, TypeScript, Tailwind, Prisma, PostgreSQL
- Runs
- Built to self-host with Docker Compose; the admin installs on a phone
- Status
- In beta testing





Up close
The details that carry it.



Decisions that mattered
- A request, not a purchaseThere's no payment and no invoice, and the request list says so in its first line. Used goods need a conversation, so the app's job is to make that conversation short.
- Expectations before the buttonPickup, shipping, payment and invoice are shown on every product, and the buyer ticks that they understand them before sending. Most of the questions I'd otherwise answer by hand are settled there.
- AI drafts, I decideThe AI fills the form rather than the listing: each field carries a confidence label and a reason, low-confidence fields are flagged in a short checklist, and it runs on a local mock when no key is set, so the app works without any AI at all.
What I learned
Saying what you won't do builds as much trust as what you will. Being plain about no invoice, no transport and slow replies made the page feel more honest, not less helpful.
Something similar in mind?