{
  "id": "ttl",
  "name": "ttl",
  "homepage": "https://github.com/lance0/ttl",
  "description": "Fast, modern traceroute with real-time TUI, per-hop stats, ASN/geo lookup, ECMP detection, and MPLS label parsing. A better mtr.",
  "executables": [
    "ttl"
  ],
  "platforms": [
    "macos",
    "linux"
  ],
  "dotfiles": {
    "paths": [
      "~/.config/ttl/config.toml",
      "[appData]/ttl/config.toml",
      "[preferences]/ttl/config.toml"
    ],
    "exclude": [],
    "secret": []
  },
  "commands": {
    "format": 1,
    "label": "Trace route",
    "description": "Trace the path to one or more hosts with ttl. Output modes other than the report, replay, diff, Prometheus and enrichment options are left out.",
    "quality": "ai-draft",
    "parser": {
      "end_of_options": "--",
      "interleave": "permute",
      "long_equals": true,
      "short_attached": true,
      "short_bundles": false
    },
    "source": [
      {
        "id": "help",
        "kind": "manual",
        "url": "https://github.com/lance0/ttl/blob/master/docs/FEATURES.md#cli-reference",
        "revision": "2026-10-27",
        "evidence": "  -c, --count <N>            Probe rounds; 0 = run until quit (default: 0)\n  -i, --interval <S>         Seconds between rounds (default: 1.0)\n  -m, --max-ttl <N>          Maximum TTL, 1-64 (default: 30)\n  -p, --protocol <P>         auto, icmp, udp, tcp (default: auto)\n      --flows <N>            Flows for ECMP detection, 1-16 (default: 1; needs UDP or TCP)\n  -4, --ipv4                 Force IPv4\n  -6, --ipv6                 Force IPv6\n      --no-dns               Skip reverse DNS\n      --no-tui               Plain text output, one line per hop each round\n      --report               Text report at the end of the run (requires -c)\nUsage: ttl [OPTIONS] [TARGETS]...\n"
      }
    ],
    "field": [
      {
        "id": "targets",
        "label": "Targets",
        "description": "Hostnames or IP addresses. Empty opens an interactive session.",
        "type": "string",
        "position": 0,
        "multiple": true,
        "sources": [
          "help"
        ]
      },
      {
        "id": "count",
        "label": "Rounds",
        "description": "0 runs until quit.",
        "type": "integer",
        "option": [
          "--count",
          "-c"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "interval",
        "label": "Interval (seconds)",
        "type": "number",
        "option": [
          "--interval",
          "-i"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "max_ttl",
        "label": "Maximum TTL",
        "type": "integer",
        "option": [
          "--max-ttl",
          "-m"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "protocol",
        "label": "Protocol",
        "type": "enum",
        "option": [
          "--protocol",
          "-p"
        ],
        "choices": [
          {
            "value": "auto",
            "label": "Auto"
          },
          {
            "value": "icmp",
            "label": "ICMP"
          },
          {
            "value": "udp",
            "label": "UDP"
          },
          {
            "value": "tcp",
            "label": "TCP"
          }
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "flows",
        "label": "ECMP flows",
        "description": "Needs UDP or TCP.",
        "type": "integer",
        "option": [
          "--flows"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "ipv4",
        "label": "Force IPv4",
        "type": "boolean",
        "option": [
          "--ipv4",
          "-4"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "ipv6",
        "label": "Force IPv6",
        "type": "boolean",
        "option": [
          "--ipv6",
          "-6"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "no_dns",
        "label": "Skip reverse DNS",
        "type": "boolean",
        "option": [
          "--no-dns"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "no_tui",
        "label": "Plain text output",
        "type": "boolean",
        "option": [
          "--no-tui"
        ],
        "sources": [
          "help"
        ]
      },
      {
        "id": "report",
        "label": "Text report at end",
        "description": "Requires a round count.",
        "type": "boolean",
        "option": [
          "--report"
        ],
        "sources": [
          "help"
        ]
      }
    ],
    "task": [
      {
        "id": "live",
        "label": "Live trace",
        "fields": [
          "targets",
          "protocol",
          "ipv4",
          "ipv6",
          "no_dns"
        ],
        "required": [
          "targets"
        ]
      },
      {
        "id": "report",
        "label": "100-round report",
        "set": {
          "count": [
            100
          ],
          "report": [
            true
          ]
        },
        "lock": [
          "report"
        ],
        "fields": [
          "targets",
          "count",
          "protocol",
          "interval",
          "no_dns"
        ],
        "required": [
          "targets"
        ]
      }
    ],
    "group": [
      {
        "id": "basic",
        "label": "Basic",
        "fields": [
          "targets",
          "count",
          "protocol",
          "interval",
          "report"
        ]
      },
      {
        "id": "advanced",
        "label": "Advanced",
        "fields": [
          "max_ttl",
          "flows",
          "ipv4",
          "ipv6",
          "no_dns",
          "no_tui"
        ]
      }
    ]
  }
}
