# invoiceninja/flutter architecture

> Architecture diagram of the GitHub repository invoiceninja/flutter, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/invoiceninja/flutter
- Repository: https://github.com/invoiceninja/flutter

## Overview

Invoice Ninja is a cross-platform client for managing business records against an Invoice Ninja backend. The principal workflow is to interact with a feature screen, have its view model use the entity repository, and read local state from Drift; writes are queued offline and later synchronized with the server. The README documents the layered MVVM and sync design, while the supplied source excerpts do not include the Dart runtime implementation, so the graph uses documented relationships and omits uncertain internal wiring.

Main entry points: [`lib/app/router.dart`](https://github.com/invoiceninja/flutter/blob/main/lib/app/router.dart) (App router), [`lib/ui/features`](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features) (Feature view models), [`lib/data/repositories`](https://github.com/invoiceninja/flutter/tree/main/lib/data/repositories) (Entity repositories), [`lib/data/services`](https://github.com/invoiceninja/flutter/tree/main/lib/data/services) (HTTP services)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App navigation"]
  node_shell["App shell"]
  node_router["App router<br/>[router.dart]"]
end

subgraph group_features["Business features"]
  node_auth["Authentication"]
  node_billing["Billing records"]
  node_business["Business records"]
  node_expenses["Expenses and banking"]
  node_work["Projects and tasks"]
  node_insights["Dashboard and reports"]
  node_configuration["Settings"]
  node_viewmodels["Feature view models"]
end

subgraph group_data["Data and sync"]
  node_repositories["Entity repositories"]
  node_models["Domain and API models"]
  node_database[("Drift database<br/>[app_database.dart]")]
  node_daos["Entity DAOs"]
  node_outbox["Mutation outbox<br/>[outbox_dao.dart]"]
  node_sync["Sync dispatch"]
  node_services["HTTP services"]
end

subgraph group_services["External services"]
  node_server{{"Invoice Ninja API"}}
end

node_user(("User"))

node_user -->|"uses"| node_shell
node_shell -->|"navigates"| node_router
node_router -->|"routes to"| node_auth
node_router -->|"routes to"| node_billing
node_router -->|"routes to"| node_business
node_router -->|"routes to"| node_expenses
node_router -->|"routes to"| node_work
node_router -->|"routes to"| node_insights
node_router -->|"routes to"| node_configuration
node_auth -->|"uses"| node_viewmodels
node_billing -->|"uses"| node_viewmodels
node_business -->|"uses"| node_viewmodels
node_expenses -->|"uses"| node_viewmodels
node_work -->|"uses"| node_viewmodels
node_insights -->|"uses"| node_viewmodels
node_configuration -->|"uses"| node_viewmodels
node_viewmodels -->|"uses"| node_repositories
node_repositories -->|"uses"| node_models
node_repositories -->|"reads and writes"| node_daos
node_daos -->|"queries"| node_database
node_repositories -->|"queues mutations"| node_outbox
node_sync -->|"drains in order"| node_outbox
node_sync -->|"dispatches mutations"| node_services
node_services -->|"HTTP requests"| node_server
node_services -->|"writes server state"| node_database

click node_shell "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/shell"
click node_router "https://github.com/invoiceninja/flutter/blob/main/lib/app/router.dart"
click node_auth "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/auth"
click node_billing "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/invoices"
click node_business "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/clients"
click node_expenses "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/expenses"
click node_work "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/projects"
click node_insights "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/dashboard"
click node_configuration "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/settings"
click node_viewmodels "https://github.com/invoiceninja/flutter/tree/main/lib/ui/features"
click node_repositories "https://github.com/invoiceninja/flutter/tree/main/lib/data/repositories"
click node_models "https://github.com/invoiceninja/flutter/tree/main/lib/data/models"
click node_database "https://github.com/invoiceninja/flutter/blob/main/lib/data/db/app_database.dart"
click node_daos "https://github.com/invoiceninja/flutter/tree/main/lib/data/db/dao"
click node_outbox "https://github.com/invoiceninja/flutter/blob/main/lib/data/db/dao/outbox_dao.dart"
click node_sync "https://github.com/invoiceninja/flutter/tree/main/lib/domain/sync"
click node_services "https://github.com/invoiceninja/flutter/tree/main/lib/data/services"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_shell,node_router,node_user toneBlue
class node_auth,node_billing,node_business,node_expenses,node_work,node_insights,node_configuration,node_viewmodels toneAmber
class node_repositories,node_models,node_database,node_daos,node_outbox,node_sync,node_services toneMint
class node_server toneRose
```

## Components

### App navigation

- [App shell](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/shell): `lib/ui/features/shell`
- [App router](https://github.com/invoiceninja/flutter/blob/main/lib/app/router.dart): `lib/app/router.dart`

### Business features

- [Authentication](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/auth): `lib/ui/features/auth`
- [Billing records](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/invoices): `lib/ui/features/invoices`
- [Business records](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/clients): `lib/ui/features/clients`
- [Expenses and banking](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/expenses): `lib/ui/features/expenses`
- [Projects and tasks](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/projects): `lib/ui/features/projects`
- [Dashboard and reports](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/dashboard): `lib/ui/features/dashboard`
- [Settings](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features/settings): `lib/ui/features/settings`
- [Feature view models](https://github.com/invoiceninja/flutter/tree/main/lib/ui/features): `lib/ui/features`

### Data and sync

- [Entity repositories](https://github.com/invoiceninja/flutter/tree/main/lib/data/repositories): `lib/data/repositories`
- [Domain and API models](https://github.com/invoiceninja/flutter/tree/main/lib/data/models): `lib/data/models`
- [Drift database](https://github.com/invoiceninja/flutter/blob/main/lib/data/db/app_database.dart): `lib/data/db/app_database.dart`
- [Entity DAOs](https://github.com/invoiceninja/flutter/tree/main/lib/data/db/dao): `lib/data/db/dao`
- [Mutation outbox](https://github.com/invoiceninja/flutter/blob/main/lib/data/db/dao/outbox_dao.dart): `lib/data/db/dao/outbox_dao.dart`
- [Sync dispatch](https://github.com/invoiceninja/flutter/tree/main/lib/domain/sync): `lib/domain/sync`
- [HTTP services](https://github.com/invoiceninja/flutter/tree/main/lib/data/services): `lib/data/services`

### External services

- **Invoice Ninja API**

### Other components

- **User**

## Connections

- User → App shell: uses
- App shell → App router: navigates
- App router → Authentication: routes to
- App router → Billing records: routes to
- App router → Business records: routes to
- App router → Expenses and banking: routes to
- App router → Projects and tasks: routes to
- App router → Dashboard and reports: routes to
- App router → Settings: routes to
- Authentication → Feature view models: uses
- Billing records → Feature view models: uses
- Business records → Feature view models: uses
- Expenses and banking → Feature view models: uses
- Projects and tasks → Feature view models: uses
- Dashboard and reports → Feature view models: uses
- Settings → Feature view models: uses
- Feature view models → Entity repositories: uses
- Entity repositories → Domain and API models: uses
- Entity repositories → Entity DAOs: reads and writes
- Entity DAOs → Drift database: queries
- Entity repositories → Mutation outbox: queues mutations
- Sync dispatch → Mutation outbox: drains in order
- Sync dispatch → HTTP services: dispatches mutations
- HTTP services → Invoice Ninja API: HTTP requests
- HTTP services → Drift database: writes server state
