Skip to content

Releases: KaraZajac/TRAMES

TRAMES 1.1.4 — one camera geometry everywhere

Choose a tag to compare

@KaraZajac KaraZajac released this 28 Jul 19:19

Navigation that routes around automated licence-plate readers.

What changed

One camera geometry, everywhere. The map cones, the "N cameras can see this
route" count, and the server's routing had quietly drifted to three different
field-of-view shapes. As of this release they are all the same 60 m / 45°
wedge
— the exact geometry the routing graph is built with (and the geometry
the exposure study scores against).

Concretely: the map now draws the wedge the router actually avoided, and the
exposure count is measured against that same wedge. What you see, what gets
counted, and what the route was planned around finally agree. A single constant
(TramesGeometry) is the source of truth, so they can't drift apart again.

On screen the cones are a little smaller than the previous build, because 60 m
is the real routing radius rather than a display-only pick. The exposure count's
radius also moved from 40 m to 60 m, so on some routes it will report marginally
more cameras — correctly, since those readers fall inside the wedge the router
treats as seeing you.

This is a client-side alignment only; the routing graph and the research
analysis were already at 60 m / 45° and are unchanged.

Install

TRAMES-1.1.4-arm64-v8a.apk — 210 MB, Android 7.0+, arm64-v8a only

Verify before installing:

sha256  a0e2688cc999c319ceb0334cc303e9d1ef5114f3064145e49363066b070865a5

Package org.soulstone.trames — installs alongside OsmAnd rather than
replacing it. Open it, type a destination, and avoidance is already on.

⚠️ Read this before you trust the build

This APK is signed with the public Android debug key (CN=Android Debug,
the well-known keystores/debug.keystore, password android).

That key is not secret. Anyone can build a modified APK signed with the
identical key, and Android will accept it as an update to this app. The
signature proves nothing about who built it.

For a tool whose users are specifically trying to avoid being tracked, that is
a real weakness and not a formality. Until a proper release key exists:

  • Verify the SHA-256 above against a build you make yourself, or
  • Build from source: ./setup-resources.sh && cd client && ./trames-build.sh

Camera and map data © OpenStreetMap contributors (ODbL), largely mapped by the
DeFlock community.

TRAMES 1.1.3 — whole-route camera exposure

Choose a tag to compare

@KaraZajac KaraZajac released this 28 Jul 18:49

Navigation that routes around automated licence-plate readers.

What changed

The "cameras on this route" count now covers the whole route, not just the
part on your screen.
It previously scored only the cameras already loaded for
the visible map, so on a zoomed-in view a route could report zero while in
fact passing several readers further along.

