Kalla Property Management is where I got my first real full-stack role. frontend AND backend. both at the same time. scary but exciting. 🚀
The Project
Kalla Group owns properties across Indonesia - commercial spaces, residential, retail. managing them was a mess of spreadsheets, emails, and lost information. they needed a centralized system.
What I Built
Property Listings Module
- CRUD operations for property listings
- Photo gallery management
- Location mapping integration
- Availability status tracking
- Search and filter functionality
Tenant Management
- Tenant profiles and history
- Lease agreement tracking
- Document storage
- Communication log
- Maintenance request submission
Financial Module
- Rent payment tracking
- Invoice generation
- Payment reminder system
- Financial reports
- Integration with payment gateways
Admin Dashboard
- Overview of all properties
- Occupancy rates
- Revenue analytics
- Maintenance scheduling
- User role management
Technical Deep Dive
Frontend:
// property listing component example
async function PropertyList({ filters }: PropertyFilters) {
const properties = await getProperties(filters);
return (
<div className="grid grid-cols-3 gap-4">
{properties.map(property => (
<PropertyCard key={property.id} {...property} />
))}
</div>
);
}
Backend (NestJS):
// property module structure
@Module({
imports: [PrismaModule],
controllers: [PropertyController],
providers: [PropertyService],
})
export class PropertyModule {}
Challenges
Full-stack scope First time owning both frontend and backend. had to think about:
- API design from frontend perspective
- Database queries optimization
- Authentication flow across both
- Error handling consistency
Real estate domain knowledge Had to learn industry terms: CAP rate, NLA, CAM, lease types. spent time with stakeholders to understand workflows.
Complex queries Property search with multiple filters + availability + price range = interesting SQL challenges.
Features I'm Proud Of
- Dynamic pricing calculator - based on lease type, duration, property type
- Maintenance request workflow - submit → assign → track → resolve
- Document generator - lease agreements from templates
- Dashboard analytics - visual representation of portfolio performance
Tech Decisions
Why NestJS?
- Structured architecture (modules, services, controllers)
- Dependency injection out of the box
- Great TypeScript support
- CLI tools for code generation
Why Prisma?
- Type-safe queries
- Great migration system
- Intuitive API
- Works great with Next.js
Results
- ✅ 50+ properties managed in system
- ✅ 70% reduction in manual data entry
- ✅ Integrated payment tracking
- ✅ Tenant self-service portal launched
Lessons Learned
- Full-stack means understanding both sides deeply
- Domain knowledge is as important as technical skills
- API design matters - think before you code
- Testing would have saved me hours (writing tests now, promise)
being full-stack is a superpower. you see the whole picture, not just your side of the fence.
Related Articles
Music Distribution Platform - Licensing & Digital Contracts
Built a music distribution platform with payment gateway, digital signatures, and 20GB file uploads.
PAMAFix Opex Capex - Financial Reporting Module
Built complex financial reporting with expandable tables, dynamic summaries, and Budget vs Actual comparisons.
DPR RI Open Data - Making Parliament Data Accessible
Built the open data portal for Indonesian Parliament - high traffic, strict requirements, real impact.