- Root cause: parseFromSlice returns slices pointing into the raw JSON
body, but body was freed immediately after parsing in getUpdates
- Fix: return OwnedParsed wrapper that keeps both parsed result and
raw body alive together
- Switch HTTP layer to curl subprocess (more reliable than std.http
with static linking)
- Fix downloadToFile: use spawnAndWait instead of collectOutput
(collectOutput requires both pipes)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Simplify Dockerfile: use pre-built cross-compiled binary instead of
building in Alpine (Alpine only has Zig 0.13, we need 0.15)
- Fix image URL in k8s manifest: git.mikhailkilin.ru (not gitea.)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Long-polling bot that accepts voice messages and video notes,
sends them to Whisper STT API, and replies with transcription text.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>