Golden Net Real Estate
Multi-tenant SaaS real estate management platform. Three-layer architecture with an Express + PostgreSQL backend, Next.js 16 storefront, and a separate super-admin dashboard. Live demo on Supabase + Render + Vercel free tiers.
About the Project
Golden Net is a multi-tenant SaaS platform that lets real-estate agencies run their own storefronts and admin panels on top of a single backend. Each tenant gets a dedicated subdomain, isolated admin users, and isolated data. The system is three separate applications: a Next.js frontend hosting the storefront + tenant admin panel, a separate Next.js super-admin dashboard for managing all tenants, and an Express + PostgreSQL backend serving both. Tenant isolation is enforced at two layers — application-level via X-Tenant-Id header + middleware, and database-level via per-query tenant_id filtering. The demo runs on Supabase + Render + Vercel free tiers with no credit card required.
Challenges
The biggest challenge was deploying a multi-tenant SaaS to a production-grade state using only free, no-credit-card services. Render free tier uses an ephemeral filesystem, so the original multer disk-storage uploads vanished on every restart. Vercel's middleware/auth bypass advisories blocked the older Next.js 15 builds. With NODE_ENV=production set on Render, `npm install` skipped devDependencies, so @types/node was missing and tsc died with 'Cannot find name process/console/Buffer' floods. On the multi-tenant side, when the X-Tenant-Id header was missing the backend tried to derive a tenant from the request host, mistaking 'golden-net-backend.onrender.com' for a tenant subdomain and 404-ing every call.
Solutions
The multer disk storage was swapped for memoryStorage + @supabase/supabase-js so uploads go to Supabase Storage; local disk now only kicks in when SUPABASE_URL is absent. Next.js was bumped to 16.2.9 to clear Vercel's security gate. The @types/* packages and typescript itself were moved into dependencies so they install under NODE_ENV=production. The tenant detection middleware learned to skip known PaaS host suffixes (.onrender.com / .vercel.app / .fly.dev) and accept a DEFAULT_TENANT_SUBDOMAIN env-var fallback. The Postgres pool was refactored to accept a connection string with SSL for the Supabase pooler. CORS now uses a regex-based whitelist that covers *.vercel.app plus the custom domain.
Results
The platform shipped to Supabase Postgres + Storage, a single Render web service, and two Vercel projects — total monthly cost: ₺0. The custom domain (goldennet.atmacamustafa.site) was wired through Hostinger DNS into Vercel with Let's Encrypt-issued SSL. UptimeRobot pings the backend every five minutes to keep Render from sleeping. Idempotent seed SQL ships one super admin, one demo tenant, six property listings, and three blog posts. Super-admin and tenant-admin logins, property/blog CRUD flows, Supabase Storage image uploads, and end-to-end multi-tenant isolation have all been verified live.
Screenshots

Ana Sayfa
Vitrin ana sayfası — hero arama formu ve istatistik kartları

İlan Listesi
Sol panelde tip/durum/fiyat filtreleri, sağda kart görünümlü ilan grid'i

İlan Detay
Galeri, fiyat, lokasyon ve danışman iletişim kartı

Tenant Admin Paneli
Yönetim paneli ana sayfası — hızlı eylem kartları ve istatistik özeti (toplam ilan, ortalama fiyat, blog sayısı)

Tenant Admin – Analitik
Son eklenen ilanlar, en çok görüntülenenler, emlak tipi dağılımı ve satılık/kiralık donut grafiği

Super Admin Dashboard
Tüm tenant'ları listeleyen merkezi panel — sağlık skoru, plan ve property sayıları

Yeni Tenant Oluştur
Super admin'in subdomain + admin kullanıcı + plan seçimiyle multi-tenant kayıt formu