No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Robert Butzhammer 73ebee578f Apply the 2026-09-02 changelist to the tracker; retire it
23 issues gained a dated 'Update -- 2026-09-02' section, matching the
convention of the two earlier review rounds. Three issues created:

- #71 Voice turn announcements from the phone (Phase 3, FR-N19/D45)
- #72 Name route sources that export cues (Phase 3, FR-N20/D40)
- #73 Off-route re-routing with cue-sheet splicing (Phase 5, D42)

#57 was cut to rejoin-point selection and the bearing arrow; everything
about enriching and splicing a detour moved to #73.

Dependency edges rewired for the scope cut: #57 is no longer blocked by
#27 (it enriches nothing now), and #73 picks up #27, #57 and #31.

docs/TRACKER-CHANGES.md removed -- it existed only because the tracker
needed authentication that was unavailable, and it says to delete it
once the tracker matches. It does.
2026-09-02 19:43:04 +02:00
docs Apply the 2026-09-02 changelist to the tracker; retire it 2026-09-02 19:43:04 +02:00
.gitignore Add project documentation and 2026-09-02 design review 2026-09-02 15:06:46 +02:00
LICENSE Add project documentation and 2026-09-02 design review 2026-09-02 15:06:46 +02:00
README.md Apply the 2026-09-02 changelist to the tracker; retire it 2026-09-02 19:43:04 +02:00

PedalPebble

A cycling computer for the Pebble Time 2 and Pebble Round 2, paired with an Android phone.

Shows speed, average speed and heart rate on the wrist; later, turn-by-turn navigation for routes planned in komoot, and a map view.

Status

Planning complete and closed. The repository currently contains documentation only.

No further planning rounds happen until the two blocker spikes below have run — see D48. Their findings reopen the documents; nothing else does.

Hardware and platform

Watches Pebble Time 2emery, 200×228 rectangular, 64-colour e-paper, 4 buttons
Pebble Round 2gabbro, 260×260 round, colour e-paper at 283 DPI, 4 buttons
Heart rate The watch's own optical sensor — Time 2 only; the Round 2 has no HRM, so the field is simply absent there
Phone Android — supplies GPS, navigation and the map
Speed Phone GPS, with an optional BLE wheel sensor (Cycling Speed & Cadence, 0x1816)
Routes GPX, imported through the Android share sheet — komoot, bikerouter.de, RideWithGPS, Strava
Turn cues Read from the GPX where the planner provides them; otherwise derived on the phone at import

The Pebble has no GPS of its own, and iOS is not supported: Core Devices discontinued PebbleKit iOS, so a companion app is only possible on Android.

Documentation

Document What it covers
docs/DECISIONS.md Every significant decision, with its rationale and the options rejected
docs/DESIGN.md Watch display: page descriptors, templates, default pages, button model
docs/REQUIREMENTS.md Functional and non-functional requirements, and what is still open
docs/PROTOCOL.md The message contract — every AppMessage key, both directions, and the update-rate policy

docs/archive/PLAN.md is the original 2026-08-31 plan. It is kept for the reasoning, not for the content: its architecture, message contract and Spike C definition are all overtaken, and its issue table stops at #47 of 70. Start with DECISIONS.md instead.

Planning routes

Any GPX works, but where you plan the route decides how good the turn instructions are.

Planner Turn cues in its GPX? What PedalPebble does
bikerouter.de Yes — enable turn instructions on export Reads them directly. Exact, offline, nothing else needed. Recommended
cycle.travel, RideWithGPS, Garmin Usually Reads them directly
komoot No — geometry only Derives cues at import, via BRouter if installed, otherwise a geometric guess

bikerouter.de is BRouter's own web front end, so its exported cues are the same quality as an on-device BRouter enrichment — without installing BRouter or downloading segment files. When a geometry-only file arrives, the import says so and names a planner that would not have. See D40.

Issue tracker

All work is tracked as issues in this repository:

https://git.butzei.de/robert/PedalPebble/issues

73 issues across 8 milestones, one milestone per phase. Issues carry blocked-by dependencies, so the issue list shows what is actually startable.

Milestone Issues What it delivers
Bootstrap 2 Docs and MIT licence on main, repo pushable
Phase 0 — Toolchain & spikes 8 SDK working; CI; the three spikes that de-risk everything else
Phase 1 — Ride view 11 Watch-only build on emery: page system, speed, heart rate, ride timer
Phase 1b — Generalise the display 2 HERO1, GRID6, German, and the round Pebble Round 2
Phase 2 — Companion & speed 16 Android app: background GPS, speed/cadence/power sensors, GPX recording
Phase 3 — Navigation 23 Turn-by-turn from an imported GPX
Phase 4 — Map view 4 Vector map on the watch
Phase 5 — Polish 7 Settings, laps, export, distribution, re-routing

Phase 1 deliberately stops at emery with two templates, so the first rideable build lands before the display work is generalised — see D32.

Labels are area:* (watchapp, companion, shared, tooling, docs), kind:* (feature, spike, chore, test) and blocker.

The tracker reflects the 2026-09-02 review (D37D48). Twenty-three issues carry a dated Update — 2026-09-02 section recording what changed and why, in the same style as the two earlier review rounds; three issues are new (#71 voice announcements, #72 route-source guidance, #73 the deferred re-route splice).

Start here

Two issues are labelled blocker, and between them they gate most of the project.

#4 — Spike A: PebbleKit Android round-trip decides the transport, and almost all of Phases 24 depends on it. It tries PebbleKit Android 2 first — a maintained Kotlin library that replaces the 2016 bridge's broadcast intents with bound services — and 4.0.1 second. The most likely failure of either is Android 11+ package visibility, not the bridge, so the spike must rule that out before reporting anything broken.

It also has to verify the fallback, which was as unverified as the thing it backs up, and measure what 1 Hz of link traffic costs the watch battery — the one number that could invalidate the whole architecture. See D37, D38 and D36.

#6 — Spike C: BRouter AIDL enrichment decides the komoot path. BRouter is a router, not a map-matcher: it computes its own route between the via points, which can diverge from the route you imported. Voice hints coming back is not a pass — the spike has to measure geometric fidelity, per leg rather than per route. See D25 and D41.

Its stakes are lower than they were. A route planned on bikerouter.de already carries cues (D40), and off-route guidance is a bearing arrow rather than a mid-ride re-route (D42), so BRouter is no longer on the mid-ride critical path at all.

Repository layout (planned)

watchapp/    Pebble C project, targets emery and gabbro
companion/   Android app, Kotlin
shared/      message_keys.json — the AppMessage contract, generated into both sides
tools/       gpx_replay.py and other dev utilities
docs/        this documentation

Licence

MIT — see LICENSE.

Routing and turn instructions are derived from OpenStreetMap data via BRouter and, when the rider opts in, online map-matching services. OpenStreetMap data is © OpenStreetMap contributors, available under the Open Database Licence.