···55The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7788-## v3.0.0 - Unreleased
88+## [v3.0.0] - Unreleased
991010### Changed
1111···1313- [possum] Most functions now create a new request internally when being called,
1414 there's no need to pipe `request.new()` into them.
15151616-## v2.1.0 - 2026-07-12
1616+## [v2.1.0] - 2026-07-12
17171818### Added
1919
+4-6
README.md
···2323### Decentralized Identifiers (DIDs)
24242525```gleam
2626-import gleam/http/request
2726import possum/did
2827import possum/handle
2928import possum
···3534// Handle validation
3635let assert Ok(handle) = handle.parse("gleam.run")
37363838-request.new()
3939-|> request.set_host("slingshot.microcosm.blue")
4040-|> possum.resolve_handle(handle)
3737+// Resolve an atproto handle (hostname) to a DID.
3838+let request =
3939+ possum.resolve_handle(handle, pds: "slingshot.microcosm.blue")
41404241// Use `did.parse` to turn strings into valid DID format
4342let assert Ok(did) = did.parse("did:plc:ewvi7nxzyoun6zhxrhs64oiz")
···4645### Building HTTP Requests
47464847```gleam
4949-import gleam/http/request
5048import possum/did
5149import possum/nsid
5250import possum
53515452let assert Ok(did) = did.parse("did:plc:ewvi7nxzyoun6zhxrhs64oiz")
5555-let assert Ok(collection) = nsid.parse("sh.tangled.repo")
5353+let assert Ok(collection) = nsid.parse("site.standard.document")
56545755// Reading public data from repositories, no Authorization needed.
5856let request =