Skip to content
SaaSLive2026

Vendaí

Offline-first POS ecosystem for small businesses — Electron desktop app, sync cloud, and Flutter app

Electron 42React 19Vite 7 (electron-vite)Tailwind CSS v4Flutter / DartNode.js 22
Runs onmacOSWindowsMicrosoft StoreAndroidiOS
usevendai.com.br
reports in 7 categories
50+
apps: desktop, cloud, and phone
3
of the operation works offline
100%
banks with boleto and CNAB
7

01

Overview

Vendaí was born inside a feed store and became a product for any small business. It is an ecosystem in three parts, all built by me: the desktop POS (Electron + React 19 + SQLite) that runs at the counter and works 100% offline; the sync API (Node + Express + PostgreSQL on Railway), the 'premium cloud' that receives everything from the desktop and sends back whatever was changed on the phone; and the Flutter app (Android and iOS) so the owner can track revenue, sales, inventory, and the cash register from anywhere. Every record has a UUID, a sync queue, and an immutable history — sales and movements are never deleted, cancellations generate new events. The system is distributed as a macOS/Windows installer, through the Microsoft Store (MSIX), and through the Play Store, with automatic updates, Sentry telemetry, a complete manual inside the app, and its own visual identity (design system, website, and store materials).

My role

Solo full-stack developer — product, offline-first architecture, Electron/React/SQLite desktop app, Node/PostgreSQL sync API, Flutter app, integrations with thermal printer and label-printing scale, branding, website, store publishing, and support for shop owners.


Category

SaaS

Year

2026

Status

Live

Platforms

macOSWindowsMicrosoft StoreAndroidiOS

Three applications, one store. The desktop is the origin of events, the cloud is the meeting point, and the phone is the owner's window.

Desktop POS

Runs at the counter, 100% offline

ElectronReact 19SQLite

Vendaí Cloud

Sync API (premium)

NodeExpressPostgreSQLRailway

Management app

Android and iOS

FlutterRiverpodFCM

Sync: Two-way sync: the desktop sends everything; the phone sends back customers and inventory movements.


02

The Problem

Small businesses in Brazil run on a notebook of customer tabs, a cash register closed 'by gut feeling', inventory problems discovered only when something runs out, and supplier invoices (boletos) scattered in a drawer. The POS systems on the market either depend on stable internet — which drops in small towns and neighborhood shops — or are expensive and built for chains. And when the owner leaves the shop, they lose all visibility into what is happening at the counter.

03 — The Solution

An offline-first desktop POS that is fast to operate during the rush (F2–F9 shortcuts, USB scanner, real-time change calculation) and handles the entire operation — sales, cash register, inventory, customers and tabs, suppliers, accounts payable, PIX, boletos, and reports — syncing with the cloud when a connection is available. The owner follows everything from their phone, the cashier sees only what they need, and the store keeps selling even when the internet is down.


04

Inside the product

The system in action, recorded from the real application with a demo store — no screen is a mockup.

01

POS

A sale in seconds, with the keyboard or the scanner

The product goes through the scanner and lands straight in the cart. Quantity, discount, customer, and payment each have their own key — the operator never takes their hands off the keyboard. Change appears while the amount is typed, and the confirmation comes with the sale number and a receipt on the thermal printer.

  • F2–F9 shortcuts in the bottom bar at all times
  • Open tab alert when the customer is linked
  • Split payment across several methods, with net amount shown before finalizing
POS
02

Inventory

Inventory warns you before it runs out

Goods receipt with supplier, invoice, and cost — if the purchase was on credit terms, the accounts payable are created automatically. Every adjustment has a reason and a responsible person, and the 'Today' screen shows what needs restocking before any KPI.

  • Minimum stock and upcoming expiration alerts
  • Complete movement history
  • CSV import and export
Inventory
03

Finance

Supplier boletos read from the barcode

