- Replace custom TextField+send-button in board_entry_detail_screen with ComposerBar
- Replace custom compose UI in create_board_post_sheet with ComposerBar (text+image+send)
- Enable GIF picker in encrypted group chat (allowGifs: true in ComposerConfig)
- Enable GIF picker in encrypted group feed posts (allowGifs: true)
- Add GIF URL detection in group_chat_tab: detect GIF URLs stored as body text from sendGroupMessage fallback
- Add
- Move /image-proxy to public (unauthenticated) route so CachedNetworkImage
can fetch proxied GIFs without Bearer token (fixes 401 errors)
- Expand image proxy SSRF allowlist to include i.imgur.com + media.giphy.com
- Broaden GIF filter in gif_picker: accept i.redd.it, preview.redd.it,
i.imgur.com URLs (not just .gif extension) so Reddit posts actually show
- Change GIF search hint to 'Search GIFs…' (no subreddit mention)
- Add i.imgur.com + media.giphy.com to client-side needsProxy() list
- Create lib/widgets/composer/composer_bar.dart — single ComposerBar widget
with ComposerConfig presets (publicPost/comment/threadReply/chat/privatePost)
that handles text, GIF picker, image picker, upload, and send button uniformly
- Apply ComposerBar to: group feed posts, group feed comments sheet,
group thread reply bar, quips comment sheet, group chat bar
- Remove all duplicate TextField+send-button+media-button implementations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add capsule_reports table and admin UI: new /capsule-reports page with list/update handlers
- POST /capsules/:id/entries/:entryId/report: members can report encrypted entries with voluntary decrypted sample
- GET /image-proxy: stream external images (Reddit, GifCities) through server to hide client IPs
- group_chat_tab: add GIF picker, report button, proxy external GIF URLs through ApiConfig.proxyImageUrl()
- api.ts: add list
- Go: Add overlay_json to Post model, CreatePost handler, and all post queries
- Flutter: Rename QuipTextOverlay → QuipOverlayItem with type enum (text/sticker)
- QuipOverlayItem: add id field, content replaces text, backward-compat alias
- quip_video_item: parse overlay_json and render non-interactive overlays in feed
- quip_upload_provider: accept overlayJson param and pass to publishPost
- api_service: add overlayJson param to publish
- Add GET /feed/personal alias for /feed (Flutter uses this endpoint)
- Fix 'Neighborhood unavailable' board bug: GetMyNeighborhood now
creates the neighborhood group lazily if group_id is NULL in the seed,
matching the same auto-create logic as the Detect endpoint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Routes POST /users/:userId/unfollow, GET /users/:userId/is-following, and
GET /users/:userId/mutual-followers conflicted with /users/:id/* routes.
Renamed :userId to :id and updated follow_handler.go accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both were wired in Flutter but missing from Go routes:
- GET /media/sign?path=X — resolves R2 relative keys to full URLs
- GET /users/by-handle/:handle — profile lookup for capsule invite flow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove false 'LAUNCH READY / 11 directives complete / zero TODOs' fiction.
Accurately reflects what is shipped, what needs server deploy, and what
work genuinely remains (audio overlay, small backend gaps, cleanup).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Flutter:
- clusters_screen: _navigateToGroup now pushes real GroupScreen (was print)
- public_cluster_screen: calls GET /groups/:id/feed instead of fetchNearbyBeacons
- feed_sojorn_screen: _sharePost uses share_plus
- api_service: getSignedMediaUrl calls Go /media/sign endpoint
- quip_repair_screen: fully rewired to Go admin API (GET /admin/quips/broken, POST repair)
- private_capsule_screen: auto key rotation on open (_checkAndRotateKeysIfNeeded),
_performKeyRotation helper; _CapsuleAdminPanel now ConsumerStatefulWidget with
working Rotate/Invite/Remove/Settings modals
Admin panel:
- Sidebar: Groups & Capsules + Quip Repair links added
- /groups: full group management page with member panel + deactivate/remove
- /quips: quip repair page with per-row and repair-all
- /algorithm: live feed scores table (lazy-loaded)
- api.ts: listGroups, getGroup, deleteGroup, listGroupMembers, removeGroupMember,
getBrokenQuips, repairQuip, setPostThumbnail, getFeedScores
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add VideoProcessor service to PostHandler for frame-based video moderation
- Implement multi-frame extraction and Azure OpenAI Vision analysis for video content
- Enhance VideoStitchingService with filters, speed control, and text overlays
- Add image upload dialogs for group avatar and banner in GroupCreationModal
- Implement navigation placeholders for mentions, hashtags, and URLs in sojornRichText