What is NexisOmni
NexisOmni is a database-per-tenant POS + CRM SaaS for the Sri Lanka market. Each business (tenant) gets its own isolated database; a central admin database tracks the platform itself.
The product ships as three independent git repositories that version and deploy separately. There is no monorepo tying them together - the shared contract is the API, not a shared codebase.
The three repositories
Section titled “The three repositories”| Repository | What it is | Stack |
|---|---|---|
NexisOmni |
Backend API | .NET 10 / C# 14, ASP.NET Core, EF Core 10, PostgreSQL |
nexis-omni-web |
Online dashboards | React 19 + Vite SPA, TanStack Router/Query, pnpm + Turborepo |
nexis-omni-pos |
Offline-first POS | Flutter (Android + Windows), Drift, Riverpod, Dio |
The web repo holds two dashboards: hq-dashboard (the tenant-facing business back-office) and platform-admin (the operator console). The POS is a separate native app because it must keep selling with no network.
How they fit together
Section titled “How they fit together”Everything is built around one API contract. A change to that contract is the one case where a single logical change spans repositories - and even then it lands as separate commits in each repo, with the web client regenerated from the backend’s OpenAPI document.
┌─────────────────────┐ │ NexisOmni (API) │ │ central + per-tenant│ │ PostgreSQL │ └──────────┬──────────┘ ADMIN plane │ TENANT plane ┌────────────────┐ │ ┌────────────────┐ │ platform-admin │◀────┼────▶│ hq-dashboard │ │ (operator) │ │ │ (tenant) │ └────────────────┘ │ └────────────────┘ │ ┌─────▼──────┐ │ POS app │ offline-first, │ (Flutter) │ syncs when online └────────────┘To understand the system as a whole, read The API contract next - it is the single most important page here.
The workspace on disk
Section titled “The workspace on disk”Locally the three repos sit side by side under one parent folder (F:\dev\unitrix). That parent is not a git repository. Always change into the relevant sub-repo before running any git, build, or test command - a command run from the parent will not do what you expect.