"AXOIX: 18 verticals, 98 live tenants, database-per-tenant, source-available. Here's the honest tour, and why I'm opening it up.
Hey — I'm Rajat, solo founder of AXOIX.
Before I get into it: yes, really. One person, one VPS, one codebase. 18 industry verticals, 4,083 API endpoints, live tenants in production. This post is an honest tour of what that looks like, the lessons that came out of it, and why I'm opening the codebase up for contributors.
If any of this sounds like a codebase you'd want to poke at, there's an application link at the bottom.
What AXOIX actually is
AXOIX is a multi-tenant SaaS that ships as a single codebase but serves 18 verticals, each with their own data models, flows, and UI:
E-commerce / storefront
Restaurants
Real estate & construction
Hotels & hospitality
Sports and arena management
Healthcare
Education
HR and workforce management
Logistics
WhatsApp CRM (internally: CHORUS)
Telephony / IVR / call-center (internally: LINK, backed by FreeSWITCH + FusionPBX)
…and more.
Every tenant gets their own MySQL database — axoix_{subdomain}. No shared tables. No row-level tenant_id trickery. Files land in a per-tenant Backblaze B2 bucket and are served through a Cloudflare Worker, so egress stays at zero (Bandwidth Alliance). Secrets live in HashiCorp Vault — never .env files.
The stack, concretely
Backend: FastAPI, Python 3.11, ~4,083 endpoints across 180+ route files
Frontend: React + Vite, 530+ pages
Database: MySQL 8, one database per tenant
Secrets: HashiCorp Vault
Object storage: Backblaze B2 + Cloudflare Worker (cdn.axoix.io)
AI: Local Ollama (hyperion-4b-q4 for reasoning, nomic-embed-text for embeddings)
Telephony: FreeSWITCH + FusionPBX, dialplan stored in PostgreSQL tables (not XML)
Frontend delivery: Cloudflare Pages
The architecture splits three ways:
Mothership (indev-api, port 8010) — tenant provisioning, billing, admin, voice catalog.
POC API (axoix-poc-api, port 8003) — all tenant business logic, per-tenant DB routing.
PBX layer — FreeSWITCH + FusionPBX for voice.
That "Mothership vs POC" split was hard-won. I'll get into why in a minute.
The numbers, unfiltered
98 live tenants (11 paying + 87 seeded demos), each with a real per-tenant database.
4,083 API endpoints — grep'd and verified, not projected.
530+ frontend pages.
990+ tables provisioned per tenant on signup.
B2 storage at $0.006/GB/month.
Zero Cloudflare egress thanks to the Bandwidth Alliance.
8,798 nodes / 11,849 edges in the knowledge graph the internal AI Builder scans the codebase into.
I quote the numbers because "multi-tenant SaaS" usually means "one Postgres with a tenant_id column and a prayer." AXOIX is actually database-per-tenant. Yes, the tradeoffs are real. Yes, it's survivable at this cost, at this scale, as a solo operator.
One hard lesson
Sparing the victory-lap version. Here's the honest one.
For months, the storefront module was unstable. Editor state desynced from the rendered output, sections refused to save, content vanished mid-session. I shipped fix after fix. None held.
The bug wasn't in the code I kept editing. The bug was that tenant_migrations.py wasn't wired into API startup — new schema migrations weren't running on existing tenants. Every "fix" I shipped was chasing the downstream symptom of ~20 un-applied migrations queued across every tenant.
When I finally wired migrations into ensure_tenant_schema in main.py, the whole storefront category of bugs closed in one shot.
The lesson out of that: patch symptoms vs. fix foundations. Every sprint I run now starts with a Phase 0 "read repo, prove the theory" — no coding until I can state the root cause. It feels slower. It is not.
There's a second one: wrong-target development is expensive. I spent two weeks building a voice-agent execution layer in the POC API. It belonged in Mothership. Full revert. The architecture split now gets confirmed before Phase 1 of any sprint.
I mention both because this is the culture you'd be working inside. I declare broken things honestly. Sprints end with honest broken-lists. I don't pretend the ship is tighter than it is.
Why source-available, not MIT
The code is Polyform Noncommercial 1.0.0 — not OSI-approved. I want to address this up front because half the dev.to / HN crowd will spot it in five seconds.
Polyform Noncommercial means: you can read it, fork it, run it locally, contribute, use it for non-commercial work — but you cannot use it to compete commercially against AXOIX or resell hosted versions. That's the commercial moat for the product business.
If that makes AXOIX "not real open source" in your framework — fair. I'd rather be honest about being source-available than slap MIT on a commercial SaaS and then claim surprise when someone clones the whole thing. If the license is a blocker, I understand, and no hard feelings.
What contributors get today
GitHub push access to the repo after approval, with a signed CLA in your file.
Tier auto-promotion based on merged-PR counts: rookie default → regular at 5 merged PRs → core at 20 → lead by hand.
A public contributors page (opt-in) where approved contributors are listed.
Direct access to me on the roadmap decisions — no PM layer between you and what ships.
On the structural side: Axoix Technologies is being incorporated as a Pvt Ltd rather than an OPC, deliberately, because a Pvt Ltd preserves the option to issue equity later. I'm not promising any specific allocation, timing, or threshold today — the company isn't even fully incorporated yet. I'm just saying the structure is being set up so that recognising meaningful contributors with equity is something that can happen down the road, not something the corporate form would rule out.
If that's enough signal to make it worth your time, great. If not, also fair.
What you'd actually work on
The seed batch of good-first-issues (queued to land when the public mirror flips) includes things like:
Fixing a submission_deadline regex that drops time after "upto" in tender extraction.
Adding missing milestones patterns for CPWD-style tender documents.
Lazy-loading 10 eager-imported vertical routes in App.jsx (bundle-size win).
Adding company_id columns + migrations to specific models flagged in the multi-tenant isolation audit.
Wiring missing-table migrations for EcomCart / EcomCartItem.
Per-section search in the StorefrontEditor sidebar (21-item list, no filter today).
HTML5 DnD mobile touch fallback in HomepageSectionManager.
Dead-page wirings for per-subpage SEO meta fields.
Row-level publish / unpublish toggle in the Pages tab.
These are real issues out of a priority file I maintain — not synthetic practice tasks. Sizes range from a half-hour fix to a multi-day feature.
Longer-term, whole modules are up for grabs: a Puck page-builder integration, a Playwright test harness, re-implementing the XTTS voice service in the correct architectural slot, or vertical-specific features across any of the 18 domains.
The honest pre-launch status
The public repo (axoixrb/axoix-tenant) is currently private. It flips public once the Mothership-based contributor onboarding is live — which is the next sprint, not a someday. The intake flow, CLA, GitHub auto-invite, and tier tracking are all built and running. What I'm finishing now is restoring the governance files (LICENSE, CONTRIBUTING.md, SECURITY.md, issue templates) that got wiped when the repo was recreated from scratch on 2026-04-19.
Today, the contributor path is:
Apply at https://indevithub.com/contributors/apply (sign in with GitHub; the form auto-fills from your profile).
I review the application.
On approval, you're auto-invited as a push-permission collaborator to the repo, with a signed CLA in your file.
Clone, run docker compose up, pick an issue, open a PR.
That's it. No gatekeeping, no "prove yourself on three side projects first." If the fit is there, we get you in.
A separate track: if your strength is selling, not shipping
Totally independent from the contributor program, AXOIX runs a referral partner program for people who'd rather bring paying tenants to the platform than write code.
10% direct commission from day one (Starter tier), on every payment from a tenant you refer — initial and recurring.
Scales with active referrals: 10.5% at Bronze (50 active referrals), 11% at Silver (100), 11.5% at Gold (200), 12% at Platinum (500).
+2% long-term bonus on 5-year and 10-year subscription purchases (so a Platinum partner on a 10-year plan earns 14% direct).
MLM overrides: 2% on your Level 1 downline's referrals, 1% on Level 2.
Payouts weekly or monthly via bank transfer / UPI, or instant via RazorpayX (₹50 fee). Minimum balance ₹500.
TDS handled per Indian tax law (10% deducted once lifetime earnings cross ₹15,000).
Portal lives at https://partner.axoix.com. It's completely separate from the contributor track — you can do one, the other, both, or neither. No expectation or linkage between the two.
If you're still here
If the scale is interesting, or the stack aligns with yours, or you just want to work on something that isn't yet-another-todo-app — apply: https://indevithub.com/contributors/apply. Ask questions in the form. If you'd rather email first, hello@indevithub.com reaches me directly.
I'll be writing more here as the public sync lands. Next one's a deep-dive on the Mothership ↔ POC split and why "just put it all in one app" didn't survive past three verticals.
— Rajat
Top comments (0)