OpenPE / OpenPump

Get the app
Sections

We wrote our own app to run our pump the way we wanted.

The app that came with it only let us do what its makers had thought of. We wanted to find out what the hardware itself could do, so we built one that hands the settings to you.

Download for AndroidOpenPump 0.10.0, under 2 MB, for Android 7.0 or newer. No iPhone version yet. Release notes and checksum.

To check the APK really comes from OpenPump, its signing certificate's SHA-256 fingerprint is a277b68a88aacec9d9137e492eddd2b141d03756f0c7143d441e082ae843402d

See it run ↓

Why bother

The only way in

Most smart pumps come with an app from the company that made them, and that app is usually the only way in. For now OpenPump runs one pump, the Epic Hydro PE Pump. The goal is any Bluetooth pump whose protocol can be reverse engineered.

Routines and records should belong to whoever's using the pump.

A session · 1 of 4

Today

It opens on the routine you picked: how long it runs, what it peaks at and how many stages it has. One button starts it.

1button starts it

A session · 2 of 4

The run

The solid line is the pressure the pump reports, about four times a second. The dashed line is what it was asked to hold.

Try it:pullThe app's own model of the pump, running here: the dashed line moves at once, the pump's line follows.

A session · 3 of 4

Changing it mid-run

Pull, hold, drop and drop time change from the − / + controls while a set is running, and More › has the speed. Coming steps changes the steps still to come. It all applies to this run only: when it's over, you decide whether the saved routine keeps the change.

A session · 4 of 4

The summary

Peak and dose come from the pump's own readings, and a session that got no readings leaves them blank instead of writing a zero. It says what the session counted for, and why.

Any time

Sets of your own

Sets go into stages and stages go into routines. Change a set once and every routine that uses it follows. Each routine is drawn as the shape it will run.

3kinds of set: fixed, ramp, rest

Weeks

The plan

Tell it how long your sessions run now and the pressure you use, then pick your days. It adjusts the routine it wrote for you as your sessions come in. Moving up is your call.

Months

Over months

Readings only line up with others taken the same way. The line breaks where two can't be compared.

8ways of measuring, kept apart

Always

What never changes

Anything above your ceiling is lowered before it reaches the pump. A session ends and vents on its own after two hours under pressure.

2.1–16.8inHg (7–57 kPa): the ceiling, set by you

Try it:Each step is one press of the app's + or −: the ceiling moves one notch.

When you want it

Kept to yourself

Settings › Privacy has a switch for each incognito feature — a disguised icon and name (Fitness log, Habits or Notes, worn on the app lock too), discreet notifications, hiding from recent apps, quick hide — plus one that turns your chosen set on and off together, off until you turn it on. STOP stays reachable, and safety alerts still ring and vibrate.

Try it:discreet notificationsThe app's own notification words, with the switch off and on.

Start here

Your first session

  1. Try every screen on the simulated pump: Settings › Device & developer. No hardware needed.
  2. Connect your Epic Hydro PE Pump.
  3. Pick a routine on Today.
  4. Press start. Simulated runs are always labelled.

New versions go up on the Releases page. Follow the project on GitHub to hear when one does.

Kinds of set

Early on we noticed that a set can take almost any shape, and the same shape feels different from one person to the next. So instead of shipping a list of presets, we broke a set down into the numbers it's made of and handed all of them over.

fixed · the same pull every rep

ramp · 2 to 9 steps from one pressure to another

rest · the pump vents and a timer runs

Pick a kind, then set the numbers: how hard it pulls, how long it holds, how far it lets go and for how long, and how fast the pump works. Switch on per-rep edits in Settings and each rep of a fixed set can have its own values as well.

People shape their sessions around their own comfort and preferences, and around anything they'd rather avoid. The app doesn't decide any of that for you.

Pull to −4.1 inHg and hold for 40 seconds, drop for 8, and repeat for 4 minutes.

Keeping track is the hard part

Following a long-term plan means remembering what you ran and how it went, then matching that against where the plan says you should be by now. That's where people lose the thread, or end up buried in numbers.

So the training plan does that part. You tell it how long your sessions run now and the pressure you use, then pick the days you can train. It starts each track where its own session is closest to yours. You train. As your sessions come in, it adjusts the routine it wrote for you, plans the deload weeks, and tells you when you've met the conditions for the next level. A week counts with two full sessions of a track, or three shorter ones. Moving up is your call, at your own pace: while your measurements are on target and rising, its scheduled steps come half as often, and the card asks whether to step up now or wait.

It applies publicly available training guidance mechanically. Every decision shows its reason, and whether the rule behind it is stated in a source or was worked out. It can't know your body, and it isn't advice. It stays off until you turn it on. It never stops you starting a session, and it leaves any routine you've changed yourself alone.

