Repository navigation
Releases
mapterm 0.1.2
Cleaner rivers in the built-in style, and label-free snapshots.
Added
--no-labelsstarts the viewer with labels and symbols hidden, as ifnhad been
pressed (nshows them). With--snapshotit prints a frame of map lines and fills
only, e.g. for images: labels otherwise take cells where the map would be drawn.
Changed
- The built-in style draws rivers in the water color from zoom 11, as MapLibre styles do,
so a river's centerline disappears into its water polygon instead of showing as a
stray line down the river, or as a stub where a creek flows into a wider river.
Streams, canals and ditches stay bright, and rivers stay bright below zoom 11.
Binaries
| platform | file |
|---|---|
| Linux, x86-64 (glibc) | mapterm-0.1.2-x86_64-unknown-linux-gnu.tar.gz |
SHA256SUMS lists every archive's checksum, and SHA256SUMS.sig is the maintainer's SSH
signature of it. The trusted key comes from the signing keys on the maintainer's GitHub
account, not from this repository (fingerprint
SHA256:LiOY0+3e/eOQFeUsG7iMovOBJui3yCAXXHlWz48c4uk). To download and check with
gh:
gh release download v0.1.2 --repo tlpinney/mapterm
gh api users/tlpinney/ssh_signing_keys --jq '.[].key | "tlpinney namespaces=\"mapterm-release\" " + .' > allowed_signers
ssh-keygen -Y verify -f allowed_signers -I tlpinney -n mapterm-release -s SHA256SUMS.sig < SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing
tar xzf mapterm-0.1.2-*.tar.gzOr build it with Cargo (Rust 1.89 or newer):
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.2macOS: install with Cargo (above) until there are notarized macOS binaries.
mapterm 0.1.1
Security fixes for memory use and API keys.
Security
- A small vector tile can no longer decode to gigabytes: each feature gets its own copy of
the dictionary strings it references, so one long string shared by many features (a
1 MiB tile, 5 KiB gzipped) took 2 GiB. A tile's feature properties are now limited to
64 MB decoded (mvt::MAX_PROP_BYTES); real tiles stay far below it. - API keys no longer follow redirects to other hosts. Requests that carry a key (in a
header such asmaxar-api-key, or in the URL) follow a redirect only to the same scheme,
host and port; reqwest droppedAuthorizationon a cross-origin redirect but kept custom
key headers. No request sends aRefererany more, which carried the previous URL,
including a key in its query, to the next host. - The raster tile store is limited to 512 MB (
raster::RASTER_STORE_BUDGET) as well as 256
tiles: 4096 px tiles that compress to a few hundred KB each could fill about 16 GB.
Decoding also moves the pixels instead of copying them, halving the peak per tile.
Binaries
| platform | file |
|---|---|
| Linux, x86-64 (glibc) | mapterm-0.1.1-x86_64-unknown-linux-gnu.tar.gz |
SHA256SUMS lists every archive's checksum, and SHA256SUMS.sig is the maintainer's SSH
signature of it. The trusted key comes from the signing keys on the maintainer's GitHub
account, not from this repository (fingerprint
SHA256:LiOY0+3e/eOQFeUsG7iMovOBJui3yCAXXHlWz48c4uk). To download and check with
gh:
gh release download v0.1.1 --repo tlpinney/mapterm
gh api users/tlpinney/ssh_signing_keys --jq '.[].key | "tlpinney namespaces=\"mapterm-release\" " + .' > allowed_signers
ssh-keygen -Y verify -f allowed_signers -I tlpinney -n mapterm-release -s SHA256SUMS.sig < SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing
tar xzf mapterm-0.1.1-*.tar.gzOr build it with Cargo (Rust 1.89 or newer):
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.1macOS: install with Cargo (above) until there are notarized macOS binaries.
mapterm 0.1.0
The first stable-numbered release, so plain Cargo commands find it (they skip
pre-releases):
cargo install mapterm # the viewer
cargo add mapterm # the libraryPre-1.0, a minor version (0.2.0) may still change the API. No code changes since
0.1.0-alpha.3; this is also the first version published by the release workflow with
crates.io trusted publishing.
Binaries
| platform | file |
|---|---|
| macOS, Apple silicon | mapterm-0.1.0-aarch64-apple-darwin.tar.gz |
| Linux, x86-64 (glibc) | mapterm-0.1.0-x86_64-unknown-linux-gnu.tar.gz |
SHA256SUMS lists every archive's checksum, and SHA256SUMS.sig is the maintainer's SSH
signature of it. The trusted key comes from the signing keys on the maintainer's GitHub
account, not from this repository (fingerprint
SHA256:LiOY0+3e/eOQFeUsG7iMovOBJui3yCAXXHlWz48c4uk). To download and check with
gh:
gh release download v0.1.0 --repo tlpinney/mapterm
gh api users/tlpinney/ssh_signing_keys --jq '.[].key | "tlpinney namespaces=\"mapterm-release\" " + .' > allowed_signers
ssh-keygen -Y verify -f allowed_signers -I tlpinney -n mapterm-release -s SHA256SUMS.sig < SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing
tar xzf mapterm-0.1.0-*.tar.gzOr build it with Cargo (Rust 1.89 or newer):
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.0The macOS binary isn't notarized: files downloaded with a browser need
xattr -d com.apple.quarantine mapterm once (gh and curl downloads don't).
mapterm 0.1.0-alpha.3
The first release on crates.io:
cargo install mapterm --version 0.1.0-alpha.3 # the viewer
cargo add mapterm@0.1.0-alpha.3 # the libraryReleases
- Each version tag also publishes the crate to crates.io once the maintainer approves the
release workflow'scrates-ioenvironment, with crates.io trusted publishing (no
stored token).
Binaries
| platform | file |
|---|---|
| macOS, Apple silicon | mapterm-0.1.0-alpha.3-aarch64-apple-darwin.tar.gz |
| Linux, x86-64 (glibc) | mapterm-0.1.0-alpha.3-x86_64-unknown-linux-gnu.tar.gz |
SHA256SUMS lists every archive's checksum, and SHA256SUMS.sig is the maintainer's SSH
signature of it. The trusted key comes from the signing keys on the maintainer's GitHub
account, not from this repository (fingerprint
SHA256:LiOY0+3e/eOQFeUsG7iMovOBJui3yCAXXHlWz48c4uk). To download and check with
gh:
gh release download v0.1.0-alpha.3 --repo tlpinney/mapterm
gh api users/tlpinney/ssh_signing_keys --jq '.[].key | "tlpinney namespaces=\"mapterm-release\" " + .' > allowed_signers
ssh-keygen -Y verify -f allowed_signers -I tlpinney -n mapterm-release -s SHA256SUMS.sig < SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing
tar xzf mapterm-0.1.0-alpha.3-*.tar.gzOr build it with Cargo (Rust 1.89 or newer):
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.0-alpha.3The macOS binary isn't notarized: files downloaded with a browser need
xattr -d com.apple.quarantine mapterm once (gh and curl downloads don't).
mapterm 0.1.0-alpha.2
Hardening from a security review and fuzzing, plus signed release binaries.
Security
- Control characters in map text (tile labels, style text and glyphs, search results,
data file properties) no longer reach the terminal, where they could set the clipboard
or window title;--snapshotexports drop them too. - Deeply nested KML, WKT and FlatGeobuf geometry is rejected instead of overflowing the
stack. - A source with a bad zoom range (min above max, or past zoom 30) in a PMTiles header,
TileJSON or style no longer panics. - Raster tiles larger than 4096 pixels a side are refused before decoding, so a small
image declaring huge dimensions can't take hundreds of megabytes. - The docs show header-based API keys as
--raster-header 'Name: {key}', keeping the key
itself out ofpsand shell history. - A style loaded from a URL can only use web sources: a
pmtiles:///path, file path or
local GeoJSON in it is an error, so a remote style can't make mapterm read local files. - A FlatGeobuf file with part ends out of order no longer crashes mapterm, and huge
feature counts or offsets in FlatGeobuf and PMTiles no longer overflow (found by the new
fuzz targets infuzz/). --raster-list-mosaicsonly follows Planet's next-page links back to
https://api.planet.com/, since each request carries the key; place search and the
mosaic list read at most 4 and 16 MB per response.- PMTiles directory entries must lie inside their section of the archive, and zero-length
or wrapping byte ranges are refused before any request.
Releases
-
Signed binaries: each version tag builds
maptermfor macOS (Apple silicon) and Linux
(x86-64) in CI, attached to the GitHub release withSHA256SUMS, which the maintainer
signs with an SSH key (SHA256SUMS.sig, namespacemapterm-release; trusted keys in
signing/allowed_signers). The release notes say how to verify, taking the key from
the signing keys on the maintainer's GitHub account rather than from the repository. -
Commits and tags are signed with the same key (shown as Verified on GitHub).
-
Install with Cargo from git (not published to crates.io):
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.0-alpha.2
Binaries
| platform | file |
|---|---|
| macOS, Apple silicon | mapterm-0.1.0-alpha.2-aarch64-apple-darwin.tar.gz |
| Linux, x86-64 (glibc) | mapterm-0.1.0-alpha.2-x86_64-unknown-linux-gnu.tar.gz |
SHA256SUMS lists every archive's checksum, and SHA256SUMS.sig is the maintainer's SSH
signature of it. The trusted key comes from the signing keys on the maintainer's GitHub
account, not from this repository (fingerprint
SHA256:LiOY0+3e/eOQFeUsG7iMovOBJui3yCAXXHlWz48c4uk). To download and check with
gh:
gh release download v0.1.0-alpha.2 --repo tlpinney/mapterm
gh api users/tlpinney/ssh_signing_keys --jq '.[].key | "tlpinney namespaces=\"mapterm-release\" " + .' > allowed_signers
ssh-keygen -Y verify -f allowed_signers -I tlpinney -n mapterm-release -s SHA256SUMS.sig < SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing
tar xzf mapterm-0.1.0-alpha.2-*.tar.gzOr build it with Cargo (Rust 1.89 or newer):
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.0-alpha.2The macOS binary isn't notarized: files downloaded with a browser need
xattr -d com.apple.quarantine mapterm once (gh and curl downloads don't).
mapterm 0.1.0-alpha.1
The first alpha, for private testing. Not published to crates.io; install from git:
cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.0-alpha.1The viewer (mapterm)
- OpenStreetMap vector tiles in the terminal: braille lines, cell-color fills, labels that
don't overlap, and MapLibre-style pan and zoom (wheel at the cursor, drag with inertia,
double-click and box zoom, eased keys). - Sources: PMTiles (local or over HTTP range requests), XYZ URLs and TileJSON; OpenFreeMap
by default, no key needed. - A built-in terminal style for the OpenMapTiles and Protomaps schemas (dark and light),
or any MapLibre style with--style(OpenFreeMap's liberty, positron, bright, dark,
fiord, a URL or a file);mswitches styles,tthe theme. - Imagery under the map with
--raster(OSM, Esri, USGS, EOX, NASA GIBS, and keyed
providers such as Vantor, Planet, Mapbox and MapTiler), as kitty graphics or cell colors. - Your data over the map with
--geojson: GeoJSON, CSV with lat/lon or WKT columns, GPX,
KML and FlatGeobuf, by file or URL; large point sets cluster. - Place search with
/(Photon or Nominatim), with a flyTo-style flight. - Inspect mode (
i): every feature under a spot, drawn or not, with its properties,
size and location;ycopies it as JSON. --snapshotprints a frame as text, ANSI color or HTML;--pickprints features as JSON.- Experimental pixel-smooth scrolling on the Ghostty smooth-scroll fork (
MAPTERM_SMOOTH).
The library
Map: named sources (vector tiles, GeoJSON, raster) and ordered style layers
(background, fill, line, circle, symbol, raster) with MapLibre expressions and filters,
plus custom layers; drawn as a ratatui widget.- MapLibre style JSON loading, and the style properties a terminal can show: colors and
opacity, line widths and dashes, text fields and fonts, anchors and offsets, labels
repeated along roads, sort keys, icons as one-cell symbols. query_rendered_featuresandquery_features(drawn or not), layer events and hover
state (events::Events, feature state),Controllerwithfly_toandfit_bounds.- GeoJSON sources with a spatial index and point clustering; tiles loaded in the
background with retries; kitty image memory kept within a budget; source attribution.
Binaries
| platform | file |
|---|---|
| macOS, Apple silicon | mapterm-0.1.0-alpha.1-aarch64-apple-darwin.tar.gz |
| Linux, x86-64 (glibc) | mapterm-0.1.0-alpha.1-x86_64-unknown-linux-gnu.tar.gz |
SHA256SUMS lists every archive's checksum, and SHA256SUMS.sig is the maintainer's SSH
signature of it. To download and check (the repository is private, so use gh):
gh release download v0.1.0-alpha.1 --repo tlpinney/mapterm
gh api repos/tlpinney/mapterm/contents/signing/allowed_signers --jq .content | base64 -d > allowed_signers
ssh-keygen -Y verify -f allowed_signers -I tlpinney -n mapterm-release -s SHA256SUMS.sig < SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing
tar xzf mapterm-0.1.0-alpha.1-*.tar.gzOr build it with Cargo (CARGO_NET_GIT_FETCH_WITH_CLI lets Cargo use git's credentials for
the private repository; Rust 1.89 or newer):
CARGO_NET_GIT_FETCH_WITH_CLI=true cargo install --git https://github.com/tlpinney/mapterm --tag v0.1.0-alpha.1The macOS binary isn't notarized: files downloaded with a browser need
xattr -d com.apple.quarantine mapterm once (gh and curl downloads don't).