The payment schedule organizes what is overdue, due today, due in 7 days, and due this month. The barcode on the boleto (or the electricity bill) is read and validated instantly, recognizing about 90 issuers. Partial and batch payment, with interest and discount, reversal, and attachments.

  • Due-date badge in the sidebar
  • 12 reports with CSV, Excel, and PDF export
  • Boleto issuing with CNAB 400/240 for 7 banks
Finance
04

Reports

50+ analyses, without leaving the system

Cash flow with running balance, profit, ABC curve, inventory turnover, peak hours, payment methods with fees, customer ranking, expiration, audit. Search, filters, KPIs at the top, and a chart only where the series says something.

  • Export to CSV, Excel, and PDF, plus A4 printing
  • Sales history with reprint and cancellation with reversal
  • Everything calculated locally — works offline
Reports
05

Secure Receiving

Blind count and a trail nobody can edit

The invoice comes in by XML or access key, but it doesn't touch inventory. Whoever unloads the goods counts without seeing the expected quantity; the system compares order × invoice × physical count item by item, shows the discrepancy in money, and takes the decision to whoever has the authority — whoever did the count doesn't approve their own discrepancy.

  • Quarantine stock and return to supplier
  • Inventory and accounts payable updated in a single transaction
  • Append-only trail signed by device, with remote approval through the app
Secure Receiving

05

9 video walkthroughs

Each video shows a complete task, end to end. Click to watch with controls.


06

Key Features

01

Counter POS built for the rush

Search by name, code, or USB barcode scanner, per-item and overall discounts, split payment (cash, PIX, debit, credit, and tab), change calculated as you type, linked customer with a tab alert, and F2–F9 shortcuts always visible.

02

100% offline, syncs when it can

Login, sales, inventory, cash register, reports, and printing all work without internet. Every write goes into a sync queue with a UUID and is sent to the cloud with retries when the connection returns — nothing is lost.

03

Inventory with goods receipt

Receipt with supplier, invoice, cost, and payment method — a purchase on credit terms generates the accounts payable automatically. Outflows, adjustments with reason and responsible person, minimum stock and expiration alerts, CSV import and export.

04

Finance: accounts payable and boletos

Payment schedule (overdue · today · 7 days · month) with barcode reading and validation for boletos (47 digits) and utility bills (48), partial/batch payment with interest and discount, attachments, and 12 reports. Boleto issuing module with CNAB 400/240 and layouts for 7 banks.

05

Reports center with 50+ reports

Finance, sales, inventory, customers, products, cash register, and audit: cash flow, profit, ABC curve, inventory turnover, peak hours, card fees, receivables forecast. KPIs at the top, charts where the series says something, and export to CSV, Excel, and PDF.

06

Secure Receiving