Working pressure is close. Time per session, and two weeks holding both, are still to go.

Numbers that came from your own answers say so, like "Placed by your 20-min session". Sample data.

Measurements only compare when they're taken the same way

Any way of measuring works, as long as you keep using the same one. The app keeps every measurement with the way it was taken and with the session around it, and it only lines a reading up against others taken the same way.

A reading taken under pressure is stored with the pressure the pump actually reported, and it's only compared with another taken within 0.3 inHg (1 kPa) of it. So you can stop guessing whether two numbers belong on the same line.

WhenRoutineLengthFinishedPeakDoseHow it felt
12 Sep, 19:04Warm + Build11:30yes−10.0 inHg10,840 kPa·sok
10 Sep, 18:51Warm + Build6:52stopped early−9.0 inHg6,120 kPa·stoo much

Sample rows from a session export, with some columns left out. Peak and dose come from the pump's own readings, and a session that got no readings leaves them blank instead of writing a zero.

Export sessions and measurements as spreadsheet files or a PDF report whenever you like, and keep them wherever you want. Nothing leaves your phone unless you export, back up or share it yourself.

Where OpenPump is going

Numbered rows are the steps, in order. Indented rows are ideas.

  • A step, in order
  • An idea, growing from a step
  • NowNextLaterMaybenearer is surer
  • Dashed: a maybe

The roadmap as a table. Each step is followed by the ideas that grow from it.
StageWhat it isThemeNeedsHow you can help
NowEverythingfinishing and reviewinstall it, report bugs
NowMeasurements
Nowgrows from step 2Everythingsay you'd use it
Nowgrows from step 2Everythingsay you'd use it
NextPumpsbuilding it in small reviewed stepsreview the design
Nextgrows from step 3Communitypump ownersadd your pump
NextCommunitya pump owner trying ittry it on your pump
NextPlatforms
Nextgrows from step 5Communitytranslatorstranslate a screen
LaterPumpsowners and their capturesopen a New pump issue
Latergrows from step 6Pumpshardware logssend a session log
LaterMeasurementsmany logged sessionskeep the Tissue response test on
Latergrows from step 7Measurementsa safety reviewsay you'd use it
Latergrows from step 7Running a sessiondesignsay you'd use it
LaterDataa documented formatshare a routine code
Latergrows from step 8Trainingdesignshare a routine code
MaybeData
Maybegrows from step 9Dataa contributorhelp build it
Maybegrows from step 9Datasay you'd use it
MaybePumps
Maybegrows from step 10Pumpssay you'd use it
  • NowEverything

    Needsfinishing and reviewYou caninstall it, report bugs

  • NowMeasurements
  • NowEverything
    grows from step 2

    You cansay you'd use it

  • NowEverything
    grows from step 2

    You cansay you'd use it

  • NextPumps

    Needsbuilding it in small reviewed stepsYou canreview the design

  • NextCommunity
    grows from step 3

    Needspump ownersYou canadd your pump

  • NextCommunity

    Needsa pump owner trying itYou cantry it on your pump

  • NextPlatforms
  • NextCommunity
    grows from step 5

    NeedstranslatorsYou cantranslate a screen

  • LaterPumps

    Needsowners and their capturesYou canopen a New pump issue

  • LaterPumps
    grows from step 6

    Needshardware logsYou cansend a session log

  • LaterMeasurements

    Needsmany logged sessionsYou cankeep the Tissue response test on

  • LaterMeasurements
    grows from step 7

    Needsa safety reviewYou cansay you'd use it

  • LaterRunning a session
    grows from step 7

    NeedsdesignYou cansay you'd use it

  • LaterData

    Needsa documented formatYou canshare a routine code

  • LaterTraining
    grows from step 8

    NeedsdesignYou canshare a routine code

  • MaybeData
  • MaybeData
    grows from step 9

    Needsa contributorYou canhelp build it

  • MaybeData
    grows from step 9

    You cansay you'd use it

  • MaybePumps
  • MaybePumps
    grows from step 10

    You cansay you'd use it

Tap a row for its details.

Suggest an idea, or vote on oneReport a bug

Both go to GitHub: ideas to Discussions › Ideas, bugs to Issues.

Most wanted

The ideas with the most votes in GitHub Discussions › Ideas.

No ideas yet: be the first.

Suggest or vote

Got a pump it doesn't support?

That's most of them.

Help us add yours, or get the app for the one it does support.

You don't have to write code to help. Report a bug with your phone, Android version and pump, share a capture from a pump it doesn't support yet, suggest a screen, or fix wording that reads badly. One honest limit: a pump that can't report its own pressure can't confirm a vent, so support for it would be limited, or declined.

