DEV Community

Raktim Ranjit
Raktim Ranjit

Posted on

We Built an Offline-First, Open-Source Restaurant POS — Because Restaurants Can't Afford to Go Offline

A restaurant can survive a lot of things.

A slow day.

A broken printer.

A supplier arriving late.

But when the internet goes down during a busy dinner service, things can get chaotic very quickly.

Orders stop moving.

Kitchen tickets get delayed.

Bills become harder to process.

Tables become difficult to track.

And suddenly, the restaurant's most important operational system depends on something it doesn't control: the internet.

That problem is what led us to build OrderRestro.

OrderRestro is an open-source, offline-first restaurant management system designed specifically around restaurant operations — not a generic retail POS with a restaurant menu added on top.

The project is available on GitHub:

https://github.com/Raktim94/nodedr-restaurant-pos

It is built with:

Next.js
TypeScript
NestJS
PostgreSQL
Prisma
Socket.IO
Tailwind CSS
Docker
pnpm + Turborepo

And it is licensed under AGPL-3.0.

The problem with "everything in the cloud"

Cloud software is convenient.

There is no server to maintain.

Updates can happen centrally.

Data can be accessed remotely.

For many businesses, that's a great trade-off.

But restaurants have a different operational environment.

A restaurant might have:

A cashier at the POS
Servers using tablets
A kitchen display
A host managing reservations
A manager checking inventory
Multiple devices connected to the same local network

Most of these operations don't actually require the public internet.

They require the local network.

So we asked a simple question:

What if the restaurant's POS worked perfectly even when the internet disappeared?

That became one of the core architectural decisions behind OrderRestro.

Offline-first, not "offline as a fallback"

There is an important distinction here.

We didn't want to build a cloud application that happens to have a few offline features.

We wanted the restaurant to be able to run its core operation locally.

The default architecture is simple:

             RESTAURANT LAN

    ┌─────────────────────────┐
    │     Local Server        │
    │                         │
    │  Next.js + NestJS       │
    │  PostgreSQL             │
    │  Socket.IO              │
    └────────────┬────────────┘
                 │
      ┌──────────┼──────────┐
      │          │          │
    POS       Kitchen     Tablet
   Screen      Display    / Phone
Enter fullscreen mode Exit fullscreen mode

The restaurant can have one local machine running OrderRestro.

Every device connected to the restaurant's Wi-Fi or Ethernet network can access it.

If the WAN connection disappears, the restaurant's local system can continue operating.

Orders can still be created.

Bills can still be processed.

Kitchen tickets can still move.

Tables can still be managed.

Receipts can still be printed.

That is the fundamental idea behind the architecture.

Why build a restaurant-specific POS?

One of the decisions we made early was not to turn our existing retail POS into a restaurant POS.

Retail and restaurants look similar from a distance.

Both sell products.

Both need billing.

Both need inventory.

Both need customers.

But operationally they are very different.

A retail transaction might look like:

Scan product

Add to cart

Take payment

Print receipt

A restaurant transaction is closer to:

Customer arrives

Table assigned

Order taken

Modifiers selected

Kitchen receives KOT

Multiple kitchen stations prepare food

Food served

Additional orders

Bill split / merge

Payment

Table becomes available

The system needs to understand the restaurant floor and kitchen.

That means tables, reservations, waitlists, kitchen stations, KOTs, modifiers, recipes, inventory, customer history and much more.

Trying to force all of that into a retail schema would eventually make both systems worse.

So OrderRestro became its own codebase.

What is actually inside OrderRestro?

The current project already covers a large portion of the restaurant operation.

  1. POS & Billing

The POS supports:

Dine-in orders
Takeaway
Delivery orders
Split bills
Merged bills
Discounts
Tips
Gift cards
Loyalty points
Multiple payment methods
Refunds
GST/VAT handling
Printable receipts

The goal is to keep the workflow fast.

A restaurant employee shouldn't have to navigate through five different screens just to close a table.

  1. Tables and Floor Management

Restaurants aren't just a list of transactions.

They have a physical floor.

OrderRestro provides a visual table layout where staff can see the current state of the restaurant.

For example:

┌────────┐ ┌────────┐ ┌────────┐
│ Table 1│ │ Table 2│ │ Table 3│
│ FREE │ │ SEATED │ │RESERVED│
└────────┘ └────────┘ └────────┘

