mobile bluesky app made with flutter
lazurite.stormlightlabs.org/
mobile
bluesky
flutter
1<!-- markdownlint-disable MD041 -->
2
3
4
5Lazurite is a cross-platform Bluesky client built with Flutter and Dart using Material You (M3) design.
6
7## Features
8
9### Home Feed & Composer
10
11| Home Feed | Composer | Profile |
12| --------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
13|  |  |  |
14| View your personal timeline with support for threads and media. | Create new posts with rich text and media attachments. Supports replies and quoting. | View detailed actor profiles, including their feed and metadata. |
15
16### Search & Profile
17
18| Search | About | DevTools |
19| ----------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------- |
20|  |  |  |
21| Discover people and posts across the Bluesky network. | About (showing Rose Pine Moon theme) | Built-in logs and developer utilities for exploring the AT Protocol (Rose Pine Dawn). |
22
23### Offline Support & Drafts
24
25Local-only drafts and caching powered by Drift (SQLite).
26
27- **Drafts:** Save posts locally and publish later.
28- **Search History:** Persisted local search history.
29- **Saved Feeds:** Manage and pin your favorite feeds.
30
31## Architecture
32
33### Stack
34
35- **Framework:** Flutter (M3)
36- **State Management:** `flutter_bloc`
37- **Database:** Drift (SQLite)
38- **Networking:** Dio + `atproto`/`bluesky` packages
39- **Navigation:** `go_router`
40- **Data Serialization:** `freezed` + `json_serializable`
41
42### Directory Structure
43
44The project follows a feature-first architecture layered with a core module:
45
46- `lib/core/`: Shared infrastructure, database, router, and themes.
47- `lib/features/`: Feature-specific logic (Auth, Feed, Search, Profile, etc.).
48 - `<feature>/bloc/`: Business logic components.
49 - `<feature>/presentation/`: UI screens and widgets.
50 - `<feature>/data/`: (Optional) Feature-specific repositories or models.
51
52### Data Flow
53
54- **Network:** Authenticated requests are routed through user PDS; public reads use the public AppView.
55- **Database:** Drift manages local persistence for accounts, cached profiles/posts, settings, and drafts.
56
57### Routing
58
59Lazurite uses `StatefulShellRoute` for persistent bottom navigation.
60
61| Path | Description |
62| ----------- | ------------------------------ |
63| `/login` | Authentication gateway |
64| `/` | Home Feed tab |
65| `/search` | Search tab |
66| `/profile` | Current user profile tab |
67| `/settings` | Global settings |
68| `/compose` | Root-level modal for new posts |
69
70## Local Development
71
72Use `just` for common tasks:
73
74- `just format` - Runs `dart format`
75- `just lint` - Proxies `flutter analyze`
76- `just test` - Executes the `flutter test` suite
77- `just gen` - Triggers `build_runner` for code generation
78- `just check` - Runs format, lint, and tests in sequence
79
80For a quick start:
81
82```sh
83flutter pub get
84just gen
85flutter run
86```
87
88## Database Schema
89
90Powered by **Drift**, the following tables are currently implemented:
91
92| Table | Purpose |
93| ----------------- | ---------------------------------------------------------------- |
94| `accounts` | Local storage for session and auth tokens (DID, handle, service) |
95| `cached_profiles` | Cached profile metadata to reduce network calls |
96| `cached_posts` | Cached post content for offline viewing |
97| `saved_feeds` | Locally Managed feed preferences |
98| `search_history` | Persistent query history |
99| `drafts` | Offline-first post drafting with media support |
100| `settings` | Key-value application configuration |
101
102## References
103
104- [Bluesky API Documentation](https://docs.bsky.app/)
105- [AT Protocol Specification](https://atproto.com/)
106- [Flutter Documentation](https://flutter.dev/docs)
107
108## Credits
109
110- Typography inspiration from [Anisota](https://anisota.net/) by [Dame.is](https://dame.is).
111- Custom theming inspired by [Witchsky](https://witchsky.app/).
112- DevTools (AT Protocol Explorer) inspiration from [pdsls](https://pds.ls/)
113- AT URI links pass through [aturi.to](https://aturi.to/)