Commit Graph

38 Commits

Author SHA1 Message Date
jared b9a251bd7a Integrate matrixbot into existing LXC 151 deploy hook
Lint / Shell (shellcheck) (push) Successful in 11s
Lint / JS (eslint) (push) Successful in 6s
Removed standalone matrixbot/deploy.sh — deploy is handled by the existing
webhook system. Added matrixbot/ block to deploy/lxc151-hookshot.sh: on push,
if any matrixbot/ file changed, source files are synced to /opt/matrixbot and
matrixbot.service is restarted automatically.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 16:18:10 -04:00
jared 52c4781e64 Add matrixbot source to repo
All bot source files from LXC 151 (/opt/matrixbot) are now tracked here.
Secrets (.env, credentials.json), venv dirs, and runtime state files
(nio_store, welcome_state.json, wordle_stats.json) are excluded via .gitignore.
Includes deploy.sh to sync files to /opt/matrixbot and restart the service.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 16:16:38 -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 735c1eb30e ci: add lint workflow, shellcheck fixes, and CI failure hookshot alert
Lint / Shell (shellcheck) (push) Has been cancelled
Lint / JS (eslint) (push) Has been cancelled
- .gitea/workflows/lint.yml: new workflow running shellcheck on .sh files
  and eslint on hookshot/ JS transform scripts
- hookshot/.eslintrc.json: declare data/result as hookshot globals
- hookshot/ci-alert.js: new Matrix hookshot transform for CI failure alerts
- hookshot/deploy.sh: fix SC2155 (split local/assign), SC2034 (remove unused var)
- systemd/livekit-clear-port.sh: fix SC2148 (invalid shebang escape)
- cinny/dev-update.sh: fix SC2115 (use ${WEB_ROOT:?} to guard rm -rf)
- deploy/lxc151-hookshot.sh: add shellcheck source=/dev/null for sourced file
- .gitignore: ignore node_modules/
- package.json + package-lock.json: eslint@8 dev dependency

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 16:25:39 -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 69449803fd feat(hookshot): expand tinker-tickets transform for all event types
Previously only handled ticket_created. Now handles:
- status_changed: shows old → new status with actor name
- comment_added: shows author + 200-char preview (opt-in via MATRIX_NOTIFY_COMMENTS)
- mention: targeted notification when @username used in comment
- assigned: shows new assignee + actor (opt-in via MATRIX_NOTIFY_ASSIGNMENTS)

Unknown events fall back to a debug line rather than being silently dropped.
Avatar updated to ticket emoji via Synapse admin API (mxc already applied live).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 21:50:30 -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 c1e21004be landing: full mobile responsiveness pass
- Sticky first table column (feature names stay visible while scrolling horizontally)
  with opaque background to properly cover scrolled content
- body: align-items flex-start on mobile to prevent vertical clipping
- ≤540px breakpoint: reduced logo, h1, padding, table font/cell sizes,
  homeserver code word-break, client card tags stack vertically
- ≤380px breakpoint: further compression for very small phones
- Swipe hint ("← swipe to compare →") shown on touch devices above table,
  auto-hides after first scroll via JS
- Privacy strip stacks vertically on small screens
- Footer/legal tighter spacing on mobile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:06:00 -04:00
jared 2b284d3da7 landing: fix Commet E2EE voice, add deleted message visibility row
- Commet voice/group calls: mark partial — no E2EE encrypted voice rooms yet
- Add "Deleted message visibility" row: Cinny hides deleted messages entirely;
  Element X, FluffyChat, Commet, Element, Nheko all show a redaction placeholder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:02:08 -04:00
jared 2f1754e7bb landing: add full feature comparison table + dev branch notes
- Add 6-client comparison table (Cinny dev, Element X, FluffyChat, Commet, Element, Nheko)
  covering platform, security, calling, core features, UX/extras — ✓/~/✗ with context notes
