Summary
Settings ▸ Preferences shipped 2026-08-16 with three of the five documented View Preferences, and one of the three it does ship has a range the web cannot represent.
The documented pane (/help/settings, re-read 2026-09-07)
| Setting |
Documented range / values |
macOS today |
| Messages per page |
10 to 30 |
🐞 5...100 step 5 (PreferencesView.swift:57) |
| Viewing preference |
My Messages / All Messages / Followers Only / Following Only |
❌ absent |
| Show link previews |
on / off |
✅ shipped (and now backed by real previews) |
| Notification tray limit |
10 to 40, default 20 |
❌ absent |
Also in the same family, under Message settings: Default message visibility ✅ (shipped, PR #34) and Advanced post settings — verify the latter is present and actually controls the composer's gear affordance the way the web describes.
Why the page-size range is a real bug, not a nit
PreferencesView lets a user save 5 or 100. The web control offers 10–30, so a value saved from macOS may be unrepresentable there, and the server's own validation is unverified at those extremes. Narrow the native control to the documented range and clamp on load so an already-saved out-of-range value is corrected rather than re-sent.
viewingPreference — the one with a dependency
UserDTO.viewingPreference is decoded (UserDTO.swift:89) and deliberately excluded from UserSettings, so the timeline currently ignores a filter the account may already have set on the web. Live probe on the test account returns "viewingPreference":"all_messages", which pins the wire vocabulary for at least one value — probe the other three by setting them on the web and re-reading GET /api/user rather than guessing the snake_case forms.
⚠️ Interaction with the following feed. Following Only cannot be honoured until the backend feed exists (P1-G — re-verified broken 2026-09-05: ?scope=following returns the identical unfiltered page). Until then the picker must either omit that option or select it and show the existing "coming soon" state honestly. Decide which in the PR, do not ship a silently-wrong feed.
Division of labor
Kit
Domain
App
Tests
Acceptance criteria
- No value savable from macOS is unrepresentable on the web.
- An account whose viewing preference was set on the web sees that filter honoured on launch in macOS.
- Full E2E gate green.
Notes
work-consolidation.md tracks this as G35. Size S.
Summary
Settings ▸ Preferences shipped 2026-08-16 with three of the five documented View Preferences, and one of the three it does ship has a range the web cannot represent.
The documented pane (
/help/settings, re-read 2026-09-07)5...100 step 5(PreferencesView.swift:57)Also in the same family, under Message settings: Default message visibility ✅ (shipped, PR #34) and Advanced post settings — verify the latter is present and actually controls the composer's gear affordance the way the web describes.
Why the page-size range is a real bug, not a nit
PreferencesViewlets a user save5or100. The web control offers 10–30, so a value saved from macOS may be unrepresentable there, and the server's own validation is unverified at those extremes. Narrow the native control to the documented range and clamp on load so an already-saved out-of-range value is corrected rather than re-sent.viewingPreference— the one with a dependencyUserDTO.viewingPreferenceis decoded (UserDTO.swift:89) and deliberately excluded fromUserSettings, so the timeline currently ignores a filter the account may already have set on the web. Live probe on the test account returns"viewingPreference":"all_messages", which pins the wire vocabulary for at least one value — probe the other three by setting them on the web and re-readingGET /api/userrather than guessing the snake_case forms.Following Onlycannot be honoured until the backend feed exists (P1-G— re-verified broken 2026-09-05:?scope=followingreturns the identical unfiltered page). Until then the picker must either omit that option or select it and show the existing "coming soon" state honestly. Decide which in the PR, do not ship a silently-wrong feed.Division of labor
Kit
notificationTrayLimitandviewingPreferenceare both accepted byPATCH /api/user/update(the verb fixed in PR fix(api): correct seven live-verb defects and repoint the GitHub issue routes #24) and that omitting them still never clobbers them.Domain
viewingPreference(typed enum + raw-string escape hatch) andnotificationTrayLimittoUserSettingsand its mapper.messagesPerPageto 10...30 andnotificationTrayLimitto 10...40 on both read and write.viewingPreferenceintoMessagesService.timelineso the account's stored filter drives the default scope, with the.followingshort-circuit preserved until P1-G lands.App
PreferencesView: correct the stepper range; add the viewing-preference picker and the tray-limit stepper.NotificationsServicealready reads a tray limit — connect the new setting to it (nothing sets it today).Tests
viewingPreferencestring falls back to All rather than throwingAcceptance criteria
Notes
work-consolidation.mdtracks this as G35. Size S.