thiserror

A derive macro for ergonomic, zero-boilerplate custom error types in Rust.

Library
Cargo
v2.0.21
5,584 stars
Apache License 2.0

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
78 /100 Good
Development Activity 76
Maintenance 84
Community 52
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
88 /100 Excellent
Architecture 85
Code Quality 90
Innovation 88
Learning Curve 88

thiserror is a lightweight derive macro that implements Rust’s std::error::Error trait for custom error types, eliminating the boilerplate of hand-written Display and source() implementations. Developers annotate an enum or struct with #[derive(Error)] and per-variant #[error(”…”)] messages, and thiserror generates the trait implementations at compile time with no runtime cost and no trace left in the crate’s public API.

Widely regarded as the standard choice for library authors who want precise, structured error types (as opposed to anyhow’s single dynamic error type for application code), thiserror is used throughout the Rust ecosystem by crates that need typed, matchable error enums with readable messages.

What You Get

  • A #[derive(Error, Debug)] macro that implements std::error::Error for any struct or enum
  • Automatic Display generation via #[error(”…”)] message strings with field interpolation shorthand ({field}, {0}, {field:?})
  • Automatic From impls for variants annotated with #[from], enabling seamless ? operator conversions
  • source() chaining via #[source] or #[from] fields, plus Backtrace capture via #[backtrace] on nightly compilers
  • #[error(transparent)] support for forwarding Display/source straight through to an inner error, useful for opaque public error types

Common Use Cases

  • Defining a library’s public error enum with one variant per failure mode and a human-readable message per variant
  • Wrapping upstream errors (io::Error, serde_json::Error, etc.) with #[from] for seamless ? propagation across module boundaries
  • Building an opaque top-level error type via #[error(transparent)] to hide internal representation from callers while keeping it free to evolve

Under The Hood

Architecture — The project splits into two crates: the public thiserror crate (src/lib.rs) re-exports a single derive macro and a handful of small runtime helper modules (private.rs, var.rs, aserror.rs, display.rs, provide.rs) that generated code relies on for trait-bound checks and provide() support, while the actual codegen lives in the thiserror-impl proc-macro crate (impl/): ast.rs parses the struct/enum into an internal model, attr.rs parses the #[error(…)], #[from], #[source], #[backtrace] attributes, fmt.rs implements the field-interpolation shorthand parser, valid.rs enforces macro-usage constraints at compile time, and expand.rs assembles the final Display/Error/From token streams. build.rs probes the active compiler version to conditionally enable nightly-only Backtrace/provide() features.

Tech Stack — Pure Rust, 2021 edition, MSRV 1.71. The impl crate depends on the standard proc-macro trio (syn, quote, proc-macro2); the public thiserror crate itself has zero runtime dependencies beyond thiserror-impl, keeping compile times and dependency trees minimal. Dual-licensed MIT OR Apache-2.0. Structured as a Cargo workspace with impl/ and tests/no-std/ as members.

Code Quality — Backed by an extensive test suite: unit-style integration tests (test_display.rs, test_from.rs, test_source.rs, test_transparent.rs, test_backtrace.rs, test_generics.rs, test_option.rs, test_path.rs, test_expr.rs, test_lints.rs) plus a 76-file trybuild tests/ui/ suite that asserts the macro’s compile-error messages stay stable and helpful. Clippy lint allowances are explicitly documented rather than silently suppressed. Over 800 commits and a decorated release history (89 releases) reflect long-term maintenance discipline from a single primary maintainer (dtolnay).

API Design — The public surface is intentionally minimal: one derive macro plus a small set of attributes (#[error], #[from], #[source], #[backtrace]). The field-interpolation shorthand (#[error(“{field}”)] instead of write!(”{}”, self.field)) removes nearly all boilerplate from the common case, and the README explicitly contrasts thiserror against anyhow to help users pick the right tool. Because generated code never appears in the crate’s public API, switching to or away from thiserror is a non-breaking change for consumers.

Used by 58 apps in this directory

Python
55%
Other

PostHog

Ab Testing Experimentation · Analytics · Developer Tools

40,397

The all-in-one open source product platform combining analytics, session replay, feature flags, error tracking, AI observability, and a built-in data warehouse in a single self-hostable stack.

View details
92
Repo Health
80
Technical
65
Dependency
Built with
Python 55%
TypeScript 36%
Updated 5 days ago
Java
93%
Apache 2.0

QuestDB

Analytics · Databases

17,466

A high-performance, open-source time-series database built for financial market data, IoT telemetry, and real-time analytics, combining a zero-GC Java/C++ core with SIMD-accelerated SQL and a WAL-to-Parquet storage engine.

View details
91
Repo Health
86
Technical
67
Dependency
Built with
Java 93%
Updated 5 days ago
Rust
63%
MIT

Readur

Bookmarks Archiving · File Storage · Knowledge Management

804

A self-hosted document management system that OCRs, indexes, and makes every PDF, scan, and Office file instantly searchable.

View details
83
Repo Health
78
Technical
67
Dependency
Built with
Rust 63%
TypeScript 32%
Updated 5 days ago
Rust
72%
Apache 2.0

Rivet

AI Agents · Developer Tools

6,326

Stateful actors as a primitive for AI agents, real-time collaboration, and durable execution — with in-memory state, WebSockets, queues, and scheduling built in.

View details
87
Repo Health
81
Technical
64
Dependency
Built with
Rust 72%
TypeScript 25%
Updated 5 days ago
Rust
69%
AGPL 3.0

RustDesk

Networking

126,751

Open-source, self-hosted remote desktop built in Rust — your data, your infrastructure, no third-party cloud.

View details
93
Repo Health
84
Technical
70
Dependency
Built with
Rust 69%
Dart 22%
Updated 5 days ago
TypeScript
61%
AGPL 3.0

Silex

Design Tools · No Code Platforms

3,015

Free, open-source visual website builder that exports clean HTML/CSS — no lock-in, no subscription, host anywhere

View details
89
Repo Health
68
Technical
67
Dependency
Built with
TypeScript 61%
Rust 15%
JavaScript 11%
Updated 6 days ago
Rust
79%
AGPL 3.0

Spacedrive

Collaboration · File Storage

39,292

One file manager for all your devices and clouds — powered by a Virtual Distributed File System built in Rust.

View details
84
Repo Health
84
Technical
63
Dependency
Built with
Rust 79%
TypeScript 18%
Updated 2 weeks ago
Rust
46%
MIT

Svix

Automation · Developer Tools

3,463

Open source, self-hostable webhook infrastructure that handles delivery, retries, HMAC signing, and multi-tenant event management so you never have to build a webhooks system from scratch.

View details
91
Repo Health
77
Technical
67
Dependency
Built with
Rust 46%
C# 16%
Updated 6 days ago
Rust
66%
Apache 2.0

Temps

Analytics · Devops · Monitoring

865

A self-hosted Rust PaaS that replaces Vercel, Sentry, PostHog, Pingdom, Resend, and E2B with one binary — plus 440+ CLI operations agents like Claude Code can drive directly.

View details
81
Repo Health
86
Technical
66
Dependency
Built with
Rust 66%
TypeScript 33%
Updated 6 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers