id = "i2pd"
name = "i2pd"
homepage = "https://github.com/PurpleI2P/i2pd"
description = "A lightweight, high-performance C++ I2P router."
executables = ["i2pd"]
[dotfiles]
paths = []
secret = ["~/.i2pd/i2pd.conf", "~/.i2pd/tunnels.conf"]
[commands]
format = 1
label = "Run the i2pd router"
description = "Start the router with common overrides. Every option can also be set in i2pd.conf; transport, tunnel and per-service options are left out."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = false, short_bundles = false }
[[commands.source]]
id = "man"
kind = "manual"
url = "https://github.com/PurpleI2P/i2pd/blob/openssl/debian/i2pd.1"
revision = "openssl 2026-10"
evidence = """
--conf=
--tunconf=
--log=
Logs destination: stdout, file, syslog
--logfile=
--loglevel=
Log messages above this level (debug, info, warn, error, none)
--datadir=
--port=
--ipv6
--floodfill
--bandwidth=
"""
[[commands.source]]
id = "docs"
kind = "manual"
url = "https://github.com/PurpleI2P/i2pd_docs_en/blob/master/docs/user-guide/configuration.md"
revision = "master 2026-10"
evidence = """
for example, running i2pd with argument `--port=10123` and setting option `port = 10123` in config file will have
./i2pd --datadir .
Run `./i2pd --help` to show builtin help message
and use `--http.theme=hacker`.
daemon | Router will go to background after start (default: true)
"""
[[commands.field]]
id = "conf"
label = "Config file"
type = "path"
path = { kind = "file", role = "input" }
option = ["--conf"]
sources = ["man"]
[[commands.field]]
id = "datadir"
label = "Data directory"
type = "path"
path = { kind = "directory", role = "input" }
option = ["--datadir"]
sources = ["man"]
[[commands.field]]
id = "port"
label = "Listen port"
type = "integer"
option = ["--port"]
sources = ["man"]
[[commands.field]]
id = "log"
label = "Log destination"
type = "enum"
option = ["--log"]
choices = [{ value = "stdout", label = "stdout" }, { value = "file", label = "File" }, { value = "syslog", label = "syslog" }]
sources = ["man"]
[[commands.field]]
id = "loglevel"
label = "Log level"
type = "enum"
option = ["--loglevel"]
choices = [{ value = "debug", label = "Debug" }, { value = "info", label = "Info" }, { value = "warn", label = "Warn" }, { value = "error", label = "Error" }, { value = "none", label = "None" }]
sources = ["man"]
[[commands.field]]
id = "logfile"
label = "Log file"
type = "path"
path = { kind = "file", role = "output" }
option = ["--logfile"]
sources = ["man"]
[[commands.field]]
id = "ipv6"
label = "Enable IPv6"
type = "boolean"
option = ["--ipv6"]
sources = ["man"]
[[commands.field]]
id = "floodfill"
label = "Run as floodfill"
type = "boolean"
option = ["--floodfill"]
sources = ["man"]
[[commands.field]]
id = "bandwidth"
label = "Bandwidth limit"
description = "KBps or a letter alias L, O, P, X."
type = "string"
option = ["--bandwidth"]
sources = ["man"]
[[commands.task]]
id = "foreground"
label = "Run with a data directory"
fields = ["datadir", "log", "loglevel"]
required = ["datadir"]
[[commands.group]]
id = "basic"
label = "Basic"
fields = ["conf", "datadir", "port", "log", "loglevel", "logfile"]
[[commands.group]]
id = "advanced"
label = "Advanced"
fields = ["ipv6", "floodfill", "bandwidth"]