mobile bluesky app made with flutter
lazurite.stormlightlabs.org/
mobile
bluesky
flutter
1---
2title: Smoke Test Checklist
3updated: 2026-04-01
4---
5
6A manual walkthrough to verify core functionality after a build. Each section covers a
7feature area with steps and expected outcomes.
8Test on both iOS and Android unless noted otherwise.
9
10---
11
12## 1. Authentication
13
14### OAuth Login
15
16- [ ] Launch app → Login screen appears
17- [ ] Enter a valid handle and tap "Sign in with BlueSky"
18- [ ] System browser opens → complete OAuth flow
19- [ ] Redirected back to app → Home feed loads
20
21### App Password Login (Debug only)
22
23- [ ] Toggle to app-password mode
24- [ ] Enter handle + app password (xxxx-xxxx-xxxx-xxxx)
25- [ ] Tap sign in → Home feed loads
26
27### Session Restore
28
29- [ ] Kill and relaunch app → session restores without login prompt
30- [ ] Token refresh works silently (wait for expiry or force)
31
32### Logout
33
34- [ ] Log out from settings → returns to login screen
35- [ ] Relaunching app shows login screen (session cleared)
36
37---
38
39## 2. Home Feed
40
41### Feed Loading
42
43- [ ] Following feed loads with posts on launch
44- [ ] Pull-to-refresh fetches new posts
45- [ ] Scroll down → infinite pagination loads more posts
46
47### Post Cards
48
49- [ ] Posts display: avatar, name, handle, relative timestamp
50- [ ] Rich text renders correctly (mentions, links, hashtags highlighted)
51- [ ] Image embeds display (single + multi-image grids)
52- [ ] Video embeds display with thumbnail
53- [ ] Link card embeds render (title, description, thumbnail)
54- [ ] Quote posts render inline
55- [ ] Engagement counts shown (likes, reposts, replies)
56
57### Post Actions
58
59- [ ] Tap like → icon fills, count increments (optimistic)
60- [ ] Tap like again → unlike, count decrements
61- [ ] Tap repost → menu: "Repost" and "Quote Post"
62- [ ] Repost → count increments
63- [ ] Tap reply → compose modal opens with reply context
64- [ ] Tap share → system share sheet
65- [ ] Overflow → Save post (bookmark icon fills)
66- [ ] Overflow → Copy link
67
68### Navigation from Feed
69
70- [ ] Tap post body → thread view opens
71- [ ] Tap avatar or name → profile screen opens
72
73---
74
75## 3. Feed Management
76
77- [ ] Open feed management from home screen
78- [ ] Pinned feeds listed (Following + custom generators)
79- [ ] Drag to reorder feeds → order persists
80- [ ] Toggle pin off → feed removed from home tabs
81- [ ] Add a suggested feed → appears in home tabs
82
83---
84
85## 4. Post Composition
86
87### Basic Compose
88
89- [ ] Tap compose FAB → compose screen opens
90- [ ] Type text → character counter updates (max 300 graphemes)
91- [ ] Mentions auto-highlight as typed
92- [ ] Links and hashtags auto-highlight
93- [ ] Submit → post appears in feed
94
95### Media
96
97- [ ] Attach 1–4 images → thumbnails shown
98- [ ] Add alt text to an image
99- [ ] Remove an image attachment
100- [ ] Attach a video → upload progress shown
101- [ ] Images and video are mutually exclusive (UI enforces)
102
103### Reply & Quote
104
105- [ ] Compose as reply → parent post context shown above input
106- [ ] Compose as quote → quoted post shown below input
107
108### Drafts
109
110- [ ] Save draft → confirmation shown
111- [ ] Open drafts → saved draft listed
112- [ ] Load draft → text and media restored
113- [ ] Submit loaded draft → posts successfully
114
115### Scheduled Posts
116
117- [ ] Schedule a post for a future time → confirmation shown
118- [ ] Post publishes at scheduled time (background task)
119
120## 5. Search
121
122### Post Search
123
124- [ ] Type query → results load
125- [ ] Sort toggle: "Top" vs "Latest" works
126- [ ] Tap result → thread view opens
127
128### Actor Search
129
130- [ ] Switch to Actors tab → type query
131- [ ] Autocomplete suggestions appear as you type
132- [ ] Tap result → profile screen opens
133
134### Starter Pack Search
135
136- [ ] Switch to Starter Packs tab → type query
137- [ ] Results show pack cards
138- [ ] Tap result → starter pack detail opens
139
140### Search History
141
142- [ ] Recent searches appear below search bar
143- [ ] Tap history item → re-executes search
144- [ ] Swipe to delete a single entry
145- [ ] "Clear all" removes all history
146
147## 6. Notifications
148
149### Notification List
150
151- [ ] Alerts tab shows notifications (likes, reposts, follows, mentions, replies, quotes)
152- [ ] Grouped by day
153- [ ] Unread count badge on nav tab
154- [ ] Tap notification → navigates to post or profile
155- [ ] "Mark all as read" clears unread badge
156
157### Unread Polling
158
159- [ ] Leave app open → badge count updates (30s poll interval)
160
161## 7. Direct Messages
162
163### Conversation List
164
165- [ ] Messages sub-tab shows conversations sorted by recency
166- [ ] Unread count per conversation displayed
167- [ ] Requests sub-tab shows unanswered conversations
168
169### Message Thread
170
171- [ ] Tap conversation → message thread opens
172- [ ] Messages paginate (scroll up for older)
173- [ ] Own messages right-aligned, others left-aligned
174- [ ] Type and send a message → appears immediately
175- [ ] Tap message → copy option
176
177### Conversation Actions
178
179- [ ] Mute conversation from overflow → muted indicator shown
180- [ ] Unmute → indicator removed
181
182## 8. Profile
183
184### Own Profile
185
186- [ ] Profile tab shows: banner, avatar, display name, handle, bio
187- [ ] Follower/following/post counts displayed
188- [ ] Posts tab → author's posts (no replies)
189- [ ] Replies tab → posts and threads
190- [ ] Media tab → only posts with media
191- [ ] Lists tab → lists created by user (Curation | Moderation sub-tabs)
192- [ ] Packs tab → starter packs created by user
193
194### Other User's Profile
195
196- [ ] Tap user anywhere → their profile loads
197- [ ] Follow button shown → tap to follow → button changes
198- [ ] Unfollow → button reverts
199- [ ] Overflow: Mute, Block, Report, Copy DID, Share
200
201### Suggested Follows
202
203- [ ] Overflow → "Suggested Follows" → sheet with suggestions
204- [ ] Follow/unfollow buttons in sheet work
205
206## 9. Profile Context (Constellation)
207
208- [ ] Open profile context from profile overflow menu
209- [ ] **Blocked By** tab: shows count, "Show accounts" expands list
210- [ ] Paginated account tiles load
211- [ ] **Blocking** tab: shows outgoing blocks (own profile only)
212- [ ] Shows "unavailable" message for other profiles
213- [ ] **Lists** tab: shows lists user is a member of
214- [ ] List cards display: name, owner, purpose badge, description
215- [ ] Tap account → navigates to profile
216- [ ] Tap list → navigates to list detail
217
218## 10. Post Thread
219
220- [ ] Thread loads: parent chain above, replies below
221- [ ] Root post visually highlighted
222- [ ] Nested reply chains render correctly
223- [ ] All post actions work within thread (like, repost, reply, save)
224- [ ] Tap profile in thread → profile screen
225
226## 11. Lists
227
228### My Lists
229
230- [ ] Navigate to lists screen
231- [ ] Curation and Moderation tabs separate lists correctly
232- [ ] Tap list → detail screen
233
234### Create List
235
236- [ ] Tap FAB → create dialog
237- [ ] Enter name (1–64 graphemes), optional description, pick avatar
238- [ ] Select purpose (curation or moderation)
239- [ ] Save → list appears in My Lists
240
241### List Detail
242
243- [ ] Header: name, avatar, description, creator, member count
244- [ ] Feed tab (curation lists): shows posts from members
245- [ ] Members tab: lists member profiles
246- [ ] Overflow: Edit, Delete, Add/Remove members
247
248### List Members
249
250- [ ] Search for actors to add
251- [ ] Add member → appears in list
252- [ ] Remove member → removed from list
253
254### Moderation Actions
255
256- [ ] Mute list → all members muted
257- [ ] Block via list → all members blocked
258
259## 12. Starter Packs
260
261### Starter Pack Detail
262
263- [ ] Header: name, description, creator
264- [ ] Stats: joined this week, joined all-time
265- [ ] Sample members displayed (up to 12)
266- [ ] Recommended feeds displayed (up to 3)
267- [ ] "See all members" → navigates to list members
268- [ ] "Follow all" → follows all members (with confirmation)
269
270### Create Starter Pack
271
272- [ ] Tap create from own profile's Packs tab
273- [ ] Enter name (max 50 graphemes), optional description
274- [ ] Search and add members
275- [ ] Pick up to 3 feeds
276- [ ] Save → pack appears on profile
277
278### Edit / Delete
279
280- [ ] Edit pack → update name, description, feeds
281- [ ] Delete pack → removed from profile
282
283## 13. Media
284
285### Image Viewer
286
287- [ ] Tap image → full-screen viewer
288- [ ] Pinch to zoom, pan around
289- [ ] Multi-image post → swipe between images
290- [ ] Alt text shown at bottom (if present)
291- [ ] Download → saved to gallery
292- [ ] Share → system sheet
293- [ ] Swipe down → dismiss viewer
294
295### Video Player
296
297- [ ] Tap video → full-screen player
298- [ ] Play/pause, seek bar, mute controls work
299- [ ] Elapsed/total time displayed
300- [ ] Fullscreen toggle works
301
302### Long-Press Context Menu
303
304- [ ] Long-press image thumbnail → Save / Share options
305
306---
307
308## 14. Saved Posts
309
310- [ ] Navigate to saved posts screen
311- [ ] Previously saved posts listed
312- [ ] Tap post → thread view
313- [ ] Unsave → removed from list
314- [ ] Empty state shown when no saved posts
315
316---
317
318## 15. Moderation & Labelers
319
320### Content Filtering
321
322- [ ] Blurred content shows click-through overlay
323- [ ] Alert badge renders on warned content
324- [ ] Filtered content hidden from feeds
325- [ ] Media blur shows blurred images, text visible
326
327### Labeler Management
328
329- [ ] Settings → Moderation → labeler list shown
330- [ ] Tap labeler → detail with label definitions
331- [ ] Toggle per-label preference (ignore/warn/hide)
332- [ ] Subscribe to new labeler
333- [ ] Unsubscribe from labeler
334- [ ] Adult content toggle gates 18+ labels
335
336---
337
338## 16. Connectivity & Offline
339
340### Network Loss
341
342- [ ] Disable network → offline banner appears at top
343- [ ] Cached feed data still displays
344- [ ] Post actions (like, repost, compose) disabled with tooltip
345- [ ] Notifications/DMs show empty or cached state
346
347### Network Restore
348
349- [ ] Re-enable network → banner disappears
350- [ ] Actions re-enabled
351- [ ] Pull-to-refresh loads fresh data
352
353### Optimistic Updates
354
355- [ ] Like a post on slow connection → UI updates immediately
356- [ ] If API fails → UI rolls back, error snackbar shown
357
358---
359
360## 17. Settings & Preferences
361
362### Theme
363
364- [ ] Change theme palette (Oxocarbon, Catppuccin, Nord, Rosé Pine)
365- [ ] Toggle Light / Dark / System mode
366- [ ] Theme applies immediately across all screens
367
368### Account Switching
369
370- [ ] Open account switcher → all accounts listed
371- [ ] Switch to another account → feeds/profile reload for new account
372- [ ] Add new account → OAuth flow → account added to list
373
374### Dev Tools
375
376- [ ] Logs: view logs, filter by level, search text, share log file
377- [ ] PDS Explorer: resolve handle, browse collections, view record JSON
378
379### About
380
381- [ ] App version and build number displayed
382- [ ] Licenses accessible
383
384---
385
386## 18. Cross-Cutting Concerns
387
388### Navigation
389
390- [x] Bottom nav switches between Home, Search, Alerts, Profile
391- [x] Back button / swipe-back navigates correctly through stack
392- [ ] Deep link to a post URI opens thread view
393
394### Performance
395
396- [ ] Feed scroll is smooth (no jank)
397- [ ] Image loading doesn't block UI
398- [ ] Search results appear within reasonable time
399
400### Error States
401
402- [ ] Invalid handle on login → error message shown
403- [ ] Network error on post submit → error snackbar, draft preserved
404- [ ] 404 on deleted post → appropriate error state
405
406### State Persistence
407
408- [ ] Kill app mid-scroll → relaunch restores session
409- [ ] Drafts survive app restart
410- [ ] Saved posts survive app restart
411- [ ] Search history survives app restart
412- [ ] Theme selection survives app restart