
Building a Modern Property Management System (PMS) from Scratch with Next.js & NestJS
After several months of planning, development, testing, and countless iterations, I've successfully completed a full-scale Property Management System (PMS).
This wasn't just another CRUD application—it was a complete platform designed for landlords, tenants, and real estate agents to manage properties, leases, tenants, and public property listings from a single system.
The Goal
The objective was to create a scalable platform that combines:
- Property listing marketplace
- Tenant management
- Lease management
- Rental payment tracking
- Role-based dashboards
- Administrative verification
- Secure document management
The application was designed with future expansion in mind, allowing additional modules to be added without major architectural changes.
Tech Stack
Frontend
- Next.js 16
- TypeScript
- Tailwind CSS
- shadcn/ui
- TanStack Query
- React Hook Form
- Zod
Backend
- NestJS
- TypeORM
- PostgreSQL
- JWT Authentication
- AWS S3
- Swagger API Documentation
Infrastructure
- VPS Deployment
- PM2
- Nginx
- SSL
- Docker (supporting services)
- GitHub
Core Features Delivered
Public Website
The platform includes a fully responsive public-facing website where users can:
- Browse rental and sale properties
- View detailed property information
- Create accounts
- Upload verification documents
- Manage their public profile
Authentication System
Security was a major priority.
The authentication system includes:
- User registration
- Secure login
- Password reset
- CAPTCHA protection
- JWT authentication
- Role selection during onboarding
Property Management
Landlords can efficiently manage their properties through an intuitive dashboard.
Features include:
- Property creation
- Property editing
- Image uploads
- Deed document uploads
- Property verification workflow
- Multi-property management
Lease Management
One of the largest modules in the application.
It allows landlords to:
- Create lease terms
- Manage lease durations
- Assign participants
- Invite tenants
- Renew leases
- Upload agreements
- Control permissions within each lease
Instead of hardcoding tenants directly into a lease, I designed a flexible participant system that supports future expansion for owners, managers, and additional user roles.
Request Workflow System
Rather than building separate invitation systems for every feature, I developed a reusable Request Module.
It currently powers:
- Lease invitations
- Lease renewals
- Tenant invitations
- Manager invitations
- Owner invitations
The architecture is generic, making future approval workflows significantly easier to implement.
Document Verification
The platform supports secure document handling.
Administrators can verify:
- User identity documents
- Property deed documents
This verification workflow increases trust while keeping the approval process organized.
Admin Dashboard
The administration panel provides tools to:
- Verify users
- Review uploaded documents
- Manage administrators
- Approve property ownership documents
- Monitor platform activity
Building for Scale
One of my biggest goals during development was to avoid building features that would eventually need to be rewritten.
Instead, I focused on creating reusable modules that can support future growth.
Examples include:
- Generic Request System
- Role-based authorization
- Lease participant architecture
- Document verification workflow
- Modular NestJS backend
- Reusable API structure
These architectural decisions make future feature development much faster while keeping the codebase clean and maintainable.