Testing OpenGraph tags usually demands a public URL. Tools like Facebook’s Sharing Debugger, Twitter’s Card Validator, and LinkedIn’s Post Inspector fetch live pages, parse meta tags, and render previews. Push to staging or production first, and you risk cache lock-in—Facebook caches aggressively for up to 24-48 hours, forcing manual scrapes or domain verification to clear. Tunnels like ngrok expose localhost temporarily but add latency and potential leaks. Developers waste minutes per iteration.
og-check changes this. It’s a CLI tool from neutils that fetches any URL—including localhost—extracts og:title, og:description, og:image, twitter:*, and other namespaces, then renders a full preview in your terminal. Images appear inline where terminals support it. Run it against http://localhost:4343, and you see the exact social card in seconds, no deployment needed. Feedback loops shrink from minutes to seconds, letting you tweak copy, images, and tags locally.
This matters for anyone building shareable web content. OpenGraph controls 70-80% of link previews across platforms—Facebook, LinkedIn, WhatsApp, Slack. A mismatched title or cropped image tanks click-through rates; studies from Buffer and HubSpot show optimized previews boost shares by 20-30%. But iteration blocks kill momentum. og-check keeps work private, avoids premature exposure, and sidesteps cache wars. In security terms, it reduces blast radius—no accidental prod deploys or tunnel misconfigs leaking dev data.
Terminal Support and Fallbacks
Inline images rely on the Kitty graphics protocol, which transmits images via escape sequences. Supported terminals include:
- Kitty
- Ghostty
- WezTerm
- Konsole
- iTerm2 (with images enabled)
- Warp
- wayst
- st (patched)
- xterm.js (partial, as of early 2026)
The author tested primarily in Ghostty. Unsupported terminals output text: title, description, type, canonical URL, and image URL. No images, but still faster than browsers. Install via neutils (Zig-based suite), then run:
$ og-check http://localhost:3000
Outputs JSON with –json, or markdown previews by default. Skeptical note: Kitty protocol adoption grows but isn’t universal—VS Code’s integrated terminal lags. If your stack runs tmux or older xterm, stick to text mode.
Implementation Breakdown
og-check fetches with Zig’s std.http.Client—no external deps like curl. It parses HTML response for meta tags, buckets by namespace (og:*, twitter:*, article:*, etc.). Builds in-memory markdown, pipes to zigdown for terminal rendering. zigdown handles Kitty escapes: downloads og:image, encodes to protocol bytes, emits directly. No handshake—terminals ignore if unsupported.
JSON mode skips rendering, dumps raw tags via std.json. Simple, lightweight: whole tool under 10k lines of Zig. No runtime deps beyond Zig stdlib. Compare to browser-based previewers (opengraph.xyz): they proxy public URLs only, proxy images (privacy risk), and throttle free tiers.
Limitations? Single-page focus—no SPA hydration or JS-generated tags. Images must be absolute URLs; relative paths fail. External og:image fetches could leak if server logs, but localhost stays local. For SPAs, pair with local proxy serving built assets.
Why adopt? In a world of Vercel previews and Netlify deploys, og-check enforces discipline: perfect locally before ship. Saves hours weekly for frequent sharers—bloggers, SaaS landing pages, newsletters. Fork it on GitHub if needed; Zig’s compile-once-run-anywhere keeps it portable. Test your setup now—iteration speed compounds.