A fork of Citrine (the Nostr relay for Android) that turns your phone into a validating index relay and search node for SIP-01 — the Decentralized Search Index Protocol on Nostr.
One shared decentralized index. Many independent indexers. Many independent search engines. No single owner — and now the index fits in your pocket.
Crawlers like Crawlstr and indexstr publish signed kind 39697 web index observations; this relay validates, indexes, replicates, and serves them — the same relay profile as the UNCAGED Index Relay, on Android:
- Ingestion validation (SIP-01 §12.4) — malformed observations are rejected with
OK false invalid: …: schema version,d↔ normalized-uconsistency,x↔ content-hash consistency, URL allowlist, and all hard length caps are enforced at the door - Byte-compatible URL normalization & hashing (§7, §3, §8) — the spec's §13 test vectors run as unit tests (
WebDocumentTest), so this relay deduplicates identically to every other implementation - Structured indexing (relay profile §2) — observations are extracted into dedicated fields (
WebIndexEntity: url, host, file extension, title, description, language, content hash, published/observed/first-seen timestamps, source, and thetype/platform/category/network/country/mimeextension tags) while the signed event stays the source of truth - NIP-50 web-search operators (§4) —
site:,domain:,url:,inurl:,title:,topic:,type:,platform:,category:,network:,country:,mime:,filetype:,source:,lang:,before:,after:,distinct:domain/distinct:author, each filter with a negated-op:form - NIP-11 capability advertisement (§5) — the relay information document carries the
uncaged_indexblock (sip01,nip50,nip77, document kinds, operator-declared scope/domains/languages/document types) - Index replication (§6 federation) — optional sync subscribes to kind 39697 on peer index relays, so the phone keeps a live, fully searchable copy of the shared index even offline; WiFi-only and pause-on-limited-network modes included
- Plain NIP-01 filters (
kinds,#d,#t,#u,#x,authors,since/until) keep working against the same stored events
Example search, straight from any Nostr client connected to the phone:
["REQ", "search", {
"kinds": [39697],
"search": "bitcoin privacy site:github.com lang:en after:2026-01-01",
"limit": 50
}]- Export database
- Import database
- Export only events from your account
- Manage the relay (port, icon, user, start, stop)
- Broadcast events after coming back online
- Add content resolvers
Issues and pull requests are very welcome.


