# PoliticTalk Jitsi Setup

This folder is the local source of truth for the PoliticTalk Jitsi setup used by:

```text
https://politictalk.parallelglobe.io
```

The VPS still runs the actual Jitsi services. Changes should be made here first, committed to Git, pulled on the VPS, then deployed into the system Jitsi paths with the deploy script.

## Structure

```text
jitsi/
  config/
    politictalk.parallelglobe.io-config.js
  assets/
    public/politictalk/
      branding.json
      favicon.ico
      pgLogo.svg
      pg_bg.png
  interface_config/
    politictalk-overrides.js
  local/
    README.md
    custom-config.js
    custom-interface_config.js
    docker-compose.override.yml
  nginx/
    politictalk.parallelglobe.io.conf
  prosody-plugins/
    mod_politictalk_roles.lua
  scripts/
    deploy-vps.sh
    local-jitsi-setup.sh
    local-jitsi-start.sh
    local-jitsi-stop.sh
    local-jitsi-sync.sh
  templates/
  web/
    plugin.head.html
    title.html
```

## Current Meeting Policy

- Meetings start in audio-only mode.
- Participants join with microphone muted.
- Participants cannot unmute themselves until a host allows them through Jitsi AV moderation.
- Participants join with camera off.
- Jitsi prejoin is disabled because PgPlatform owns the PoliticTalk prejoin/auth step.
- Camera/premeeting camera controls are hidden.
- Toolbar is limited to microphone, chat, raise hand, fullscreen, noise suppression, participants pane, and hangup.
- Chat and polls are enabled.
- Invite/share controls are disabled.
- Room names are not stored in recent rooms.
- E2EE support is enabled in the Jitsi config.
- The logo and dynamic branding point to PoliticTalk public assets.
- Browser title, favicon, Open Graph metadata, and in-meeting watermark/logo use PoliticTalk branding.
- When JWT auth is enabled, Jitsi auto-owner is disabled so the first entrant cannot become moderator automatically.
- A custom Prosody module maps PoliticTalk JWT roles to Jitsi moderator/member roles, enables host-controlled AV moderation, and closes the room when the host leaves.

## Local Docker Testing

Local Jitsi testing uses the official Docker Jitsi release. The downloaded Docker files and generated runtime config are ignored by Git, while PoliticTalk overrides stay tracked in this repo.

First install and start Docker Desktop. Then:

```bash
cd /Users/amardeep/work/pg/jitsi
./scripts/local-jitsi-setup.sh
./scripts/local-jitsi-start.sh
```

Open:

```text
https://localhost:8443/pt-local-test
```

The local browser may show a self-signed certificate warning. That is expected.

When editing local override files or assets:

```bash
./scripts/local-jitsi-sync.sh
./scripts/local-jitsi-restart-web.sh
```

To stop local Jitsi:

```bash
./scripts/local-jitsi-stop.sh
```

## VPS Paths

The deploy script copies local files into these VPS paths:

```text
jitsi/config/politictalk.parallelglobe.io-config.js
  -> /etc/jitsi/meet/politictalk.parallelglobe.io-config.js

jitsi/assets/public/politictalk/*
  -> /etc/jitsi/meet/public/politictalk/
  -> /usr/share/jitsi-meet/images/politictalk/

jitsi/web/title.html
  -> /usr/share/jitsi-meet/title.html

jitsi/web/plugin.head.html
  -> /usr/share/jitsi-meet/plugin.head.html

jitsi/interface_config/politictalk-overrides.js
  -> appended to /usr/share/jitsi-meet/interface_config.js

jitsi/prosody-plugins/mod_politictalk_roles.lua
  -> /usr/share/jitsi-meet/prosody-plugins/mod_politictalk_roles.lua

jitsi/nginx/politictalk.parallelglobe.io.conf
  -> /etc/nginx/sites-available/politictalk.parallelglobe.io.conf
```

By default, the deploy script does not replace nginx config unless `DEPLOY_NGINX=1` is set.

## Deploy On VPS

After pulling the latest repo changes on the VPS:

```bash
cd /path/to/pg/jitsi
sudo ./scripts/deploy-vps.sh
```

To also deploy the nginx vhost:

```bash
cd /path/to/pg/jitsi
sudo DEPLOY_NGINX=1 ./scripts/deploy-vps.sh
```

For current `config.js`, branding, and asset changes, an nginx reload is enough. JWT/auth and Prosody plugin changes require restarting Prosody and Jicofo, and usually Jitsi Videobridge.

The `politictalk_roles` Prosody module should be configured with the PgApi
inactive-room and occupancy callbacks from
`templates/prosody-token-auth.cfg.lua.example`. The inactive callback clears the
event `meetingCode` when the last host leaves, and the occupancy callback keeps
the platform room cards updated with the current room occupancy count, including
the host. If the occupancy callback URL is omitted, the module derives it from
the inactive callback URL by replacing `room-inactive` with `room-occupancy`.

## Token Auth Rollout

The authenticated flow is:

```text
PgPlatform -> PgApi verifies event/user -> PgApi creates short-lived Jitsi JWT
-> PgPlatform prejoin/iframe -> Jitsi validates JWT on VPS
```

PgApi now supports JWT-backed `join-link` responses when these environment values are set:

```text
jitsi/templates/pgapi-politictalk-jwt.env.example
```

The VPS-side Prosody token-auth shape is documented here:

```text
jitsi/templates/prosody-token-auth.cfg.lua.example
```

Do not commit real secrets here. JWT secrets, Prosody passwords, and private keys should stay in VPS-only environment/config files.
