···2233
4455-Lazurite is a cross-platform Bluesky client built with Flutter and Dart using Material You (M3) design.
55+Lazurite is a cross-platform Bluesky client that *rocks*[^1] built with Flutter and Dart using Material You (M3) design.
6677## Features
88···2828- **Search History:** Persisted local search history.
2929- **Saved Feeds:** Manage and pin your favorite feeds.
30303131+## What Lazurite Offers Beyond Bluesky
3232+3333+### Available Now
3434+3535+- **Semantic Search:** On-device vector embeddings (all-MiniLM-L6-v2) let you search saved
3636+ and liked posts by meaning, not just keywords.
3737+- **Post Scheduling:** Write posts now, publish them later.
3838+- **Follow Audit:** Bulk-analyze your follows to find deleted, deactivated, suspended, or
3939+ blocking accounts. Batch unfollow in one tap like [clean follows](https://cleanfollow-bsky.pages.dev/)
4040+- **Constellation Integration:** See who has blocked you and which lists you appear on,
4141+ powered by [Constellation](https://constellation.microcosm.blue) backlinks.
4242+- **AT Protocol Dev Tools:** Browse any user's PDS repository, inspect collections and
4343+ individual records as JSON, like an in-app [pds.ls](https://pds.ls/).
4444+- **Rich Theming:** Five full palettes (Lazurite™️[^2], Rose Pine, Catppuccin, Nord, Oxocarbon),
4545+ each with light and dark variants, built on Material 3.
4646+- **Offline First:** First page of feeds is cached locally; drafts, search history, and saved
4747+ posts persist in an on-device database.
4848+- **Local Drafts:** Auto-saved to the database, surviving crashes and force-closes. Multiple
4949+ drafts per account with full reply/quote/media context.
5050+- **Layout Options:** Toggle between Card and Compact feed views. Configure thread
5151+ auto-collapse depth (off, 1–6 levels).
5252+- **In-App Logs:** Filter by level, full-text search, share or export, useful for
5353+ debugging and AT Protocol development.
5454+5555+### On the Roadmap
5656+5757+- **RSS Feed Export:** View and export any public Bluesky profile as an RSS feed.
5858+- **Custom Fonts:** User-selectable serif, sans-serif, and monospace typefaces across the
5959+ entire app.
6060+- **Markdown Posts:** Toggleable Markdown rendering in post bodies.
6161+- **Firehose & Jetstream Viewers:** Live AT Protocol event streams inside Dev Tools.
6262+- **Auto-Threading:** Automatically split long posts into threaded replies.
6363+- **Last Read Position:** Resume your timeline exactly where you left off.
6464+3165## Architecture
32663367### Stack
···51855286### Data Flow
53875454-- **Network:** Authenticated requests are routed through user PDS; public reads use the public AppView.
5555-- **Database:** Drift manages local persistence for accounts, cached profiles/posts, settings, and drafts.
8888+```mermaid
8989+flowchart LR
9090+ router["App Navigator/Router (go_router)"] <--> ui["Feature UI"]
9191+ ui <--> bloc["BLoC"]
9292+ bloc <--> repo["Repository Classes (Data Layer)"]
9393+ repo <--> pds["Authenticated API (User PDS)"]
9494+ repo <--> appview["Public API (AppView)"]
9595+ repo <--> local["On-device Database (SQLite/Drift)"]
56965757-### Routing
5858-5959-Lazurite uses `StatefulShellRoute` for persistent bottom navigation.
6060-6161-| Path | Description |
6262-| ----------- | ------------------------------ |
6363-| `/login` | Authentication gateway |
6464-| `/` | Home Feed tab |
6565-| `/search` | Search tab |
6666-| `/profile` | Current user profile tab |
6767-| `/settings` | Global settings |
6868-| `/compose` | Root-level modal for new posts |
9797+ classDef primary fill:#0b63d1,stroke:#0953af,color:#ffffff,stroke-width:1px;
9898+ classDef surface fill:#f4f6f9,stroke:#45505e,color:#101418,stroke-width:1px;
9999+ class router,ui,bloc,repo primary;
100100+ class pds,appview,local surface;
101101+```
6910270103For development setup, tooling, database schema, and contribution notes, see [DEVELOPMENT.md](DEVELOPMENT.md).
71104···81114- Custom theming inspired by [Witchsky](https://witchsky.app/).
82115- DevTools (AT Protocol Explorer) inspiration from [pdsls](https://pds.ls/)
83116- AT URI links pass through [aturi.to](https://aturi.to/)
117117+118118+[^1]: It's actually a mineral <https://en.wikipedia.org/wiki/Lazurite>
119119+[^2]: not really trademarked, actually a cool theme that you can find in the [desktop flavor](https://github.com/stormlightlabs/lazurite-desktop) too.
+25
docs/TODO.md
···75757676- Last read position
7777- Autothreading of posts over char limit; splitting posts
7878+7979+---
8080+8181+- **Advanced Mute Filters:** Mute by regex pattern, time-limited mutes (e.g. mute for 24h),
8282+ and mute entire threads.
8383+- **Post Templates:** Save reusable post templates (e.g. recurring "what are you reading"
8484+ threads) for quick composition.
8585+- **Thread Bookmarks:** Save your position in long threads and resume reading later.
8686+- **Read-It-Later Queue:** A dedicated queue for posts you want to come back to, separate
8787+ from saved posts.
8888+- **Batch Actions:** Select multiple posts to save, delete, or export (as JSON) in bulk.
8989+9090+### Data Ownership
9191+9292+- **Account Data Export:** Export your posts, follows, likes, and saved posts to JSON/CSV.
9393+- **Account Data Import:** Migrate saved posts, drafts, and settings between accounts.
9494+9595+### AT Protocol (in the explorer)
9696+9797+- **Custom Feed Filters:** Layer client-side filters on top of any feed generator (hide
9898+ reposts, minimum engagement threshold, language filter).
9999+- **DID History Viewer:** Inspect the rotation history and recovery keys for any DID in the
100100+ network.
101101+- **Labeler Comparison:** Side-by-side view of how different labelers classify the same
102102+ content or account.