Retour aux projets
Desktop

Freeze POS: Offline-First Point of Sale

A desktop POS that keeps selling when the internet doesn't: a full back-office for African SMBs, usable like a pro in an afternoon.

Enterprise React Electron typescript MySQL
Freeze POS: Offline-First Point of Sale

Overview

Freeze is a desktop point-of-sale and back-office application built for African small and medium businesses operating in low-connectivity environments, where cloud SaaS simply isn't an option. Invoicing, inventory, cash management, receivables, purchasing and industry add-ons all live in one Electron app that stays fully operational with no network. It was first deployed in Congo-Brazzaville and designed to be localized to other markets.

Freeze is your register, your stock and your cash, even with no internet.

It is intentionally not a distributed multi-store cloud ERP and not an accounting suite. It does one thing seriously: run a real business's daily operations on a local machine, correctly, offline.

The engineering challenge

The hard part of Freeze is twofold: doing money, stock and tax correctly with no cloud to fall back on, and keeping a system that deep simple enough to master in an afternoon. Both forces shaped every decision:

  • Offline-first by design. The app boots, sells, prints and reports with zero connectivity. The network is only used opportunistically (license heartbeat, encrypted backups, cloud reporting sync).
  • Powerful, yet usable in about 2 hours. Freeze spans POS, stock, cash, tax and six business add-ons, but it's designed to be installed and used like an expert within a couple of hours, not after days of training. Modules activate only when a business needs them, settings ship with sensible defaults, each role gets its own tailored screen, and realistic demo data can be loaded to learn on before going live.
  • Correctness over shortcuts. Multi-rate VAT (18% / 5% / exempt) plus the Congolese centime additionnel, FIFO lot costing, cash-session reconciliation and receivables aging (0 to 30, 31 to 90, 90+ days) are enforced in the domain layer, not left to the UI. A fiscal-declaration report reconciles taxable base, collected VAT and additional tax for filing.
  • A strict IPC contract. Every capability exposed to the UI flows through five enforced layers (service, IPC handler, preload, typed bridge, store/page), validated in CI so the renderer can never call an unsafe or untyped path.

Key capabilities

Sales & invoicing

  • POS invoicing with configurable VAT and additional tax
  • Quotes / proformas with one-click conversion to invoice
  • Credit notes with automatic stock re-integration
  • Customers, credit limits, receivables and collections
  • Wholesale / retail pricing, managed discounts, sales orders and delivery notes

Inventory & purchasing

  • Product and service catalog with hierarchical categories
  • Multi-warehouse stock with inter-warehouse transfers, all on one offline instance
  • Stock entries (draft to validation), FIFO lots, physical inventories
  • Purchase orders, supplier invoices, payables tracking

Cash & treasury

  • Multi-register support with open/close sessions, float and FCFA cash counting
  • Collections, deposits, withdrawals and expenses
  • Payment methods: cash, card, mobile money, cheque, bank transfer

Setup & configuration (the differentiator)

  • Guided first-run setup: configure the database and company once, then start selling
  • Deep but friendly settings for company, users & roles, warehouses, registers, stock and POS behavior, all with sensible defaults
  • Activate only the modules a business actually uses; everything else stays out of the way
  • Load realistic demo data to train staff and explore the app before going live

Reporting & dashboards

  • Role-based dashboards: a dedicated home screen per role (admin, cashier, accountant, stock manager) surfacing only what that person needs
  • Online reporting: the app runs fully offline, yet its data syncs one-way to the cloud whenever internet is available, so owners can review their reports online from anywhere without the app ever depending on a connection
  • Multi-channel revenue analysis (products, restaurant, car wash, bar, delivery), payment mix, per-establishment P&L
  • Gross-margin analysis by product and channel, top products, customer profitability
  • Sales / stock / cash journals, receivables & payables aging
  • Fiscal declaration: VAT by rate and additional-tax summaries for filing

Activatable business add-ons

Modules that switch on per business, living inline in the codebase rather than as bolt-on plugins:

  • Service providers: commissions and payouts (car washers, mechanics, waiters, and more)
  • Car wash: station tickets linked to the register
  • Restaurant / lounge: zones, tables, service tickets, kitchen flow
  • Delivery: delivery tickets, cash-on-delivery, driver assignment
  • Subscriptions: client plans and contracts
  • Garage: customer vehicles and history

Platform engineering

  • Offline RSA license with device fingerprint, plus an API heartbeat when internet is available
  • Scheduled encrypted backups
  • Resilient cloud reporting sync: a durable outbox that survives app kills, acknowledges only on success, and retries with exponential backoff when offline
  • Server / LAN client mode: pair additional terminals to one instance over the local network
  • Data-integrity diagnostics and support bundles for field troubleshooting

Localization, done properly

Freeze isn't generically "internationalized." It's localized to how business is actually run on the ground: configurable currency and tax rules, multi-rate VAT plus region-specific levies, denomination-aware cash counting, and a French-first UI. The first locale is Congo-Brazzaville (FCFA, 18% VAT plus the 5% centime additionnel, cash denominations from coins to 10,000 notes), and the tax and currency model is built to extend to other markets.

Tech stack

Electron (electron-vite) · React 19 · TypeScript · Tailwind CSS v4 · Zustand · MySQL 8 · Drizzle ORM · Zod · Recharts · ExcelJS · Vitest · GitHub Actions CI (lint, typecheck, IPC-contract checks, unit + zero-to-current MySQL migration tests).

What I worked on

Product and technical design of an offline-first desktop application: the domain model for invoicing, stock and cash; the enforced IPC contract between the Electron main process and the React UI; the MySQL/Drizzle schema with tested migrations; and localization to Congolese tax and cash rules. The emphasis throughout was correctness and resilience on a single offline machine rather than cloud scale.

Gallery

Freeze POS: Offline-First Point of Sale
Freeze POS: Offline-First Point of Sale
Freeze POS: Offline-First Point of Sale
Freeze POS: Offline-First Point of Sale
Freeze POS: Offline-First Point of Sale
Freeze POS: Offline-First Point of Sale
Freeze POS: Offline-First Point of Sale