INOVIT Dealer Portal
Solo-built a full replacement for a legacy C#/.NET 4.8 dealer portal — both systems running on the same production database, processing live orders, with zero downtime and zero schema changes.

A B2B e-commerce platform replacing a legacy .NET ERP — without ever taking it offline.
The new Django API and the old .NET system read and write the same SQL Server tables, in parallel, processing live dealer orders. 49 API endpoints, four regional databases behind one codebase, cross-repo OpenAPI type generation, and a migration that changed not a single column of the production schema.
- Stack
- React 19
- TypeScript
- Django 5
- DRF
- SQL Server
- Ant Design 6
- Vite 8
- Docker
- AWS
- Category
- Full-stack
My Role
Solo · greenfield rewriteAt a Glance
By the numbers- Downtime
- 0
- Schema Changes
- 0
- API Endpoints
- 49
- Regions
- 4
- ORM Models
- 44
- Developer
- 1
Tech Stack
Five layers- Frontend
- React
- TypeScript
- Vite
- Ant Design
- Backend
- Django
- DRF
- Python
- Gunicorn
- Database
- SQL Server
- mssql-django
4 regional databases · 42 unmanaged models
- Infra
- AWS Lightsail
- Docker
- Caddy
- GitHub Actions
- S3
- Lambda
- SES
- Testing
- Vitest
- Playwright
- pytest
OpenAPI drift checks in CI
Two Systems, One Database
Parallel operationDjango maps 42 legacy tables with managed = False: the ORM works normally and never migrates them. Both systems process live orders in parallel, unaware of each other.
New System
Legacy
Alongside
One Codebase, Four Databases
Region routingA dealer never picks a region: the token carries it, and one Django instance routes every ORM query to the right database.
Trade-offs
Decisions that heldOpenAPI as the contract boundary
Auth caching across AWS instances
2 MB bundle budget
Build-time architecture enforcement
Want the full walkthrough?
Happy to talk through the architecture, the decisions, and the trade-offs behind this build.


