{"id":51124620,"url":"https://github.com/preston-peterson/hoptrail","last_synced_at":"2026-06-25T06:01:40.554Z","repository":{"id":364347636,"uuid":"1237260924","full_name":"preston-peterson/hoptrail","owner":"preston-peterson","description":"Continuous traceroute and per-hop latency tracker for Linux","archived":false,"fork":false,"pushed_at":"2026-06-12T18:00:26.000Z","size":1089,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T18:22:27.029Z","etag":null,"topics":["golang","icmp","latency","network-monitoring","ntfy","ping","self-hosted","sqlite","svelte","traceroute"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/preston-peterson.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T02:51:55.000Z","updated_at":"2026-06-12T18:00:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/preston-peterson/hoptrail","commit_stats":null,"previous_names":["preston-peterson/hoptrail"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/preston-peterson/hoptrail","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preston-peterson%2Fhoptrail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preston-peterson%2Fhoptrail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preston-peterson%2Fhoptrail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preston-peterson%2Fhoptrail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/preston-peterson","download_url":"https://codeload.github.com/preston-peterson/hoptrail/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/preston-peterson%2Fhoptrail/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34761847,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","icmp","latency","network-monitoring","ntfy","ping","self-hosted","sqlite","svelte","traceroute"],"created_at":"2026-06-25T06:01:39.479Z","updated_at":"2026-06-25T06:01:40.542Z","avatar_url":"https://github.com/preston-peterson.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hoptrail\n\u003c!-- Version: 0.7.3 --\u003e\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Go 1.22+](https://img.shields.io/badge/go-1.22+-blue.svg)](https://go.dev/dl/)\n[![Platform: Linux](https://img.shields.io/badge/platform-Linux-orange.svg)](https://www.linux.org/)\n[![Version: 0.7.3](https://img.shields.io/badge/version-0.7.3-green.svg)](docs/user-guide.md)\n\nHoptrail is a continuous traceroute and per-hop latency tracker for Linux.\n\n![hoptrail dashboard](docs/images/dashboard.png)\n\nIt is a self-hosted daemon that continuously traces the network path from\nyour host to one or more targets, persists per-hop latency and loss to\nSQLite, and serves a web UI with a hop table, latency timeline, and\nbandwidth history. It exists to answer questions about real, continuous\nnetwork behavior — \"when did this start,\" \"is the slowdown local or\nupstream,\" \"which leg of the path is degrading\" — rather than the\nsingle-snapshot questions point-in-time tools answer.\n\n## Features\n\n- **Continuous per-hop tracing** — every hop on the path pinged on a\n  configurable cadence (default 1s), with loss attribution that\n  distinguishes real packet loss from routers that merely deprioritize\n  ICMP replies, and ECMP-aware route-change detection that doesn't\n  misreport load balancing as flapping.\n- **Multi-target tabs** — monitor any number of IPs or hostnames at\n  once, each with its own probe interval, latency thresholds, and view\n  state. Hostname targets survive CDN IP rotation.\n- **A timeline you can investigate with** — scroll back through history,\n  zoom with the wheel, brush a focus range to recompute hop statistics\n  for a past incident, and pin annotations to moments (\"router reboot\",\n  \"called the ISP\").\n- **Distributed probing** — install lightweight probes at other sites;\n  they push measurements to the central over HTTP with automatic\n  buffering through outages, and every tab can display any probe's\n  vantage point. The diagnostic question shifts from *something is\n  degrading* to *which leg is degrading*.\n- **Bandwidth monitoring** — scheduled or interval speed tests via the\n  operator-installed [Ookla® Speedtest®](https://www.speedtest.net)\n  CLI, charted alongside latency with test windows marked on the\n  timeline, and automatic alerts when throughput derates below your\n  rolling baseline — including the asymmetric case where only upload\n  collapses.\n- **Shareable evidence** — one-click JSON export of samples, path,\n  route changes, and annotations for any window: the \"send this to my\n  ISP\" artifact.\n- **Single static binary** — Go daemon with the Svelte UI embedded.\n  SQLite storage. No container required, no external services, no\n  telemetry.\n\n## Quick start\n\n```bash\ncurl -fsSL https://get.hoptrail.net | bash\n```\n\nOne line: downloads the latest release's prebuilt binary for your\narchitecture (amd64/arm64, sha256-verified), then runs the installer —\nno build tools needed. Open `http://\u003chost\u003e:8080`, add a target, and\nwatch the path appear. The installer handles the one privileged\ndetail — granting `cap_net_raw` so the daemon can open a raw ICMP\nsocket without running as root — and supports the Debian, RPM, Arch,\nand openSUSE families.\n\nPrefer building from source?\n\n```bash\ngit clone https://github.com/preston-peterson/hoptrail.git\ncd hoptrail\n./install.sh          # builds if needed, installs to /opt/hoptrail, starts the systemd service\n```\n\nBuild requirements: Go 1.22+, Node 18+, and a C toolchain for SQLite\n(build host only — the deployed binary is self-contained).\n\nTo add a remote probe at another site: gear icon → **Probes** → **Add\nprobe**. The UI mints a token and hands you the complete install\ncommand to paste on the remote host — no config files, no restart. The\nprobe appears in the central UI within one heartbeat. See\n[distributed probing](docs/distributed-probing.md) for the full\nwalkthrough.\n\n## More screenshots\n\n| | |\n|---|---|\n| ![environment status](docs/images/status.png) | ![bandwidth history](docs/images/bandwidth.png) |\n| ![alert history](docs/images/alerthistory.png) | ![in-app documentation](docs/images/docsviewer.png) |\n\n*All screenshots use illustrative data.*\n\n## Documentation\n\n- [User guide](docs/user-guide.md) — install, targets, reading the\n  charts, thresholds, annotations, bandwidth monitoring, retention.\n- [Distributed probing](docs/distributed-probing.md) — multi-site\n  setup, tokens, partition recovery, troubleshooting.\n- [Operations](docs/operations.md) — updates, backups, token rotation,\n  systemd, the `setcap` gotcha.\n- [API reference](docs/api.md) — every endpoint with wire shapes.\n\n## Architecture\n\n```\n┌──────────────────┐        ┌────────────────────────┐       ┌──────────────┐\n│  Network hops    │───────▶│  Central daemon        │◀──────│  Browser     │\n│  (ICMP probes,   │  ICMP  │  (Go + SQLite + UI)    │ HTTP  │              │\n│   path discovery)│        └───────────▲────────────┘       └──────────────┘\n└──────────────────┘                    │ HTTP push (batches,\n┌──────────────────┐        ┌───────────┴────────────┐         heartbeats)\n│  Network hops    │───────▶│  Remote probe(s)       │\n│  at another site │  ICMP  │  (same binary, no UI)  │\n└──────────────────┘        └────────────────────────┘\n```\n\nOne binary, two roles. The central runs the probe engine, storage,\nretention, reverse-DNS, the bandwidth scheduler, and the web UI. Remote\nprobes run the same engine and push results to the central, spilling to\na local buffer whenever the central is unreachable and draining it on\nreconnect — no measurements are lost to an outage.\n\n## What it is not\n\nHoptrail is not a one-shot diagnostic tool. It is designed to be left\nrunning continuously over days and weeks, with a UI you'd actually keep\nopen during real work.\n\nHoptrail is not enterprise observability. There is no multi-tenancy, no\nauthentication on the web UI, no SaaS, no telemetry. It is a\nsingle-operator tool intended for trusted networks — bind it to\nloopback and front it with a reverse proxy if you need it reachable\nbeyond one.\n\n## Some things hoptrail will not have\n\nNo cloud account. No user tracking. No telemetry. No ads. No\nsubscription. No analytics SDK. No \"premium features.\" It runs on your\nhardware, probes from your network, and the data stays local unless you\nchoose otherwise.\n\n## Project status\n\nHoptrail is a one-person side project. The code is here because it\nmight be useful to someone else with the same gap — not because anyone\nis building a product or a community.\n\n- **Bug reports are welcome.** File an issue if something is broken;\n  expect best-effort response, no SLA, no promises.\n- **Pull requests are not accepted.** Hoptrail is\n  built the way one person wants it built. If you want to take it\n  somewhere different, the MIT license invites you to fork freely —\n  that's a feature, not a problem.\n- **Feature suggestions** are fine in issues, but the bar for \"I'll\n  actually build this\" is \"I want it for myself.\"\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the longer version,\n[CHANGELOG.md](CHANGELOG.md) for release notes, and\n[SECURITY.md](SECURITY.md) for the threat model and how to report\nissues.\n\n## License\n\n[MIT](LICENSE). Use it, fork it, modify it, redistribute it.\n\nSpeed tests are performed by the operator-installed Ookla® Speedtest®\nCLI under [Ookla's license terms](https://www.speedtest.net/about/eula);\nhoptrail does not redistribute it.\n\n## Built on\n\n- **[SQLite](https://www.sqlite.org)** — durable, embedded, perfect at this scale.\n- **[`golang.org/x/net/icmp`](https://pkg.go.dev/golang.org/x/net/icmp)** — the ICMP wire layer the probe engine builds on.\n- **[Svelte](https://svelte.dev)** + **[uPlot](https://github.com/leeoniya/uPlot)** — the embedded UI and its charts.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpreston-peterson%2Fhoptrail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpreston-peterson%2Fhoptrail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpreston-peterson%2Fhoptrail/lists"}