┌────────┐ ┌────────┐ ┌────────┐
│ Table 4│ │ Table 5│ │ Table 6│
│ SEATED │ │ FREE │ │ WAITING│
└────────┘ └────────┘ └────────┘

Staff can manage seating, reservations and the waitlist from the same operational view.

  1. Kitchen Display System

This is one of the most important parts of a restaurant POS.

A traditional workflow often looks like:

POS

Printed KOT

Kitchen

Someone loses the paper

Customer waits

We wanted something more reliable.

OrderRestro sends kitchen tickets to a live Kitchen Display System.

NEW

ACCEPTED

PREPARING

READY

Tickets can be routed to kitchen stations, and the display can show priority and elapsed-time information.

Because the system uses Socket.IO for realtime events, screens don't need to continuously poll the server waiting for changes.

The server can push the update when something actually happens.

  1. Menu and Combo Management

Restaurants need more than a product catalogue.

A menu item can have modifiers:

Burger
├── Size
│ ├── Regular
│ └── Large

├── Cheese
│ ├── None
│ └── Extra

└── Add-ons
├── Fries
└── Drink

OrderRestro supports categories, modifiers, combo meals and item availability.

This becomes especially useful during busy service when something sells out.

Instead of continuing to sell an unavailable item, staff can mark it unavailable.

  1. Inventory Based on Ingredients

Restaurant inventory is different from retail inventory.

A retail store might sell:

1 × Coca-Cola
1 × Notebook
1 × Shirt

A restaurant sells:

1 × Chicken Biryani

But internally that might consume:

Rice
Chicken
Oil
Spices
Onions
Yogurt

That's why OrderRestro uses recipe-based inventory.

The system can track ingredients rather than only finished dishes.

It also includes:

Recipe costing
Suppliers
Purchase orders
Goods receipts
Batch/lot tracking
Expiry tracking
Waste logging
Automatic stock deduction
Weighted-average costing

This gives restaurant owners a much better picture of where food costs are actually going.

  1. Customer Profiles and Loyalty

A restaurant's relationship with a customer shouldn't end when the bill is printed.

OrderRestro includes customer profiles with:

Visit history
Loyalty points
Feedback
Customer information
Gift cards

That creates the foundation for future CRM and marketing functionality.

The long-term goal is to connect the operational side of the restaurant with customer retention.

The architecture

The project is a monorepo built around a fairly conventional modern TypeScript stack.

nodedr-restaurant-pos/

├── apps/
│ ├── backend/
│ │ └── NestJS
│ │
│ └── web/
│ └── Next.js

├── packages/
│ └── types/
│ └── Shared Zod schemas

├── docs/

└── casaos/

The major pieces are:

Frontend

Next.js + TypeScript

The web application handles the POS, dashboards, kitchen display, tables, reservations, inventory and administration.

Backend

NestJS

The API provides the business logic and REST endpoints.

Database

PostgreSQL + Prisma

Restaurant data needs relational consistency.

Orders, bills, tables, customers, inventory, recipes and reservations all have relationships that benefit from a relational database.

Realtime

Socket.IO

Used for realtime restaurant events such as:

Kitchen tickets
Table updates
Order updates
QR-order status
Infrastructure

Docker Compose

The complete stack can run together as containers.

One of the most important rules: money belongs on the server

A POS is not a place where you want business-critical calculations happening only in the browser.

Prices, taxes, discounts and loyalty calculations need to be authoritative.

OrderRestro follows a server-authoritative model:

Client

│ "I want to buy this"

Backend

├── Validate item
├── Calculate price
├── Calculate tax
├── Apply discount
├── Calculate loyalty
└── Save transaction


PostgreSQL

The frontend is responsible for the interface.

The backend is responsible for deciding what the transaction actually means.

This matters even more when the system handles GST/VAT, refunds, loyalty balances and inventory.

Why PostgreSQL instead of SQLite?

An offline-first application doesn't necessarily mean "use SQLite."

We wanted the database architecture to support the operational complexity of a restaurant system.

PostgreSQL gives us:

Strong relational modelling
Transactions
Concurrent access
Mature indexing
A well-established ecosystem
A path toward larger deployments