For developers

How it's put together, in enough detail to find your way around the source.

the app routines, the run, the plan, the logbook exists a pump driver interface match, write, listen, stop doesn't exist yet PumpLink SimPump lives inside a second pump planned one exists
Today the app talks to PumpLink directly. The dashed box in the middle is the job: an interface both pumps can sit behind.

The main parts

SessionActivity
The launcher and the run engine. It's still over 41,000 lines, although the screens have moved into classes of their own: RunScreen, LibraryScreen, ProgressScreen, TrainerScreen, SettingsScreen and a few more.
PumpLink
The Bluetooth link, which scans, connects, writes frames and reads the pump's telemetry. PumpMatch picks the pump out of a scan, Proto builds and parses the frames, and Conn tracks the connection state.
SimPump
A model of the pump's firmware. A switch in Settings (Device & developer › Simulated pump) swaps it in inside PumpLink, so the whole app runs with no hardware, and every run it files is marked simulated.
Model and Store
Sets, stages, routines, sessions and readings as plain data classes with their JSON. Store keeps them in one file on the phone.
Session and AsRun
Session makes the run's decisions without touching Android. AsRun records what a run actually did. RunService keeps a live run going behind a foreground notification.
Plan and Mint
Plan holds the training plan's progression rules, and Mint turns a prescription into sets.
Export and Backup
Export writes the CSV files and ExportScreen the PDF report. Backup builds and checks the zip.

Building and testing

git clone https://github.com/OpenByte-source/OpenPump-App.git
cd OpenPump-App
./gradlew test                 # every check, no phone needed
./gradlew :app:assembleDebug   # the APK
./gradlew installDebug         # onto a connected phone or an emulator

You need JDK 17 or newer and the Android SDK, platform 34. Android Studio installs both.

A Gradle build with no third-party libraries in the app. It targets SDK 34 and runs on Android 7 (SDK 24) and up. The logic lives in a plain Java 17 module, 126 files that never import Android, so most of it is tested on any computer without an emulator.

What the exports look like

sessions.csv

One row per session: when, which routine, how long, the peak and the dose, the change in length and girth, and how it felt.

readings.csv

One row per measurement: when, how it was measured, length and girth, the hold it was taken under, and which photos you took.

Every column, for developers
FileColumnMeaning
sessionsts_isowhen the session was saved, local time
sessionsroutine, duration_s, completedwhat ran (Manual for a manual run), for how many seconds, whether it ran to the end
sessionspeak_kpa, peak_display, display_unitthe highest pressure the pump reported, raw and in your unit
sessionsdose_kpa_sthe pressure above 10 kPa, added up over the run
sessionsexpansion_len_cm, expansion_gir_cm, expansion_len_display, expansion_gir_display, size_unitafter minus before, raw and in your unit
sessionscomparablewhether the after-reading was taken the same way as the one before it
sessionsfeelyour answer to “How did it go?”: great, ok or too much (older rows: easy, fine or tough)
sessionsnoteyour note
sessionsfill_time_before_s, fill_time_after_s, fill_time_change_pctthe Tissue response test’s fill time before and after the routine, in seconds, and the change in % (empty when the test was off; the change is also empty when the two pulls can’t be compared)
readingsts_iso, len_cm, gir_cm, len_display, gir_display, size_unitwhen; length and girth, raw and in your unit (empty unless the reading’s method measures it and a value was entered)
readingshold_kpa, observed_kpathe hold's target and what the pump reported (empty when unknown)
readingshas_front, has_side, has_topwhich photos were taken
readingsmethodhow it was measured: STD (the Standardised line) or an at-rest method, BPEL, NBPEL, BPSSL, BPSL, NBPSL, MSEG or MSSG (empty for a code this version doesn’t know)
readingsphasebefore or after a session (empty when not said)
readingskindstandardised: a hold was recorded, its pressure in hold_kpa; at_rest: an at-rest method; no_hold: on the Standardised line with no hold recorded, including older at-rest readings saved before methods existed
  • Raw columns are plain numbers in kPa and cm, whatever units you use, so a spreadsheet can add them up.
  • An empty cell means not measured. It's never 0.
  • The headers never change without a new version; the self-test checks them.

What a pump driver would have to do

match
Recognise the pump from the name it advertises.
write
Send a preset and get an acknowledgement back.
listen
Report samples with a unit and a rate, and say plainly when there's no measurement.
stop
Vent, and report the pressure falling so the app can confirm it.

None of that exists as an interface yet. The only boundary today is PumpLink's listener callback, and pulling a driver interface out of PumpLink is the first job on the list after the release.