Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 07:39

Korvun v0.3.0

The third release. Korvun speaks Discord: a complete third channel — Gateway
WebSocket in, REST out — validated end to end on real hardware. No breaking
changes: existing Telegram and Webhook setups run unchanged.

Highlights

The Discord channel, hardware-validated (ADR-0033)

Korvun now serves Discord alongside Telegram and the generic Webhook channel. It
is a new adapter behind the same channel.Channel seam — the router, brains, and
policies are untouched — and it was validated end to end on real hardware
(2026-07-19, iMac Intel, macOS 13): a human message in a guild channel was routed
through a brain to a local model, and the reply came back in the same
channel, within the same minute
.

What the channel does:

  • Receiving over the Gateway (WebSocket), with a resume/reconnect supervisor.
    Free-form Discord messages only arrive over the Gateway, so the adapter keeps a
    supervised WebSocket session: it survives connection drops, resumes the
    session where it left off (no missed-event window on a clean resume), backs off
    exponentially between attempts (no reconnect storms), and treats Discord's
    fatal close codes as named terminal errors — no blind retry against an
    unrecoverable close (e.g. an invalid token or a missing intent).
  • Sending over plain REST, with mentions blocked by default. Replies are
    posted with allowed_mentions set to none, so a model's output can never
    ping
    @everyone, @here, a role, or a user — whatever the model writes.
    Long replies are split rune-safely at Discord's 2000-character limit, and a
    429 maps to Korvun's house rate-limit error grammar.
  • A complete anti-loop family. Messages from the bot itself, from other
    bots, and from webhooks are dropped by design at the channel edge — the bot
    cannot answer itself and two bots cannot ping-pong.
  • A step-by-step bot setup guidedocs/DISCORD-SETUP.md:
    Developer Portal, token (environment-only, never in the config file), the
    easy-to-miss Message Content intent switch, the OAuth2 invite, and a
    troubleshooting section grown from the real validation run.
  • A new metrickorvun_channel_reconnects_total{channel} counts Gateway
    reconnects, so a flapping connection is visible on /metrics.

A fourth dependency, deliberately (ADR-0034)

The Gateway needs a WebSocket client, and the Go standard library does not ship
one. v0.3.0 adds the project's fourth direct dependency,
coder/websocket v1.8.15 — pure Go, zero transitive dependencies, so the
cross-compile matrix (six OS/arch targets, CGO_ENABLED=0) is intact. The
decision, the alternatives, and the four-axis dependency test are recorded in
ADR-0034.

Compatibility

No breaking changes. If you use Telegram or the Webhook channel, v0.3.0
changes nothing for you. Discord is an additive config block — a new entry in
channels ("type": "discord", "mode": "gateway", "token_env": "...") plus a
route; see docs/CONFIGURATION.md and the setup guide.

Verifying this release

Releases are signed keyless with cosign (Sigstore)
and ship an SBOM. Verify the checksums signature, then check your archive against the
verified checksums.txt:

cosign verify-blob checksums.txt \
  --signature checksums.txt.sig \
  --certificate checksums.txt.pem \
  --certificate-identity-regexp 'https://github.com/Sebastian197/korvun/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Full install and verification walkthrough: docs/packaging/INSTALL.md.


Full commit changelog: v0.2.0...v0.3.0