Building a Full-Stack Offline Parking Management App with React 19, Electron & Dexie.js
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).
Live Links
Web App: park-my-vehicle.vercel.app
GitHub: github.com/atul0016/park-manager
Product Hunt: producthunt.com/posts/parkmanager
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.
