• v3.4.0 2b6a8ff354

    v3.4.0
    Some checks failed
    CI / Docker image build (push) Successful in 13s
    Release / Create Forgejo release (push) Successful in 18s
    CI / Backend lint (ruff) (push) Successful in 36s
    Release / Build and push versioned images (push) Failing after 9s
    CI / Bot tests and audit (push) Successful in 1m46s
    CI / Backend migration, tests, and audit (push) Failing after 2m23s
    CI / Frontend tests, audit, and build (push) Successful in 3m40s
    Stable

    rbrooks released this 2026-07-16 06:08:49 +00:00 | 739 commits to main since this release

    Reliability, operations & self-hosting.

    All 14 milestone issues. Makes failures visible and recoverable and smooths
    deploy/upgrade for self-hosters. Backend and bot suites green (backend 395,
    bot 186).

    Added

    • [webapp+bot] At-least-once bot event delivery — backend→bot session events
      now flow over a durable Redis Stream (qb:bot:events) with a consumer group
      and per-event event_id idempotency, replacing fire-and-forget pub/sub that
      silently dropped events while the bot was down and could double-post on the
      HTTP fast path. (#81)
    • [webapp] Automatic ordered migrations on deploy — a one-shot migrate
      service runs alembic upgrade head before backend/worker/beat start; fresh
      installs self-provision and app services never boot against an old schema. (#89)
    • [webapp+bot] Version handshakeGET /api/bot/meta plus a bot startup
      check refuse to run on a contract-version mismatch and warn on drift. (#93)
    • [webapp] VAD silence-trim before transcription (opt-in, Admin → Bot
      Settings) cuts Whisper time/cost by transcribing only speech spans, with exact
      session-relative timestamp offsets. (#101)
    • [webapp] Pagination (limit/offset + X-Total-Count header) on list
      endpoints, backward compatible. (#99)
    • [webapp] Background-job failure counters (backup_failed_total,
      celery_task_failed_total, bot_event_delivery_failed_total), example
      Prometheus alert rules, and an optional Sentry hook. (#86)
    • [ops] Container hardening — worker/beat/frontend healthchecks, memory
      limits, and Redis AOF persistence. (#84)
    • [ci] Versioned Docker images published to the Forgejo container registry
      on tag. (#91)
    • [ops] Disaster-recovery docs — restore runbook, off-host backup copies,
      and media-volume backup. (#80)

    Changed

    • [bot] Recording streams to disk instead of buffering whole sessions in RAM
      — memory is now bounded (was ~20 GB for a 5-person/6-hour session), and audio
      survives a crash. (#82)
    • [webapp] Backend hot-path performance — module-level Redis connection
      pools, SSE releases its pooled DB session, N+1 vote/NPC queries replaced with
      grouped aggregates, and a sessions (status, confirmed_time) composite
      index. (#96)
    • [webapp+bot] Pinned Python base image to 3.12 to match CI and avoid the
      3.13+ stdlib audioop removal that discord.py voice needs. (#87)
    • [webapp] Tree-wide ruff format applied and enforced as a CI gate. (#20)

    Fixed

    • [webapp] Celery event-loop crashes — every task now uses a per-call
      NullPool session (task_session()), fixing intermittent "Future attached to a
      different loop" failures in recap-email and vote auto-close. (#129)
    Downloads