And because PostgreSQL runs locally inside the Docker stack, using it doesn't require a cloud database.

The restaurant can still own the entire deployment.

Self-hosted means something different here

OrderRestro doesn't require the restaurant to send its operational data to our servers.

The default deployment can look like:

Restaurant


Local Server

├── Application
├── PostgreSQL
└── Restaurant Data

The same application can also be deployed on a VPS when remote access is desirable.

There isn't a separate "cloud edition."

It's the same application.

That flexibility is intentional.

Open source changes the relationship

OrderRestro is released under the AGPL-3.0 license.

That means the project isn't simply:

"Here's a free demo. Pay us when you need the real thing."

The source is available.

You can inspect it.

You can self-host it.

You can modify it.

You can contribute to it.

And if you build a modified network service under the AGPL requirements, the license includes corresponding source-sharing obligations.

For a system that manages a business's operational data, being able to inspect what you're running can be valuable.

There is still a lot left to build

We don't want to pretend that a restaurant ERP/POS can be finished in a weekend.

The current system already covers core POS, kitchen, tables, reservations, CRM and inventory functionality.

But the roadmap is much larger.

Some of the areas planned for future phases include:

Deeper procurement
Delivery management
Full online ordering
Multi-branch management
Advanced analytics
Marketing campaigns
Accounting
Finance
Maintenance
Documents
More integrations
Advanced security features

The roadmap is intentionally public.

You can see the project and its current status here:

GitHub repository

Why not just use a SaaS POS?

That's a completely reasonable question.

For many restaurants, SaaS is the right answer.

You get support, hosting and a managed environment.

But there are businesses with different requirements.

For them, questions like these matter:

What happens if our internet goes down?

Where is our data stored?

Can we modify the system?

Can we run it on our own infrastructure?

Are we locked into a vendor?

Can we integrate it with our existing systems?

Do we really need another monthly subscription?

OrderRestro is an attempt to provide a different answer.

Not necessarily a better answer for everyone.

Just a different one.

The bigger idea

The interesting part of building restaurant software isn't the POS screen.

It's understanding the restaurant as a distributed system.

There are multiple actors:

Customer


Server ────────► POS


Kitchen


Service


Table


Billing


Customer CRM

At the same time:

Inventory ──► Recipes ──► Orders
▲ │
│ ▼
Purchasing ◄──────────── Sales

And:

Reservations


Tables


Orders


Customers

A good restaurant system isn't just billing software.

It is the operational layer connecting all of these workflows.

That's the problem we're trying to solve.

Try it yourself

The easiest way to explore OrderRestro is through the project website:

https://orderrestro.nodedr.com/

The source code is available here:

https://github.com/Raktim94/nodedr-restaurant-pos

The project can be run with Docker, and the repository includes installation and development documentation.

For a quick-start deployment:

git clone https://github.com/Raktim94/nodedr-restaurant-pos.git

cd nodedr-restaurant-pos

./install.sh

Then open:

http://localhost:1995

You can also run the stack on a local restaurant server, VPS, or compatible home-server environments.

We're building this in public

OrderRestro is still actively developing.

That means there are bugs.

There are unfinished modules.

There are architectural decisions that will evolve.

And there are probably things we've designed incorrectly.

That's also the reason we're building it in the open.

If you're interested in:

Open-source POS systems
Restaurant technology
Offline-first applications
Next.js
NestJS
PostgreSQL
Prisma
Socket.IO
Self-hosted software
Restaurant operations
Building vertical SaaS alternatives

take a look at the repository.

Issues, ideas and contributions are welcome.

Repository: https://github.com/Raktim94/nodedr-restaurant-pos

Product: https://orderrestro.nodedr.com/

Final thought

A restaurant shouldn't stop taking orders because its internet connection stopped working.

That sounds obvious.

But once you start designing the entire system around that principle, it changes almost everything:

How you deploy.

How realtime communication works.

Where data lives.

How the database is selected.

How the frontend talks to the backend.

How you think about backups.

And ultimately, how much control the restaurant has over its own software.

That's why we built OrderRestro as offline-first, self-hosted and open source.

Not because cloud software is bad.

Because sometimes the best cloud architecture is the one that still works when there is no cloud.

Top comments (0)