diff --git a/README.md b/README.md
index 403276a..1e3920e 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,67 @@ anyhow = "=1.0.0-alpha.1"
+## Details
+
+- Use `Result`, or equivalently `anyhow::Result`, as the
+ return type of any fallible function.
+
+ Within the function, use `?` to easily propagate any error that implements the
+ `std::error::Error` trait.
+
+ ```rust
+ use anyhow::Result;
+
+ fn get_cluster_info() -> Result {
+ let config = std::fs::read_to_string("cluster.json")?;
+ let map: ClusterMap = serde_json::from_str(&config)?;
+ Ok(map)
+ }
+ ```
+
+- Attach context to help the person troubleshooting the error understand where
+ things went wrong. A low-level error like "No such file or directory" can be
+ annoying to debug without more context about what higher level step the
+ application was in the middle of.
+
+ ```rust
+ use anyhow::{Context, Result};
+
+ fn main() -> Result<()> {
+ ...
+ it.detach().context("failed to detach the important thing")?;
+
+ let content = std::fs::read(path)
+ .with_context(|| format!("failed to read instrs from {}", path))?;
+ ...
+ }
+ ```
+
+ ```console
+ Error: failed to read instrs from ./path/to/instrs.jsox
+
+ caused by:
+ 0: No such file or directory (os error 2)
+ ```
+
+- Downcasting is supported and can be by value, by shared reference, or by
+ mutable reference as needed.
+
+ ```rust
+ // If the error was caused by redaction, then return a
+ // tombstone instead of the content.
+ match root_cause.downcast_ref::() {
+ Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)),
+ None => Err(error),
+ }
+ ```
+
+- A backtrace is captured and printed with the error if the underlying error
+ type does not already provide its own. In order to see backtraces, the
+ `RUST_LIB_BACKTRACE=1` environment variable must be defined.
+
+
+
## Acknowledgements
The implementation of the `anyhow::Error` type is identical to