# Sojorn Development Status **Last Updated**: February 18, 2026 **Branch**: goSojorn — **Status**: Active Development — MVP near-complete --- ## Shipped and Working ### Core Platform - Go backend (Gin, pgx v5, PostgreSQL) — 100% migrated from Supabase - JWT auth with refresh tokens, email verification, ALTCHA bot protection - Posts: create, edit, delete, visibility, chains, reactions, saves - Comments: threaded with replies - Feed: algorithmic (5-factor scoring), chronological fallback - Feed algorithm: engagement weighting, cooling period (0.2x multiplier), 60/20/20 diversity injection, impression recording - Repost/boost: 4 repost types, amplification analytics, trending posts - Image/video uploads to Cloudflare R2 with signed URLs - GET /media/sign?path=X — resolves relative R2 keys to full URLs - Video moderation: FFmpeg frame extraction -> R2 upload -> Google Vision AI + OpenAI analysis - Follow/unfollow, search (users/posts/hashtags/beacons) - Profile widget system with layout persistence - Blocking: single, by handle, bulk import (POST /users/me/blocks/bulk) - E2EE chat (X3DH), push notifications (FCM) - Beacons + Neighborhoods (OSM-based) - Groups: create/join/leave, member management, discovery, E2EE capsules - Capsule key distribution and auto-healing rotation - Group feed endpoint - Capsule admin: rotate keys, invite member, remove member, settings - GET /users/by-handle/:handle — profile lookup for capsule invite - Health check service: /health, /health/detailed, /health/ready, /health/live - Content moderation: OpenAI text + Google Vision images, Three Poisons scoring - NSFW labeling, blur toggles, appeal system, safe links - GeoIP, Nginx reverse proxy + SSL/TLS - Audio overlay proxy: GET /audio/library, GET /audio/library/:trackId/listen - Returns 503 until FUNKWHALE_BASE is set — gracefully handled in Flutter ### Admin Panel (Next.js, port 3001) - Dashboard, user management, post management, bulk actions - Moderation queue, AI moderation config/audit, appeals, reports - Algorithm config tuning + live feed scores viewer - Categories, neighborhoods, official accounts scheduler - Storage browser, system health, reserved usernames, safe domains - Email templates with test send - Groups and Capsules page (list, member management, deactivate, key rotation status) - Quip Repair page (list missing thumbnails, server-side FFmpeg repair) ### Flutter App - Full audio overlay system in Quip recorder: - AudioLibraryScreen: Device tab (file_picker) + Library tab (Funkwhale via Go proxy) - EnhancedQuipRecorderScreen: music button, audio chip, volume slider - VideoStitchingService: ffmpeg audio mix pass (amix with dropout_transition) - Group navigation (clusters → GroupScreen) - Public cluster group feed - Share post via share_plus - Signed media URL resolution via Go backend --- ## Needs Server Deploy Code is on goSojorn branch, NOT yet live. The `internal` remote may be missing on the server. ```bash ssh -i ~/.ssh/mpls.pem patrick@116.202.231.103 cd /opt/sojorn # Add internal remote if missing: git remote get-url internal 2>/dev/null || git remote add internal https://git.mp.ls/patrick/sojorn.git git pull internal goSojorn psql "$DATABASE_URL" -f go-backend/migrations/20260218_feed_impressions_and_group_keys.sql cd go-backend && go build -o bin/api ./cmd/api/... echo PASSWORD | sudo -S systemctl restart sojorn-api.service ``` --- ## Remaining Work ### High Priority **Funkwhale Infrastructure** (audio library backend) - Deploy Funkwhale Docker pod on server — see sojorn_docs/FUNKWHALE_DEPLOYMENT.md - Add to /opt/sojorn/.env: `FUNKWHALE_BASE=http://127.0.0.1:5000` - Seed with royalty-free tracks - Optional: `audio.sojorn.net` Nginx block + SSL cert ### Medium Priority **Flutter Polish** - sojorn_rich_text.dart — profile navigation from @mentions - post_with_video_widget.dart — post options menu (edit, delete, report) - video_player_with_comments.dart — more options button - reading_post_card.dart — share functionality **Algorithm Transparency** - Show users why a post appeared in their feed - A/B testing framework for algorithm weights ### Low Priority **Code Cleanup** - Delete go-backend/cmd/supabase-migrate/ (dead tool) - Remove stale Supabase comments in go-backend/internal/middleware/auth.go - Remove forceResetBrokenKeys() from simple_e2ee_service.dart - go-backend root: loose check_table.go, seed_groups*.go — conflicting main, move or delete **Infrastructure** - CI/CD pipeline (currently manual deploy) - Integration test suite exists but is dead code (internal/testing/) --- ## Completed This Sprint (Feb 17-18, 2026) - Feed cooling period + diversity injection + impression recording - Video frame upload to R2 (was returning local /tmp path) - Admin: Groups & Capsules page, Quip Repair page, Algorithm feed scores viewer - BulkBlockUsers endpoint - Group feed, key management, member invite/remove, settings endpoints - Capsule auto key rotation on open + admin modals (rotate, invite, remove, settings) - Flutter: group navigation, group feed, share_plus, signed URL, quip repair wired to Go - Health check service wired into routes - GET /media/sign and GET /users/by-handle/:handle endpoints added - Full audio overlay system: AudioLibraryScreen, Funkwhale proxy routes, ffmpeg amix