NF-e import by XML or access key, blind count (whoever counts doesn't see the expected quantity), three-way comparison of order × invoice × physical count, discrepancies with an approval authority, quarantine stock, and an append-only trail signed by device.

07

Mobile management app

Revenue, sales, average ticket, low stock, customers, and cash register on Android and iOS — the same store as the desktop, read from the cloud. License-key pairing, push notifications, and dark theme.

08

Store hardware and distribution

Thermal printer with a reliable print queue (never 'printed' without confirmation), scale and label printer (MGV 7), static PIX with QR Code at the counter, macOS/Windows installers, Microsoft Store (MSIX), and automatic updates.


07

Product screens

Real screenshots of the product, organized by module. Click any screen to enlarge it.

Daily dashboard: shortcuts, actionable pending items, revenue, sales, average ticket, and low stock
Sales by day of the month
Best sellers with revenue per product
The same screen in dark theme dark
Global search (F1): product, customer, or sale
POS at rest: search, F2–F9 shortcuts, and best-sellers showcase
Cart with items, subtotal, and total
Cash payment with change calculated in real time
Sale confirmation with number, total, and change
PIX QR Code for the exact amount, generated offline
POS in dark theme dark
Products with category, brand, price, stock, and status

08

On mobile

The same store as the desktop, in the palm of your hand: the numbers in the app match the ones at the counter because they come from the same synced database.

Today
Sales
Sale details
Low stock
Product
Customers
Cash register
Reports
Sync
Dark theme

09

Technologies

Front-end

Electron 42React 19Vite 7 (electron-vite)Tailwind CSS v4Flutter / Dart

Back-end

Node.js 22ExpressIPC + contextBridge

Database

SQLite (better-sqlite3)PostgreSQLsqflite (app)

Deployment

Railwayelectron-builder (DMG / NSIS)Microsoft Store (MSIX)Google PlayVercel (site)

Integrations

StripeFirebase Cloud MessagingSentryImpressora térmicaBalança / etiquetadora (serialport)Amazon S3 (backups)

Libraries

ZodRechartselectron-updaterbcryptjsPapaparseRiverpodgo_routerdiofl_chartVitest

10

Design Decisions

The interface is designed for the counter: 44 px touch targets (56 px on POS buttons), keyboard shortcuts visible at all times, numbers in a tabular font for quick reading, and a 'Today' screen that shows what needs action first (stock at minimum, overdue bills) before the KPIs. Vendaí green (#059669) as the single action color, Sora for headings and hero numbers, Inter for body text, native dark theme. The cashier sees a simple system; the administrator sees the whole system — the difference is permission, not a different product. Complete built-in manual, offline, with a Help button on every screen.

11

Technical Challenges

The biggest challenge was getting three applications to agree on one store without any of them being 'the right one'. The solution was to treat the desktop as the origin of events and the cloud as the meeting point: each record is born with a UUID, each write goes into a queue with the operation (create/update/delete) and the payload, and the sync service monitors the connection, sends in batches, marks records as synced, and logs failures with a retry count — the phone reads a consolidated snapshot and sends back only what it changed (customers, movements). Second challenge: Secure Receiving needed guarantees that a regular CRUD doesn't provide — blind count, segregation of duties (whoever counted doesn't approve their own discrepancy), inventory and accounts payable updated in a single transaction, and an append-only trail signed by device, verifiable by the owner. Third: boletos and barcodes generated and validated 100% offline (digitable line, barcode, hybrid PIX QR, settlement via CNAB 400/240 return file) for banks with different layouts.


12

Results

  • Product in production at version 1.8, distributed for macOS, Windows (installer and Microsoft Store), and Android — with automatic updates and error telemetry
  • Three applications, one store: desktop, cloud, and phone share the same data through two-way sync with a queue and retries
  • 50+ reports, a complete finance module (accounts payable, CNAB boletos, PIX), and Secure Receiving with an immutable audit trail
  • Its own end-to-end visual identity: design system with tokens, logo kit, website, and materials for the Play Store and Mercado Livre

13

Learnings

  • True offline-first is a modeling decision, not a caching one: UUIDs on every record, sync_status/deleted_at fields, a sync_queue with the operation and payload, and events that are never deleted — cancellations become new events, which is what makes conflict resolution possible
  • Pure code shared between main and renderer (src/comum): the calculation of POS totals, fees, and net amount is a single module — the number the screen shows is exactly what the database stores
  • Electron security with no shortcuts: React never touches the database; every call goes through contextBridge → IPC handler (session + profile + payload validated with Zod) → service. Passwords in bcrypt, remembered session encrypted with safeStorage
  • Store hardware is where software breaks: printing became a job with state (sent, accepted, failed, timeout) and history, so the receipt never silently disappears or comes out twice
  • Multi-channel distribution: the Microsoft Store version needs its own data folder and a one-time import from the traditional version; the Play Store requires a privacy policy, account deletion, and real screens — all of this becomes code and documentation
  • A Flutter app that shows the same numbers as the desktop requires the API to be the source of truth for the snapshot — and the local cache (sqflite) to know when it is stale