Find a lekker spot in Cape Town — without the gatvol. Real rents. Real safety. Real talk from locals.
LekkerStay CT is a community-powered rental transparency platform for Cape Town. Skip the dodgy listings and the price-gouging — see what locals actually pay, what neighbourhoods actually feel like, and whether that asking price is fair before you sign.
🌍 Live app: lekkerstayct.lovable.app
Renting in Cape Town is rough: prices vary wildly between suburbs (and even between blocks), listings often hide the truth about loadshedding, safety, and transport, and there's no easy way to know if you're being charged a fair rate.
LekkerStay CT fixes that by crowdsourcing the truth from people who actually live here — howzit, awê, and welcome to a more transparent rental scene.
| Feature | What it does |
|---|---|
| 🗺️ Area Explorer | Pick a suburb → see avg rent, safety score (★★★★★), Eskom status, traffic chatter, and live listings |
| 💰 Fair Price Tool | Enter a rent + suburb + bedrooms → instant verdict on whether it's a steal, fair, or a rip-off |
| 📡 Neighbourhood Pulse | Live feed of local reports: power cuts, water issues, safety, traffic, community vibes |
| 🎯 Match Me Quiz | 4-step quiz (budget → areas → bedrooms → vibe) → personalised matches with "Lekker Deal" flags |
| 🔥 Discover Deals | Aggregated external listings sorted by price, with affordability badges |
| 📝 Submit Rental | Locals share rentals they know about — rent, vibe checks, photos |
| ☕ Drop the Tea | Submit pulse reports about your suburb (anonymous-feeling, signed-in safe) |
| ⭐ Saved Suburbs | Bookmark areas you're watching, see them on your dashboard |
| 🚩 Report Listing | Flag dodgy or out-of-date rentals |
| 🔗 Share Listing | One-click share with deep links to specific suburbs |
Frontend
- ⚛️ React 18 + TypeScript
- ⚡ Vite 5
- 🎨 Tailwind CSS v3 + shadcn/ui
- 🎬 Framer Motion (page + list animations)
- 🧭 React Router v6
- 🍞 Sonner (toasts)
- 🔣 Lucide React (icons)
Backend (Lovable Cloud)
- 🔐 Auth (email/password + Google OAuth)
- 🗄️ Postgres with Row Level Security (RLS) on every table
- 📦 Storage (rental photos, user-scoped folders)
- 📡 Realtime subscriptions (rentals + pulse_reports)
Design language
- Ocean blues, mountain greens, SA gold accents
- Space Grotesk headings, Inter body
- Cape Town slang throughout (howzit, lekker, awê, eish, sharp-sharp)
- Bun (or Node 18+ with npm)
- A Lovable Cloud / Supabase project (auto-provisioned if you fork via Lovable)
# 1. Clone
git clone <your-repo-url>
cd lekkerstay-ct
# 2. Install
bun install
# or: npm install
# 3. Run dev server
bun run dev
# or: npm run devApp runs at http://localhost:8080.
.env is auto-managed by Lovable Cloud. If you're running outside Lovable, you'll need:
VITE_SUPABASE_URL=https://<your-project-ref>.supabase.co
VITE_SUPABASE_PUBLISHABLE_KEY=<your-anon-key>
VITE_SUPABASE_PROJECT_ID=<your-project-ref>
⚠️ Never commit secret/service-role keys. Only the publishable (anon) key belongs in the frontend.
src/
├── components/ # Reusable UI
│ ├── ui/ # shadcn/ui primitives
│ ├── AreaExplorer.tsx # Suburb deep-dive
│ ├── DiscoverDeals.tsx # External listings grid
│ ├── SuburbSelect.tsx # Grouped suburb dropdown
│ ├── Navbar.tsx
│ └── ...
├── pages/
│ ├── Dashboard.tsx # Home: hero, tabs, my areas, alerts, pulse
│ ├── Area.tsx # /area/:slug deep link
│ ├── FairPrice.tsx # Rent verdict tool
│ ├── MatchMe.tsx # 4-step matching quiz
│ ├── SubmitRental.tsx
│ ├── SubmitPulse.tsx
│ ├── Auth.tsx # Sign in / sign up
│ └── NotFound.tsx
├── hooks/
│ ├── useAuth.tsx # Supabase session wrapper
│ └── useSavedSuburbs.ts
├── lib/
│ ├── suburbs.ts # Grouped CT suburb list
│ └── utils.ts
├── integrations/
│ └── supabase/ # Auto-generated client + types
└── index.css # Design tokens (HSL)
All tables live in the public schema with RLS enabled.
| Table | Purpose | Key columns |
|---|---|---|
profiles |
Per-user profile (no email exposure) | user_id, display_name, avatar_url |
rentals |
Community-submitted rentals | suburb, monthly_rent, bedrooms, vibe-check booleans, photo_urls, user_id |
pulse_reports |
Live neighbourhood reports | suburb, report_type, description, photo_url, user_id |
saved_suburbs |
User bookmarks | user_id, suburb |
rental_reports |
Flagged listings | rental_id, user_id, reason, details |
external_listings |
Aggregated public deals | suburb, monthly_rent, bedrooms, source_name, source_url |
Security highlights
- Profiles are not publicly readable — only authenticated users.
- Rental photos are stored in user-scoped folders (
rental-photos/{user_id}/...); only the owner can update/delete. - Inserts/updates everywhere are gated by
auth.uid() = user_id.
Realtime channels
rentals(INSERT) → dashboard refreshpulse_reports(INSERT) → live pulse feed
- Open the project in Lovable.
- Click Publish (top right).
- Your app goes live at
<project>.lovable.app.
- Project → Settings → Domains → Connect Domain
- Requires a paid Lovable plan.
- Docs: Custom domain setup
This started as a SA Startup Week build, but PRs and ideas are welcome:
- New suburb data / corrections
- Better safety/vibe heuristics
- Additional pulse report types
- Accessibility improvements
Open an issue first if you're planning a big change — let's chat.
Built with ❤️ in Cape Town by Laura Bailie during SA Startup Week.
Powered by Lovable (Lovable Cloud + AI Gateway).
MIT — do something lekker with it.
"Sharp-sharp, bru. Now go find your spot." 🌊⛰️