PackLog is a cross-platform mobile application (iOS/Android) engineered for the intelligent management of personal belongings across multiple properties and real-time trip tracking.
The app addresses a common logistical pain point: maintaining an accurate inventory of items when managing multiple residences or traveling frequently.
-
🏠 Multi-Property Management (Houses): Full CRUD with integrated geocoding via Geoapify, custom iconography, and real-time inventory analytics.
-
📑 Smart Inventory Templates: Accelerated property setup via predefined travel profiles. Users can batch-import essential items into a house using curated templates (e.g., "Business Essentials", "Summer Kit"), reducing manual data entry.
-
🎒 Inventory Engine (Items): Categorized cataloging (Clothes, Toiletries, Electronics, Misc) with dynamic state tracking ("Available" vs. "In Transit").
-
✈️ Trip Planning (Trips): Timeline-based logistics with automatic status calculation (Upcoming, Active, Completed) and dynamic packing checklists. -
💾 Disaster Recovery & Backup: Physical SQLite DB export/import system featuring automated pre-import safety backups, post-import schema validation, and atomic rollbacks in case of data corruption.
-
🎨 Enterprise UX/UI & i18n: Adaptive Light/Dark/System themes, proprietary Design System, and full internationalization (it-IT, en-US) with zero hardcoded strings.
PackLog is engineered using a Feature-First Architecture combined with Clean Architecture principles. This ensures a strict separation of concerns and high testability.
While NoSQL offers faster prototyping, I opted for Drift (SQLite) to handle complex relational queries (joins between houses, items, and trips), ensure referential integrity via Foreign Keys (with cascade deletes), and maintain type-safe schema migrations.
When an item is added to a trip, the system creates an independent Snapshot (TripItem) instead of a simple reference.
Rationale: Immutability ensures that if a user modifies or deletes the original item from a house weeks later, the historical data of past trips remains intact.
The backup system performs a file-system level copy of the .db file.
Rationale: Physical copying is significantly faster than JSON serialization for large datasets, eliminates parsing overhead, and leverages SQLite's native atomic transaction guarantees.
Since Drift performs lazy migrations, an incompatible imported database could lead to delayed runtime crashes. PackLog forces an immediate connection check (SELECT 1). If the schema mismatch is detected, the app performs a transparent rollback using the safety backup, ensuring system stability.
- Core: Flutter 3.10+, Dart 3.10.4
- State Management: Riverpod 2.5 (Code generation via
riverpod_annotationfor isolated, auto-dispose providers). - Database: Drift 2.22.1 (SQLite ORM).
- Routing: GoRouter 14.2 (Declarative routing with
StatefulShellRoutesupport). - Immutability: Freezed & JSON Serializable.
- Network: Http (Geoapify API integration).
- Flutter SDK 3.10+
- Dart 3.10.4+
- A Geoapify API Key.
-
Clone the repository
git clone [https://github.com/your-username/packlog.git](https://github.com/your-username/packlog.git) cd packlog -
Install dependencies
flutter pub get
-
Environment Configuration Create a
.envfile in the root directory:GEOAPIFY_KEY=your_api_key_here
-
Code Generation Crucial for generating Drift tables, Freezed models, and Riverpod providers.
dart run build_runner build --delete-conflicting-outputs
-
Run the application
flutter run
The project is designed for TDD (Test-Driven Development), utilizing Repository pattern abstractions (HouseRepository) to allow seamless mock injection.
A DataIntegrityService runs health checks at startup to detect and repair orphaned foreign keys or data inconsistencies.
Distributed under the MIT License. See LICENSE for more information.




