Vasera – Acquisition-ready, production-grade multi-tenant property management SaaS. Built with Next.js, TypeScript, PostgreSQL & Prisma for landlords, property managers & real estate owners.
README
Vasera — Multi-Tenant Real Estate SaaS Foundation Don't start your real-estate SaaS from zero. Start with an existing multi-tenant foundation and build your product on top of it. Live Demo Demo: https://vasera-orcin.vercel.app/
https://vasera-orcin.vercel.app/super-admin/login
https://vasera-orcin.vercel.app/admin/login
Vasera is a full-stack multi-tenant real-estate SaaS codebase built with Next.js, TypeScript, PostgreSQL and Prisma. It provides an existing technical foundation for founders, PropTech startups, real-estate agencies, property-management companies and software teams that want to build a branded or white-label real-estate platform without spending the first development cycle building the core SaaS architecture from scratch. 🚀 What You're Getting This is not an empty starter template. The repository provides an existing application foundation covering: Multi-tenancy Tenant-aware routing Tenant isolation Authentication Role-based authorization Super Admin Tenant Admin Customer experience Properties Property submission and review Projects Project media Inventory Inventory images Customer enquiries Tenant branding/configuration PostgreSQL database Prisma ORM Server-side APIs Automated tests CI configuration Deployment configuration Technical documentation The buyer receives the applicable repository snapshot through GitBuyer and can continue development independently. 🏗️ Architecture VASERA PLATFORM | +-----------+-----------+ | | SUPER ADMIN TENANTS | +--------------------------+-------------------------+ | | | TENANT A TENANT B TENANT C | | | +------+-------+ +-----+-------+ +-----+-------+ | | | | | | ADMIN PANEL PUBLIC SITE ADMIN PANEL PUBLIC SITE ADMIN PANEL PUBLIC SITE | | | | | | Properties Customers Properties Customers Properties Customers Projects Projects Projects Projects Projects Projects Inventory Inventory Inventory Inventory Inventory Inventory Enquiries Enquiries Enquiries Enquiries Enquiries Enquiries Core SaaS model Platform ↓ Multiple Tenants ↓ Tenant-specific Admin + Customer Experience ↓ Tenant-scoped Data ↓ Properties / Projects / Inventory / Enquiries 🔐 Multi-Tenancy & Tenant Isolation Tenant isolation is a core part of the application architecture. Protected operations follow a tenant-aware flow: Request ↓ Authentication ↓ Role Verification ↓ Tenant Resolution ↓ Resource Ownership Check ↓ Tenant-Scoped Operation The architecture is designed to prevent protected cross-tenant resource access. 👥 User Roles Super Admin Platform-level administration and tenant oversight. Tenant Admin Manages tenant-specific: Properties Projects Inventory Enquiries Media Property-management information Branding/configuration Customer Uses the tenant's customer-facing experience for: Registration Login Property submission Property interaction Enquiries 🏠 Property Workflow Customer ↓ Submit Property ↓ Tenant Admin Review ↓ Approved / Rejected ↓ Managed Property ↓ Customer-Facing Experience This creates a foundation for property-management and real-estate marketplace workflows. 🏢 Projects & Inventory Tenant administrators can work with: Real-estate projects Project publishing Featured projects Project media Inventory records Inventory images Customer-facing inventory presentation The data model keeps these resources associated with their tenant context. 📩 Enquiries Customers can submit enquiries through the tenant-facing experience. Tenant administrators can manage their tenant-specific enquiries through the admin environment. This provides a foundation for extending the system into CRM and lead-management workflows. 🎨 Tenant Branding Tenant configuration supports business-specific presentation such as: Business name Logo Favicon Primary color Secondary color Hero/background images Tagline Phone Email Address Domain configuration foundation This makes the architecture suitable for building multiple branded real-estate experiences on top of a shared SaaS platform. Fully independent white-label websites, advanced custom-domain infrastructure and highly customized tenant storefronts can be further developed on top of the foundation. 🧩 Core Modules Module Foundation Multi-Tenancy ✅ Tenant Isolation ✅ Authentication ✅ Role-Based Authorization ✅ Super Admin ✅ Tenant Admin ✅ Customer Experience ✅ Properties ✅ Property Submission ✅ Projects ✅ Project Media ✅ Inventory ✅ Inventory Images ✅ Enquiries ✅ Tenant Branding ✅ PostgreSQL ✅ Prisma ✅ Server APIs ✅ Automated Tests ✅ CI ✅ Deployment Configuration ✅ 🗄️ Database Foundation Tenant ├── User ├── Property │ ├── PropertyImage │ └── PropertyManagement ├── Project │ └── ProjectImage ├── Inventory │ └── InventoryImage └── Enquiry 🛠️ Technology Stack Next.js 16 React 19 TypeScript Tailwind CSS Prisma ORM PostgreSQL bcryptjs jose Vercel Blob Vitest GitHub Actions Vercel-compatible deployment 🔌 API Foundation /api/auth /api/properties /api/projects /api/enquiries /api/admin /api/super-admin /api/tenant 🧪 Engineering Validation The repository includes an automated validation baseline. Validation Result Automated tests 187 Test files 11 Statement coverage 100% Line coverage 100% Function coverage 100% Branch coverage 99.6% TypeScript Passed ESLint Passed Production build Passed These are repository validation metrics. They are not guarantees of production performance, scalability, uptime, security or commercial success. 💻 Development npm install npx prisma generate npx prisma migrate deploy npm run dev Validation npx tsc --noEmit npm run build npm run vercel-build 📈 What Can You Build With It? Vasera can serve as a foundation for products such as: Property-management SaaS Real-estate agency software Rental-management platforms Landlord/property-owner platforms Tenant management systems Real-estate listing platforms Multi-tenant PropTech products Branded real-estate portals White-label SaaS products Real-estate CRM extensions Property marketplaces These are potential product directions, not claims that every listed product capability is already implemented. 🔮 Expansion Opportunities The foundation can be extended with: CRM and lead management Subscription and billing Analytics and reporting Notifications Workflow automation Advanced property search Saved properties Agent portals Owner portals Tenant portals Marketplace functionality Third-party integrations Custom domains Advanced white-label deployments Additional property-management workflows The buyer can focus development on its own market, business model, branding, integrations and monetization. 💡 Why Start With Vasera? Building a multi-tenant SaaS product from an empty repository requires solving the foundational architecture first. Vasera gives an acquiring team an existing foundation across: Multi-Tenancy + Tenant Isolation + Authentication + Authorization + Admin Architecture + Customer Experience + Properties + Projects + Inventory + Enquiries + Media + PostgreSQL + Prisma + APIs + Testing + CI + Deployment + Documentation The goal is simple: Spend more development time on your product and business logic, rather than rebuilding the same SaaS foundation from scratch. 📦 Acquisition & Delivery Vasera is offered through GitBuyer as a repository snapshot acquisition. After a successful purchase, the buyer receives access to the applicable repository snapshot through GitBuyer's delivery process. The buyer can clone/download that snapshot and continue development independently. ⚠️ Important Scope & Ownership Notes GitHub ownership is NOT transferred The transaction does not transfer: GitHub account ownership Original repository ownership Control of the original repository Other repositories Future commits Future development work A purchase does not automatically include future changes made to the original repository. Rights & Licensing Commercial use, modification, redistribution, exclusivity, intellectual-property rights and other rights are governed by the applicable repository license and GitBuyer transaction terms. Buyers should perform their own technical, security, legal, licensing and infrastructure due diligence. 🎯 Product Positioning Vasera is positioned as an acquisition-ready MVP / SaaS codebase and technical foundation. It is not represented as: A revenue-generating business A company acquisition Guaranteed production-scale infrastructure Guaranteed commercial success Guaranteed future development Guaranteed future support The value proposition is the existing technical foundation and the development time it can save a team starting a similar product. 📚 Documentation Additional documentation is available in: docs/ ├── ACQUISITION_BRIEF.md ├── BUYER_OVERVIEW.md ├── architecture/ ├── api/ ├── database/ ├── security/ └── deployment/ For buyers, docs/BUYER_OVERVIEW.md provides the detailed product architecture, workflows, acquisition context and extension opportunities. 🚀 Bottom Line Vasera gives a buyer an existing multi-tenant real-estate SaaS foundation instead of an empty repository. Start with the architecture. Customize the product. Add your business logic. Integrate your services. Build your real-estate SaaS on top of an existing foundation. Vasera — Multi-Tenant Real Estate SaaS Foundation For any query-
… README truncated here; the full file ships with the clone.
230 files
file contents open where the seller allows a preview; the rest is what you are buying
.github/1
docs/11
- docs/ACQUISITION_BRIEF.md13 KB
- docs/BUYER_OVERVIEW.md9 KB
- docs/api/API.md26 KB
- docs/architecture/ARCHITECTURE.md20 KB
- docs/audits/phase1-2-schema-audit.md6 KB
- docs/audits/phase1-3-repository-architecture-audit.md7 KB
- docs/database/DATABASE.md25 KB
- docs/deployment/DEPLOYMENT.md22 KB
- docs/modules/MODULES.md21 KB
- docs/product/PRODUCT.md16 KB
- docs/security/SECURITY.md16 KB
prisma/19
- prisma/migrations/20260816185536_initial_vasera/migration.sql3 KB
- prisma/migrations/20260816202924_add_project_fields/migration.sql122 B
- prisma/migrations/20260816205805_add_project_images/migration.sql641 B
- prisma/migrations/20260816231019_add_project_images/migration.sql417 B
- prisma/migrations/20260817164515_add_project_enquiries/migration.sql901 B
- prisma/migrations/20260818075700_add_inventory_relation_to_enquiry/migration.sql332 B
- prisma/migrations/20260819103806_add_inventory_images/migration.sql665 B
- prisma/migrations/20260821092100_add_multi_tenant/migration.sql4 KB
- prisma/migrations/20260821100643_make_tenant_id_required/migration.sql1 KB
- prisma/migrations/20260829101208_enforce_property_tenant_required/migration.sql226 B
- prisma/migrations/20260829150000_add_super_admin_role/migration.sql60 B
- prisma/migrations/20260829152000_enforce_property_tenant_required/migration.sql60 B
- prisma/migrations/20260830031118_add_tenant_status/migration.sql176 B
- prisma/migrations/20260830130637_add_property_management/migration.sql1 KB
- prisma/migrations/20260905213916_add_tenant_branding_images/migration.sql108 B
- prisma/migrations/20260906001745_add_auth_branding_images/migration.sql115 B
- prisma/migrations/migration_lock.toml128 B
- prisma/schema.prisma7 KB
- prisma/seed.ts4 KB
public/47
- public/auth-bg.png2.6 MB
- public/file.svg391 B
- public/globe.svg1 KB
- public/images/about.png0 B
- public/images/contact-bg.png2.5 MB
- public/images/hero-bg.png2.2 MB
- public/images/hero-building.png0 B
- public/images/hero-property1.png2.6 MB
- public/images/hero.png0 B
- public/images/how-it-works-bg.png2.3 MB
- public/images/how-it-works.png2.1 MB
- public/images/inventory-bg.png2.3 MB
- public/images/owner-bg.png0 B
- public/images/owner-cta-bg.png2.1 MB
- public/images/project-1.png0 B
- public/images/project-2.png0 B
- public/images/projects-bg.png2.4 MB
- public/images/projects/projects-hero.jpg0 B
- public/images/property-1.png0 B
- public/images/property-2.png0 B
- public/images/services-bg.png2.2 MB
- public/images/team-1.png0 B
- public/images/team-2.png0 B
- public/images/trump-residences.jpg1.8 MB
- public/images/trump-residences.png12.1 MB
- public/images/vasera-management.png2.5 MB
- public/next.svg1 KB
- public/uploads/inventory/inventory-cmt00ppiq000510i55fafm1gd/1787139509820-1-projects-bg.png1.9 MB
- public/uploads/inventory/inventory-cmt00ppiq000510i55fafm1gd/1787139509833-2-services-bg.png2.2 MB
- public/uploads/inventory/inventory-cmt00ppiq000510i55fafm1gd/1787139509842-3-how-it-works-bg.png2.3 MB
- public/uploads/inventory/inventory-cmt00ppiq000510i55fafm1gd/1787139509863-4-landing-hero-bg.png2.2 MB
- public/uploads/inventory/inventory-cmt02pi6y0000vgi5r9du4cda/1787143031783-1-WhatsApp-Image-2026-08-12-at-10-05-19-PM-2-.jpg148 KB
- public/uploads/inventory/inventory-cmt02pi6y0000vgi5r9du4cda/1787143031794-2-WhatsApp-Image-2026-08-12-at-10-05-19-PM-1-.jpg148 KB
- public/uploads/inventory/inventory-cmt02pi6y0000vgi5r9du4cda/1787143031803-3-WhatsApp-Image-2026-08-12-at-10-05-19-PM.jpg238 KB
- public/uploads/inventory/inventory-cmt02pi6y0000vgi5r9du4cda/1787143031811-4-WhatsApp-Image-2026-08-12-at-10-05-18-PM-1-.jpg220 KB
- public/uploads/inventory/inventory-cmt02qlrq0001vgi5dmmuv7cq/1787142907298-1-projects-bg.png1.9 MB
- public/uploads/inventory/inventory-cmt02qlrq0001vgi5dmmuv7cq/1787142907310-2-services-bg.png2.2 MB
- public/uploads/inventory/inventory-cmt02qlrq0001vgi5dmmuv7cq/1787142907316-3-ChatGPT-Image-Aug-17-2026-10_45_34-PM.png2.5 MB
- public/uploads/inventory/inventory-cmt02qlrq0001vgi5dmmuv7cq/1787142907324-4-ChatGPT-Image-Aug-17-2026-10_43_10-PM.png2.5 MB
- public/uploads/projects/project-cmszwlbgv0000xki5a46iho9g/1787132585705-1-projects-bg.png1.9 MB
- public/uploads/projects/project-cmszwlbgv0000xki5a46iho9g/1787132585720-2-services-bg.png2.2 MB
- public/uploads/projects/project-cmszwlbgv0000xki5a46iho9g/1787132585726-3-how-it-works-bg.png2.3 MB
- public/uploads/projects/project-cmszwlbgv0000xki5a46iho9g/1787132585732-4-landing-hero-bg.png2.2 MB
- public/uploads/properties/838d947c-62dc-474f-905f-a86039f7ca4d.png2.5 MB
- public/uploads/properties/9a38beed-7cca-46da-963c-888000e033e3.png2.5 MB
- public/vercel.svg128 B
- public/window.svg385 B
scripts/13
- scripts/backfill-vasera-tenant.ts3 KB
- scripts/check-property-tenants.cjs785 B
- scripts/count-data.ts705 B
- scripts/create-abc-tenant.ts1 KB
- scripts/create-admin.ts3 KB
- scripts/create-super-admin.ts4 KB
- scripts/list-tenants.ts513 B
- scripts/reset-tenants.ts880 B
- scripts/verify-admin-password.ts2 KB
- scripts/verify-admin-tenant.ts1 KB
- scripts/verify-super-admin-password.ts2 KB
- scripts/verify-super-admin.ts2 KB
- scripts/verify-tenant-isolation.ts2 KB
src/127
- src/app/admin/dashboard/page.tsx29 KB
- src/app/admin/enquiries/EnquiryStatusActions.tsx2 KB
- src/app/admin/enquiries/page.tsx27 KB
- src/app/admin/inventory/InventoryImageUploader.tsx11 KB
- src/app/admin/inventory/inventory.css0 B
- src/app/admin/inventory/page.tsx73 KB
- src/app/admin/login/page.tsx5 KB
- src/app/admin/page.tsx490 B
- src/app/admin/projects/ProjectImageUploader.tsx18 KB
- src/app/admin/projects/page.tsx45 KB
- src/app/admin/projects/projects.css24 KB
- src/app/admin/properties/ManagementEditor.tsx4 KB
- src/app/admin/properties/PropertyRequestActions.tsx4 KB
- src/app/admin/properties/PropertyRequestsWorkspace.tsx17 KB
- src/app/admin/properties/page.tsx2 KB
- src/app/api/admin/enquiries/[id]/route.ts11 KB
- src/app/api/admin/inventory/[id]/images/[imageId]/route.ts8 KB
- src/app/api/admin/inventory/[id]/images/route.ts9 KB
- src/app/api/admin/inventory/[id]/route.ts10 KB
- src/app/api/admin/inventory/route.ts3 KB
- src/app/api/admin/projects/[id]/__tests__/route.test.ts16 KB
- src/app/api/admin/projects/[id]/images/[imageId]/route.ts7 KB
- src/app/api/admin/projects/[id]/images/route.ts14 KB
- src/app/api/admin/projects/[id]/route.ts9 KB
- src/app/api/admin/projects/__tests__/route.test.ts10 KB
- src/app/api/admin/projects/images/route.ts8 KB
- src/app/api/admin/projects/route.ts3 KB
- src/app/api/admin/properties/[id]/__tests__/route.test.ts16 KB
- src/app/api/admin/properties/[id]/management/__tests__/route.test.ts10 KB
- src/app/api/admin/properties/[id]/management/route.ts3 KB
- src/app/api/admin/properties/[id]/route.ts12 KB
- src/app/api/auth/admin-login/__tests__/route.test.ts15 KB
- src/app/api/auth/admin-login/route.ts5 KB
- src/app/api/auth/login/__tests__/route.test.ts11 KB
- src/app/api/auth/login/route.ts4 KB
- src/app/api/auth/logout/__tests__/route.test.ts3 KB
- src/app/api/auth/logout/route.ts779 B
- src/app/api/auth/signup/__tests__/route.test.ts13 KB
- src/app/api/auth/signup/route.ts3 KB
- src/app/api/auth/super-admin-login/__tests__/route.test.ts11 KB
- src/app/api/auth/super-admin-login/route.ts3 KB
- src/app/api/enquiries/route.ts12 KB
- src/app/api/projects/[id]/route.ts2 KB
- src/app/api/projects/route.ts1 KB
- src/app/api/properties/route.ts18 KB
- src/app/api/super-admin/tenants/[id]/branding/route.ts8 KB
- src/app/api/super-admin/tenants/[id]/credentials/route.ts3 KB
- src/app/api/super-admin/tenants/[id]/route.ts15 KB
- src/app/api/super-admin/tenants/route.ts14 KB
- src/app/api/tenant/current/route.ts1 KB
- src/app/api/tenant/route.ts2 KB
- src/app/contact/page.tsx15 KB
- src/app/customer/dashboard/add-property/page.tsx10 KB
- src/app/customer/dashboard/page.tsx8 KB
- src/app/customer/dashboard/properties/[id]/page.tsx8 KB
- src/app/favicon.ico25 KB
- src/app/globals.css216 KB
- src/app/inventory/[id]/page.tsx20 KB
- src/app/inventory/page.tsx19 KB
- src/app/layout.tsx472 B
- src/app/login/page.tsx7 KB
- src/app/page.module.css3 KB
- src/app/page.tsx2 KB
- src/app/projects/[id]/images/route.ts9 KB
- src/app/projects/[id]/page.tsx11 KB
- src/app/projects/page.tsx12 KB
- src/app/properties/[id]/page.tsx17 KB
- src/app/properties/page.tsx508 B
- src/app/signup/page.tsx8 KB
- src/app/super-admin-login/page.tsx134 B
- src/app/super-admin/dashboard/components/SuperAdminConsole.tsx137 KB
- src/app/super-admin/dashboard/page.tsx424 B
- src/app/super-admin/login/page.tsx5 KB
- src/components/Admin/AdminDashboard.module.css12 KB
- src/components/Admin/AdminDashboard.tsx12 KB
- src/components/Admin/AdminLogin.module.css5 KB
- src/components/Admin/AdminLogin.tsx3 KB
- src/components/Auth/Auth.module.css11 KB
- src/components/Auth/AuthLayout.tsx8 KB
- src/components/Footer/Footer.module.css9 KB
- src/components/Footer/Footer.tsx7 KB
- src/components/Hero/Hero.module.css15 KB
- src/components/Hero/Hero.tsx3 KB
- src/components/HowItWorks/HowItWorks.module.css11 KB
- src/components/HowItWorks/HowItWorks.tsx5 KB
- src/components/Inventory/Inventory.module.css18 KB
- src/components/Inventory/Inventory.tsx17 KB
- src/components/Navbar/Navbar.module.css9 KB
- src/components/Navbar/Navbar.tsx4 KB
- src/components/OwnerCTA/OwnerCTA.module.css11 KB
- src/components/OwnerCTA/OwnerCTA.tsx4 KB
- src/components/Projects/Projects.module.css23 KB
- src/components/Projects/Projects.tsx19 KB
- src/components/Services/Services.module.css12 KB
- src/components/Services/Services.tsx4 KB
- src/components/Team/Team.module.css12 KB
- src/components/Team/Team.tsx6 KB
- src/components/TrustBar/TrustBar.module.css3 KB
- src/components/TrustBar/TrustBar.tsx574 B
- src/generated/prisma/browser.ts1 KB
- src/generated/prisma/client.ts2 KB
- src/generated/prisma/commonInputTypes.ts31 KB
- src/generated/prisma/enums.ts2 KB
- src/generated/prisma/internal/class.ts87 KB
- src/generated/prisma/internal/prismaNamespace.ts56 KB
- src/generated/prisma/internal/prismaNamespaceBrowser.ts7 KB
- src/generated/prisma/models.ts721 B
- src/generated/prisma/models/Enquiry.ts74 KB
- src/generated/prisma/models/Inventory.ts73 KB
- src/generated/prisma/models/InventoryImage.ts66 KB
- src/generated/prisma/models/Project.ts71 KB
- src/generated/prisma/models/ProjectImage.ts64 KB
- src/generated/prisma/models/Property.ts89 KB
- src/generated/prisma/models/PropertyImage.ts58 KB
- src/generated/prisma/models/PropertyManagement.ts66 KB
- src/generated/prisma/models/Tenant.ts146 KB
- src/generated/prisma/models/User.ts57 KB
- src/lib/__tests__/auth.test.ts5 KB
- src/lib/__tests__/tenant.test.ts6 KB
- src/lib/auth-context.ts7 KB
- src/lib/auth-cookie-names.ts157 B
- src/lib/auth.ts2 KB
- src/lib/data.ts3 KB
- src/lib/prisma.ts578 B
- src/lib/tenant.ts3 KB
- src/proxy.test.ts3 KB
- src/proxy.ts2 KB
- .gitignore848 B
- .vercelignore124 B
- AGENTS.md678 B
- CLAUDE.md11 B
- README.md10 KB
- eslint.config.mjs465 B
- next.config.ts133 B
- package-lock.json397 KB
- package.json2 KB
- prisma.config.ts254 B
- tsconfig.json670 B
- vitest.config.ts399 B