Commit Graph

34 Commits

Author SHA1 Message Date
jared 68a6acfa24 feat: hard cross-client voice channel limits via voice-limit-guard
Lint / Shell (shellcheck) (push) Successful in 7s
Lint / JS (eslint) (push) Successful in 5s
Lint / Python (ruff) (push) Successful in 4s
Lint / Python deps (pip-audit) (push) Successful in 1m1s
Lint / Secret scan (gitleaks) (push) Successful in 4s
Add a fail-open Python sidecar (livekit/voice-limit-guard.py) that fronts
lk-jwt-service to enforce per-room voice participant caps for ALL Matrix
clients, not just Lotus Chat:
- lk-jwt-service moved to :8071 (systemd drop-in), guard owns :8070 so NPM's
  existing /sfu/get + /get_token proxy targets are unchanged
- guard reads io.lotus.voice_limit.max_users (Synapse admin API, cached),
  forwards to lk-jwt-service, and on an issued token decodes the LiveKit alias
  + requester, counts distinct Matrix users via LiveKit ListParticipants, and
  returns 403 when the room is full (rejoins/extra devices allowed)
- any error fails open (returns upstream response) so calls never break
- systemd/voice-limit-guard.service; README documents ports, setup, revert

Also update landing page: voice limit is now server-enforced for all clients.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 23:45:41 -04:00
jared f65e56d06d docs: update landing page with GIF preview, policy lists, collapsible messages, send animation, context menu
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 33s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Adds inline GIF preview and collapsible long messages rows to the
feature comparison table; extends the June 2026 feature list with all
five newly completed items (P3-5, P3-9, P5-19, P5-23, P5-26).
Includes pre-staged README additions for presence tracking, encrypted
search, privacy settings, draft persistence, and PiP persistence.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 20:57:18 -04:00
jared 85ca1ca8a1 docs: document screenshare/PTT/status features in README + landing page
Lint / Shell (shellcheck) (push) Successful in 13s
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 58s
Lint / Secret scan (gitleaks) (push) Successful in 4s
README.md:
- Replaced the stale 'Auto-revert spotlight on screenshare' entry
  (that 600ms revert-to-grid code was removed — it caused fullscreen
  to show avatars instead of the screenshare)
- Added accurate entries for all four features added this cycle:
  Screenshare fullscreen, PiP screenshare focus, Screenshare audio
  mute, Custom status message

landing/index.html:
- Updated Lotus Fork feature description paragraph to mention
  screenshare fullscreen, screenshare audio mute, PTT, and custom
  status messages
- Added PTT row to Voice & Video comparison table
- Updated Screenshare row for Lotus Chat to note fullscreen + audio mute
- Added 'Custom status message' row to UX & Extras section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 12:40:02 -04:00
jared b609497179 docs: document /get_token nginx proxy and NPM override risk
Lint / Shell (shellcheck) (push) Successful in 7s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 51s
Lint / Secret scan (gitleaks) (push) Successful in 10s
LXC 139 NPM proxy host 49 now proxies both /sfu/get and /get_token
to lk-jwt-service (port 8070). Note that re-saving via NPM UI will
overwrite the conf and require re-adding the location blocks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:32:28 -04:00
jared 30bb0e5748 docs: add presence badges and device sessions to landing page and README
Document the new member list presence indicators and per-member device
sessions panel with per-device SAS verification in both the landing
page feature list and the README custom features table.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:18:37 -04:00
jared f3a7bcd00b feat: update client comparison table (May 2026)
Lint / Shell (shellcheck) (push) Successful in 15s
Lint / JS (eslint) (push) Successful in 8s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 1m4s
Lint / Secret scan (gitleaks) (push) Successful in 6s
- Cinny voice/video/calls: ✓ now covers rooms, DMs, group calls,
  screenshare via Element Call embed
- Cinny screenshare: ✓ (via EC iframe)
- Cinny GIF picker: ✓ Giphy with Terminal TDS theme
- Cinny polls: ~ display-only (read-only m.poll.start renderer)
- Cinny deleted messages: ✓ now shows placeholder instead of hiding
- New row: incoming call notification (ring + Answer/Decline for DMs)
- Updated featured client description with custom feature list
- README Lotus Cinny section updated with latest custom features

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 00:49:04 -04:00
jared ffff199b7f Fix NODE_OPTIONS heap size for Vite build (896MB → 6144MB)
Lint / Shell (shellcheck) (push) Successful in 11s
Lint / JS (eslint) (push) Successful in 12s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 40s
Lint / Secret scan (gitleaks) (push) Successful in 5s
OOM observed during rendering-chunks phase at 896MB and 3072MB.
6144MB heap with 8GB LXC memory is confirmed working.
Also update README rebuild command to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 20:34:14 -04:00
jared 7f7ddd3e3c Switch Lotus Cinny from nightly dev to stable-release fork workflow
Lint / Shell (shellcheck) (push) Successful in 9s
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 55s
Lint / Secret scan (gitleaks) (push) Successful in 5s
- Replace nightly build script with daily upstream release checker
  (cinny/upstream-check.sh) — posts to Matrix as LotusBot when a new
  cinnyapp/cinny stable release is published