- Note chat.lotusguild.org is the dev/beta branch of Cinny; add link to stable cinny.in
- Add "Dev Branch" purple tag to featured Cinny card
- Expand container to 900px to accommodate table; table scrolls on mobile
- Add encryption architecture note (Vodozemac Rust SDK vs matrix-js-sdk) in table footer
- Add table legend

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:57:55 -04:00
jared 907d600999 landing: overhaul client listings with accurate March 2026 data
- Replace flat client buttons with descriptive cards showing platforms, features, and caveats
- Cinny featured card: "Voice & Video Rooms" (accurate — not DMs, space rooms only)
- Element X: correct platforms (iOS/Android only), add Rust SDK + Screenshare tags
- FluffyChat: add "Calls Experimental" tag with homeserver caveat
- Commet: fix to Android/Windows/Linux only (remove incorrect iOS listing), add multi-account/GIF/calendar notes
- Element desktop: add Screenshare tag, note resource usage
- Nheko: add as native lightweight desktop alternative
- Remove SchildiChat (unverified/outdated)
- Add encryption security note (Vodozemac Rust SDK vs matrix-js-sdk)
- Add new CSS: .client-card, .tag.rust, .tag.experimental, .tag.platform, .security-note

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:51:07 -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 5e936b2ca1 Add auto-deployment infrastructure for all 4 LXCs
- Per-LXC deploy scripts (lxc151-hookshot, lxc106-cinny, lxc139-landing, lxc110-draupnir)
- Per-LXC webhook hook configs with unique HMAC-SHA256 secrets
- Livekit graceful restart script + systemd timer (waits for zero active calls)
- Fix hookshot/deploy.sh capitalization bug (Uptime-Kuma, Tinker-Tickets, etc.)

Each LXC independently clones repo and runs its own deploy.sh via adnanh/webhook on port 9000.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 11:41:32 -04:00
jared 0e275d725e refactor: replace old bot code with Matrix infra configs and scripts
- Remove obsolete Python bot (Wordle, commands, callbacks, welcome)
- Add hookshot/ — all 11 webhook transformation functions + deploy.sh
- Add cinny/ — config.json and dev-update.sh (nightly dev branch build)
- Add landing/ — matrix.lotusguild.org landing page HTML
- Add systemd/ — livekit-server, draupnir, cinny cron unit files
- Add draupnir/ — production config (access token redacted)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 10:36:51 -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 1219b73492 Use NYT Wordle API for daily word instead of local list
Fetches today's word from https://www.nytimes.com/svc/wordle/v2/YYYY-MM-DD.json
so puzzle numbers and solutions match the official NYT Wordle. Results are
cached per day; falls back to the local answer list if the API is unreachable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 10:21:30 -05:00
jared d0fd260336 Auto-share Wordle result to origin room on game end
Instead of posting "Check your DMs" when !wordle is used in a public
room, the bot now silently routes the game to DMs and automatically
posts the spoiler-free emoji share grid back to the origin room (e.g.
Commands) when the game ends — win, lose, or give up.

Also removed the "use !wordle share" prompt from win/loss messages
since sharing now happens automatically.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-21 14:23:57 -05: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 889569c087 Fix !wordle silence in public rooms — notify user to check DMs
When !wordle is used in a public room (e.g. Commands), the bot now
sends "📬 Check your DMs to play Wordle!" before redirecting the game
to a DM. Previously the user saw no response at all.

Also refactors handle_wordle to resolve the DM room once and reuse it
across all subcommands, eliminating repeated _get_dm_room calls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-20 10:39:11 -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 5723ac3581 Add Phase 2: integrations, admin, and remaining commands
New commands: agent, trivia (with 30s timer reveal), ask (Ollama LLM
with cooldown), minecraft (RCON whitelist), health (admin-only metrics).
Adds metrics tracking, per-user cooldowns, and admin permission checks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 20:52:57 -05:00
jared 50de731a82 Add Matrix bot Phase 1: core setup + fun commands
Modular bot using matrix-nio[e2e] with E2EE support, deployed as
systemd service on Synapse LXC. Includes 10 commands: help, ping,
8ball, fortune, flip, roll, random, rps, poll, champion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 20:42:28 -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