Commit Graph
73 Commits
Author SHA1 Message Date
Lotus CIandClaude Opus 5.5 bc504a881d docs: call stack upgraded to lk-jwt-service 0.9.0 and LiveKit 1.13.11
Lint / Shell (shellcheck) (push) Successful in 1m31s
Lint / JS (eslint) (push) Successful in 1m31s
Lint / No Hookshot webhook IDs in README (push) Successful in 13s
Lint / No secrets in webhook configs (push) Successful in 22s
Lint / Landing page is rendered (matrix (push) Successful in 14s
Lint / Python (ruff) (push) Successful in 14s
Lint / Secret scan (gitleaks) (push) Successful in 28s
Lint / Shell (shellcheck) (pull_request) Successful in 22s
Lint / Python deps (pip-audit) (push) Successful in 1m7s
Lint / JS (eslint) (pull_request) Successful in 17s
Lint / No Hookshot webhook IDs in README (pull_request) Successful in 19s
Lint / No secrets in webhook configs (pull_request) Successful in 16s
Lint / Landing page is rendered (matrix (pull_request) Successful in 22s
Lint / Python (ruff) (pull_request) Successful in 15s
Lint / Secret scan (gitleaks) (pull_request) Successful in 25s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m25s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-11-03 16:36:28 -05:00
Lotus CIandClaude Opus 5.5 9eca253229 docs: note the 2026-11-03 webhook rotation (Grafana, Proxmox, Uptime Kuma, Ci-Alert)
Lint / JS (eslint) (push) Successful in 38s
Lint / No Hookshot webhook IDs in README (push) Successful in 36s
Lint / Landing page is rendered (matrix (push) Successful in 13s
Lint / Python (ruff) (push) Successful in 25s
Lint / Secret scan (gitleaks) (push) Successful in 17s
Lint / Shell (shellcheck) (push) Successful in 16s
Lint / Shell (shellcheck) (pull_request) Successful in 15s
Lint / JS (eslint) (pull_request) Successful in 16s
Lint / Python deps (pip-audit) (push) Successful in 1m15s
Lint / No Hookshot webhook IDs in README (pull_request) Successful in 7s
Lint / No secrets in webhook configs (pull_request) Successful in 7s
Lint / Landing page is rendered (matrix (pull_request) Successful in 9s
Lint / Python (ruff) (pull_request) Successful in 9s
Lint / Secret scan (gitleaks) (pull_request) Successful in 24s
Lint / No secrets in webhook configs (push) Successful in 12s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m8s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-11-03 00:51:35 -05:00
Lotus CIandClaude Opus 5.5 6e41477a0b docs: stop publishing Hookshot webhook IDs; record the Hookshot and call-stack upgrades
Lint / JS (eslint) (push) Successful in 9s
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / No Hookshot webhook IDs in README (push) Successful in 5s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 10s
Lint / Secret scan (gitleaks) (push) Successful in 7s
Lint / Shell (shellcheck) (pull_request) Successful in 12s
Lint / JS (eslint) (pull_request) Successful in 10s
Lint / No Hookshot webhook IDs in README (pull_request) Successful in 12s
Lint / Python deps (pip-audit) (push) Successful in 56s
Lint / No secrets in webhook configs (pull_request) Successful in 6s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 6s
Lint / Secret scan (gitleaks) (pull_request) Successful in 7s
Lint / Python deps (pip-audit) (pull_request) Successful in 39s
- The README's webhook table listed every Hookshot webhook's full UUID.
  The UUID is the webhook's only secret and this repo is public, so
  anyone could post into Spam and Stuff. Shorten them to 8 characters
  and add CI (readme-no-webhook-ids) rejecting full UUIDs in README.md.
  They remain in git history until rotated.
- Hookshot is now 7.5.0: how it's built (pnpm 7.4.1+, Node 22 limit
  of 7.6.0) and how to swap a new build in.
- Planned lk-jwt-service 0.9.0 / LiveKit 1.13.11 upgrade: the LiveKit
  webhook delegated leave needs, the prometheus config key, and
  restart caveats, from local testing.
- Graceful restart: describe the fixed check (#54).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-11-03 00:34:03 -05:00
Lotus CIandClaude Opus 5.5 811ae9d2cc docs: voice bridge live — bot profile, room setup, upgrade steps
Lint / JS (eslint) (push) Successful in 7s
Lint / Shell (shellcheck) (push) Successful in 7s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 5s
Lint / Secret scan (gitleaks) (push) Successful in 6s
Lint / Shell (shellcheck) (pull_request) Successful in 8s
Lint / JS (eslint) (pull_request) Successful in 10s
Lint / No secrets in webhook configs (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 39s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 17s
Lint / Secret scan (gitleaks) (pull_request) Successful in 9s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m3s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-29 13:22:36 -04:00
Lotus CIandClaude Opus 5.5 46d0e98424 voice-bridge: Discord voice <-> Lotus voice room (patched nether-voicebridge)
Lint / Shell (shellcheck) (push) Successful in 2m0s
Lint / JS (eslint) (push) Successful in 2m1s
Lint / No secrets in webhook configs (push) Successful in 18s
Lint / Landing page is rendered (matrix (push) Successful in 18s
Lint / Python (ruff) (push) Successful in 25s
Lint / Secret scan (gitleaks) (push) Successful in 14s
Lint / Shell (shellcheck) (pull_request) Successful in 9s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / No secrets in webhook configs (pull_request) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 1m7s
Lint / Landing page is rendered (matrix (pull_request) Successful in 4s
Lint / Python (ruff) (pull_request) Successful in 6s
Lint / Secret scan (gitleaks) (pull_request) Successful in 6s
Lint / Python deps (pip-audit) (pull_request) Successful in 30s
Production setup for the Discord voice bridge on LXC 151: config and
appservice-registration templates (secrets rendered on the server), an
idempotent install script (one Synapse restart on first install, creates
the bot account so it can be invited), and a hardened systemd unit.

voice-limit-guard: VOICE_LIMIT_EXEMPT_USERS lets the bridge's own bot
listen in a call without taking a slot; relayed Discord speakers still
count. Unit tests added (61 pass); verified live on the dev stack.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-29 12:51:56 -04:00
Lotus CIandClaude Opus 5.5 b06f422837 docs: bot profiles (names, avatars, where each is set)
Lint / JS (eslint) (push) Successful in 8s
Lint / Shell (shellcheck) (push) Successful in 8s
Lint / No secrets in webhook configs (push) Successful in 10s
Lint / Landing page is rendered (matrix (push) Successful in 9s
Lint / Python (ruff) (push) Successful in 16s
Lint / Secret scan (gitleaks) (push) Successful in 10s
Lint / Shell (shellcheck) (pull_request) Successful in 21s
Lint / JS (eslint) (pull_request) Successful in 12s
Lint / No secrets in webhook configs (pull_request) Successful in 11s
Lint / Landing page is rendered (matrix (pull_request) Successful in 11s
Lint / Python deps (pip-audit) (push) Successful in 1m25s
Lint / Python (ruff) (pull_request) Successful in 9s
Lint / Secret scan (gitleaks) (pull_request) Successful in 9s
Lint / Python deps (pip-audit) (pull_request) Successful in 36s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-29 01:30:24 -04:00
Lotus CIandClaude Opus 5.5 7cf68b6850 docs: the Discord bot login stays on @jared
Lint / Shell (shellcheck) (push) Successful in 19s
Lint / JS (eslint) (push) Successful in 9s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 8s
Lint / Python (ruff) (push) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 53s
Lint / Secret scan (gitleaks) (push) Successful in 8s
Lint / Shell (shellcheck) (pull_request) Successful in 19s
Lint / JS (eslint) (pull_request) Successful in 17s
Lint / No secrets in webhook configs (pull_request) Successful in 6s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m45s
Lint / Secret scan (gitleaks) (pull_request) Successful in 6s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-28 22:14:37 -04:00
Lotus CIandClaude Opus 5.5 0386474118 discord-bridge: bot profile, down alert, login-owner account
Lint / JS (eslint) (push) Successful in 9s
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 6s
Lint / Secret scan (gitleaks) (push) Successful in 8s
Lint / Shell (shellcheck) (pull_request) Successful in 11s
Lint / JS (eslint) (pull_request) Successful in 8s
Lint / No secrets in webhook configs (pull_request) Successful in 5s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 54s
Lint / Python (ruff) (pull_request) Successful in 10s
Lint / Secret scan (gitleaks) (pull_request) Successful in 8s
Lint / Python deps (pip-audit) (pull_request) Successful in 41s
Add the Discord-logo avatar and a script that uploads it as the bridge
bot and sets the display name to "Discord Bridge". Document the new
"Discord Bridge Down" Grafana alert, and why the bot login belongs on a
dedicated non-chatting account: whoever holds it sends to Discord as the
bot instead of through the relay webhook.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-28 21:58:34 -04:00
Lotus CIandClaude Opus 5.5 8f35ab23a3 discord-bridge: Matrix avatars on Discord, catch up missed messages
Lint / JS (eslint) (push) Successful in 15s
Lint / Shell (shellcheck) (push) Successful in 15s
Lint / Landing page is rendered (matrix (push) Successful in 9s
Lint / No secrets in webhook configs (push) Successful in 9s
Lint / Python (ruff) (push) Successful in 11s
Lint / Secret scan (gitleaks) (push) Successful in 15s
Lint / Shell (shellcheck) (pull_request) Successful in 14s
Lint / JS (eslint) (pull_request) Successful in 8s
Lint / No secrets in webhook configs (pull_request) Successful in 7s
Lint / Landing page is rendered (matrix (pull_request) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 1m6s
Lint / Python (ruff) (pull_request) Successful in 5s
Lint / Secret scan (gitleaks) (pull_request) Successful in 9s
Lint / Python deps (pip-audit) (pull_request) Successful in 54s
Set bridge.public_address so relayed messages carry the sender's avatar
(served through a new NPM location for /mautrix-discord/avatar/), listen
on 0.0.0.0 so NPM can reach it, and backfill all Discord messages missed
while the bridge was down.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-28 21:51:02 -04:00
Lotus CIandClaude Opus 5.5 0587f18063 docs: Discord bridge is live; linking notes
Lint / JS (eslint) (push) Successful in 9s
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / No secrets in webhook configs (push) Successful in 8s
Lint / Landing page is rendered (matrix (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 9s
Lint / Secret scan (gitleaks) (push) Successful in 7s
Lint / Shell (shellcheck) (pull_request) Successful in 12s
Lint / JS (eslint) (pull_request) Successful in 11s
Lint / No secrets in webhook configs (pull_request) Successful in 5s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 1m33s
Lint / Secret scan (gitleaks) (pull_request) Successful in 6s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m18s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-28 21:45:21 -04:00
Lotus CIandClaude Opus 5.5 3e6f210f46 Add mautrix-discord bridge config and installer
Lint / Shell (shellcheck) (push) Successful in 12s
Lint / JS (eslint) (push) Successful in 11s
Lint / No secrets in webhook configs (push) Successful in 7s
Lint / Landing page is rendered (matrix (push) Successful in 8s
Lint / Python (ruff) (push) Successful in 12s
Lint / Python deps (pip-audit) (push) Failing after 1m1s
Lint / Secret scan (gitleaks) (push) Successful in 8s
Lint / Shell (shellcheck) (pull_request) Successful in 15s
Lint / JS (eslint) (pull_request) Successful in 14s
Lint / No secrets in webhook configs (pull_request) Successful in 6s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 7s
Lint / Secret scan (gitleaks) (pull_request) Successful in 9s
Lint / Python deps (pip-audit) (pull_request) Failing after 1m54s
Bot-login Discord bridge on LXC 151: config template (DB password is
filled in on the server), systemd unit, and a one-time install script
run from the Proxmox node that sets up the PostgreSQL role/database,
installs the checksum-verified v0.7.7 binary, generates the appservice
registration, adds it to Synapse and restarts Synapse once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-28 21:08:45 -04:00
Lotus CIandClaude Opus 5.5 6cdac33ca4 docs: Synapse 1.164.1
Lint / Shell (shellcheck) (push) Successful in 17s
Lint / JS (eslint) (push) Successful in 16s
Lint / Landing page is rendered (matrix (push) Successful in 7s
Lint / No secrets in webhook configs (push) Successful in 8s
Lint / Python (ruff) (push) Successful in 8s
Lint / Secret scan (gitleaks) (push) Successful in 7s
Lint / Shell (shellcheck) (pull_request) Successful in 10s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / No secrets in webhook configs (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 42s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 7s
Lint / Secret scan (gitleaks) (pull_request) Successful in 9s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m24s
Upgraded on LXC 151 (now on large1) on 2026-10-28 from 1.163.2.
1.164.1 brings msgpack 1.2.4 (GHSA-j586-36cw-2gc2: memory exhaustion via
malformed public room list tokens, reachable unauthenticated) on top of
1.164.0. Checked first: no upgrade notes to act on; MSC4210 (legacy mention
push rules off) handled by matrix#42 and Lotus already sending m.mentions;
null profile values not used (Lotus clears with an empty string).
Verified: client and federation versions report 1.164.1, federation tester
OK, no ERROR/CRITICAL since restart, clients resynced (200).
Rollback package kept (1.163.2+trixie1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-28 15:02:28 -04:00
Lotus CIandClaude Opus 5.5 8a2867e64b docs: Synapse 1.163.2 (Pillow 13 security update)
Lint / Shell (shellcheck) (push) Successful in 15s
Lint / JS (eslint) (push) Successful in 14s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 5s
Lint / Python (ruff) (push) Successful in 6s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Lint / Shell (shellcheck) (pull_request) Successful in 7s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / No secrets in webhook configs (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 39s
Lint / Landing page is rendered (matrix (pull_request) Successful in 4s
Lint / Python (ruff) (pull_request) Successful in 7s
Lint / Secret scan (gitleaks) (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m1s
Upgraded on LXC 151 on 2026-10-26 from 1.162.0 (the README still said
1.159.0). 1.163.2 brings Pillow 13.0.0 (security fixes in the image
thumbnailer). Upgrade notes checked: the new start-up check for
limit_profile_requests_to_users_who_share_rooms does not apply (unset).
Verified: /versions and federation version report 1.163.2, federation
tester OK, no errors since restart, Synapse thumbnailer works with Pillow 13.
Rollback package kept in /var/cache/apt/archives (1.162.0+trixie1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-26 19:23:53 -04:00
Lotus CIandClaude Opus 5.5 d3f389cab1 feat(voice-limit-guard): enforce the limit at connect time too (#25)
Lint / Shell (shellcheck) (push) Successful in 39s
Lint / JS (eslint) (push) Successful in 6s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 43s
Lint / Secret scan (gitleaks) (push) Successful in 9s
Lint / Shell (shellcheck) (pull_request) Successful in 13s
Lint / JS (eslint) (pull_request) Successful in 11s
Lint / No secrets in webhook configs (pull_request) Successful in 10s
Lint / Landing page is rendered (matrix (pull_request) Successful in 11s
Lint / Python (ruff) (pull_request) Successful in 10s
Lint / Python deps (pip-audit) (pull_request) Successful in 50s
Lint / Secret scan (gitleaks) (pull_request) Successful in 5s
The limit was only checked at token issue, and lk-jwt tokens last an hour,
so a token fetched while there was space could be used to connect once the
room was full. The reconcile loop now compares each limited room's
distinct Matrix users with max_users and RemoveParticipants the people who
arrived since the previous sweep, newest first, until it is back within the
limit. People already in the call are never removed (lowering a limit
mid-call kicks nobody); extra devices of one person never count twice.

Fixes #25

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-19 23:30:15 -04:00
Lotus CIandClaude Opus 5.5 b6380b6c8a feat(cinny-web): serve avatar decorations from chat.lotusguild.org/decorations (#22)
Lint / Shell (shellcheck) (push) Successful in 14s
Lint / JS (eslint) (push) Successful in 11s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 32s
Lint / Secret scan (gitleaks) (push) Successful in 4s
Lint / Shell (shellcheck) (pull_request) Successful in 7s
Lint / JS (eslint) (pull_request) Successful in 5s
Lint / No secrets in webhook configs (pull_request) Successful in 4s
Lint / Landing page is rendered (matrix (pull_request) Successful in 3s
Lint / Python (ruff) (pull_request) Successful in 4s
Lint / Python deps (pip-audit) (pull_request) Successful in 30s
Lint / Secret scan (gitleaks) (pull_request) Successful in 4s
Decorations came through Nextcloud's public DAV: a new PHP session (four
cookies) per image and no cache headers, on every decorated avatar. The
set (629 decorations + thumbnails, 573 MB) is now a versioned Gitea
generic package (avatar-decorations 1.0.0, 4 tar parts), pinned by
sha256 in cinny/decorations.sha256. LXC 106's deploy installs it to
/var/www/decorations-<version> (verified against the pin and the
in-package manifest; previous version kept; failures leave the live set
alone), and nginx serves /decorations/ with a one-week public cache.
deploy/publish-decorations.sh publishes a new version and writes the pin.

Fixes #22

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-19 12:32:34 -04:00
Lotus CIandClaude Opus 5.5 076340227f docs(livekit): bind lk-jwt-service to 127.0.0.1:8071, not all interfaces (#24)
Lint / Shell (shellcheck) (pull_request) Successful in 19s
Lint / JS (eslint) (pull_request) Successful in 16s
Lint / No secrets in webhook configs (pull_request) Successful in 9s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (pull_request) Successful in 38s
Lint / Secret scan (gitleaks) (pull_request) Successful in 8s
Lint / Shell (shellcheck) (push) Successful in 14s
Lint / JS (eslint) (push) Successful in 9s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 40s
Lint / Secret scan (gitleaks) (push) Successful in 7s
voice-limit-guard (:8070) is meant to be the only way to get a LiveKit
token, but lk-jwt-service bound :8071 on every interface, so any LAN
host could mint an unguarded token (no max_users, full publish sources
in audio-only rooms). The guard runs on the same LXC: document the
loopback bind in the setup steps and the port table.

Refs #24

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-18 01:27:00 -04:00
Lotus CIandClaude Opus 5.5 cf42d0aab0 docs: registration is closed (SSO/LLDAP only); note Draupnir encryption status
Lint / Shell (shellcheck) (pull_request) Successful in 10s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / No secrets in webhook configs (pull_request) Successful in 4s
Lint / Landing page is rendered (matrix (pull_request) Successful in 5s
Lint / Python (ruff) (pull_request) Successful in 6s
Lint / Python deps (pip-audit) (pull_request) Successful in 52s
Lint / Secret scan (gitleaks) (pull_request) Successful in 6s
Lint / Shell (shellcheck) (push) Successful in 11s
Lint / JS (eslint) (push) Successful in 8s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Landing page is rendered (matrix (push) Successful in 5s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 43s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-16 18:52:37 -04:00
jaredandClaude Opus 5.5 7c857bea1e docs: record the Devdesk hookshot webhook
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / JS (eslint) (push) Successful in 10s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 5s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 44s
Lint / Secret scan (gitleaks) (push) Successful in 6s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 23:34:02 -04:00
jaredandClaude Opus 5.5 5efd214ebe docs: record the Ci-Alert hookshot webhook and how to look up hook UUIDs
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / JS (eslint) (push) Successful in 8s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 43s
Lint / Secret scan (gitleaks) (push) Successful in 6s
The Ci-Alert hook existed (created when ci-alert.js was deployed) but its URL
was never set in Gitea, so every repo's notify-failure job skipped. The org
secret MATRIX_WEBHOOK_URL now points at it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 19:08:53 -04:00
Lotus CIandClaude Opus 5.5 8d47df711d fix(lxc106): deploy script merges config.json and updates itself (#13)
Lint / Shell (shellcheck) (push) Successful in 31s
Lint / JS (eslint) (push) Successful in 5s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Landing page is rendered (matrix (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 8s
Lint / Python deps (pip-audit) (push) Successful in 1m2s
Lint / Secret scan (gitleaks) (push) Successful in 10s
Lint / Shell (shellcheck) (pull_request) Successful in 12s
Lint / JS (eslint) (pull_request) Successful in 12s
Lint / No secrets in webhook configs (pull_request) Successful in 8s
Lint / Landing page is rendered (matrix (pull_request) Successful in 8s
Lint / Python (ruff) (pull_request) Successful in 8s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m15s
Lint / Secret scan (gitleaks) (pull_request) Successful in 12s
LXC 106's matrix-deploy hook has not fired since May: Gitea posts to
10.10.10.6:9000, which webhook.service binds to 127.0.0.1. The same hooks
(same secret) are served by webhook-lotus on :9001; the Gitea hook is being
re-pointed there. Before it starts firing again:

- cinny/config.json is merged into the live file instead of copied over it.
  The live file carries gifApiKey (injected by lotus_deploy.sh), empty in
  git, which a copy would blank. Repo keys win except where the repo value is
  empty and the live one isn't. Backup goes to /root/config-backups; the live
  file is left untouched on error.
- The script installs its own updates (deploy/lxc106-cinny.sh →
  /usr/local/bin/matrix-deploy.sh, after bash -n). Until now repo edits to
  it never reached the server.
- A hooks.json change restarts webhook-lotus 15 s after the script exits,
  since that listener is the one running this script.
- README: port 9001, the file list, and the history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
2026-09-28 18:47:49 -04:00
Lotus CIandClaude Opus 5.5 e28256ab3a docs: note the Element Call headers exception
Lint / Shell (shellcheck) (push) Successful in 9s
Lint / JS (eslint) (push) Successful in 7s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 38s
Lint / Secret scan (gitleaks) (push) Successful in 6s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
2026-09-25 19:26:52 -04:00
Lotus CIandClaude Opus 5.5 23ad133dc3 cinny(nginx): security headers on every location; sync repo with live (cinny #210, #214, #155)
Lint / Shell (shellcheck) (push) Successful in 13s
Lint / JS (eslint) (push) Successful in 12s
Lint / No secrets in webhook configs (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 9s
Lint / Python deps (pip-audit) (push) Successful in 1m9s
Lint / Secret scan (gitleaks) (push) Successful in 10s
Applied on LXC 106 (backed up, `nginx -t`, reloaded) and recorded here:

- Security headers (incl. CSP) moved to snippets/cinny-security-headers.conf
  and included at server level plus in the /sw.js, static-asset and
  json/html locations. nginx drops inherited add_header in any block that
  sets its own, so static assets were served without nosniff and /sw.js
  without a CSP (a service worker takes its CSP from its own script).
  Now every path carries all seven headers. Verified: the SW installs and
  controls the page under the CSP with no violations.
- #214: CSP no longer allows fonts.googleapis.com / fonts.gstatic.com
  (VT323 is self-hosted since cinny 6f250353).
- #155: the /share-target → /share 303 is now live (it was only in the
  repo; the 106 matrix-deploy hook has been dead since May, so repo edits
  never reached it). absolute_redirect off makes it relative.
- README: the snippet, and that 106 needs these applied by hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
2026-09-23 23:17:53 -04:00
Lotus CIandClaude Opus 5.5 1dacf29d53 security(deploy): webhook secrets out of git; all exposed ones rotated
Lint / Shell (shellcheck) (push) Successful in 14s
Lint / JS (eslint) (push) Successful in 11s
Lint / No secrets in webhook configs (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 13s
Lint / Python deps (pip-audit) (push) Successful in 1m46s
Lint / Secret scan (gitleaks) (push) Successful in 11s
deploy/hooks-lxc*.json in this public repo held the HMAC secrets for
every auto-deploy webhook (and 106's cinny-build token), readable
anonymously. Six values had been committed: the four matrix-deploy
secrets, 106's lotus-deploy secret (publicly reachable through
chat.lotusguild.org/hooks/lotus-deploy) and the cinny-build token.

- All six rotated on the servers and in Gitea (matrix hooks 6-9,
  cinny hook 69). The old values are rejected.
- Secrets now live in /etc/webhook/secrets.env (0600) on each LXC, loaded
  by a systemd drop-in that also enables webhook's -template mode; the
  hooks files use {{ getenv "NAME" | js }} placeholders.
- The repo hooks files are now exact copies of the live ones, so they
  also document the *-config-deploy hooks they were missing. Those
  three secrets were never committed and are unchanged.
- README: where the secrets live and how to rotate one.
- CI `hooks-no-secrets` fails if a literal secret lands in a hooks
  file again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
2026-09-23 22:29:52 -04:00
jaredandClaude Opus 5 cccd0084fb docs: record Synapse 1.159.0 upgrade
Lint / Shell (shellcheck) (push) Successful in 29s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 30s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Not a security release. No schema bump, background updates drained,
homeserver.yaml preserved via --force-confold, experimental_features
untouched. MSC4140 delayed events verified still working.

Note the prerequisite: 1.159.0 ships a new expiry on the packages.matrix.org
GPG key, so matrix-org-archive-keyring must be upgraded first or apt fails
with EXPKEYSIG.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 12:15:33 -04:00
jaredandClaude Opus 5 70db0648f1 fix: read LiveKit credentials from env file instead of hardcoding
Lint / Shell (shellcheck) (push) Successful in 25s
Lint / JS (eslint) (push) Successful in 14s
Lint / Python (ruff) (push) Successful in 9s
Lint / Python deps (pip-audit) (push) Successful in 1m39s
Lint / Secret scan (gitleaks) (push) Successful in 18s
LIVEKIT_KEY/LIVEKIT_SECRET were committed in the unit since 68a6acf
(2026-06-12). That secret signs re-issued SFU join tokens, so it
controlled who could publish. Rotated and moved to /etc/matrix-deploy.env
(0600); livekit-server, lk-jwt-service and voice-limit-guard all updated
and verified against the new value.

Environment= overrides EnvironmentFile= regardless of order, so the
hardcoded lines had to be removed rather than shadowed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 01:25:05 -04:00
jaredandClaude Opus 5 d014ef9a04 docs: record PLP storage fix, Synapse 1.158.0, worker triggers
Lint / Shell (shellcheck) (push) Successful in 1m19s
Lint / Python (ruff) (push) Successful in 36s
Lint / Python deps (pip-audit) (push) Successful in 7m6s
Lint / Secret scan (gitleaks) (push) Successful in 38s
Lint / JS (eslint) (push) Successful in 45s
Synapse and PostgreSQL moved to the plpSSDPool Ceph pool (enterprise SSDs
with power-loss protection) after consumer NVMe fsync latency was traced as
the cause of dropped calls: slow fsync stalled restart_delayed_event past
Element Call's 18s delayed_leave_event_delay_ms, firing the MSC4140 delayed
event and clearing every m.call.member at once.

INSERT INTO stream_positions went 87.30ms -> 0.462ms mean.

Also:
- Correct the Synapse version to 1.158.0 (file claimed 1.157.2; the upgrade
  was performed but never logged - second time)
- Correct the push_rules.limits note: the limits are enforced by default in
  1.157.2+, so no config block is needed. Verified against the installed
  synapse/config/push_rules.py
- Record worker revisit thresholds. Synapse measures 0.045 cores, 4.5% of
  its single-process ceiling, so a worker split would add Redis and routing
  to solve a CPU problem that does not exist
- Note that presence is a deliberate, paid-for cost tied to Cinny features
- BBR now applied on compute-storage-gpu-01 as well
- Remove a duplicated "Server Checklist" header

Ceph pool topology and drive-level detail deliberately left out; that
belongs with the cluster docs, not the Matrix README.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 01:15:00 -04:00
Claude 5d420e318c docs: record Synapse 1.157.2 security upgrade
Lint / Shell (shellcheck) (push) Successful in 1m15s
Lint / JS (eslint) (push) Successful in 15s
Lint / Python (ruff) (push) Successful in 11s
Lint / Python deps (pip-audit) (push) Successful in 45s
Lint / Secret scan (gitleaks) (push) Successful in 7s
Upgraded LXC 151 from 1.157.1 to 1.157.2 (packages.matrix.org, Trixie), a
security release fixing 11 advisories (6 High / 3 Moderate / 2 Low; no CVE IDs
assigned). Applies to us: most High-severity issues need open federation (we
federate) and two call out untrusted local users.

Pure apt bump — no upgrade.md notes for v1.157.2, no schema migration,
Python/PostgreSQL minimums unchanged, homeserver.yaml preserved via
--force-confold. Clean restart (NRestarts=0), version endpoint reports 1.157.2,
no errors, federation healthy.

Note: 1.157.2 adds an OPTIONAL push_rules.limits config block (safe defaults)
for the push-rule-exhaustion advisory — captured for later tuning, not required.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 17:05:55 -04:00
Claude 0a451a6f82 docs: record Synapse 1.157.1 upgrade + add upgrade runbook
Lint / Shell (shellcheck) (push) Successful in 11s
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 51s
Lint / Secret scan (gitleaks) (push) Successful in 11s
Upgraded LXC 151 from 1.156.0 to 1.157.1 (packages.matrix.org, Trixie).

The host was found on 1.156.0 despite this README recording 1.155.0 — an
intermediate upgrade had gone unlogged. Corrected the infra and Tech Stack
tables and noted the drift so future upgrades verify with dpkg rather than
trusting the docs.

Not a security release (no CVEs in range; the last were fixed in 1.152.1),
but 1.157.0 fixes an application-service ephemeral-events regression shipped
in 1.156.0, which affects hookshot. No schema-version bump (94 -> 94) and the
three new background updates completed immediately. Our experimental_features
block (MatrixRTC/Element Call MSCs) is unaffected by 1.157.0's removal of
msc3861, which we do not use; it was preserved via --force-confold.

Also adds a Synapse upgrade runbook — the repo had no documented procedure or
automation for this at all, so the two prior upgrades were done out-of-band.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 23:29:41 -04:00
jaredandClaude Opus 4.8 3835ce4020 docs: document on-device message translation
Add the translation feature to the landing page (Newest July 2026
prose + comparison-table row) and the README custom-features table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 16:19:01 -04:00
jaredandClaude Opus 4.8 d9dfc54200 fix(cinny): restore gifApiKey placeholder + redact leaked key from README
Lint / Shell (shellcheck) (push) Successful in 29s
Lint / JS (eslint) (push) Successful in 5s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 34s
Lint / Secret scan (gitleaks) (push) Successful in 5s
The production config.json (cp'd from cinny/config.json by deploy/lxc106-cinny.sh)
lost its "gifApiKey": "" placeholder, so lotus_deploy.sh's sed injection had no
field to fill -> the GIF composer button disappeared (it renders only when
gifApiKey is non-empty). Restore the placeholder so future deploys inject the key.

Also redact the real Giphy key that was committed in the README (it belongs only in
/etc/lotus-deploy.env on LXC 106). NOTE: the key remains in git history (commit
f3a7bcd) — it should be rotated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 00:56:47 -04:00
jaredandClaude Opus 4.8 6d5583398b docs: document cinny inline media embeds
- README Custom Features: 'Inline media embeds' row (16 providers, facade, CSP
  note incl. the live LXC 106 frame-src allowlist vs the repo wildcard fallback).
- landing: add inline media embeds to the July 2026 feature list.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 12:13:02 -04:00
jaredandClaude Opus 4.8 7618b3b091 docs: Slack-style per-thread notifications (P4-1)
Lint / Shell (shellcheck) (push) Successful in 9s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 31s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Landing: thread row + prose note the participating-default notifications with
per-thread All/Mentions/Mute. README: Lotus Cinny threads row extended.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 22:41:04 -04:00
jaredandClaude Opus 4.8 d9585f13f1 docs: July 2026 client batch — threads, math, search cache, session hardening
- landing: Threads row upgraded to ✓ (full side panel + unread chips); prose
  sentence for the new batch (threads, KaTeX math, opt-in encrypted-search
  index, session hardening, crypto diagnostics).
- README: two new rows in the Lotus Cinny custom-features table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 21:48:34 -04:00
jaredandClaude Opus 4.8 daa532835f docs: advertise the Lotus Chat desktop app (native features)
Lint / Shell (shellcheck) (push) Failing after 8s
Lint / JS (eslint) (push) Successful in 7s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 37s
Lint / Secret scan (gitleaks) (push) Successful in 8s
- landing/index.html: desktop-app sentence in the feature prose + a "Desktop App"
  comparison-table section (rich toasts click/reply, jump list, taskbar + volume
  controls, Focus Assist DND, no-sleep, recursive folder upload).
- README.md: a "Desktop app (Tauri)" row in the Lotus Cinny custom-features table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 10:06:13 -04:00
jaredandClaude Opus 4.8 8481610066 docs(call): document soundboard/quality/permissions (README table + landing)
Lint / Shell (shellcheck) (push) Failing after 32s
Lint / Python (ruff) (push) Successful in 10s
Lint / Python deps (pip-audit) (push) Successful in 36s
Lint / Secret scan (gitleaks) (push) Successful in 8s
Lint / JS (eslint) (push) Failing after 13m15s
- README Custom Features table: add rows for the in-call soundboard (P5-15),
  call quality controls, and room call-permissions (P5-31).
- landing: mention the soundboard, per-user quality controls, and
  server-enforced room call-permissions in the feature blurb.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:43:49 -04:00
jaredandClaude Opus 4.8 a06f2c662a feat(livekit-guard): enforce per-room call permissions (screenshare/camera)
Extend voice-limit-guard to enforce a per-room publish-source policy
(io.lotus.room_quality allow_screenshare/allow_camera) for ALL Matrix clients,
alongside the existing participant limit.

- At token issue, re-sign the LiveKit JWT's canPublishSources to drop forbidden
  sources (microphone always kept). Verifies our own secret signed the token
  first and fails open on mismatch, so a secret drift can never mint a token the
  SFU rejects. Limit check and source policy are independent (one's outage can't
  skip the other).
- Live (mid-call) enforcement: a background reconcile loop calls LiveKit
  UpdateParticipant to revoke a forbidden source from participants who joined
  before the policy changed -- which unpublishes their in-progress
  screenshare/camera server-side within ~3s and blocks re-publish. Only removes
  sources (never grants), preserves other permission flags, fails open, and runs
  as a daemon thread that cannot crash or block token issuance.
- Endpoint-specific room-id extraction (/get_token->room_id, /sfu/get->room) so
  a client sending both keys can't get a different room's policy applied.
- Auto-deploy the guard on LXC 151 (py_compile-gated, backup + rollback).
- Unit tests: JWT re-sign/verify + tamper, secret-mismatch, source narrowing,
  reconcile (never-grant / preserve-flags / disable-on-empty), fail-open.

Numeric bitrate/fps caps are NOT server-enforceable on an SFU (LiveKit forwards,
never transcodes) and remain a Lotus-client-cooperative setting; the
screenshare/camera permission is the hard cross-client lever.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:34:34 -04:00
jaredandClaude Opus 4.8 3fe232a6b7 docs: note planned Element Call fork (Lotus Call)
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 5s
Lint / Python deps (pip-audit) (push) Successful in 34s
Lint / Secret scan (gitleaks) (push) Successful in 5s
Tag the EC embed row and add a callout explaining the plan to fork
element-hq/element-call and self-build it for true ownership (decorations,
focus/screenshare, reconnect mic, theming, call-audio injection — all unfixable
against the prebuilt @element-hq/element-call-embedded bundle). Infra notes:
EC uses our LiveKit SFU (livekit/, LXC 151) + lk-jwt-service; a new build/deploy
pipeline will be needed. Full plan: LotusGuild/cinny → HANDOFF_ELEMENT_CALL_FORK.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 20:57:44 -04:00
jaredandClaude Opus 4.8 8c9edf60c3 docs: bump Element Call reference to 0.20.1
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 44s
Lint / Secret scan (gitleaks) (push) Successful in 11s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 04:18:43 -04:00
jaredandClaude Opus 4.8 52e9be1f8d docs: bump Element Call to 0.19.4; add noise suppression to landing
Lint / Shell (shellcheck) (push) Successful in 8s
Lint / JS (eslint) (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 4s
Lint / Python deps (pip-audit) (push) Successful in 33s
Lint / Secret scan (gitleaks) (push) Successful in 6s
- README: correct embedded Element Call version 0.19.3 -> 0.19.4 in the
  Custom Features and Tech Stack tables
- landing/index.html: add a "Noise suppression" row to the Voice & Video
  comparison table (Lotus = 3 tiers incl. on-device RNNoise ML) and note
  the feature in the June 2026 narrative

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 20:30:07 -04:00
jaredandClaude Fable 5 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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
jaredandClaude Sonnet 4.6 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