- Add cinny/lotus-build.sh — merges latest release tag into the lotus
  branch, builds, deploys; triggered via !cinny-update webhook
- Fork lives at code.lotusguild.org/LotusGuild/cinny (lotus branch, v4.11.1)
- deploy/hooks-lxc106.json — adds cinny-build webhook endpoint (port 9000)
- Update landing page: "dev branch / nightly" → "Lotus fork / stable releases"
- Set LotusBot avatar on @hookshot_tinker-tickets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 16:57:35 -04:00
jared 54c73535b8 feat: add 9 new games and update help/README
Lint / Shell (shellcheck) (push) Successful in 8s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Failing after 5s
Lint / Python deps (pip-audit) (push) Successful in 41s
Lint / Secret scan (gitleaks) (push) Successful in 5s
New commands: numguess/ng, wordchain/wc/endwc, acronym/ac,
20q/q/answer, nhie, hottake, ttt/move, blackjack/hit/stand,
triviaduel/da. All per-room with AI-generated content where
applicable. callbacks.py wired up for new reaction handlers
(acronym votes, nhie, hottake). Help and README updated with
full command reference.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 16:29:23 -04:00
jared 58d8987e32 README: remove stale phase status line
Lint / Shell (shellcheck) (push) Successful in 13s
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 1m10s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 17:16:44 -04:00
jared ef9ff1106c README: remove Priority Order section, drop vCPUs from infra table
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (ruff) (push) Has been cancelled
Lint / Python deps (pip-audit) (push) Has been cancelled
Lint / Secret scan (gitleaks) (push) Has been cancelled
Priority Order is stale project tracking that doesn't belong in a README.
vCPUs removed from the infrastructure table — containers are HA and can
migrate between physical hosts so pinning a CPU model is misleading.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 17:16:15 -04:00
jared a559e98d82 Security hardening: TURN peer restriction, TCP relay, rate limits
Lint / Shell (shellcheck) (push) Successful in 14s
Lint / JS (eslint) (push) Successful in 9s
- coturn allowed-peer-ip scoped from 10.10.10.0/24 → 10.10.10.29 only
  (prevents TURN relay being used to reach other internal LXCs)
- coturn no-tcp-relay=true (UDP only; TCP relay was an SSRF vector)
- Added rc_joins (local: 0.1/s burst 3, remote: 0.01/s burst 3)
- Added rc_joins_per_room (1/s burst 3)
- Added rc_invites (per_room: 0.3/s burst 10, per_user: 0.003/s burst 5)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 13:39:03 -04:00
jared 5bb62db222 Fix ToS consent enforcement — disable require_at_registration
Lint / Shell (shellcheck) (push) Successful in 16s
Lint / JS (eslint) (push) Successful in 7s
Previously require_at_registration=true caused Cinny to silently complete
the m.login.terms UIA step during registration (~34ms), meaning users were
auto-consented without ever seeing the ToS page.

Setting require_at_registration=false removes the UIA step from registration.
New users start with NULL consent and are blocked by block_events_error on
first message send. Synapse sends a Server Notice DM with the /_matrix/consent
URL, which they must explicitly visit and submit before messaging is unblocked.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 12:54:43 -04:00
jared 08651fcbda docs: add CI lint badge to README
Lint / Shell (shellcheck) (push) Successful in 8s
Lint / JS (eslint) (push) Successful in 7s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 16:27:33 -04:00
jared 0ee1922bb1 Add Music room to space room table in README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 22:48:27 -04:00
jared 7078c467d8 Fix Synapse event processing lag alerts — root cause and mitigations documented
- tcp_retries2 reduced from 8 to 5 (~15-30s timeout vs ~90s)
- Unreachable routes added for asymmetric-connectivity servers (bark.lgbt ×2,
  parodia.dev, chat.ohaa.xyz, matrix.k8ekat.dev) so outbound attempts fail in
  0ms instead of hanging; routes persist via /etc/network/interfaces post-up
- Stuck device_lists_remote_resync entries cleared for dead-server users
- Grafana alert threshold raised 120s→300s, for duration 5m→15m to avoid
  false positives from normal 10-min federation backoff cycling

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:32:51 -04:00
jared 0458851a56 Re-enable presence, fix federation lag with TCP timeout tuning
Presence was incorrectly disabled as a workaround. Root cause of lag spikes was
Linux's default tcp_retries2=15 (~15 min retransmit window) causing hung outbound
TCP connections to slow remote servers (e.g. exp.farm) to block the federation
sender queue for minutes at a time.

