A mobile-first property management platform for Tanzania — M-Pesa payments, TANESCO billing, 4-tier role system, PWA
# TenantLink
A mobile-first property management platform connecting landlords, caretakers, and tenants through a unified digital ecosystem. Built for the Tanzanian market with M-Pesa payment integration and TANESCO-compliant electricity billing.
---
## Tech Stack
- **Backend:** Node.js, Express.js
- **Database:** MongoDB (Mongoose)
- **Frontend:** EJS, HTML/CSS, JavaScript
- **Auth:** JWT + bcryptjs
- **Email:** Nodemailer (Gmail SMTP)
- **File Upload:** Cloudinary + Multer
- **PDF Generation:** PDFKit
- **PWA:** manifest.json + Service Worker
---
## Setup
```bash
# 1. Clone and install
npm install
# 2. Configure environment
cp .env.example .env
# Edit .env with your values
# 3. Seed Super Admin account
node src/seed.js
# 4. Start development server
npm run dev
```
---
## Role Hierarchy
```
Super Admin
└── Property Owner
└── Caretaker
└── Tenant
```
All non-Super-Admin accounts are created via invite-only token links.
---
## API Endpoints
All routes are prefixed with the portal path. Authentication via JWT cookie.
### Auth — `/auth`
| Method | Endpoint | Auth | Description |
|--------|----------|------|-------------|
| GET | `/auth/login` | Public | Login page |
| POST | `/auth/login` | Public | Login |
| GET | `/auth/register/:token` | Public | Register via invite |
| POST | `/auth/register/:token` | Public | Complete registration |
| GET | `/auth/forgot-password` | Public | Forgot password page |
| POST | `/auth/forgot-password` | Public | Send reset email |
| GET | `/auth/reset-password/:token` | Public | Reset password page |
| POST | `/auth/reset-password/:token` | Public | Set new password |
| GET | `/auth/logout` | Auth | Logout |
### Super Admin — `/super-admin`
| Method | Endpoint | Auth | Description |
|--------|----------|------|-------------|
| GET | `/super-admin/dashboard` | Super Admin | Dashboard |
| GET | `/super-admin/owners` | Super Admin | List owners + invites |
| POST | `/super-admin/invite-owner` | Super Admin | Generate own …