SkyLeger (DIMS)
Enterprise drone registry and fleet management platform for registering, tracking, and auditing unmanned aircraft — with immutable audit trails, RBAC, and offline-ready Firebase workflows.
Project Overview
SkyLeger (Drone Intelligent Management System) is a full-stack web application for registering, tracking, and auditing unmanned aircraft across owners, institutions, and regulatory workflows. It gives regulators and operators a single source of truth for fleet records, ownership, maintenance history, and compliance investigations.
As drone adoption grows, spreadsheets are not enough. SkyLeger centralizes drone lifecycle management in a secure, auditable registry where every mutation leaves a permanent trail, roles are enforced at both the UI and database layers, and staff can work reliably even with intermittent connectivity.
Platform Screenshot
The admin portal supports bilingual navigation (English and Sinhala), responsive layouts for field and desk use, and clear status indicators across every record.

Key Features
Drone Registry & Lifecycle
- Register drones with serial number, model, specs, and registration ID
- Track status: active, suspended, deregistered, under repair, pending transfer
- Transfer ownership between verified owners with full snapshots
- Log repairs and hardware upgrades tied to accredited institutions
- Serial numbers normalized as document IDs to prevent duplicates
Immutable Audit Trail
Every state change produces a DroneEvent in the same atomic Firestore batch as the aggregate update. Events are append-only — security rules forbid updates and deletes on the audit collection. Each event stores aggregate version, actor admin ID, before/after snapshots, and occurred vs recorded timestamps.
Role-Based Access Control
- super_admin — full system access and user management
- registrar — drone and owner registration, transfers
- repair_admin — institution-linked maintenance logging
- auditor — read-only access to records and audit logs
What I Built
- Domain modeling for admins, owners, drones, institutions, and events
- Firestore service layer with batched writes, pagination, and search
- RBAC with auth context, protected routing, and role-gated UI actions
- Audit system with timeline visualization and admin/drone query modes
- Keyword indexing and token normalization across collections
- Offline UX with persistent cache and pending-mutation banner
- Google Maps owner geolocation with search and pin placement
- Firestore security rules for auth, super-admin gates, and event immutability
Technical Highlights
Drone records use monotonically increasing aggregateVersion numbers. Each write reads the current document, increments the version, and commits the updated aggregate plus a new immutable event in a single writeBatch — giving regulators a tamper-evident history without a separate audit pipeline.
const batch = writeBatch(db)
batch.update(droneRef, updates)
batch.set(doc(db, EVENTS, evtId), eventData)
await batch.commit()The codebase follows a feature-first layout (features/drones, features/owners, features/audit, etc.) with services owning all Firestore interaction and components focused on presentation.
Tech Stack
- Frontend: React 19, TypeScript, Vite, React Router 7, Tailwind CSS 4, DaisyUI
- Backend: Firebase Auth, Cloud Firestore, security rules, Admin SDK seed scripts
- Integrations: Google Maps JavaScript API for owner geolocation
- Deployment: Vercel (SPA) + Firebase backend services
Portfolio Highlights
- Compliance-grade admin system on modern serverless infrastructure
- Event-sourcing-inspired aggregates with immutable audit integrity
- Regulated data workflows: RBAC, search at scale, offline resilience, bilingual UX
Key Features
- 1Drone registry with lifecycle status tracking and ownership transfers
- 2Immutable append-only audit events with before/after snapshots
- 3Role-based access for super admins, registrars, repair admins, and auditors
- 4Owner management with Google Maps geolocation picker
- 5Institution network for repair shops and training centers
- 6Keyword search, pagination, and offline-ready Firestore cache