Fix applied to /etc/sysctl.d/99-matrix-tuning.conf on LXC 151:
- net.ipv4.tcp_retries2 = 8   (~90s before giving up on stalled connection)
- net.ipv4.tcp_syn_retries = 4  (~45s for initial SYN)
- net.ipv4.tcp_keepalive_probes = 3  (dead conn detected ~6.5 min)

Presence re-enabled in homeserver.yaml (presence: enabled: true).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 21:22:38 -04:00
jared 3db163e43d Enable Draupnir web server (abuse reporting) and add healthz config to repo
- draupnir/production.yaml: Add health.healthz (port 8081) and web.abuseReporting
  (port 8080) config — healthz was live on LXC but missing from repo; web server
  enables Matrix client Report button forwarding to management room (Synapse module
  install on LXC 151 still needed to complete the integration)
- README: Add Draupnir port map, abuse reporting setup docs, updated monitoring
  section (3 new Prometheus scrape jobs, Draupnir Down alert, Grafana panel count),
  add presence-disabled federation lag fix to performance checklist, document
  Draupnir healthz/audit DB paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 21:12:19 -04:00
jared ffd51e87bf docs: overhaul README with current infrastructure and auto-deploy docs
- Fix repo URL (matrixBot → matrix)
- Add repo structure tree
- Update Cinny: dev branch, nightly build, 2GB RAM, correct paths
- Add full Auto-Deployment section (per-LXC endpoints, what each deploys, installed components)
- Add Livekit Graceful Restart documentation
- Add Access Token Rotation procedure
- Update port map: add 9500 (webhook on LXC 151)
- Add Voice Room to rooms table
- Add Proxmox embed format note to hookshot section
- Add manual hookshot deploy instructions
- Add Cinny dev branch section with build notes
- Add HA migration livekit fix to Known Issues
- Update server checklist (auto-deploy, voice room visibility)
- Remove stale Python bot files section
- Update tech stack table

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 13:37:01 -04:00
jared e6b1030b04 docs: remove stray Storj reference from Matrix README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 20:37:52 -04:00
jared 18c4ea14d4 docs: clean up README — remove stale audit sections, update versions, add Draupnir
- Remove all verbose Improvement Audit sections 1–11 (already applied)
- Remove stale running services table with old uptime/memory numbers
- Update Synapse version 1.148.0 → 1.149.0
- Add Draupnir moderation bot to infrastructure table, key paths, and new Moderation section
- Document active ban lists (community-moderation-effort-bl, matrix-org-coc-bl)
- Mark federation bad-actor blocking , Draupnir deployment 

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 19:43:27 -04:00
jared 210984f914 Add Draupnir moderation bot (LXC 110) — Phase 7
- Mark Draupnir as complete in roadmap (v2.9.0, LXC 110/10.10.10.24)
- Add Draupnir row to infrastructure table
- Document key paths, management room, bot account details
- Mark checklist item complete; update phase to 7
- Set draupnir avatar (draupnir_ring.png)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 18:00:16 -04:00
jared 0ba095ba03 docs: mark coturn hardening applied, update action items
- stale-nonce, user-quota, total-quota, cipher-list applied to /etc/turnserver.conf
- BBR noted as intentionally skipped (HA multi-host setup)
- Storj update and Synapse lag resolved

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 14:05:59 -04:00
jared a7d700d06e docs: update README for Phase 6 — monitoring, observability, alert rules
- Add Prometheus and Grafana to infrastructure table
- Update port map: Hookshot metrics on 9004, node_exporter on 9100, LiveKit metrics on 6789
- Add PostgreSQL LXC port map
- Update monitoring checklist — all Prometheus/Grafana items now complete
- Mark Hookshot metrics audit item as resolved
- Add Storj node outdated to admin checklist
- Add full Monitoring & Observability section:
  - Prometheus scrape jobs table (synapse, livekit, hookshot, matrix-node, postgres, postgres-node)
  - Grafana dashboard section listing all 21 panel groups
  - Alert rules tables (Matrix + Infrastructure folders, Prometheus rules)
  - /sync long-poll false positive note
  - Known alert watch items

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-10 12:30:03 -04:00
jared 2b998b9ba6 docs: comprehensive March 2026 audit and applied fixes
- Add Improvement Audit section tracking all identified gaps and their status
- All critical/high/medium items applied: coturn cert auto-renewal (sync cron
  on compute-storage-01), Synapse metrics port locked to 127.0.0.1+10.10.10.29,
  well-known matrix endpoints live on lotusguild.org, suppress_key_server_warning,
  fail2ban on login endpoint, PostgreSQL autovacuum per-table tuning, LiveKit
  VP9/AV1 codecs
