Find and post local garage sales and community events. Uses Google Sheets as a CMS because that's where the people who run garage sales already work.
Live at sales.tuunz.com · Also at events.tuunz.com
| Map view | Card view | List view |
![]() |
![]() |
![]() |
Garage sale listings live on Facebook Marketplace, Craigslist, and yard signs. None of those give you a map. None let you search by neighborhood. And the people posting them — mostly older folks clearing out attics — aren't going to learn a new app.
So Tuunz meets them where they are: Google Sheets. Organizers post sales to a shared spreadsheet. The app reads it, geocodes the addresses, and plots them on a map. No new tool to learn, no app to install, no data entry into "the system." The spreadsheet is the system.
- Map view — garage sales plotted by location, tap for details
- Card view — photo, title, date, address for each listing
- List view — sortable, searchable, filterable
- Event listings — separate site for community events with categories and sharing
- Save listings — bookmark sales you want to visit (requires auth)
- Magic link auth — Supabase Auth, no passwords
- Email notifications — Resend integration for admin alerts and confirmations
- React + Tailwind CSS + Vite — frontend
- Google Sheets — the CMS, via
google-spreadsheetlibrary - Supabase — auth (magic link), Postgres for user data (saved sales, saved addresses), Storage for images
- Netlify — static site + serverless functions
- Resend — admin notifications, confirmation emails
The Google Sheets integration is the whole point — it's a CMS that non-technical people already know how to use. The app reads the sheet, geocodes addresses, and serves the data. If Sheets vars aren't configured, it falls back to mock data for development (ALLOW_MOCK_DATA=1).
npm install
cp .env.example .env.local # Supabase + Google Sheets + Resend keys
npm run dev # Netlify Dev serverProprietary. All rights reserved.



