v0.3.0
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 withallowed_mentionsset 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 guide —
docs/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 metric —
korvun_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.comFull install and verification walkthrough: docs/packaging/INSTALL.md.
Full commit changelog: v0.2.0...v0.3.0