Rust 1.85+ · no_std

whereat

Know where the bug is at() — without panic!, debuginfo, or overhead. Replace ? with .at()? in your call tree for beautiful, async-friendly stacktraces with GitHub links.

Essential Features

Clean, minimal, and focused on content

Zero Ok-Path Cost

No heap allocation, no work, no overhead when your code succeeds. Tracing only happens when errors propagate.

Tiny sizeof

At<E> is sizeof(E) + 8 bytes. One pointer for a boxed trace. Your error enum stays the same size it was, plus a pointer.

100x Faster Than Backtrace

18ns per frame vs 2,500ns+ for backtrace/anyhow with RUST_BACKTRACE=1. Captures file:line:col at compile time via #[track_caller].

no_std Compatible

Works with core + alloc. No std required. Use it in embedded, WASM, or anywhere you need error context without a full standard library.

Cross-Crate Tracing

at!() and at_crate!() macros capture crate metadata for GitHub, GitLab, Gitea, and Bitbucket links. See exactly which crate each frame came from.

Works With Everything

Compatible with plain enums, structs, thiserror, anyhow, or any type with Debug. No changes to your error types required.

Quick Start

Add whereat to your project and start tracing errors.

[dependencies] whereat = "0.1"
[dependencies] whereat = "0.1" # In lib.rs: # whereat::define_at_crate_info!();
docs.rs

Start Tracing Errors

whereat is lightweight, production-ready, and works with any error type you already have.

Read the Docs