Skip to main content

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

OSLinux (x86_64, aarch64), macOS 13+, Windows 11
Memory2 GB minimum, 8 GB+ for production corpora
DiskRoughly 25–40% of your corpus size for the local index
NetworkOne 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.

PlatformInstall
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.

gnarl.yaml (mobile defaults)
node:
power:
index_while: charging
answer_on: [wifi, ethernet]
max_concurrent_queries: 4
Mobile peers are in progress

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