Teamora is a personal ERP SaaS project focused on scalable and modular project management. It’s built using Django, Django REST Framework, and React, and supports multi-tenant architecture using django-tenants. This project is in its MVP stage with a completed project management module and plans to expand into HR, CRM, and Finance in the future.
- ✅ Project & Task management with subtasks
- ✅ Drag-and-drop Kanban interface
- ✅ Role-based access (Admin, Project Manager, Developer)
- ✅ Multi-tenant architecture with subdomain routing
- ✅ Real-time updates using Django Channels + Redis
- ✅ Modular monolithic structure with DRY principles
- 🚧 More ERP modules planned (HR, CRM, Finance)
Backend:
- Django
- Django REST Framework
- django-tenants
- PostgreSQL (schema-based multi-tenancy)
- Redis
- Django Channels
- JWT Authentication
Frontend:
- React
- Redux Toolkit
- React Router
- TailwindCSS
- Axios (with tenant-aware API client)
teamora/
├── backend/ # Django project with modular apps
│ ├── apps/ # Project, Task, User, etc.
│ ├── core/ # Shared utilities, base models
│ └── tenants/ # Tenant and Domain models
├── frontend/ # React frontend
│ ├── components/
│ ├── features/
│ └── pages/
└── README.md
cd backend
python -m venv env
source env/bin/activate # or .\env\Scripts\activate on Windows
pip install -r requirements.txtMigrate public schema first:
python manage.py migrate_schemas --schema=publicThen apply tenant migrations:
python manage.py migrate_schemas --tenant💡 Or just run for all:
python manage.py migrate_schemaspython manage.py createsuperuser --schema=publicpython manage.py runserver- Docker + Docker Compose installed
docker compose up --buildBackend will be available at:
http://localhost:8000/
-
Restart:
docker compose restart
-
Shut down:
docker compose down
-
Access backend container:
docker compose exec teamora-backend bash -
Django shell inside container:
docker compose exec teamora-backend python manage.py shell
Run the Django shell:
python manage.py shellThen create a tenant and domain (example):
from tenants.models import Client, Domain
tenant = Client(
name="Acme Corp",
schema_name="acme",
paid_until="2026-01-01",
on_trial=True
)
tenant.save()
domain = Domain()
domain.domain = "acme.localhost" # Use actual subdomain in production
domain.tenant = tenant
domain.is_primary = True
domain.save()🔁 Visit your tenant at
http://acme.localhost:8000/
Make sure you have proper DNS or local hosts entry.
Create a .env file (or use .env.example) in your backend/ folder for things like:
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
DJANGO_SECRET_KEY=your-secret-key
DJANGO_DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1- Project & task management (MVP)
- Subtask support & assignment
- Role-based access
- Multi-tenancy support
- Drag-and-drop Kanban
- HR module
- CRM module
- Finance module
- Notification center
- Audit logs & activity tracking
- Admin dashboard for tenants
- Mobile optimization
Roshan J.
Built with ❤️ to learn, scale, and experiment with modern ERP design and architecture.
Teamora is licensed under the MIT License.