mobile bluesky app made with flutter
lazurite.stormlightlabs.org/
mobile
bluesky
flutter
1*roadmap.txt* Material You (Flutter/Dart) Bluesky Client
2
3================================================================================
4O. Hardening (mobile) *bsky-O*
5================================================================================
6
7Phase 1: Code Quality and Architecture
8- [x] Feature architecture standardization:
9 - [x] Audit all features for missing domain/infrastructure/application
10 layers
11 - [x] Refactor features missing layers (priority: auth, settings,
12 profile, search, thread)
13 - [x] Document architecture patterns in doc/architecture.md
14 - [x] Establish clear guidelines for layer responsibilities
15 - [x] Document testing patterns in doc/testing.md
16- [ ] Type safety improvements:
17 - Use freezed for critical models
18 - Add typed JSON parsing where appropriate
19- [x] Error handling standardization:
20 - Define standard error types for common failures (network, auth,
21 validation)
22 - Standardize error display messages (no raw .toString() in UI)
23 - Document error handling patterns in doc/errors.md
24 - Add error handling tests
25
26Phase 2: Performance Optimization
27- [ ] Performance:
28 - Decide on image caching strategy
29 - List virtualization sanity checks (ListView.builder usage)
30 - Profile critical paths with Flutter DevTools
31 - Optimize animation controller usage in lists (skeleton widgets)
32 - Memory leak detection (especially in stateful widgets)
33- [ ] Network efficiency:
34 - Audit pagination cursor handling
35 - Review cache invalidation strategies
36 - Optimize background sync frequencies
37
38Phase 3: Quality Assurance
39- [ ] Test coverage:
40 - Achieve >95% coverage target across all features
41 - Add missing integration tests (notifications grouping, DMs outbox)
42 - Add E2E tests for critical flows
43 - Widget test coverage for all custom widgets
44- [ ] Accessibility:
45 - Semantic labels for all interactive elements
46 - Dynamic type support and testing
47 - Contrast ratio checks (WCAG AA compliance)
48 - Screen reader testing on iOS and Android
49 - Keyboard navigation testing (tab focus order)
50- [ ] Scroll performance tests:
51 - Sanity test on mid-range Android emulator profile
52 - iOS scroll performance validation
53 - Measure frame render times under load
54- [ ] Observability:
55 - [x] Structured logging framework
56 - [ ] Crash reporting integration (Sentry/Firebase Crashlytics)
57 - [ ] Performance monitoring hooks
58 - [ ] Analytics event tracking foundation
59
60Phase 4: Security and Moderation
61- [ ] Security audit:
62 - Review secure storage usage (credentials, tokens)
63 - Validate input sanitization (XSS prevention)
64 - Audit network request security (HTTPS enforcement)
65 - Review dependency vulnerabilities
66- [ ] Moderation basics:
67 - Respect labels/filters returned by AppView/PDS
68 - Hide/blur content based on moderation labels
69 - User-configurable content filters
70 - Block/mute functionality
71
72Tests:
73- [ ] Scroll perf sanity test on mid-range Android emulator profile
74- [ ] iOS scroll performance validation
75- [ ] A11y audit checklist pass
76- [ ] Security audit checklist pass
77- [ ] Database migration tests (upgrade, rollback, data preservation)
78- [ ] Error handling integration tests
79- [ ] Memory leak detection tests
80- [ ] Network failure resilience tests
81
82Deliverables:
83- [ ] Mobile app feels stable and responsive for daily use
84- [ ] All features follow consistent architecture patterns
85- [ ] Database migration strategy ready for production
86- [ ] Type-safe codebase with minimal unsafe casts
87- [ ] Comprehensive error handling with user-friendly messages
88- [ ] Security best practices validated
89- [ ] Accessibility requirements met (WCAG AA)
90- [ ] Performance benchmarks passing
91- [ ] Feature parity with official BlueSky app
92
93================================================================================
94Initial Release (Lazurite-0.1.0-alpha)
95================================================================================
96
97*todo*
98
99================================================================================
100P. Smart folders (local-only saved views) *bsky-P*
101================================================================================
102
103Definition:
104- A smart folder is a saved query over cached posts + local metadata.
105- It never fetches from network by itself; it organizes what’s already cached.
106
107Tasks:
108- [ ] Drift tables:
109 - smart_folders (name, sortMode)
110 - smart_folder_rules (type, payloadJson)
111 - smart_folder_items materialization
112- [ ] Rule engine (MVP rule types):
113 - author allow/deny (DIDs)
114 - keyword include/exclude (text)
115 - has media / has link
116 - bookmarked only
117 - exclude replies / replies only
118- [ ] UI:
119 - create/edit folder
120 - folder list and folder detail view
121
122Tests:
123- [ ] Rule evaluation tests against fixture posts.
124- [ ] Query performance test with N=10k cached posts.
125
126Deliverables:
127- "Saved views" that feel like feeds, entirely local and fast.
128
129================================================================================
130Q. Desktop pass *bsky-Q*
131================================================================================
132
133Tasks:
134- [ ] Responsive layout:
135 - multi-column (timeline + thread) for wide screens
136- [ ] Keyboard shortcuts:
137 - navigate, like, repost, reply, new draft
138- [ ] Storage:
139 - confirm Drift backend performance on desktop targets
140- [ ] Window behaviors:
141 - restore last route, remember split pane sizes
142- [ ] ThemeInspectorPane with role inspector in Settings
143 - Split pane theme inspector showing multiple components
144 - Computed role display (surfaceContainerLow, outlineVariant values)
145- [ ] Composer Keyboard shortcuts:
146 - [ ] Ctrl/Cmd+N to open composer
147 - [ ] Esc to cancel composer
148 - [ ] Ctrl/Cmd+Enter to publish
149Tests:
150- [ ] Desktop smoke tests: app boots, auth works, DB works.
151
152Deliverables:
153- Desktop build that is genuinely usable (not just "it runs").
154
155================================================================================
156R. Push Notification Backend *bsky-R*
157================================================================================
158
159Context:
160- Bluesky does NOT send push notifications directly to third-party clients
161- app.bsky.notification.registerPush forwards signed requests to your backend
162- Backend must validate signatures and relay to FCM/APNs
163
164Tasks:
165- [ ] Local Notifications
166 - [ ] flutter_local_notifications integration
167 - [ ] Foreground notification banner
168 - [ ] Background notification display
169 - [ ] Deep link handling from notification tap
170 - [ ] Platform-specific configuration (Android channels, iOS presentation)
171- [ ] Backend service:
172 - POST /register-device (store device token with user DID)
173 - POST /push-notification (receive signed notifications from Bluesky)
174 - POST /unregister-device (remove token on logout)
175 - Validate Bluesky signatures using public key
176 - Queue and batch push sends
177 - Rate limiting and error handling
178- [ ] FCM/APNs integration:
179 - FCM configuration for Android
180 - APNs configuration for iOS
181 - Handle token refresh and invalidation
182- [ ] Client integration:
183 - Generate FCM/APNs tokens on app start
184 - Register tokens via app.bsky.notification.registerPush
185 - Include platform identifier (fcm/apns) and service endpoint
186 - Re-register on token refresh
187 - Unregister on logout
188- [ ] Infrastructure:
189 - Deploy backend (AWS Lambda, Cloud Functions, etc.)
190 - Database for device token storage
191 - Monitoring and alerting
192 - Delivery metrics tracking
193
194Tests:
195- [ ] Backend: signature validation, token storage, FCM/APNs send
196- [ ] Client: token generation, registration, unregistration
197- [ ] Integration: end-to-end push delivery from Bluesky → backend → device
198
199Deliverables:
200- Push notifications working end-to-end
201- Backend service deployed and monitored
202- Token management robust across app lifecycle
203
204================================================================================
205Parking Lot *bsky-plot*
206================================================================================
207
208Tasks:
209- [ ] Composer Analytics events:
210 - [ ] Composer opened
211 - [ ] Draft saved
212 - [ ] Post published
213 - [ ] Media attached
214 - [ ] Publish failed
215- [x] DM Accessibility
216 - [x] screen reader support (semantic labels)
217 - [ ] keyboard navigation (Cmd/Ctrl+Enter to send)
218- [ ] DM Integration tests:
219 - [ ] fetch convos → display → tap → open detail
220 - [ ] compose → send → outbox → server → display
221 - [ ] send offline → queue → network restore → deliver
222 - [ ] receive message → display → mark read → sync
223 - [ ] message request → accept → move to main list
224- [ ] DM Offline scenarios:
225 - [ ] compose offline, send when online, display cached
226- [ ] DevTools Write Mode (Triple-Gated):
227 - [ ] Settings toggle: "Enable record editing (dangerous)"
228 - [ ] Biometric/device auth required before enabling
229 - [ ] RecordEditorPage: JSON text editor with validation
230 - [ ] com.atproto.repo.createRecord: create new records
231 - [ ] com.atproto.repo.putRecord: update existing records
232 - [ ] com.atproto.repo.deleteRecord: delete with typed confirmation
233 - [ ] (Phase 9) Bookmarks Screen (View Saved Posts)
234 - [ ] Diff preview for updates
235 - [ ] Batch operations UI: com.atproto.repo.applyWrites with review
236 - [ ] Security test: record editing disabled when gates are off
237 - [ ] Security test: cannot edit other users' repos
238- [ ] (Phase 9) Muted Words/Filters
239Tests:
240- [ ] System theme: follows OS brightness changes
241- [ ] Multi-device: preference changes merge correctly
242- [ ] Offline queue: preference updates retry on network restoration