On every route, TRAMES now fetches every camera along the entire path (tiled so
long routes stay within the server's limits, deduplicated) and scores it off the
UI thread. A camera still only counts if the route passes within ~40 m and
inside the direction it faces — a reader watching the other carriageway is not
counted against you.

The failure behaviour is deliberate: if the check can't complete, TRAMES falls
back to the cameras it already had rather than a false "clear," and if it truly
can't check it stays silent instead of claiming zero. For a tool whose whole
point is knowing what can see you, a false "no cameras can see this route" is the
one answer it must never give by accident.

Everything from v1.1.2 (ground-anchored camera cones) carries forward.

Install

TRAMES-1.1.3-arm64-v8a.apk — 210 MB, Android 7.0+, arm64-v8a only

Verify before installing:

sha256  6c5f1e6c48e97653ee9648f7e9b5e1d4a999bf5e55107fc75ab9b13ff5ac5a32

Package org.soulstone.trames — installs alongside OsmAnd rather than
replacing it. Open it, type a destination, and avoidance is already on.

⚠️ Read this before you trust the build

This APK is signed with the public Android debug key (CN=Android Debug,
the well-known keystores/debug.keystore, password android).

That key is not secret. Anyone can build a modified APK signed with the
identical key, and Android will accept it as an update to this app. The
signature proves nothing about who built it.

For a tool whose users are specifically trying to avoid being tracked, that is
a real weakness and not a formality. Until a proper release key exists:

  • Verify the SHA-256 above against a build you make yourself, or
  • Build from source: ./setup-resources.sh && cd client && ./trames-build.sh

Camera and map data © OpenStreetMap contributors (ODbL), largely mapped by the
DeFlock community.

TRAMES 1.1.2 — ground-anchored camera cones

Choose a tag to compare

@KaraZajac KaraZajac released this 28 Jul 18:33

Navigation that routes around automated licence-plate readers.

What changed

Camera field-of-view cones are now anchored to the ground. Each cone was
drawn at a fixed on-screen size, so it looked the same at every zoom and implied
a different real-world coverage each time you zoomed — and read far too small
next to the DeFlock map's cones.

A cone is now a real geographic sector: apex at the camera, swept at a fixed
radius in metres. It grows and shrinks with zoom, covers a consistent stretch of
road, and lies flat on the road when you tilt the map into 3D. The GL renderer
draws it as a filled polygon (the same primitive OsmAnd uses for eclipse
footprints); the non-GL fallback projects the same geographic sector.

Two display constants tune the look — the radius (how far down the road a reader
is shown watching) and the span (how wide the wedge is). They're a display
convention, not a survey: OpenStreetMap gives only the bearing a camera faces.

Everything from v1.1.1 carries forward.

Install

TRAMES-1.1.2-arm64-v8a.apk — 210 MB, Android 7.0+, arm64-v8a only

Verify before installing:

sha256  0489cce8f26abf34b2bad13891f50b34a8ddd1ac6895909e5f99bc53f9362286

Package org.soulstone.trames — installs alongside OsmAnd rather than
replacing it. Open it, type a destination, and avoidance is already on.

⚠️ Read this before you trust the build

This APK is signed with the public Android debug key (CN=Android Debug,
the well-known keystores/debug.keystore, password android).

That key is not secret. Anyone can build a modified APK signed with the
identical key, and Android will accept it as an update to this app. The
signature proves nothing about who built it.

For a tool whose users are specifically trying to avoid being tracked, that is
a real weakness and not a formality. Until a proper release key exists:

  • Verify the SHA-256 above against a build you make yourself, or
  • Build from source: ./setup-resources.sh && cd client && ./trames-build.sh

Camera and map data © OpenStreetMap contributors (ODbL), largely mapped by the
DeFlock community.

TRAMES 1.1.1 — its own launch screen

Choose a tag to compare

@KaraZajac KaraZajac released this 28 Jul 17:15

Navigation that routes around automated licence-plate readers.

A small release with one visible change: TRAMES now shows its own launch
screen
, not OsmAnd's.

What changed

The startup splash is TRAMES. OsmAnd's SecondSplashScreenFragment — shown
briefly after the themed launch screen — still stacked OsmAnd's logo and
wordmark, so a fork named TRAMES greeted you with OsmAnd branding it doesn't
speak for. It now shows the TRAMES launch mark and wordmark, forced to a dark
background so the mark reads cleanly on any device theme. The OpenStreetMap
credit is kept
— the map data is OSM's, and crediting it is correct under
ODbL.

Everything from v1.1.0 carries forward: ALPR avoidance on by default with
zero setup, the camera map layer served from the project's own infrastructure,
and the five avoidance-strength levels.

Licensing note

TRAMES is a GPLv3 fork of OsmAnd; this
change is to GPLv3 code, freely modifiable. No CC-BY-NC-ND artwork was edited —
OsmAnd's own splash drawables remain in the tree, unused. See
client/TRAMES-NOTICE.md
for the full attribution and licensing posture.

Install

TRAMES-1.1.1-arm64-v8a.apk — 210 MB, Android 7.0+, arm64-v8a only

Verify before installing:

sha256  3f0eccfe119554e07b060a64c37fc995f84ec06823a9e0ff1121536b6d87c978

Package org.soulstone.trames — installs alongside OsmAnd rather than
replacing it. Open it, type a destination, and avoidance is already on.

⚠️ Read this before you trust the build

This APK is signed with the public Android debug key (CN=Android Debug,
the well-known keystores/debug.keystore, password android).

That key is not secret. Anyone can build a modified APK signed with the
identical key, and Android will accept it as an update to this app. The
signature proves nothing about who built it.

For a tool whose users are specifically trying to avoid being tracked, that is
a real weakness and not a formality. Until a proper release key exists:

  • Verify the SHA-256 above against a build you make yourself, or
  • Build from source: ./setup-resources.sh && cd client && ./trames-build.sh

Camera and map data © OpenStreetMap contributors (ODbL), largely mapped by the
DeFlock community.

TRAMES 1.1.0 — avoidance on by default

Choose a tag to compare

@KaraZajac KaraZajac released this 28 Jul 15:54

Navigation that routes around automated licence-plate readers — now with zero
setup and its camera layer on infrastructure we control.

What's new

ALPR avoidance is on by default. First launch seeds the routing engine and
points the driving profile at it: install, type a destination, and the route
already avoids camera fields of view at STRONG strength. No engine to create,
no URL to paste, no settings to find. The berth selector still adjusts strength
per-profile, and self-hosters can still point the engine anywhere. Seeding runs
exactly once — turning avoidance off or deleting the engine sticks, and
upgraders who configured an engine by hand keep it, custom berth and all.

The camera map layer no longer depends on public Overpass. On 2026-07-28
both public Overpass instances spent the day answering 504 to the ALPR query
while trivial queries worked — and the map went silently dark. Cameras are now
served from the TRAMES server itself (/cameras on the routing host), from the
same snapshot the routing graph's cones were built from: the map shows exactly
the cameras the router is avoiding, not a fresher OSM state the graph has never
seen. The public Overpass instances remain in the client as fallbacks, so the
layer still works against a self-hosted router with no camera endpoint.

Server-side, server/cameras/ is new: a stdlib Python bbox service speaking
enough of Overpass's protocol that the client cannot tell the difference,
answering the continental snapshot (120,838 cameras) in ~0.6 s through the
public endpoint, systemd-hardened and blast-radius-capped like the routing
unit.

Install

TRAMES-1.1.0-arm64-v8a.apk — 210 MB, Android 7.0+, arm64-v8a only

Verify before installing:

sha256  d3f2dcdaa8053058618dab828d9da8470cafc0b35537042115b2d1a1402e4dcd

Package org.soulstone.trames — installs alongside OsmAnd rather than
replacing it.

⚠️ Read this before you trust the build

This APK is signed with the public Android debug key (CN=Android Debug,
the well-known keystores/debug.keystore, password android).

That key is not secret. Anyone can build a modified APK signed with the
identical key, and Android will accept it as an update to this app. The
signature proves nothing about who built it.

For a tool whose users are specifically trying to avoid being tracked, that is
a real weakness and not a formality. Until a proper release key exists:

  • Verify the SHA-256 above against a build you make yourself, or
  • Build from source: ./setup-resources.sh && cd client && ./trames-build.sh

Camera and map data © OpenStreetMap contributors (ODbL), largely mapped by the
DeFlock community.

TRAMES 1.0.0 — ALPR-avoiding navigation

Choose a tag to compare

@KaraZajac KaraZajac released this 25 Jul 21:08

Navigation that routes around automated licence-plate readers.

TRAMES takes an ordinary navigation request — an address, a route — and adds one
constraint: prefer paths that no ALPR camera can actually see. Cameras are modelled as
directional wedges, not circles. A reader watching northbound traffic says nothing
about the southbound carriageway, and treating it as a circle makes the router detour
around roads nobody is being read on.

Install

TRAMES-1.0.0-arm64-v8a.apk — 209 MB, Android 7.0+, arm64-v8a only

Verify before installing:

sha256  c586dce9b5dfe566419187cb0833856badb8bb8b0848826a06c038e389d1c0cc

Package org.soulstone.trames — installs alongside OsmAnd rather than replacing it.

⚠️ Read this before you trust the build

This APK is signed with the public Android debug key (CN=Android Debug, the
well-known keystores/debug.keystore, password android).

That key is not secret. Anyone can build a modified APK signed with the identical key,
and Android will accept it as an update to this app. The signature proves nothing about
who built it.

For a tool whose users are specifically trying to avoid being tracked, that is a real
weakness and not a formality. Until a proper release key exists:

  • Verify the SHA-256 above against a build you make yourself, or
  • Build from source: ./setup-resources.sh && cd client && ./trames-build.sh

A properly signed release is the obvious next step and is not done yet.

What works

  • Address search and turn-by-turn navigation (inherited from OsmAnd)
  • ALPR-avoiding route calculation against the public backend
  • Camera map layer, rendered through the GL renderer so markers hold position in 3D
  • Berth selector for avoidance strength
  • Route exposure readout — how many cameras a given route crosses

Routing is served by https://routing.blackflagintel.com, which is live and has the
camera geometry loaded. v1 is online-only; offline ALPR avoidance is planned for v2.

Known limitations

  • The berth slider does not behave consistently between regions. Its usable range is
    roughly 0.3 → 0.01 and the dead zone is density-dependent: a setting that does nothing
    in a sparse area avoids most cameras in a dense one. A density-adaptive mapping is an
    open problem, documented in §7.4 of the paper.
  • arm64-v8a only. No armeabi-v7a or x86_64 build in this release.
  • Camera data is crowdsourced and incomplete in ways that are not random. Absence of
    a camera on the map is not evidence of absence on the pole.
  • The app carries OsmAnd's artwork, which is CC-BY-NC-ND 4.0 and cannot be modified in a
    derivative. Replacing it is outstanding work.

The study

The routing behaviour is backed by a measurement study included in this repository:
17,580 real home–work commutes drawn from Census LEHD LODES across 15 states, each routed
twice against 120,838 mapped camera installations.

  • 74.8% of American commutes pass at least one licence-plate reader
  • 84.6% can be routed to zero exposure, for a median of 1.50 minutes (5.96% overhead)
  • Avoidance is cheapest where cameras are densest — grids offer a parallel street, rural
    routes often do not
  • Demographic gradients that look robust nationally do not survive ranking tracts within
    their own county; mapped camera density varies 3.9× per capita across the states studied

Paper: research/paper/trames.pdf

Two results in it qualify the headline, and are stated there rather than buried: the
avoidance figure degrades to 56.5% if real camera fields of view are 50% wider than the
60 m assumed (§7.3), and the equity findings cannot be separated from variation in who
maps cameras (§5.5, §7.2).

Licensing

client/ derives from OsmAnd and is GPLv3.
Camera data is from OpenStreetMap (ODbL) via Overpass, the corpus surfaced by
DeFlock.