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 that *rocks*[^1] 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## What Lazurite Offers Beyond Bluesky
32
33### Available Now
34
35- **Semantic Search:** On-device vector embeddings (all-MiniLM-L6-v2) let you search saved
36 and liked posts by meaning, not just keywords.
37- **Post Scheduling:** Write posts now, publish them later.
38- **Follow Audit:** Bulk-analyze your follows to find deleted, deactivated, suspended, or
39 blocking accounts. Batch unfollow in one tap like [clean follows](https://cleanfollow-bsky.pages.dev/)
40- **Constellation Integration:** See who has blocked you and which lists you appear on,
41 powered by [Constellation](https://constellation.microcosm.blue) backlinks.
42- **AT Protocol Dev Tools:** Browse any user's PDS repository, inspect collections and
43 individual records as JSON, like an in-app [pds.ls](https://pds.ls/).
44- **Rich Theming:** Five full palettes (Lazurite™️[^2], Rose Pine, Catppuccin, Nord, Oxocarbon),
45 each with light and dark variants, built on Material 3.
46- **Offline First:** First page of feeds is cached locally; drafts, search history, and saved
47 posts persist in an on-device database.
48- **Local Drafts:** Auto-saved to the database, surviving crashes and force-closes. Multiple
49 drafts per account with full reply/quote/media context.
50- **Layout Options:** Toggle between Card and Compact feed views. Configure thread
51 auto-collapse depth (off, 1–6 levels).
52- **In-App Logs:** Filter by level, full-text search, share or export, useful for
53 debugging and AT Protocol development.
54
55### On the Roadmap
56
57- **RSS Feed Export:** View and export any public Bluesky profile as an RSS feed.
58- **Custom Fonts:** User-selectable serif, sans-serif, and monospace typefaces across the
59 entire app.
60- **Markdown Posts:** Toggleable Markdown rendering in post bodies.
61- **Firehose & Jetstream Viewers:** Live AT Protocol event streams inside Dev Tools.
62- **Auto-Threading:** Automatically split long posts into threaded replies.
63- **Last Read Position:** Resume your timeline exactly where you left off.
64
65## Architecture
66
67### Stack
68
69- **Framework:** Flutter (M3)
70- **State Management:** `flutter_bloc`
71- **Database:** Drift (SQLite)
72- **Networking:** Dio + `atproto`/`bluesky` packages
73- **Navigation:** `go_router`
74- **Data Serialization:** `freezed` + `json_serializable`
75
76### Directory Structure
77
78The project follows a feature-first architecture layered with a core module:
79
80- `lib/core/`: Shared infrastructure, database, router, and themes.
81- `lib/features/`: Feature-specific logic (Auth, Feed, Search, Profile, etc.).
82 - `<feature>/bloc/`: Business logic components.
83 - `<feature>/presentation/`: UI screens and widgets.
84 - `<feature>/data/`: (Optional) Feature-specific repositories or models.
85
86### Data Flow
87
88```mermaid
89flowchart LR
90 router["App Navigator/Router (go_router)"] <--> ui["Feature UI"]
91 ui <--> bloc["BLoC"]
92 bloc <--> repo["Repository Classes (Data Layer)"]
93 repo <--> pds["Authenticated API (User PDS)"]
94 repo <--> appview["Public API (AppView)"]
95 repo <--> local["On-device Database (SQLite/Drift)"]
96
97 classDef primary fill:#0b63d1,stroke:#0953af,color:#ffffff,stroke-width:1px;
98 classDef surface fill:#f4f6f9,stroke:#45505e,color:#101418,stroke-width:1px;
99 class router,ui,bloc,repo primary;
100 class pds,appview,local surface;
101```
102
103For development setup, tooling, database schema, and contribution notes, see [DEVELOPMENT.md](DEVELOPMENT.md).
104If you run tests locally on macOS or Linux, run `just objectbox-setup` once
105to install the pinned ObjectBox native runtime.
106
107## References
108
109- [Bluesky API Documentation](https://docs.bsky.app/)
110- [AT Protocol Specification](https://atproto.com/)
111- [Flutter Documentation](https://flutter.dev/docs)
112
113## Credits
114
115- Typography inspiration from [Anisota](https://anisota.net/) by [Dame.is](https://dame.is).
116- Custom theming inspired by [Witchsky](https://witchsky.app/).
117- DevTools (AT Protocol Explorer) inspiration from [pdsls](https://pds.ls/)
118- AT URI links pass through [aturi.to](https://aturi.to/)
119
120[^1]: It's actually a mineral <https://en.wikipedia.org/wiki/Lazurite>
121[^2]: not really trademarked, actually a cool theme that you can find in the [desktop flavor](https://github.com/stormlightlabs/lazurite-desktop) too.