Yggdrasil Mesh Network — Complete Setup Guide (TTY / Linux / Arch Friendly)

This guide explains how to install, configure, debug, and verify a working Yggdrasil node from scratch.

Goal: join the IPv6 mesh network reliably using outbound peers + listeners.


What Yggdrasil is

Yggdrasil is a decentralized encrypted IPv6 mesh overlay network.

Features:

  • automatic routing
  • no central servers
  • end-to-end encryption
  • stable node identity via keypair
  • works over TCP / TLS / QUIC
  • multicast discovery on LAN

Install Yggdrasil

Arch Linux

sudo pacman -S yggdrasil

Enable service:

sudo systemctl enable yggdrasil

Generate configuration

Create default config:

sudo yggdrasil -genconf > ~/yggdrasil.conf

Move into place:

sudo mv ~/yggdrasil.conf /etc/yggdrasil.conf

Important: PrivateKey

Example:

PrivateKey: YOUR_PRIVATE_KEY

Never regenerate unless you want a new node identity.


Add peers (recommended inline format)

Find:

Peers: []

Replace with:

Peers: [
  "tcp://ygg-1.okade.pro:20000",
  "tcp://ygg.nadeko.net:44441",
  "tls://ygg.nadeko.net:44442",
  "quic://ip6.casa2.mywire.org:44443?key=000000003cb1cc50e05147fc548f6d1f78e7ffcdc67b456f9bb0db6f0a5e4723",
  "tcp://Yggdrasil.UnderEu.Net:37001",
  "quic://Yggdrasil.UnderEu.Net:37003",
  "tls://ygg.jjolly.dev:3443",
  "tcp://mo.us.ygg.triplebit.org:9000",
  "tls://mo.us.ygg.triplebit.org:993"
]

Why inline format?

Because YAML indentation errors break configs easily.

This avoids them.


Enable incoming connections (important)

Find:

Listen: []

Replace with:

Listen: ["tls://0.0.0.0:0","tls://[::]:0"]

This allows:

  • better mesh participation
  • faster routing convergence
  • more peers connecting to you

Multicast discovery (LAN auto-peering)

Keep enabled:

MulticastInterfaces:
  - Regex: .*
    Beacon: true
    Listen: true

This lets nearby nodes auto-connect.


Restart service

sudo systemctl restart yggdrasil

Verify connection

Check peers:

yggdrasilctl getpeers

Working example output:

URI                State
tcp://peer...      Established
tls://peer...      Established

Empty table means:

node is not connected yet.


Confirm interface exists

Run:

ip addr | grep ygg

Expected:

ygg0

Test connectivity

Ping internal mesh DNS node:

ping6 inv.nadeko.ygg

Success = working mesh connection


Validate configuration syntax

Before restarting service:

sudo yggdrasil -useconffile /etc/yggdrasil.conf -normaliseconf

If config is broken:

command prints exact error line.


Debug connection failures

Check service logs

journalctl -u yggdrasil -n 50

Check active peers

yggdrasilctl getpeers

Columns:

Column Meaning
URI peer address
State connection status
Dir inbound/outbound
RTT latency
RX/TX traffic
Cost routing metric

Most common config errors

1 — YAML indentation

Wrong:

  Peers:

Correct:

Peers:

2 — Tabs instead of spaces

Fix inside vim:

:set expandtab
:retab

3 — Missing commas in inline format

Wrong:

Peers: ["tcp://peer1" "tcp://peer2"]

Correct:

Peers: ["tcp://peer1","tcp://peer2"]

4 — trailing comma

Wrong:

Peers: ["tcp://peer1",]

Confirm node identity

Check IPv6 address:

yggdrasilctl getself

Example:

Address: 200:xxxx:xxxx:xxxx::xxxx

This is your mesh address.

Permanent until PrivateKey changes.


Optional: allow firewall traffic

If using firewall:

sudo ufw allow 0:65535/tcp
sudo ufw allow 0:65535/udp

Verify routing table

yggdrasilctl getroutes

Shows mesh topology paths.


Quick health checklist

Working node checklist:

✔ service running ✔ ygg0 exists ✔ peers connected ✔ IPv6 assigned ✔ ping works ✔ routes visible


Next steps after connection

Once connected you can run:

  • yggdrasil SSH tunnels
  • mesh HTTP services
  • distributed DNS
  • IPFS over Yggdrasil
  • Gemini capsules
  • TTY-native mesh tools
  • offline-first knowledge systems

Perfect foundation for a Manna-lite assistant environment.