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.
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