- C++ 36.9%
- CMake 29%
- Dart 21.7%
- Makefile 4.5%
- Swift 3.2%
- Other 4.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Boots an empty Flutter app (contacts_manager, Material 3, Riverpod, go_router, freezed) with the same skeleton as lullalink: layered lib/ (core, data, domain, presentation), test pyramid layout (unit, widget, golden, tool), make check gate, pre-commit/commit-msg hooks, coverage gate and a dormant Forgejo CI workflow. Scaffolding is intentionally exempt from the commit size limit. |
||
| .forgejo/workflows | ||
| .githooks | ||
| android | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| test | ||
| tool | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| CONTRIBUTING.md | ||
| Makefile | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
Contacts Manager
Side-by-side contact account manager for Flutter.
The app keeps several contact accounts side by side in one place: browse and search contacts from every configured account from a single UI. This repository currently ships the project skeleton — clean-architecture layout, theming, routing, and the full verification toolchain — with feature work landing on top of it.
Quickstart
flutter pub get
flutter run # default platform
flutter run -d linux # Linux desktop
make hooks # install pre-commit / commit-msg git hooks
Verification
make check # format-check + analyze + full headless test suite
make test # unit + widget + golden + tool tests (headless)
make coverage # suite with --coverage + line-coverage gate
make update-goldens # regenerate golden references after UI changes
make check is the one gate: run it before every commit.
Test layout
test/
├── unit/ Business logic & data mapping (no widgets, no platform channels)
├── widget/ Widgets/screens in isolation, headless
├── golden/ Rendered UI pinned to committed reference PNGs
├── fakes/ Fake platform-interface implementations
└── tool/ Tests for the repo's tool/ scripts
Interactive widgets expose stable Keys (from
lib/core/constants/app_keys.dart) so tests and automation can drive the app
without matching on text.
Architecture
Clean architecture with three layers:
lib/
├── core/ Constants, utilities, extensions
├── data/ Data sources, models, repository implementations
├── domain/ Entities, use cases, repository interfaces
└── presentation/ UI screens, widgets, providers, routing
State management is Riverpod, routing is GoRouter, and immutable models
use Freezed / json_serializable (run make gen after changing them).
Contributing
Development workflow, test pyramid, branch naming, and the review loop are documented in CONTRIBUTING.md. Every feature follows it.