Project archive

Point of Sale (POS)

Offline-first POS client integrated with ERPNext, designed to keep checkout available during connectivity loss and synchronize queued transactions safely after reconnection.

Vue 3QuasarTypeScriptPiniaIndexedDBService WorkersERPNext REST APIsOffline-First Architecture
2026

Read this case as a

Choose your lens

Designed and implemented an offline-capable retail workflow covering interface behavior, local persistence, synchronization, and ERPNext integration.

Claims come with context

Each outcome shows its source, related capability, and confidence level. Missing operational data stays visibly unavailable.

Verified evidence01

Offline checkout workflow

IndexedDB stores checkout state and queued operations while ERPNext is unavailable

Source · Public GitHub repository

IndexedDBQuasarService Workers
Supporting context02

Retry-safe synchronization

Queued operations use stable references and controlled retry behavior to reduce repeated ERPNext submissions

Source · Repository implementation and engineering notes

TypeScriptERPNext APIsIdempotency
Supporting context03

Local-first interaction model

Checkout operations use local state before the synchronization process communicates with the backend

Source · Local demonstration environment

Vue 3PiniaOffline-first

Where each capability shows up

IndexedDBOffline checkout workflow
QuasarOffline checkout workflow
Service WorkersOffline checkout workflow
TypeScriptRetry-safe synchronization
ERPNext APIsRetry-safe synchronization
IdempotencyRetry-safe synchronization
Vue 3Local-first interaction model
PiniaLocal-first interaction model
Offline-firstLocal-first interaction model

A fragmented workflow slowed the whole system.

Retail checkout cannot depend entirely on continuous internet connectivity. Network latency or connection loss can interrupt sales, delay customers, and leave payment or inventory state incomplete when every action requires an immediate ERPNext request.

One product model, expressed clearly at every layer.

I designed an offline-first POS client that persists checkout state and queued operations in IndexedDB. Local workflows remain usable without connectivity, and a controlled background process synchronizes pending operations with ERPNext after the connection returns.

Walk through the system

Select a layer to inspect its responsibility.

Active layer 1

Quasar point-of-sale interface

Quasar point-of-sale interface owns the user-facing workflow and consumes a stable contract.

Responsibility stays explicit at this boundary.

The system, seen in use

Artifacts are captioned with the engineering story they support.

Point-of-sale checkout screen displaying offline statusworkflow

Offline checkout

Checkout remains usable while the ERPNext connection is unavailable.

Pending POS transaction synchronization queueinterface

Pending synchronization

Locally persisted operations wait in a controlled queue until connectivity returns.

Successful synchronization result after restoring connectivityoutcome

Recovery workflow

Queued operations synchronize with ERPNext after the connection is restored.

Decision log

Persist transactions before synchronization

Context
Checkout needed to remain usable during unstable connectivity
Decision
Stored transaction state in IndexedDB and synchronized through a background queue
Trade-off
Required conflict resolution and recovery logic but removed the network from the critical checkout path
Decision log

Assign stable operation identifiers

Context
Reconnection and request retries could submit the same operation more than once
Decision
Created stable identifiers for pending transaction operations
Trade-off
Added bookkeeping but supported safer retry behavior

Complexity moved behind durable boundaries.

The primary challenge was reconciling local transactions with ERPNext inventory and accounting state without duplicate submissions. The solution required stable operation identifiers, controlled retries, connection-state handling, and clear recovery behavior for failed synchronization.

Want to discuss a similar system?

Share the context and we’ll find a useful first move.

Start a conversation
<PORTFOLIO/>