This project is a modular, offline-first Flutter boilerplate designed for building apps that can store, sync, and share media and metadata across both centralized (Immich, Firebase) and decentralized (Nostr) systems. It emphasizes clean architecture, testing automation, and CI integration from day one — ensuring every feature module is independently testable, mockable, and replaceable. The boilerplate can serve as the foundation for apps involving: Image or content sharing Decentralized data synchronization Multi-environment deployment (dev/staging/prod) Offline-ready, cache-first design
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
gitea f462a3d966
Phase 2 complete
2 months ago
android phase 0 2 months ago
coverage phase 0 2 months ago
lib Phase 2 complete 2 months ago
macos phase 1 complete - local storage and aching 2 months ago
test Phase 2 complete 2 months ago
.gitignore phase 0 2 months ago
.metadata phase 0 2 months ago
README.md Phase 2 complete 2 months ago
analysis_options.yaml phase 0 2 months ago
pubspec.lock Phase 2 complete 2 months ago
pubspec.yaml Phase 2 complete 2 months ago

README.md

App Boilerplate

A modular, offline-first Flutter boilerplate for apps that store, sync, and share media and metadata across centralized (Immich, Firebase) and decentralized (Nostr) systems.

Phase 2 - Immich Integration

  • Immich API service for uploading and fetching images
  • Automatic metadata storage in local database
  • Offline-first behavior with local caching
  • Comprehensive unit tests

Phase 1 - Local Storage & Caching

  • Local storage service with SQLite database
  • CRUD operations for items
  • Image caching functionality
  • Comprehensive unit tests

Quick Start

# Install dependencies
flutter pub get

# Run tests
flutter test

# Run app
flutter run

Local Storage & Caching

Service for local storage and caching operations. Provides CRUD operations for items stored in SQLite, image caching with automatic download/storage, and cache hit/miss handling. Modular design with no UI dependencies.

Files:

  • lib/data/local/local_storage_service.dart - Main service class
  • lib/data/local/models/item.dart - Item data model
  • test/data/local/local_storage_service_test.dart - Unit tests

Key Methods: initialize(), insertItem(), getItem(), getAllItems(), updateItem(), deleteItem(), getCachedImage(), clearImageCache(), close()

Immich Integration

Service for interacting with Immich API. Uploads images, fetches asset lists, and automatically stores metadata in local database. Offline-first design allows access to cached metadata without network.

Configuration: Edit lib/config/config_loader.dart to set immichBaseUrl and immichApiKey for dev/prod environments (lines 40-41 for dev, lines 47-48 for prod).

Files:

  • lib/data/immich/immich_service.dart - Main service class
  • lib/data/immich/models/immich_asset.dart - Asset model
  • lib/data/immich/models/upload_response.dart - Upload response model
  • test/data/immich/immich_service_test.dart - Unit tests

Key Methods: uploadImage(), fetchAssets(), getCachedAsset(), getCachedAssets()

Configuration

All configuration is in: lib/config/config_loader.dart

Edit this file to change API URLs, Immich server URL and API key, logging settings, and other environment-specific values. Replace placeholder values ('your-dev-api-key-here', 'your-prod-api-key-here') with your actual API keys.

Environment Variables

Currently, the app uses compile-time environment variables via --dart-define:

# Set environment at runtime
flutter run --dart-define=ENV=prod

Future: .env file support can be added in later phases. When implemented, .env files would go in the project root and be loaded at runtime.

Available Environments

  • dev - Development (default): Logging enabled, dev API URL
  • prod - Production: Logging disabled, production API URL

Running the App

Android Emulator

Important: Wait for emulator to fully boot (30-60 seconds on cold boot).

  1. Start emulator from Android Studio AVD Manager
  2. Wait for boot animation to complete and home screen appears
  3. Run: flutter run

iOS Simulator (macOS)

open -a Simulator
flutter run

Running Tests

# Run all tests
flutter test

# Run with coverage
flutter test --coverage

Important: Tests must be run separately - flutter run does not execute tests.

Project Structure

lib/
 ├── config/
 │    ├── app_config.dart
 │    └── config_loader.dart
 ├── data/
 │    ├── local/
 │    │    ├── local_storage_service.dart
 │    │    └── models/
 │    │         └── item.dart
 │    └── immich/
 │         ├── immich_service.dart
 │         └── models/
 │              ├── immich_asset.dart
 │              └── upload_response.dart
 └── main.dart

test/
 ├── config/
 │    └── config_loader_test.dart
 └── data/
      ├── local/
      │    └── local_storage_service_test.dart
      └── immich/
           └── immich_service_test.dart

Powered by TurnKey Linux.