- Bot E2EE reset: full store+credentials wipe, stale devices removed, fresh
  device BBRZSEUECZ registered
- Checklist updated: LiveKit port range, autovacuum, hardening items, Grafana IP
- Hookshot: Owncast renamed to Livestream in display name (same UUID)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 13:44:53 -04:00
jared 507aa43dbd docs: rewrite all hookshot transformation functions, purge Huntarr
- Remove all Huntarr references (webhook removed for security reasons)
- Rewrite transformation functions for all 11 active webhooks via Matrix
  state event API — all now handle the full event payload:
  - Sonarr/Radarr/Readarr/Lidarr: all event types (Grab, Download, Rename,
    Add, Delete, HealthIssue, HealthRestored, ApplicationUpdate) with release
    group, download client, upgrade indicator
  - Grafana: multi-alert support with per-alert severity/instance/summary,
    generator URLs, truncation notice for >5 alerts
  - Proxmox: VM/CT name+ID, task type/status, property bag fields
  - Uptime Kuma: ping time on UP, downtime duration on DOWN, URL linkified
  - Seerr: all notification types, 4K flag, issue type, comment field
  - Owncast: all event types (STREAM_STARTED/STOPPED, USER_JOINED, CHAT)
  - Bazarr: multi-line message support from Apprise JSON payload
  - Tinker-Tickets: preserved as-is (already comprehensive)
- Huntarr state event cleared in room, UUID removed from account_data map
- Owncast and Uptime Kuma functions restored (had lost their functions)
- Hookshot restarted to pick up all changes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 17:40:42 -04:00
jared 103d09c4a9 docs: comprehensive infrastructure audit, Cinny deployment, and optimization pass
- Fix PostgreSQL IP (10.10.10.44, not .2) and add all LXC resource/version details
- Add Cinny Web LXC 106 (10.10.10.6) — Debian 13, Cinny 4.10.5 from add-joined-call-controls
  branch, nginx, HA enabled, weekly auto-update cron, NPM proxy with SSL
- Add Uptime Kuma LXC 101 (10.10.10.25) to infrastructure table
- Add full internal port map, running service table, and key paths for all LXCs
- Apply and document all optimizations:
  - PostgreSQL: shared_buffers 128MB→1500MB, tuning conf, pg_stat_statements, pg_hba lockdown
  - LiveKit: ICE ports 400→1001, TURN TTL 24h→1h, room empty/departure timeouts
  - Synapse: event_cache_size 15K→30K, _get_state_group_for_events cache factor
  - sysctl: TCP/UDP buffer alignment on LXC 151 (BBR noted as host-level only)
  - Bot: nio_store cleared, E2EE key errors resolved
- Add 7 Uptime Kuma monitors (Synapse, LiveKit, PostgreSQL, Cinny, coturn, lk-jwt, hookshot)
- Add Draupnir and Cinny branding as upcoming TODO items
- Update priority order, checklists, and Known Issues throughout

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 17:16:44 -04:00
jared 4b3864bb77 Add Bazarr + Huntarr webhook notifications via Apprise jsons://
Both services now send notifications to the hookshot webhook endpoint:
- Bazarr: switched from broken Apprise Matrix URL to JSON notifier
  with jsons://matrix.lotusguild.org/webhook/<uuid>
- Huntarr: fixed apprise_url from raw https:// to jsons:// scheme

Both hookshot transforms updated to parse Apprise JSON payload:
{version, title, message, type, attachments}

Huntarr avatar set from selfhst icons CDN.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 14:59:04 -05:00
jared 7bfc4d9e4b Remove Welcome room from README (room no longer exists)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 10:31:01 -05:00
jared dff2f0e2b1 Add Wordle, welcome system, integrations, and update roadmap
- Add Wordle game engine with daily puzzles, hard mode, stats, and share
- Add welcome module (react-to-join onboarding, Space join DMs)
- Add Ollama LLM integration (!ask), Minecraft RCON whitelist (!minecraft)
- Add !trivia, !champion, !agent, !health commands
- Add DM routing for Wordle (games in DMs, share to public room)
- Update README: reflect Phase 4 completion, hookshot webhook setup,
  infrastructure migration (LXC 151/109 to large1), Spam and Stuff room,
  all 12 webhook connections with UUIDs and transform notes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 10:29:36 -05:00
jared 28fdc2c24f Update roadmap: rate limiting, media retention, admin dashboard, sliding sync
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 20:06:55 -05:00
jared a9ac9f2f1d Update roadmap: Phase 1 complete - PostgreSQL, TURN, URL previews, search, upload limit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 19:57:01 -05:00
jared 7e35a46145 Combine bot todo and server roadmap into single README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 00:12:19 -05:00
jared a67bc2c33b Initial commit: README with project plan and todo list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 00:06:21 -05:00