Install Gnarl
A Gnarl node is a single self-contained binary. There is no cluster to provision and no external datastore to stand up first.
Requirements
| OS | Linux (x86_64, aarch64), macOS 13+, Windows 11 |
| Memory | 2 GB minimum, 8 GB+ for production corpora |
| Disk | Roughly 25–40% of your corpus size for the local index |
| Network | One inbound TCP port (default 7420) for peers |
macOS and Linux
curl -fsSL https://get.gnarl.dev | sh
The installer drops the binary in /usr/local/bin/gnarl and does nothing else —
no daemons registered, no config written until you ask for it.
Verify the install:
gnarl version
gnarl 0.1.0 (aarch64-apple-darwin)
index format 1 · protocol 1
Homebrew
brew install lucenia/tap/gnarl
Docker
docker run --rm -it \
-p 7420:7420 \
-v "$PWD/corpus:/data:ro" \
-v gnarl-index:/var/lib/gnarl \
ghcr.io/lucenia/gnarl:latest node up --data /data
Mount your corpus read-only. Gnarl never writes to the data you point it at — the index lives in its own directory.
Mobile
Phones and tablets are full peers, not thin clients — they index locally and answer queries for the data they hold.
| Platform | Install |
|---|---|
| iOS / iPadOS 17+ | Gnarl Peer on the App Store |
| Android 12+ | Gnarl Peer on Google Play |
Mobile peers default to conservative settings: they index on charge, answer only on unmetered networks, and cap fan-out participation to protect the battery.
node:
power:
index_while: charging
answer_on: [wifi, ethernet]
max_concurrent_queries: 4
iOS and Android peers are actively being built. Track progress on the roadmap.
First run
gnarl node up --data ./corpus
▸ node id n1qh7f…c2a8
▸ listening 0.0.0.0:7420
▸ indexing ./corpus
· 12,840 documents · 3.1 GB · 41s
▸ manifest published locally (not announced)
▸ ready
At this point the node is searchable by you and invisible to everyone else. Nothing is announced until you explicitly join a network.
gnarl search "glacier retreat" --local
Next
- Join the network — announce your node to peers.
- Publish your first index — control what you expose.