# 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.
