Skip to main content

Command Palette

Search for a command to run...

Building a Full-Stack Offline Parking Management App with React 19, Electron & Dexie.js

Updated
3 min read
A
Full-Stack Developer with 4+ years building enterprise systems, SaaS platforms, and Chrome extensions. Projects: SA ERP (Electron · React · SQLite), ParkManager (offline-first SaaS with 2000+ parking slots), Advanced Smart Capture Chrome extension (2000+ users), BloomNest (Angular childcare platform), Pixel Ruler Chrome extension. Stack: React · Angular 18 · TypeScript · Node.js · Electron · Appwrite · SQLite. Portfolio: https://beimatulportfolio.tech

When building ParkManager, I wanted to create a practical solution for parking lot operators who often work in areas with unreliable internet. The result is a multi-tenant SaaS application that works completely offline and sync when connectivity is available.

The Problem

Parking management in India and many developing markets faces specific challenges:

  • Connectivity is often spotty or expensive

  • Operators need real-time data locally even offline

  • Multi-location support is essential for chains

  • Mobile-first UI is critical for field staff

What ParkManager Does

ParkManager is a desktop + web hybrid application for parking lot operators. It handles vehicle check-in/check-out, billing, reporting, and multi-tenant access — all with offline-first architecture.

Key Features:

  • Vehicle Management — Log entry/exit, track duration, calculate fees

  • Multi-Tenant Support — One backend, multiple parking operators isolated by tenant

  • Offline-First — All data stored locally in IndexedDB via Dexie.js

  • Background Sync — Data syncs to Appwrite cloud when connected

  • PWA Support — Installable on Android/iOS via browser

  • Real-Time Dashboard — Live occupancy, revenue, analytics

  • Electron Integration — Native Windows/Linux/macOS desktop app

  • Receipt Printing — Print receipts directly from the app

Tech Stack

Layer Technology
Frontend React 19 (latest features)
Desktop Electron
Local DB Dexie.js (IndexedDB wrapper)
Backend Appwrite (self-hostable BaaS)
UI Tailwind CSS + shadcn/ui
Language TypeScript throughout

The Architecture Decision: Why Dexie.js?

The core challenge was offline-first with background sync. I evaluated several options:

  • PouchDB + CouchDB: Excellent sync but heavyweight and rigid schema

  • SQLite via Electron: Great offline but no browser PWA support

  • Dexie.js + Appwrite: Lightweight, works in browser AND Electron, and I could build my own sync logic

Dexie.js wraps IndexedDB with a clean API and promise-based queries. Combined with Dexie Cloud or custom sync logic against Appwrite, it gave me the best of both worlds.

Key Technical Challenges

1. Sync Conflict Resolution

When the same vehicle record is updated offline on two devices, we need conflict resolution. I implemented a "last-write-wins" strategy with timestamps, with a more sophisticated merge for billing records.

2. Multi-Tenancy Isolation

Each tenant sees only their own data. In Appwrite, this is handled via team-based permissions. Locally in Dexie, all records are tenant-scoped with a tenantId field.

3. React 19 Migration

ParkManager was originally on React 18. Migrating to React 19 let me use:

  • use() hook for data fetching

  • Improved Suspense boundaries

  • React compiler optimizations (automatic memoization)

4. Electron + PWA Dual Bundle

The same codebase runs as a PWA in browser and a native app in Electron. I used Vite with separate build configs, sharing all business logic but switching storage backends (Dexie in browser, optionally SQLite in Electron).

What's Next

  • WhatsApp notifications for vehicle owners

  • License plate recognition via camera

  • Payment gateway integration (Razorpay)

  • Multi-language support (Hindi, regional languages)


Building ParkManager taught me that offline-first isn't just a nice-to-have in emerging markets — it's essential. If you're building for users with unreliable connectivity, IndexedDB + background sync via Dexie.js is a solid choice.