Troubleshooting
Config permission warning
Section titled “Config permission warning”Herald warns when ~/.herald/conf.yaml is readable by group or other users.
chmod 600 ~/.herald/conf.yamlSQLite or CGO build errors
Section titled “SQLite or CGO build errors”Herald uses go-sqlite3, which requires CGO and a C compiler.
On macOS, install command line tools:
xcode-select --installThen rebuild:
make buildIMAP connection fails
Section titled “IMAP connection fails”Check:
- IMAP host and port
- App password or provider-specific password
- Whether IMAP is enabled for the account
- Whether a local bridge, such as Proton Mail Bridge, is running
- Whether the config path passed with
-configis the one you edited
Use debug logging for more detail:
./bin/herald -debugLarge import stalls or network pressure
Section titled “Large import stalls or network pressure”Large mailbox imports can expose provider, bridge, or local network stalls. Herald records each long IMAP fetch phase with folder, range, attempt, duration, retryability, and error details when debug logging is enabled.
Use debug logging while reproducing the issue:
./bin/herald -debug -config ~/.herald/conf.yamlIf import progress stops, include the latest log lines containing IMAP command failed, imap command timed out, fetch envelopes, uid fetch new range, fetch message details, or uid fetch all flags in the bug report. Demo mode should log that it uses offline fixtures, does not open IMAP/Ollama/external HTTP connections on startup, and disables background semantic indexing.
SMTP send fails
Section titled “SMTP send fails”Verify smtp.host, smtp.port, username, and password. Herald tries TLS-first behavior and can fall back to STARTTLS for providers that expect it.
Google OAuth credentials are not configured
Section titled “Google OAuth credentials are not configured”This message means Herald could not find the Google OAuth client ID and client secret needed to start the browser consent flow. Homebrew and release binaries include release defaults. Source builds need either runtime HERALD_GOOGLE_CLIENT_ID and HERALD_GOOGLE_CLIENT_SECRET variables, or a local build made with .herald-dev.env.
For source checkouts, the normal development path is:
cp .herald-dev.env.example .herald-dev.env$EDITOR .herald-dev.envmake build./bin/heraldThe general .env file is not read by make build for OAuth defaults. See Local OAuth Builds for runtime-only credentials, release-style local builds, and custom env file paths.
AI unavailable
Section titled “AI unavailable”For Ollama, check that the server is running:
curl http://localhost:11434/api/tagsThen confirm your config includes:
ollama: host: "http://localhost:11434" model: "gemma3:4b" embedding_model: "nomic-embed-text-v2-moe"If AI is unavailable, Herald should keep the TUI responsive and show concise AI status instead of blocking mailbox use.
Body not cached in MCP
Section titled “Body not cached in MCP”Some MCP tools need cached body text. Open the email in the TUI first so Herald fetches and caches the body, then retry the MCP tool.
Demo, virtual lab, or live config?
Section titled “Demo, virtual lab, or live config?”Use the smallest realistic surface that can prove the issue:
- Demo mode is synthetic and best for UI smoke checks, screenshots, and presentations.
- The internal virtual mail lab is for development tests that need realistic MIME, calendar, inline image, draft, reply, or send behavior without private mail.
- Live config is for provider-specific behavior such as OAuth, bridge quirks, server folders, throttling, or production IMAP/SMTP differences.
Bug reports and test reports should say which surface reproduced the issue. If a virtual-lab fixture exists for a failure, include its scenario name so the bug can be replayed without personal data.
Terminal layout looks wrong
Section titled “Terminal layout looks wrong”Try a larger terminal first. The TUI is responsive, but very small terminals can trigger fallback layouts.
Useful sizes for layout checks:
tmux new-session -d -s herald-doc-check -x 220 -y 50tmux resize-window -t herald-doc-check -x 80 -y 24tmux resize-window -t herald-doc-check -x 50 -y 15If rendering artifacts appear, capture the pane and include the terminal size in the bug report.
Terminal images do not render
Section titled “Terminal images do not render”Inline raster images depend on terminal graphics support. Native iTerm2, Ghostty, and Kitty checks are authoritative for exact placement. The ttyd browser harness is useful for repeatable browser-visible pixel checks, but stock ttyd can relocate or omit later images and should be treated as a smoke lane. Terminals without supported raster protocols should show safe placeholders or open-image links instead of corrupting layout.