# hydrant > docs for hydrant, an AT Protocol indexer and relay built on fjall every link below is a page of these docs as markdown. the site itself is https://hydrant.klbr.net/, and https://hydrant.klbr.net/llms-full.txt has every page in one file. ## guide - [hydrant](https://hydrant.klbr.net/overview/index.md): hydrant is an AT Protocol indexer built on the fjall database. it's built to be flexible, supporting both full-network indexing and filtered indexing (e.g., by DID), allowing querying with XRPCs (not only com.atproto.*!), providing an ordered event stream, etc. oh and it can also act as a relay! - [getting started](https://hydrant.klbr.net/getting-started/index.md): building, running, reverse proxying - [configuration](https://hydrant.klbr.net/configuration/index.md): all environment variables - [build features](https://hydrant.klbr.net/build-features/index.md): optional cargo features (relay, backlinks, etc.) - [embedding](https://hydrant.klbr.net/embedding/index.md): running hydrant inside a go (or other non-rust) program ## concepts - [concepts overview](https://hydrant.klbr.net/concepts/index.md): how the stream works, relay comparison, multi-relay support - [vs tap](https://hydrant.klbr.net/concepts/vs-tap/index.md): comparison against tap, the go sync utility - [relay & seeding](https://hydrant.klbr.net/concepts/relay/index.md): multi-relay support, firehose seeding, crawler sources - [retention](https://hydrant.klbr.net/concepts/retention/index.md): how event and record history ttls behave, and what /stats counts under them ## streams - [/stream](https://hydrant.klbr.net/api/stream/index.md): available in builds compiled with the indexer_stream feature. /stream is hydrant's ordered websocket event stream. each subscriber receives a full copy of the stream. - [jetstream](https://hydrant.klbr.net/api/jetstream/index.md): hydrant implements a jetstream-compatible websocket subscription endpoint when compiled with the jetstream feature. it allows clients to consume atproto repository updates (commits, identity updates, and account state transitions) via a simplified, JSON-based format. ## management api - [management api overview](https://hydrant.klbr.net/api/index.md): management API reference - [filter](https://hydrant.klbr.net/api/filter/index.md): NSID filter configuration - [repos](https://hydrant.klbr.net/api/repos/index.md): explicit repository tracking, resyncing, untracking - [ingestion](https://hydrant.klbr.net/api/ingestion/index.md): enable/disable crawler, firehose, backfill at runtime - [crawler](https://hydrant.klbr.net/api/crawler/index.md): crawler source management - [firehose](https://hydrant.klbr.net/api/firehose/index.md): firehose source management - [pds](https://hydrant.klbr.net/api/pds/index.md): bans and rate-limit tier assignments - [database](https://hydrant.klbr.net/api/database/index.md): compression training, compaction ## xrpc - [xrpc overview](https://hydrant.klbr.net/xrpc/index.md): data access via XRPC - [com.atproto.*](https://hydrant.klbr.net/xrpc/atproto/index.md): standard AT Protocol endpoints - [systems.gaze.hydrant.*](https://hydrant.klbr.net/xrpc/hydrant/index.md): hydrant-specific extensions - [identity](https://hydrant.klbr.net/xrpc/identity/index.md): verified mini-doc identity lookups - [repo](https://hydrant.klbr.net/xrpc/repo/index.md): at-uri based record lookups - [links](https://hydrant.klbr.net/xrpc/backlinks/index.md): backlinks (requires --features backlinks) ## Optional - [db layer](https://hydrant.klbr.net/specs/db-layer/index.md): everything hydrant stores goes through src/db. it opens one fjall database, gives each keyspace a typed handle, and owns the writes that have to keep several keyspaces in step, so the rest of the code can't half do them. the record keyspaces it guards are described in record storage. - [record storage](https://hydrant.klbr.net/specs/block-gc/index.md): an indexer keeps the records it indexes in two keyspaces. heads holds the current body of every record, and history holds the bodies that got replaced or deleted, so replaying an old event from /stream can still show the record as it was. everything here is indexer only. a relay stores no records, and ephemeral mode keeps bodies inside its events instead.