# sojorn sojorn is a friends-first, consent-first social platform built to foster genuine connections and reduce hostility by design. The project pairs a Flutter client with a Go backend that enforces tone gating, mutual-consent conversations, and trust-aware ranking. ## Product Principles - Friendliness is structural, not performative. - Hostility is contained; clean content remains visible. - Exposure is opt-in, filtering is private, and blocking is absolute. - Conversation requires mutual consent (mutual follow). - Attention is non-possessive: feeds rotate and trends fade. - Transparency is a feature: reach rules are explainable. ## Tech Stack - **Client:** Flutter (mobile + web) in `sojorn_app/` - **Backend:** Supabase (Postgres, Auth, RLS, Edge Functions) in `supabase/` - **Media:** Cloudflare R2 signing for uploads/downloads - **Tooling:** PowerShell helpers for dev and deployment ## What Lives Here ``` sojorn/ docs/ Architecture, setup, and deployment guides sojorn_app/ Flutter app (mobile + web) supabase/ Database + Edge Functions troubleshooting/ Notes and fixes for common issues .env Local secrets for dev scripts run_dev.ps1 Run Flutter app with .env defines (device) run_web.ps1 Run Flutter app in Chrome with .env defines deploy_all_functions.ps1 Deploy all Edge Functions to Supabase import requests.py Standalone API test script test_r2_credentials.js Quick R2 credential check ``` ## Backend Capabilities (Edge Functions) - **Publishing:** `publish-post`, `publish-comment`, `manage-post` - **Feeds:** `feed-personal`, `feed-sojorn`, `trending` - **Moderation & Trust:** `tone-check`, `report`, `calculate-harmony` - **Social Graph:** `follow`, `block`, `save`, `appreciate` - **Profiles & Auth:** `signup`, `profile`, `profile-posts`, `delete-account`, `deactivate-account` - **Notifications & Beacons:** `notifications`, `create-beacon` - **Media:** `upload-image` with R2 signing support Shared logic lives in `supabase/functions/_shared/` (tone detection, ranking, validation, R2 signing, etc.). ## Getting Started (Local) 1. **Create a local `.env`** with at least: - `SUPABASE_URL` - `SUPABASE_ANON_KEY` - `API_BASE_URL` 2. **Start Supabase and apply migrations:** ```bash supabase start supabase db reset ``` 3. **Run the Flutter app:** ```bash ./run_dev.ps1 ``` Or run the web build: ```bash ./run_web.ps1 ``` 4. **Deploy Edge Functions when needed:** ```bash ./deploy_all_functions.ps1 ``` For detailed setup, seeding, and troubleshooting, see the docs listed below. ## Key Docs - `docs/QUICK_START.md` - `docs/SETUP.md` - `docs/DEPLOYMENT.md` - `docs/EDGE_FUNCTIONS.md` - `docs/ARCHITECTURE.md` - `docs/DESIGN_SYSTEM.md` - `docs/IMAGE_UPLOAD_IMPLEMENTATION.md` ## Notes - The root `.env` file is used by `run_dev.ps1` and `run_web.ps1` to pass `--dart-define` values into Flutter. - The Supabase functions list is reflected in `deploy_all_functions.ps1`. Update it when adding new functions. ## License To be determined.