Skip to content

Releases

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 12:21
Immutable release. Only release title and notes can be modified.
7505f21

Notes

  • This is an important release, and every user should upgrade to it

Features

Delete uploaded traces with their admin key

An upload could not be removed, and finding an older link meant searching the terminal history. When the gateway returns an admin key with the upload, xmtr prints an admin link and a curl -X DELETE command under the IPMap link, in the result panel or below it when they do not fit, and in the plain output. Every upload is added to a list in the user's data directory, readable only by its owner on Unix. xmtr traces lists the uploads newest first, --json prints the complete records, and xmtr traces delete deletes a trace given by its ID, IPMap link or admin link from the gateway and from the list. (#41, fixes #40)

Fixes

Install OpenWrt packages with chained setup commands

The OpenWrt guide uses opkg-key add to trust the opkg feed key and chains the download, repository setup and installation steps with &&. The APK v3 commands select the repository with apk --print-arch and refresh the index with apk -U add xmtr.

Stop with an error when options come before a subcommand

Options before traces or self made the subcommand and its arguments targets: xmtr --dns quad9 traces delete <TRACE> traced hosts named traces and delete and uploaded the routes. xmtr now exits with status 2 before it resolves or traces anything and asks for the options after the subcommand, such as xmtr traces delete --dns quad9 <TRACE>. (#41)

v0.3.6

Choose a tag to compare

@github-actions github-actions released this 04 Nov 16:41
Immutable release. Only release title and notes can be modified.
4efb2c6

Features

Show and upload the MPLS label stacks that routers quote

A router that forwards a probe inside an MPLS tunnel can quote the tunnel's label stack in its ICMP reply (RFC 4950). xmtr now reads these extensions. The result table lists each label under the router's address, such as [MPLS: Lbl 24001 TC 0 S 1 TTL 1], the form mtr -e prints, and the upload carries the stack with the address, so IPMap knows which hops answered from inside a tunnel. (#36)

Install xmtr with OpenWrt opkg and APK v3

OpenWrt 24.10 and 25.12 receive native packages and signed repositories for eight package architectures, including MIPS in both byte orders and ARM soft-float. Release builds wait for trusted package installation and IPv4/IPv6 tracing tests in OpenWrt, ImmortalWrt and Lean LEDE firmware environments. (#39, fixes #37)

Fixes

Install the patched tracer core through Cargo

Cargo installations now use xmtr-trippy-core, the same patched core as the release binaries. This includes the Windows receive memory fix, Android IPv4 header handling and Unix socket polling for large sets of open descriptors. The core is published before xmtr and shares its version. (#36)

Package the binary source and root documentation for Cargo

Cargo source archives select src/, the root README and the two license files. Packaging after tests now uses the same inputs as a clean checkout, including when local tools have created other README files. (#36)

Keep each route's statistics and address metadata on the same round

Reports use one completed-round snapshot for hop statistics, per-address round trips and MPLS label stacks, including when a trace ends because its route is stable or its time limit is reached. (#38)

Keep each round of a UDP trace on one path

Classic UDP probes change their destination port with every probe, so a router that spreads flows over parallel links can send each hop's probe down a different link. UDP over raw sockets now uses Dublin traceroute, keeping both ports fixed within each round and matching replies even when NAT changes the UDP checksum. ICMP, TCP and UDP over unprivileged sockets use classic probes. (#36)

Read the README in Simplified and Traditional Chinese

The README is also available in Simplified Chinese and in Traditional Chinese for Taiwan, Hong Kong and Macau, linked at the top of every version. It opens with a recording of a run in the terminal and of the route replay in IPMap, and lists common commands under Usage. (#35)

Upload the best round trip of each address at a hop

When several addresses answer at the same TTL, the round-trip statistics of the hop mix all of their replies. The upload now also carries the lowest round trip of each address's own replies, so IPMap can bound how far each address is from the source by its own replies. (#36)

Report completed Windows receive errors

Return completed receive errors to the tracer instead of polling them as unfinished operations. Only an incomplete Windows overlapped operation is retried. (#38)

Finish Windows receives before closing their sockets

Wait for submitted Windows receives to finish cancellation before releasing their event or receive storage. Poll completed receives through their original overlapped state. (#38)

Stop Windows traces from overwriting memory when a reply arrives

On Windows, each reply made the system write the receive flags and the length of the source address into stack memory that the tracer no longer owned, overwriting whatever the tracer kept there at that moment. Depending on how a build was laid out, this went unnoticed or crashed the trace with an access violation. Both values now live on the heap. (#36)

Read Windows TCP connection readiness from socket events

Use TCP connection events to report writable probes and connection errors without querying a receive operation. (#38)

v0.3.4

Choose a tag to compare

@github-actions github-actions released this 31 Oct 20:00
Immutable release. Only release title and notes can be modified.
94f5fd5

Features

Ask before sending error and crash reports

After a run with errors, or a crash, xmtr asks whether to send a report to the xmtr developers; the default answer is no, and nothing is sent without a terminal to ask. IP addresses, the hosts you named, your home directory and user names in paths are removed first. One run in 100 that uploads also sends the xmtr version, the OS with its distribution and version, and the CPU architecture. DO_NOT_TRACK=1 turns off every report and question. See the Telemetry section of the README.

Fixes

Upload the source and destination as their /24 or /48 network

Uploaded routes carried the exact public source address and the exact destination, and a target given as an IP address carried the destination again. They are now cut to their network, the /24 of IPv4 or the /48 of IPv6, such as 203.0.113.0 for 203.0.113.7, which keeps the place and AS where IPMap draws the ends of the route. --json prints the same values; the tables in the terminal still show the full destination.

v0.3.3

Choose a tag to compare

@github-actions github-actions released this 31 Oct 18:44
Immutable release. Only release title and notes can be modified.
50abff7

Features

Show errors in the style of the result panel

On a terminal, an error that ends a run, such as missing raw socket rights or no target left to trace, and a failed upload appear in a framed panel with the colors of the result panel. Skipped targets and failed routes printed beside the route tables get the icons and colors they have in the panel. Logs, pipes, --quiet and --progress plain keep the plain error: lines, and exit statuses stay the same. (#34)

Start the fallback protocol beside ICMP after 4 rounds

With --protocol auto, a target that ICMP has not reached after 4 rounds is also traced over TCP port 80, or over UDP with unprivileged sockets, while the ICMP trace goes on. Before, the fallback started only once the ICMP route had finished. An ICMP route that ends sooner without the target starts the fallback when it ends. The fallback route gets its own row under the ICMP row in the panel, line and plain views, counts toward -j, and is uploaded next to the ICMP route. --port now sets the port of --protocol tcp only. (#33)

Offer the latest release after a run

After a run in a terminal, xmtr looks up the latest release, waiting at most 3 seconds. When it is newer, xmtr asks whether to install it and then whether to run the same command again with the new version; Enter answers yes to both. A binary owned by a package manager, or in a directory xmtr cannot write to, gets the command that updates it instead. Runs with --json, --quiet or --no-upload, and runs without a terminal on stdin and stderr, skip the lookup. (#34)

v0.3.2

Choose a tag to compare

@github-actions github-actions released this 31 Oct 07:45
Immutable release. Only release title and notes can be modified.
c170d1c

Features

Start routes on the map at the address the trace left from

Each uploaded route carries the public address its probes left from, and IPMap starts the route there rather than at the address the upload came from. When the local address is private or otherwise not public, xmtr asks the gateway over a direct HTTPS connection from that local address, ignoring proxy settings; the lookup runs during the trace and waits at most 3 seconds. --hide-origin uploads the routes without this address. (#32)

Fixes

Keep custom gateway DNS separate from proxy connections

With --dns, uploads no longer connect to the gateway's address and port when
opening an HTTP or SOCKS proxy connection. Direct uploads and locally resolving
SOCKS proxies still use the selected gateway resolver. HTTP, SOCKS4a and SOCKS5h
proxies receive the gateway hostname without a local lookup; proxy endpoints use
the system resolver.
(#31)

Upload through SOCKS proxies without hanging

Uploads honor SOCKS proxies configured through ALL_PROXY and all_proxy.
SOCKS negotiation, authentication, TLS and the upload response share the request
timeout, so a proxy that accepts a connection without answering cannot leave the
upload stuck. Proxy precedence and the HTTP fallback remain unchanged.
(#31)

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 29 Oct 18:48
Immutable release. Only release title and notes can be modified.
dfc686e

Features

Choose how progress is shown and match the terminal's colors

--progress picks the live view: panel, line (one status line that is redrawn in place, for small terminals) or plain (text lines for logs). The default, auto, uses the panel when the terminal is large enough and reports the cursor position, and the line view otherwise. It prints plain lines when stderr is not a terminal or TERM=dumb, so redirected stderr now shows each step and finished route.

--theme picks the colors. auto asks the terminal for its background color and uses RGB colors when COLORTERM announces true color. dark, light, dark-ansi and light-ansi set the colors directly.

Route tables that do not fit the terminal are printed with one short line per hop. (#21)

Fixes

Limit the size of the unpacked executable

The 64 MiB limit on release downloads now also applies to the executable unpacked from the archive, so a small, highly compressed archive can no longer make self update or the installer allocate far more memory. (#7, fixes #4)

Survive a closed stdout and print gateway text safely

When the reader of stdout goes away, as in xmtr --json host | head -1, xmtr no longer aborts; if the upload succeeded, the IPMap link is printed on stderr instead. Control characters in the trace ID, link and error text from the gateway are replaced with U+FFFD, so a gateway reply cannot send escape sequences to the terminal. (#19, fixes #12)

Keep the cursor query out of redirected output

Running xmtr in a terminal with stdout redirected, as in xmtr --json host > trace.json, wrote the escape sequence ESC [ 6 n at the start of the file, so the JSON did not parse. The panel now runs only when stdout is on the terminal. With stdout redirected, the line view shows progress on stderr. (#29, fixes #25)

Install with BusyBox wget and OpenWrt uclient-fetch

install.sh now passes --https-only to wget only when wget supports it. On Alpine, BusyBox and OpenWrt systems without curl, the script stopped with the wget usage text. (#16, fixes #9)

Upload to an IPv6 gateway address with a custom resolver

--api 'http://[::1]:8080' together with --dns failed with Label contains invalid characters, because the brackets reached the resolver. IPv6 literals now skip DNS like IPv4 literals do. (#6, fixes #3)

Accept very large time limits

A very large --time-limit, such as 18446744073709551615s, overflowed the round budget: debug builds panicked and release builds could stop after one round. The budget is now capped by --max-rounds for every accepted duration. (#5, fixes #2)

Keep route tables readable in narrow terminals

When stdout was a terminal too narrow for the route table, every column wrapped into a few characters, with Hos and t on separate lines. Now only long host names wrap. A table that still does not fit is printed as one line per hop, with the host, the average round trip and any loss. (#27, fixes #23)

Refuse release archives that do not contain an executable

xmtr self update and the installer now reject an archive whose xmtr entry is not a regular file or does not start with the executable header of the platform. Before, a directory, symlink or empty entry replaced the installed binary with an empty file and the update reported success. (#17, fixes #10)

Build release packages with the xmtr-ci project

The release workflow now runs through scripts/ci, one Python project that reads every target from a single table. The packages are the same apart from two metadata fields: <packageSourceUrl> in the Chocolatey nuspec points at scripts/ci/src/xmtr_ci/packages/chocolatey.py, and Generator in the wheel WHEEL file is xmtr-ci. (#1)

Show the short trace link in the README

Uploads return https://xmsl.dev/xmtr/<trace ID>, a short link that shows a preview when shared and opens the trace on IPMap. The README sample output and demo link now use it. (#22)

Keep parallel TCP traces running past 1024 open sockets

With about 24 or more TCP routes traced at once to targets that do not answer, xmtr aborted with fd must be in the range 0..FD_SETSIZE and printed nothing. The bundled trippy-core now waits on its sockets with poll, which has no descriptor limit. (#15, fixes #8)

Reject a time limit that fits no round

--time-limit must now be longer than --interval. A round ends after at least one interval, so shorter limits returned no hops and reported reachable targets as no probe was answered; such runs now stop with an argument error. (#18, fixes #11)

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 18:21
Immutable release. Only release title and notes can be modified.
4dcf7f3

Features

Show progress and results in a terminal panel

In a terminal, xmtr now draws a panel below the prompt while it runs. Numbered steps (1. Resolve, 2. Trace, 3. Lookup, 4. Upload, 5. Result) show which step is active, each route has a progress bar, reverse DNS and AS lookups show how many addresses have answered, and the upload shows that it is still waiting for the gateway.

When the run ends, the panel turns into the result: the IPMap link first, then notes about skipped targets and failed routes, then each route as a table. Runs of three or more silent hops fold into one line, and long host names are shortened before their addresses.

Ctrl-C stops a run and exits with status 130. Piped or redirected output, --quiet, and terminals that do not report the cursor position keep the plain text output.

v0.2.6

Choose a tag to compare

@github-actions github-actions released this 13 Oct 10:58
Immutable release. Only release title and notes can be modified.
6b7c08b

Full Changelog: v0.2.5...v0.2.6

v0.2.5

Choose a tag to compare

@github-actions github-actions released this 13 Oct 06:01
Immutable release. Only release title and notes can be modified.
517c4d4

Full Changelog: v0.2.4...v0.2.5

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 13 Oct 05:39
Immutable release. Only release title and notes can be modified.
10bc8b6

Full Changelog: v0.2.3...v0.2.4