Patrick Britton
d26e63ca1b
fix: Add /feed/personal route + lazy neighborhood group creation
...
- 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>
2026-02-17 18:06:46 -06:00
Patrick Britton
0753fd91e6
fix: Resolve Flutter compile errors across 15 files
...
- Fix GroupCategory enum duplication (group.dart re-exports from cluster.dart)
- Fix stitchVideos arg count (use stitchVideosLegacy in quip_recorder)
- Fix enhanced_quip_recorder: getter/field conflict, XFile→File, static calls, CameraLensDirection, setState syntax
- Fix blocking_service: imports, ShareXFiles, SnackBar content, nullable bool
- Fix audio_overlay_service: path_provider import, getOutput() stub, fade icons
- Fix enhanced_beacon_detail_screen: flutter_map v8 interactionOptions, const constraints, Uri.parse
- Fix private_capsule_screen: add api_provider import
- Stub e2ee_device_sync_service (packages not in pubspec)
- Add generic post()/delete() helpers to api_service
- Fix repost_service: remove static, migrate StateNotifier→Notifier (Riverpod 3.x)
- Fix repost_widget: Repost? null assertion, RepostState type, Post field names, timeago, context param
- Fix sojorn_swipeable_post: close if-block, remove undefined _updateChainSetting
- Fix draggable_widget_grid: use this.widget for isEditable/theme/callbacks when ProfileWidget param shadows
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 17:43:30 -06:00
Patrick Britton
91ff0dc060
fix: resolve Gin route wildcard conflict (:userId vs :id) causing startup panic
...
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>
2026-02-17 16:33:37 -06:00
Patrick Britton
8c62428556
fix: waitlist handler handles int id, add alter migration for existing waitlist table
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 16:24:24 -06:00
Patrick Britton
e06b7252c4
feat: Admin panel completions — audit log, waitlist, feed reset, profile edit for all users
...
- Remove is_official gate: profile editor and follow manager now shown for all users
- Add /audit-log page: paginated view of all admin actions
- Add /waitlist page: approve/reject/delete waitlist entries with notes
- Add Feed Impression Reset button on user detail (clears user's seen-posts history)
- Add feed cooling/diversity thresholds to algorithm_config defaults (configurable via /algorithm)
- Go: AdminListWaitlist, AdminUpdateWaitlist, AdminDeleteWaitlist handlers
- Go: AdminResetFeedImpressions handler (DELETE /admin/users/:id/feed-impressions)
- Go: Register all new routes in main.go
- Sidebar: add Waitlist (Users & Content) and Audit Log (Platform) links
- DB: add 20260218_waitlist.sql migration
- api.ts: listWaitlist, updateWaitlist, deleteWaitlist, resetFeedImpressions methods
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 16:21:42 -06:00
Patrick Britton
4315da74b2
docs: Update TODO and add Funkwhale deployment guide
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 16:03:45 -06:00
Patrick Britton
135bb7f08d
feat: Audio overlay system — AudioLibraryScreen, Funkwhale proxy, ffmpeg audio mix
...
Go:
- GET /audio/library?q= — Funkwhale tracks proxy (503 until FUNKWHALE_BASE set)
- GET /audio/library/:trackId/listen — audio stream proxy
- FUNKWHALE_BASE config key added (env var)
Flutter:
- AudioLibraryScreen: Device tab (file_picker) + Library tab (Funkwhale)
- VideoStitchingService.stitchVideos(): audioOverlayPath + audioVolume params
— second FFmpeg pass: amix with configurable volume, falls back if mix fails
- EnhancedQuipRecorderScreen: music button, audio chip + volume slider, wired to stitcher
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 16:00:55 -06:00
Patrick Britton
6e2de2cd9d
feat: Add GET /media/sign and GET /users/by-handle/:handle endpoints
...
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>
2026-02-17 15:53:57 -06:00
Patrick Britton
afdc0f3f1c
docs: rewrite TODO.md with honest current state
...
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>
2026-02-17 15:47:39 -06:00
Patrick Britton
15e83c6a14
feat: Flutter group nav, quip repair API, share, capsule key rotation, admin groups/quips pages
...
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>
2026-02-17 15:45:42 -06:00
Patrick Britton
9aaf0d84a2
feat: Add go vet to allowed bash commands in Claude settings
2026-02-17 15:33:31 -06:00
Patrick Britton
1da62185f9
feat: Feed cooling, group key rotation, admin groups/quip repair, bulk block, health endpoints
...
- video_processor: upload extracted frames to R2, return signed URLs
- feed_algorithm: cooling period (0.2x multiplier) + 60/20/20 diversity injection + record impressions
- groups_handler: group feed, E2EE key-status/distribute/public-keys, invite/remove member, settings
- admin_handler: groups CRUD, quip repair (FFmpeg to R2), feed scores viewer
- user_handler: BulkBlockUsers POST /users/me/blocks/bulk
- main.go: wire health check (/health/detailed /ready /live) + all new routes
- monitoring: fix pre-existing zerolog import + uint64 type errors
- migration: user_feed_impressions, group_member_keys, groups key columns
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 15:04:14 -06:00
Patrick Britton
e0056789ac
fix: Remove unused weights variable in GetAlgorithmicFeed
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 14:15:54 -06:00
Patrick Britton
c3329a0893
feat: Implement repost/boost API, profile layout persistence, feed algorithm wiring, and legacy cleanup
...
Backend:
- Add repost_handler.go with full CRUD (create, boost, delete, report, trending, amplification analytics)
- Add profile_layout_handler.go for profile widget layout persistence (GET/PUT)
- Wire FeedAlgorithmService into main.go as 15-min background score refresh job
- Fix follow_handler.go (broken interface, dead query pattern, naming conflict)
- Add DB migration for reposts, repost_reports, profile_layouts, post_feed_scores tables
- Add engagement count columns to posts table for feed algorithm
- Remove stale Supabase comments from auth middleware
- Delete cmd/supabase-migrate/ directory (legacy migration tool)
Flutter:
- Fix all repost_service.dart API paths (were doubling /api/ prefix against base URL)
- Rename forceResetBrokenKeys() -> resetIdentityKeys() in E2EE services
- Remove dead _forceResetBrokenKeys method from secure_chat_screen.dart
- Implement _navigateToProfile(), _navigateToHashtag(), _navigateToUrl() in sojorn_rich_text.dart
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 14:04:24 -06:00
Patrick Britton
56a9dd032f
feat: Add enhanced video moderation with frame extraction and implement placeholder UI methods
...
- 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
2026-02-17 13:32:58 -06:00
Patrick Britton
04c632eae2
fix: Resolve all compilation errors - GroupCategory conflicts, ref access, privacy types, and icon/color properties
2026-02-17 11:24:48 -06:00
Patrick Britton
d01be18b12
fix: Final compilation errors - update API calls to use new Groups system
2026-02-17 11:19:25 -06:00
Patrick Britton
6217cb2ffd
fix: Resolve remaining compilation errors in Groups feature
2026-02-17 11:16:39 -06:00
Patrick Britton
f1ee925057
fix: Resolve compilation errors in Groups feature
2026-02-17 11:13:41 -06:00
Patrick Britton
6cba4e5c59
feat: Complete Groups discovery UI and creation modal
2026-02-17 11:10:03 -06:00
Patrick Britton
31d7816e92
feat: Add GroupCard widget and start integrating Groups UI into ClustersScreen
2026-02-17 11:06:07 -06:00
Patrick Britton
c1c7ebd678
feat: Add Groups system - Flutter models and API methods
2026-02-17 11:04:51 -06:00
Patrick Britton
abfbeb2119
feat: Register Groups system routes in backend main.go
2026-02-17 11:00:44 -06:00
Patrick Britton
21a1d1e8ef
feat: Add Groups system - database schema, seed data, and backend handlers
2026-02-17 10:59:34 -06:00
Patrick Britton
b3abcf9c6e
fix: Navigate to beacon tab instead of pushing new BeaconScreen to avoid duplicate GlobalKey error
2026-02-17 10:48:13 -06:00
Patrick Britton
6d43ae2b09
fix: Make NetworkService web-safe by skipping connectivity monitoring on web platform
2026-02-17 10:46:50 -06:00
Patrick Britton
2b3704a3f9
fix: Update viewable_profile_screen to handle void return from followUser
2026-02-17 10:43:55 -06:00
Patrick Britton
00b4705a00
fix: Remove duplicate follow methods and fix FollowButton to use provider
2026-02-17 10:42:08 -06:00
Patrick Britton
70d4bc5140
feat: Initialize NetworkService in main.dart and add OfflineIndicator to HomeShell
2026-02-17 10:35:37 -06:00
Patrick Britton
7f618bcdf2
feat: Add feed filtering UI with FeedFilterButton and integrate into personal feed
2026-02-17 10:33:32 -06:00
Patrick Britton
62233d5892
feat: Add FeedFilter model and begin feed filtering integration
2026-02-17 10:27:31 -06:00
Patrick Britton
961aa02eac
feat: Register follow system routes in backend main.go
2026-02-17 10:26:25 -06:00
Patrick Britton
cdfe988eff
feat: Add connectivity_plus dependency for network monitoring
2026-02-17 10:22:50 -06:00
Patrick Britton
5f7dfa7a93
feat: Add error handling utilities, NetworkService, RetryHelper, and OfflineIndicator
2026-02-17 10:22:07 -06:00
Patrick Britton
d403749092
feat: Add SuggestedUsersSection widget with horizontal scrolling cards
2026-02-17 10:19:56 -06:00
Patrick Britton
da93bc3579
feat: Follow system - database migration, backend handlers, FollowButton widget, API methods
2026-02-17 10:16:44 -06:00
Patrick Britton
bc3fdb4211
fix: replace deprecated activeColor with activeTrackColor on Switch.adaptive
2026-02-17 03:58:28 -06:00
Patrick Britton
9348765b68
fix: remove duplicate altcha_handler.go (methods already in admin/auth handlers)
2026-02-17 03:46:58 -06:00
Patrick Britton
57cb964737
feat: Phase 5 - Privacy Dashboard with score, toggles, segmented controls, and encryption status
2026-02-17 03:44:19 -06:00
Patrick Britton
2c6c8a7c20
feat: Phase 6 - Skeleton loaders for Groups/feed, seed groups SQL migration
2026-02-17 03:41:39 -06:00
Patrick Britton
f5612be301
feat: Phase 5 - Harmony State explainer modal with progression chart, tappable from profile
2026-02-17 03:38:10 -06:00
Patrick Britton
60a42c4704
feat: Phase 2.1 - Enhanced thread detail with highlighted OP, thread connectors, chain metadata, and improved reply composer
2026-02-17 03:34:14 -06:00
Patrick Britton
bf4ac02d4b
feat: Phase 1.3 - Nav helper badges (Videos/Alerts) and long-press tooltips
2026-02-17 03:32:51 -06:00
Patrick Britton
0c183c3491
feat: Phase 1.2 - 3-screen onboarding modal (Welcome, Features, Harmony)
2026-02-17 03:31:32 -06:00
Patrick Britton
c255386db5
feat: Phase 1.1 - Groups page overhaul with discovery, category filtering, and join flow
2026-02-17 03:29:20 -06:00
Patrick Britton
9d9cfd7328
chore: refresh repo hooks
2026-02-17 03:20:16 -06:00
Patrick Britton
2bfb8eecea
feat: replace Turnstile with ALTCHA across Flutter app, Go backend, and website
2026-02-17 03:18:50 -06:00
Patrick Britton
602a139349
fix: update auth screens to use ALTCHA instead of Turnstile
2026-02-17 01:53:09 -06:00
Patrick Britton
95be179a38
security: remove development bypass tokens from production code
2026-02-17 00:52:29 -06:00
Patrick Britton
83317e8e0f
legal: update Terms of Service and Privacy Policy for AGPL-3.0
...
- Add Section 13 (Open Source Licensing) to Terms of Service
- Add Section 13 (Open Source Transparency) to Privacy Policy
- Link to GitLab repo and AGPL-3.0 license text
- Sync all website versions: .md, .astro, .html, html_landing
- Update last updated dates to February 17, 2026
- Fix entity name from 'Sojorn Inc.' to 'MPLS LLC' in HTML terms
- Expand HTML pages to match full canonical .md content
2026-02-17 00:17:16 -06:00