AiPOS is a modern, production-ready point of sale that runs from a single
docker compose up command. JWT auth, real-time inventory, a checkout screen
your cashiers will actually like. No per-seat fees. No cloud lock-in. No bloat.
“The best software for retail shouldn't feel like software at all. It should feel like the floor itself — quiet, fast, and there when you reach for it. That's what we built. ”
Three forces have shaped point-of-sale software for the last decade — and all three push against the operator. We've met hundreds of independent retailers, and the same complaints come up, every time, in different words.
Per-seat fees, per-transaction surcharges, "starter" tiers that exclude reporting, enterprise quotes that arrive behind NDAs. The cost of running a register rises faster than the revenue it helps you earn. Software should make money easier, not more expensive.
When the vendor's network drops, your register drops. When the vendor changes pricing, you change vendors. When the vendor sunsets a feature, you scramble. Your most valuable asset — your sales history, your customer relationships, your inventory truth — lives on someone else's hard drive.
The terminal can't talk to your accounting, your loyalty, your online store. Spreadsheets become the source of truth, and your team becomes the integration layer. A point of sale should be the spine of operations, not a screen that stands alone.
AiPOS is a self-hosted retail operating system. The whole thing — frontend,
backend, database, migrations — runs from one docker-compose.yml.
Your data lives on your hardware. Your upgrades ship as Docker images. Your
cashiers log in to a checkout screen that doesn't take eight seconds to load.
Postgres, FastAPI, Next.js, the migrations, the seed data — all wired up. The backend's entrypoint runs Alembic on every container start, idempotently. You bring Docker. We bring the rest.
No telemetry leaves the box. No third-party analytics. No "we may share anonymized data with partners" in the fine print. The database is yours, the backups are yours, the failure modes are ones you can see and debug.
Three pre-seeded roles, scoped at the API level. A cashier can't reach user management. A manager can't touch global settings. The boundaries are real — not just UI hiding.
FastAPI. PostgreSQL. Next.js. Tailwind. shadcn/ui. The same libraries that run a generation of production apps, with nothing experimental in the mix. If you know the stack, you own the stack.
No upsells. No "available in the Pro plan." No "contact us for an enterprise demo." The full feature set ships in the open-source repository, and the default install unlocks all of it.
JWT-based auth with refresh tokens — access tokens expire in 60 minutes, refresh tokens let you re-authenticate without re-login. Three pre-seeded roles, scoped at the API level, not just hidden in the UI.
Sales totals, recent activity, low-stock alerts — the things a manager checks first thing in the morning, before the doors open. The numbers are pulled from the same source of truth as the till.
Categories, variants, SKU and barcode, multi-tier pricing, per-product tax. Stock tracking with reorder levels and an append-only stock-movement history. Every adjustment, return, and write-off is on the record.
Customer database with purchase history and a built-in loyalty-points engine. Repeat buyers earn points on every transaction. No third-party CRM needed, no "loyalty add-on module" upsell — it ships.
A fast checkout screen with a product grid, persistent cart, and multiple payment methods. Designed for one-handed operation at the counter — barcode scan, weight entry, split tenders, cash back, all reachable in two taps.
Complete transaction flow with receipt generation. Refund line-by-line, no exceptions. Daily sales trends, product performance rankings, inventory status — the kind of reports that used to require a separate BI subscription.
What does a working day actually feel like, for a cashier and a manager, on a register that respects their time? Here is one.
Sign in with PIN. The system reconciles the cash drawer with yesterday's close. Three taps and the float is entered. M. is ready for the first customer by 8:00 sharp — no twelve-second boot screen, no "loading your dashboard".
Barcode scan picks up the item. Quantity, modifiers, weight — entered in under three seconds. Card tapped, terminal approved, receipt printed, loyalty points added. The whole transaction takes 14 seconds. The customer is out the door with a printed receipt and a thank-you.
S. opens the manager dashboard on a tablet in the back office. Sales today: $2,847. Top sellers: Sourdough, Single-Origin, Heirloom Tomato. Low-stock alert: Sparkling Yuzu at 3 units. S. fires off a quick PO from the supplier portal — back to the floor in 90 seconds.
Customer returns a dented tin. M. pulls up the original sale from the customer's loyalty number, selects the line, processes a partial refund to the original card. Receipt is printed, stock is auto-restored, the audit log gets a new entry. No manager override needed.
S. closes the till. The system reconciles the cash drawer against the card totals, prints the Z-report, and archives the day's audit log. The database is auto-backed up via cron. Total time to close: four minutes. M. goes home. The shop is closed. The system waits.
No experimental frameworks. No "the next big thing" dependencies. Every piece of the stack has been in production at scale, somewhere, for years. That's the whole point — software you can run for a decade, not a quarter.
The default install is intentionally insecure — that's so it boots on a fresh laptop without you hunting for secrets. Before you expose it to a network, the things below are what you should care about.
Access tokens expire in 60 minutes. Refresh tokens let the client re-auth silently. No "session expired, log in again" interruptions in the middle of a transaction. The signing key is yours to rotate.
Roles are checked server-side, on every protected route. Hiding a button in the UI is not the security model — the security model is the API. A cashier who crafts a request to delete a user will get a 403.
Critical actions — sales, refunds, user changes, settings edits — are written to an immutable audit log. If something goes sideways, the trail is intact. The schema also supports multi-store rollouts without a redesign.
The database is on your hardware. The backups are your cron job. The failure modes are visible. There is no vendor who can change pricing, change terms, or sunset a feature without warning. You own the system.
Every account on the system is one of these three. The boundaries are real, not cosmetic — a cashier physically cannot perform a manager action, even if they type the URL by hand.
admin
pass · admin123
manager
pass · manager123
cashier
pass · cashier123
We don't have a logo wall. We have receipts, conversations, and cashiers who don't dread the morning open.
We replaced a $480/month subscription with AiPOS in a weekend. The first thing I noticed wasn't the cost — it was that my cashiers stopped asking me to fix the register.Naomi P. Owner · Two Locations · Coffee & Provisions
The fact that I can read the source code changed how I think about this software. When something breaks, I can fix it. When the vendor is silent, I don't have to wait.David A. Operations Lead · Independent Bookstore
Checkout takes fourteen seconds. Our old system took forty. Over a day, that's the difference between a queue and a conversation.Lia K. Floor Manager · Neighborhood Grocer
If your question isn't here, open an issue on the repository. We answer every one.
docker compose pull operation.
stores table and
per-store inventory rows are baked in. Multi-store
coordination across instances is a roadmap item.
docker compose pull, restart with
docker compose up -d, and the
entrypoint script runs Alembic migrations automatically. Idempotent, every time.
SECRET_KEY and the default database password before
exposing the service to a network. The defaults are committed for
local-dev convenience — they are not safe for production.
One git clone.
One docker compose up -d.
One open browser tab. The full stack is yours, forever.