Barberfishes keeps Hammerheads sharp, in the ocean and on your bike. Native-feeling data field enhancements for the Hammerhead Karoo.
Barberfish reimplements and enhances a core set of Karoo data fields with features the built-in fields don't offer. A configurable 3- or 4-column HUD shows any combination of speed, heart rate, power, cadence, average power, normalized power, or grade side by side with zone coloring.
Zone coloring supports both background-fill and text-color styles across four palettes. Time fields use a consistent, unambiguous format across all durations. Average speed fields support a single target or a min/max range with threshold coloring. All fields are styled to match the native Karoo look and feel. Settings are configured through a Karoo-native config screen with live-updating field previews.
| Feature | Default Karoo | Barberfish |
|---|---|---|
| HUD | Not available | Configurable 3- or 4-column layout; each slot independently selectable from Speed, HR, Power, Cadence, Avg Power, NP, or Grade with per-slot zone coloring |
| Zone color palettes | Karoo only | Karoo, Wahoo, Zwift, and Intervals.icu |
| Zone coloring style | Background fill only | Background fill or text color |
| Grade coloring | Not available | Color-coded by road gradient steepness; Karoo, Wahoo, and Garmin palettes |
| Grade smoothing | Unknown | EWMA with α=0.15 (~6 s time constant) to reduce noise from GPS elevation changes |
| Average speed | Exclusive paused time only | Both inclusive and exclusive paused time variants |
| Avg speed threshold | Not available | Configurable single threshold or min/max range with warning bands |
| Time formatting | Ambigious hh:mm or mm:ss depending on duration |
Unambiguous: 1h 23m 45s, 1h 23' 45", or 01:23:45 |
| Duration fields | Built-in duration fields including total time, riding time, paused time, ... | Reimplemented with Barberfish formatting options |
All field settings are configured in the Barberfish app on your Karoo. Changes update live in the settings and take effect immediately without restarting your ride.
| Palette | Power zones (Z1 – Z7) | Heart rate zones (Z1 – Z5) |
|---|---|---|
| Karoo | ||
| Wahoo | ||
| Zwift | ||
| Intervals.icu |
| Palette | Bands (flat → steep) |
|---|---|
| Karoo | 0–5% · 5–8% · 8–13% · 13–16% · 16–20% · 20–24% · ≥24% |
| Wahoo | 0–4% · 4–8% · 8–12% · 12–20% · ≥20% |
| Garmin | 0–3% · 3–6% · 6–9% · 9–12% · ≥12% |
| Format | Under an hour | Over an hour |
|---|---|---|
| Racing | 23'45" |
1h23'45" |
| Clock | 0:23:45 |
1:23:45 |
| Segments | 23m 45s |
1h 23m 45s |
Complete list of data fields provided by Barberfish.
- HUD (configurable 3 or 4 columns; each slot accepts any of the data fields below)
- Power (Instant, 3s, 5s, 10s, 30s, 20m, 1h smoothing)
- Avg Power
- Normalized Power
- Heart rate
- Speed (Instant, 3s, 5s, 10s smoothing)
- Total average speed (including paused time)
- Moving-time average speed (excluding paused time)
- Cadence (Instant, 3s, 5s, 10s smoothing)
- Grade (EWMA smoothing, α=0.15, ~6 s time constant)
- Elapsed time
- Moving time
- Paused time
- Time to destination
- Time to sunrise
- Time to sunset
- Time to civil dawn
- Time to civil dusk
![]() |
HUD using the Wahoo palette for text zone coloring and RouteGraph in the second row. |
![]() |
HUD with background-fill zone coloring. |
![]() |
4-column HUD showing speed, HR, power, and cadence. |
![]() |
Comparing 4 reimplemented fields: Text-color power vs background-fill power and HR. Moving average speed in red above the configurable 30 km/h threshold. Paused time in clock format showing the difference between. |
![]() |
Karoo-style config screen with collapsible sections. |
![]() |
FieldCard with live preview showing the smoothing-aware label and zone color mode selector. |
![]() |
Threshold configuration for average speed: single threshold or min/max range with configurable warning bands. |
![]() |
Configurable HUD slot picker: tapping a column opens the field selector. |
![]() |
Grade field with gradient coloring. |
The three-column HUD is designed as the top row of a map data page providing speed, heart rate, and power at a glance.
A single row on the map page takes up a lot of vertical space. A nice workaround is adding a second row to occupy this excess vertical space with e.g. RouteGraph for an elevation profile.
Racing an event with a target average? Set a single threshold at your goal pace on the average speed field (excluding paused time). The field colors green above it and red below, so you know at a glance whether you're on track.
ACP randonneuring events impose checkpoint cutoff speeds on your total average speed, including any paused time. The rules set a 15 km/h minimum and 30 km/h maximum. Set Min: 15 and Max: 30 on the total average speed field to keep track. The field colors green inside the zone, orange when approaching a boundary, and red when outside.
Ideas that may or may not be implemented
- Day mode support fields are currently only tested in night mode; day mode rendering needs verification and adjustments
- ETA data field estimated time of arrival at destination, gradient- and paused-time aware for more accurate predictions on hilly routes
- Workout target field continuous deviation from the workout target (power, HR, pace) rather than the native discrete below/on target/above states; zone coloring reflects how far off target you are, not just which side you're on
Tested on a Karoo 3 running firmware 1.618.2377.20 using metric units and dark mode. Should work on Karoo 2 and other firmware versions, but no guarantees.
- Find the APK link on the latest release page.
- Sideload the APK
- Karoo 3: via the Karoo app following Hammerhead's sideloading instructions.
- Karoo 2: via your computer following DC Rainmaker's instructions
- karoo-ext — the official Hammerhead SDK for building Karoo extensions
- awesome-karoo — a curated list of Karoo extensions and resources
- Hammerhead Visual Data Field System — the Figma design guide used to match the native Karoo look and feel
Bug reports and pull requests are welcome on GitHub. Suggestions for new HUD data fields are especially welcome — open an issue describing the metric and how you'd use it on the bike.
BarberfishView and BarberfishDataType are a reimplementation of the native Karoo data field that matches the Hammerhead look and feel, with added support for variable font sizes and control over the fill color behind the label and icon.
See docs/architecture.md for the component hierarchy, naming conventions, and the rationale behind using AndroidRemoteViews for the label and value rendering.
Released under the Apache License 2.0.









