The decompression models we use and trust today to plan our dives are the result of decades of collective research by thousands of people. There is a lot of software available to plan dives, built on top of this research. However, on Android and iOS the options are limited: either expensive and proprietary, or lacking a good mobile-friendly interface.
Abysner /əˈbɪznər/ was built with the goal of giving something back to the diving community. It is open-source, built with Kotlin Multiplatform and Compose Multiplatform (the best cross-platform mobile solution to date), available on both Android and iOS, and free to inspect and verify.
Disclaimer: Diving is a potentially dangerous activity. Do not use this application without proper training in diving and decompression techniques. This application is in an early development stage, and we cannot guarantee that it is free of bugs. Always cross-validate any information presented by the application with reliable sources.
No one associated with this project (including authors, contributors, advisors, or any other affiliates) can be held responsible for the outcomes of your use of the information provided by this application. The use of this application is entirely at your own risk.
Abysner is built with simplicity in mind. Other planners may offer more data or options, but Abysner is designed to be easy and quick to use, correct enough to trust, on the device you already have in your pocket.
Prioritizing usability over complexity makes it a practical tool in the field, but as an instructor myself, also a good fit for the classroom: you can walk students through a real plan on a phone, no laptop required.
Abysner is under active development (imperial units are not available yet), but it already supports:
- Full open-circuit (OC) dive planning
- Full closed-circuit rebreather (CCR) dive planning with configurable setpoints and bailout
- Buhlmann ZHL-16 A, B and C with gradient factors
- Multi-gas: Air, Nitrox, Oxygen, Trimix, Helitrox, Heliox
- Intuitive gas selector showing MOD based on oxygen and gas density
- User configurable:
- SAC rates
- Environment (salinity, altitude)
- Descent/ascent rates
- Gradient factors
- Deco stop intervals and last deco stop
- Max PPO2 and gas switch time
- CCR setpoints (low and high) with automatic switch depth
- Dive profile graph with average depth and ceiling
- Dive plan: runtime, depth, duration, gas, gas switches, ascents, descents, and more...
- Oxygen toxicity tracking: CNS and OTU
- Contingency plan: Automatic longer and deeper contingency plan with configurable time and depth
- Gas plan: used and reserve/bailout gas calculation, per-cylinder requirements, warnings, density and PPO2 information
- Multi-level dive planning
- Multi-dive planning with surface intervals
Dives are planned based on bottom sections with automatically calculated ascents and descents.
- To reach the depth of a section the descent or ascent time that is required to reach this depth is subtracted from that section's bottom-time.
- The final ascent to the surface is not part of any section and the time it takes is not subtracted from anything, instead added to the total dive so far.
Example (assume no deco):
A planned section at 30 meters for 20 minutes at 5 m/min descent/ascent speed will turn into a dive
profile where the first 6 minutes is a descent, then 14 minutes bottom-time, then 6 minutes ascent
time. The total dive time this makes is 26 minutes.
When the app calculates a dive profile for decompression, it also calculates how much gas is required for the dive. The gas plan shows two numbers per cylinder: used gas and reserve gas for open-circuit dives, or loop gas and bailout gas for closed-circuit dives.
Both numbers can be based on the contingency (Deeper & Longer) profile if one (or both) of those options is enabled. This means the contingency settings directly affect gas requirements.
-
Used gas: How much gas one diver needs to normally complete the profile.
-
Reserve gas: How much extra gas is required to safely bring up an out-of-air diver from the worst-possible point during the dive. It is calculated based on the worst TTS in terms of gas usage (See: FAQ No. 5), however during an out-of-gas scenario your buddy may have a completely different SAC rate than normal (a panic rate). To account for this, reserve gas is calculated using the emergency SAC rate, usually at least 2 times higher than your normal SAC rate.
For CCR dives, gas planning works differently. There is no reserve gas for an out-of-air buddy. Instead, the gas plan shows loop gas (diluent and oxygen consumed in the closed-loop) and bailout gas. Bailout tells you how much open-circuit gas you need if the loop fails at the worst-possible point. It is calculated at the normal SAC rate. CCR divers can adjust their SAC rate setting to account for the stress of a bailout scenario as they see fit.
How do Abysner dive plans compare to dive plans created by other dive planners? Below are some reference plans. If you want to recreate a reference plan, these are the settings used by all of them, some settings (Gradient factors, Salinity, Altitude and Last-deco stop) are specific for each plan, see the plan specific tables for those.
| Setting | Value |
|---|---|
| Ascent | 5 m/min |
| Descent | 5 m/min |
| Algorithm | Bühlmann ZHL-16C |
| Deco PPO2 | 1.6 |
| Bottom/travel PPO2 | 1.4 |
| END | 30 meter |
| O2 Narcotic | true |
20 meter, 20 minutes*, single-gas (21/0)
| GF | Salinity | Altitude | Last-deco stop |
|---|---|---|---|
| 30/70 | Fresh | 0 meters | 3 meter |
Abysner
| Depth | Duration | Runtime | Gas |
|---|---|---|---|
| 20m | 4min | 4min | 21/0 |
| 20m | 16min | 20min | 21/0 |
| 0m | 4min | 24min | 21/0 |
| CNS: 3% | |||
| OTU: 6 |
Subsurface
| Depth | Duration | Runtime | Gas |
|---|---|---|---|
| 20m | 4min | 4min | 21/0 |
| 20m | 16min | 20min | 21/0 |
| 0m | 4min | 24min | 21/0 |
| CNS: 3% | |||
| OTU: 6 | |||
| Subsurface (6.0.5214-CICD-release) |
DIVESOFT.APP
| Depth | Duration | Runtime | Gas |
|---|---|---|---|
| 20m | 4min | 4min | 21/0 |
| 20m | 16min | 20min | 21/0 |
| 0m | 4min | 24min | 21/0 |
| CNS: 2% | |||
| OTU: 5 | |||
| DIVESOFT.APP (Android 1.8.4) |
30 meter, 30 minutes*, multi-gas
| GF | Salinity | Altitude | Last-deco stop |
|---|---|---|---|
| 30/70 | Salt | 0 meters | 6 meter |
Abysner
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 |
| ➙ | 30m | 24min | 30min | 21/0 |
| ➚ | 21m | 2min | 32min | 21/0 |
| - | 21m | 1min | 33min | 50/0 |
| ➚ | 9m | 3min | 36min | 50/0 |
| ⏹ | 9m | 1min | 37min | 50/0 |
| ⏹ | 6m | 11min | 48min | 50/0 |
| ➚ | 0m | 2min | 50min | 50/0 |
| CNS: 12% | ||||
| OTU: 35 |
Subsurface
Observations:
- Subsurface merges the ascent from 21 meter to 9 meter into the 9 meter stop, while Abysner shows the ascent as a separate segment followed by the stop.
- Subsurface rounds the final ascent (6 to 0 meter) down to 1 minute while the ascent actually takes longer at 5 meter per min. Abysner uses 2 min, adjusting the ascent slope to fit exactly.
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 |
| ➙ | 30m | 24min | 30min | 21/0 |
| ➚ | 21m | 2min | 32min | 21/0 |
| - | 21m | 1min | 33min | 50/0 |
| ⏹ | 9m | 3min | 36min | 50/0 |
| ⏹ | 6m | 11min | 47min | 50/0 |
| ➚ | 0m | 1min | 48min | 50/0 |
| CNS: 13% | ||||
| OTU: 34 | ||||
| Subsurface (6.0.5214-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
DIVESOFT.APP does not appear to include a gas switch time. With gas switch time set to zero Abysner produces the same total runtime (50min), though the individual stop distributions differ ever so slightly.
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 |
| ➙ | 30m | 24min | 30min | 21/0 |
| ➚ | 21m | 2min | 32min | 21/0 |
| ➚ | 9m | 2min | 34min | 50/0 |
| ⏹ | 9m | 1min | 35min | 50/0 |
| ⏹ | 6m | 13min | 48min | 50/0 |
| ➚ | 0m | 2min | 50min | 50/0 |
| CNS: 11% | ||||
| OTU: 32 | ||||
| DIVESOFT.APP (Android 1.8.4) |
45 meter, 15 minutes*, multi-gas, trimix
| GF | Salinity | Altitude | Last-deco stop |
|---|---|---|---|
| 30/70 | Salt | 0 meters | 3 meter |
Abysner
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 45m | 9min | 9min | 21/35 |
| ➙ | 45m | 6min | 15min | 21/35 |
| ➚ | 21m | 5min | 20min | 21/35 |
| - | 21m | 1min | 21min | 50/0 |
| ➚ | 6m | 3min | 24min | 50/0 |
| ⏹ | 6m | 2min | 26min | 50/0 |
| ⏹ | 3m | 5min | 31min | 50/0 |
| ➚ | 0m | 1min | 32min | 50/0 |
| CNS: 9% | ||||
| OTU: 25 |
Subsurface
Observations: Subsurface merges the ascent from 21 meter to 9 meter into the 9 meter stop, while Abysner shows the ascent as a separate segment followed by the stop.
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 45m | 9min | 9min | 21/35 |
| ➙ | 45m | 6min | 15min | 21/35 |
| ➚ | 21m | 5min | 20min | 21/35 |
| - | 21m | 1min | 21min | 50/0 |
| ⏹ | 6m | 5min | 26min | 50/0 |
| ⏹ | 3m | 5min | 31min | 50/0 |
| ➚ | 0m | 1min | 32min | 50/0 |
| CNS: 10% | ||||
| OTU: 26 | ||||
| Subsurface (6.0.5214-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
- DIVESOFT.APP does not appear to include a gas switch duration. With the gas switch duration set to one minute Abysner produces total runtime of 32min, compared to 33min for DIVESOFT.APP. The individual stop distributions differ ever so slightly.
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 45m | 9min | 9min | 21/35 |
| ➙ | 45m | 6min | 15min | 21/35 |
| ➚ | 21m | 5min | 20min | 21/35 |
| ➚ | 9m | 2min | 22min | 50/0 |
| ⏹ | 9m | 1min | 23min | 50/0 |
| ⏹ | 6m | 2min | 25min | 50/0 |
| ⏹ | 3m | 7min | 32min | 50/0 |
| ➚ | 0m | 1min | 33min | 50/0 |
| CNS: 9% | ||||
| OTU: 23 | ||||
| DIVESOFT.APP (Android 1.8.4) |
60 meter, 20 minutes*, multi-gas, trimix, altitude
| GF | Salinity | Altitude | Last-deco stop |
|---|---|---|---|
| 40/85 | Fresh | 1000 meters | 3 meter |
Abysner
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 60m | 12min | 12min | 18/45 |
| ➙ | 60m | 8min | 20min | 18/45 |
| ➚ | 21m | 8min | 28min | 18/45 |
| - | 21m | 1min | 29min | 50/0 |
| ➚ | 15m | 2min | 31min | 50/0 |
| ⏹ | 15m | 1min | 32min | 50/0 |
| ⏹ | 12m | 2min | 34min | 50/0 |
| ⏹ | 9m | 4min | 38min | 50/0 |
| ⏹ | 6m | 6min | 44min | 50/0 |
| ⏹ | 3m | 12min | 56min | 50/0 |
| ➚ | 0m | 1min | 57min | 50/0 |
| CNS: 15% | ||||
| OTU: 40 |
Subsurface
Observations:
- Atmospheric pressure was set to 900 mbar directly in Subsurface to match Abysner's barometric formula result for 1000 meter altitude, eliminating it as a variable in the comparison.
- The remaining stop-time differences (12, 6 and 3 meter) seem to be algorithmic.
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 60m | 12min | 12min | 18/45 |
| ➙ | 60m | 8min | 20min | 18/45 |
| ➚ | 21m | 8min | 28min | 18/45 |
| - | 21m | 1min | 29min | 50/0 |
| ⏹ | 15m | 3min | 32min | 50/0 |
| ⏹ | 12m | 3min | 35min | 50/0 |
| ⏹ | 9m | 4min | 39min | 50/0 |
| ⏹ | 6m | 8min | 47min | 50/0 |
| ⏹ | 3m | 15min | 62min | 50/0 |
| ➚ | 0m | 1min | 63min | 50/0 |
| CNS: 17% | ||||
| OTU: 46 | ||||
| Subsurface (6.0.5576-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not support setting an altitude. This plan has been based on 0 meters instead of 1000 meters used in the other planners.
DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 60m | 12min | 12min | 18/45 |
| ➙ | 60m | 8min | 20min | 18/45 |
| ➚ | 21m | 8min | 28min | 18/45 |
| ➚ | 18m | 0min | 28min | 18/45 |
| ⏹ | 18m | 1min | 29min | 50/0 |
| ⏹ | 15m | 3min | 32min | 50/0 |
| ⏹ | 12m | 2min | 34min | 50/0 |
| ⏹ | 9m | 5min | 39min | 50/0 |
| ⏹ | 6m | 8min | 47min | 50/0 |
| ⏹ | 3m | 17min | 64min | 50/0 |
| ➚ | 0m | 1min | 65min | 50/0 |
| CNS: 17% | ||||
| OTU: 47 | ||||
| DIVESOFT.APP (Android 1.8.4) |
40 meter max, multi-level (cave-profile) dive, single-gas trimix
Note: this is not meant to be a realistic scenario.
Plan details
In:
- Descent: 40 meter, 8 minutes
- Flat: 40 meter, 2 minutes
- Ascent: 30 meter, 2 minutes
- Flat: 30 meter, 8 minutes
Out:
- Flat: 30 meter, 8 minutes
- Descent: 40 meter, 2 minutes
- Flat: 40 meter, 2 minutes
- Ascent: at 5 m/min max (as planned by planner)
| GF | Salinity | Altitude | Last-deco stop |
|---|---|---|---|
| 50/80 | Fresh | 0 meters | 3 meter |
Abysner
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 40m | 8min | 8min | 21/20 |
| ➙ | 40m | 2min | 10min | 21/20 |
| ➚ | 30m | 2min | 12min | 21/20 |
| ➙ | 30m | 16min | 28min | 21/20 |
| ➘ | 40m | 2min | 30min | 21/20 |
| ➙ | 40m | 2min | 32min | 21/20 |
| ➚ | 9m | 7min | 39min | 21/20 |
| ⏹ | 9m | 3min | 42min | 21/20 |
| ⏹ | 6m | 6min | 48min | 21/20 |
| ⏹ | 3m | 15min | 63min | 21/20 |
| ➚ | 0m | 1min | 64min | 21/20 |
| CNS: 9% | ||||
| OTU: 26 |
Subsurface
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 40m | 8min | 8min | 21/20 |
| ➙ | 40m | 2min | 10min | 21/20 |
| ➚ | 30m | 2min | 12min | 21/20 |
| ➙ | 30m | 16min | 28min | 21/20 |
| ➘ | 40m | 2min | 30min | 21/20 |
| ➙ | 40m | 2min | 32min | 21/20 |
| ➚ | 9m | 7min | 39min | 21/20 |
| ⏹ | 9m | 3min | 42min | 21/20 |
| ⏹ | 6m | 8min | 50min | 21/20 |
| ⏹ | 3m | 16min | 66min | 21/20 |
| ➚ | 0m | 1min | 67min | 21/20 |
| CNS: 9% | ||||
| OTU: 25 | ||||
| Subsurface (6.0.5214-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
| Depth | Duration | Runtime | Gas | |
|---|---|---|---|---|
| ➘ | 40m | 8min | 8min | 21/20 |
| ➙ | 40m | 2min | 10min | 21/20 |
| ➚ | 30m | 2min | 12min | 21/20 |
| ➙ | 30m | 16min | 28min | 21/20 |
| ➘ | 40m | 2min | 30min | 21/20 |
| ➙ | 40m | 2min | 32min | 21/20 |
| ➚ | 9m | 6min | 38min | 21/20 |
| ⏹ | 9m | 3min | 41min | 21/20 |
| ⏹ | 6m | 7min | 48min | 21/20 |
| ⏹ | 3m | 16min | 64min | 21/20 |
| ➚ | 0m | 1min | 65min | 21/20 |
| CNS: 8% | ||||
| OTU: 24 | ||||
| DIVESOFT.APP (Android 1.8.4) |
30 meter, 30 minutes, CCR with air diluent, setpoints 0.7 low / 1.2 high
| GF | Salinity | Altitude | Last-deco stop | Low SP | High SP |
|---|---|---|---|---|---|
| 30/70 | Salt | 0 meters | 3 meter | 0.7 | 1.2 |
Abysner
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 | CCR (SP 0.7) |
| ➙ | 30m | 24min | 30min | 21/0 | CCR (SP 1.2) |
| ➚ | 6m | 5min | 35min | 21/0 | CCR (SP 1.2) |
| ⏹ | 6m | 1min | 36min | 21/0 | CCR (SP 1.2) |
| ⏹ | 3m | 2min | 38min | 21/0 | CCR (SP 1.2) |
| ➚ | 0m | 1min | 39min | 21/0 | CCR (SP 1.2) |
| CNS: 17% | |||||
| OTU: 47 |
Subsurface
Observations: Subsurface does not require a 6 meter stop, while Abysner barely does (1 minute). This is likely due to minor algorithmic differences in tissue loading precision.
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 | CCR (SP 0.7) |
| ➙ | 30m | 24min | 30min | 21/0 | CCR (SP 1.2) |
| ➚ | 3m | 6min | 36min | 21/0 | CCR (SP 1.2) |
| - | 3m | 2min | 38min | 21/0 | CCR (SP 1.2) |
| ➚ | 0m | 1min | 39min | 21/0 | CCR (SP 1.2) |
| CNS: 16% | |||||
| OTU: 46 | |||||
| Subsurface (6.0.5576-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
- DIVESOFT.APP displays 1.2 for the setpoint on the initial descent, while 0.7 was configured for descents. It is unclear whether this is just a display choice (labeling the descent with the bottom setpoint) or whether the low setpoint is not applied during descent.
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 | CCR (SP 1.2) |
| ➙ | 30m | 24min | 30min | 21/0 | CCR (SP 1.2) |
| ➚ | 6m | 5min | 35min | 21/0 | CCR (SP 1.2) |
| ⏹ | 6m | 1min | 36min | 21/0 | CCR (SP 1.2) |
| ⏹ | 3m | 3min | 39min | 21/0 | CCR (SP 1.2) |
| ➚ | 0m | 1min | 40min | 21/0 | CCR (SP 1.2) |
| CNS: 17% | |||||
| OTU: 47 | |||||
| DIVESOFT.APP (Android 2.5.1) |
30 meter, 30 minutes, CCR with air diluent (setpoints 0.7 low / 1.2 high), bailout to open circuit
Same configuration as reference plan 6, but the diver bails out to open circuit at the end of the bottom section.
| GF | Salinity | Altitude | Last-deco stop | Low SP | High SP |
|---|---|---|---|---|---|
| 30/70 | Salt | 0 meters | 3 meter | 0.7 | 1.2 |
Abysner
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 | CCR (SP 0.7) |
| ➙ | 30m | 24min | 30min | 21/0 | CCR (SP 1.2) |
| - | 30m | 1min | 31min | 21/0 | Bailout to OC |
| ➚ | 9m | 5min | 36min | 21/0 | OC |
| ⏹ | 9m | 1min | 37min | 21/0 | OC |
| ⏹ | 6m | 4min | 41min | 21/0 | OC |
| ⏹ | 3m | 8min | 49min | 21/0 | OC |
| ➚ | 0m | 1min | 50min | 21/0 | OC |
| CNS: 14% | |||||
| OTU: 38 |
Subsurface
Observations: Subsurface produces a 1 minute longer runtime (51 vs 50 minutes), which is typical algorithmic variance also seen in the other reference plans. This may be triggered by the slower initial ascent in Abysner (5 vs 4 minutes) allows for more off-gassing during the ascent itself, resulting in slightly shorter subsequent stops.
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 | CCR (SP 0.7) |
| ➙ | 30m | 24min | 30min | 21/0 | CCR (SP 1.2) |
| - | 30m | 1min | 31min | 21/0 | Bailout to OC |
| ➚ | 9m | 4min | 35min | 21/0 | OC |
| ⏹ | 9m | 2min | 37min | 21/0 | OC |
| ⏹ | 6m | 5min | 42min | 21/0 | OC |
| ⏹ | 3m | 8min | 50min | 21/0 | OC |
| ➚ | 0m | 1min | 51min | 21/0 | OC |
| CNS: 13% | |||||
| OTU: 37 | |||||
| Subsurface (6.0.5576-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
- DIVESOFT.APP produces a significantly longer runtime (60 min vs 50/51 min for Abysner and Subsurface). This is a much larger difference than seen in the OC reference plans. It is unclear why this is, but the DIVESOFT.APP versions between OC and CCR plans differ, could that be a cause? Or is it a difference in how the bailout is handled?
- DIVESOFT.APP displays 1.2 for the setpoint on the initial descent, while 0.7 was configured for descents. It is unclear whether this is just a display choice (labeling the descent with the bottom setpoint) or whether the low setpoint is not applied during descent.
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 30m | 6min | 6min | 21/0 | CCR (SP 1.2) |
| ➙ | 30m | 24min | 30min | 21/0 | CCR (SP 1.2) |
| - | 30m | 3min | 33min | 21/0 | Bailout to OC |
| ➚ | 9m | 4min | 37min | 21/0 | OC |
| ⏹ | 9m | 3min | 40min | 21/0 | OC |
| ⏹ | 6m | 5min | 45min | 21/0 | OC |
| ⏹ | 3m | 14min | 59min | 21/0 | OC |
| ➚ | 0m | 1min | 60min | 21/0 | OC |
| CNS: 12% | |||||
| OTU: 35 | |||||
| DIVESOFT.APP (Android 2.5.1) |
60 meter, 20 minutes*, CCR with 10/70 trimix diluent, setpoints 0.7 low / 1.2 high
| GF | Salinity | Altitude | Last-deco stop | Low SP | High SP |
|---|---|---|---|---|---|
| 30/70 | Salt | 0 meters | 3 meter | 0.7 | 1.2 |
Abysner
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 60m | 12min | 12min | 10/70 | CCR (SP 0.7) |
| ➙ | 60m | 8min | 20min | 10/70 | CCR (SP 1.2) |
| ➚ | 24m | 8min | 28min | 10/70 | CCR (SP 1.2) |
| ⏹ | 24m | 1min | 29min | 10/70 | CCR (SP 1.2) |
| ⏹ | 21m | 2min | 31min | 10/70 | CCR (SP 1.2) |
| ⏹ | 18m | 2min | 33min | 10/70 | CCR (SP 1.2) |
| ⏹ | 15m | 3min | 36min | 10/70 | CCR (SP 1.2) |
| ⏹ | 12m | 5min | 41min | 10/70 | CCR (SP 1.2) |
| ⏹ | 9m | 6min | 47min | 10/70 | CCR (SP 1.2) |
| ⏹ | 6m | 8min | 55min | 10/70 | CCR (SP 1.2) |
| ⏹ | 3m | 13min | 68min | 10/70 | CCR (SP 1.2) |
| ➚ | 0m | 1min | 69min | 10/70 | CCR (SP 1.2) |
| CNS: 29% | |||||
| OTU: 81 |
Subsurface
Observations: Subsurface does not require a 24 meter stop, while Abysner barely does (1 minute). This is likely due to minor algorithmic differences in tissue loading precision.
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 60m | 12min | 12min | 10/70 | CCR (SP 0.7) |
| ➙ | 60m | 8min | 20min | 10/70 | CCR (SP 1.2) |
| ➚ | 24m | 8min | 28min | 10/70 | CCR (SP 1.2) |
| ⏹ | 21m | 2min | 30min | 10/70 | CCR (SP 1.2) |
| ⏹ | 18m | 3min | 33min | 10/70 | CCR (SP 1.2) |
| ⏹ | 15m | 3min | 36min | 10/70 | CCR (SP 1.2) |
| ⏹ | 12m | 4min | 40min | 10/70 | CCR (SP 1.2) |
| ⏹ | 9m | 6min | 46min | 10/70 | CCR (SP 1.2) |
| ⏹ | 6m | 9min | 55min | 10/70 | CCR (SP 1.2) |
| ⏹ | 3m | 13min | 68min | 10/70 | CCR (SP 1.2) |
| ➚ | 0m | 1min | 69min | 10/70 | CCR (SP 1.2) |
| CNS: 29% | |||||
| OTU: 80 | |||||
| Subsurface (6.0.5576-CICD-release) |
DIVESOFT.APP
Observations: DIVESOFT.APP does not display ascents between deco stops, and does not include the ascent time to the next stop in the total stop duration. This means the displayed stop time does not always match up to the runtime. Duration values below were derived by subtracting runtimes and the final ascent using the leftover runtime (which is displayed by DIVESOFT.APP).
- DIVESOFT.APP produces a longer runtime (73 min vs 69 min for Abysner and Subsurface).
- DIVESOFT.APP displays 1.2 for the setpoint on the initial descent, while 0.7 was configured for descents. It is unclear whether this is just a display choice (labeling the descent with the bottom setpoint) or whether the low setpoint is not applied during descent.
| Depth | Duration | Runtime | Gas | Mode | |
|---|---|---|---|---|---|
| ➘ | 60m | 12min | 12min | 10/70 | CCR (SP 1.2) |
| ➙ | 60m | 8min | 20min | 10/70 | CCR (SP 1.2) |
| ➚ | 24m | 7min | 27min | 10/70 | CCR (SP 1.2) |
| ⏹ | 24m | 1min | 28min | 10/70 | CCR (SP 1.2) |
| ⏹ | 21m | 2min | 30min | 10/70 | CCR (SP 1.2) |
| ⏹ | 18m | 3min | 33min | 10/70 | CCR (SP 1.2) |
| ⏹ | 15m | 3min | 36min | 10/70 | CCR (SP 1.2) |
| ⏹ | 12m | 4min | 40min | 10/70 | CCR (SP 1.2) |
| ⏹ | 9m | 7min | 47min | 10/70 | CCR (SP 1.2) |
| ⏹ | 6m | 9min | 56min | 10/70 | CCR (SP 1.2) |
| ⏹ | 3m | 17min | 73min | 10/70 | CCR (SP 1.2) |
| ➚ | 0m | 1min | 74min | 10/70 | CCR (SP 1.2) |
| CNS: 31% | |||||
| OTU: 85 | |||||
| DIVESOFT.APP (Android 2.5.1) |
1. Does Abysner round to minutes?
Yes and no, Abysner currently calculates dive plans in whole minutes. The reasoning behind this is that most of the time we are interested as divers in minutes only, we generate plans to write down on our wetnotes and for simplicity reasons we do that in minutes.
The above has led me to believe that doing the planning in seconds first, then rounding those to minutes is kinda pointless and leads to less accurate plans.
Example: if an ascent to a certain level takes 4:20 minutes. This will be rounded to either 4 or 5 minutes but the tissue loading internally was based on those 4 minutes and 20 seconds. So when following the plan on paper, you either decompress too little during the ascent hitting the ceiling, or you go a bit slower compared to what was calculated and potentially on-gas certain slower compartments a bit more.
Instead, Abysner calculates from the very start in whole minutes so that the eventual dive plan does not need rounding. The downside of this technique is that we have to round some other things, like ascent and descent speeds. However since the eventual dive plan will be in minutes anyway, this will be the more realistic case.
TLDR: Divers usually require plans in whole minutes, thus calculate in minutes.
Do I consider adding second precision in the future, will it be a setting? Not sure, but the answer may very well be yes.
2. Why does Abysner give different plans compared to tool X?
There are countless reasons why this app may give you a different plan, first and foremost: there is not a single definition of what a dive planner is and how it should work, and this is even true for the Bühlmann model. There are just many small undefined details that are up to the implementation to decide.
Robert Helling explains the differences between planners very well in his blog post "Why is Bühlmann not like Bühlmann": https://thetheoreticaldiver.org/wordpress/index.php/2017/11/02/why-is-buhlmann-not-like-buhlmann/
If you do feel like something is a bug, feel free to report an issue.
3. Are you qualified to write this software?
No.
I'm a recreational and semi-closed rebreather instructor, technical diver, and consider myself to be a professional software engineer and awesome programmer. But I'm not a scientist, mathematician, doctor, or anything like that, so the answer is no.
4. Is Abysner free?
Abysner is open-source, licensed under AGPLv3. You are free to use, build, modify, and redistribute it under the terms of that license (that is the "free" part).
The official builds distributed through the Play Store and App Store do carry a small fee. This covers Apple's yearly developer fee and helps offset other project costs such as a domain name, development tools, and hardware to test on. If you'd rather not pay, you are welcome to build it yourself from source or obtain a build from someone else. The license explicitly allows this.
5. How does Abysner determine the worst-case point for reserve gas?
TLDR: The TTS that consumes the most gas.
Most people will tell you this is a point during the deepest part of the dive, or more precisely at the end of the planned bottom time (just before final ascent). However, with multi-level dive profiles this can be a slightly more complex story. Because where does the final ascent begin? At the end of the last bottom section? What if the deeper portion of the dive is at the beginning, and super short? While a slightly shallower but longer section causes actual decompression time?
Example: Assume an ascent/descent rate of 10 meter per minute (40/80 gf). Take a profile where you start your dive by descending to 40 meters, then have 1 minute of bottom time after which you ascend to 30 meters and stay there for 20 minutes. Then the deepest part of your dive is not the worst-possible point to ascend anymore, since your deco obligation at the 40 meters part is still essentially non-existent. However, at the end of the 30 meters section you have about 6 minutes of deco to complete (with a 50% mix). So those are 6 extra minutes of gas usage, compared to ascending from 40 meters, yes the gas usage is shallower, but there is more time to breathe more gas as well. So is the deepest section still the worst?
To correctly calculate the worst-possible ascent point during a dive Abysner uses TTS, also known as time-to-surface. Essentially it calculates how long it would take from any given point during the dive to ascend safely to the surface (including deco stops if required). The point during the dive where the TTS is the highest is most likely the worst-possible ascent point. However even this is not the complete story (see example), in some cases a shallower section at the end of the dive may cause a longer TTS, and thus potentially more gas usage. So the app calculates ascent gas usage for multiple TTS points, then takes the maximum numbers for each mix. These maximum numbers are the basis for calculating the reserve gas requirements.
If you'd like to contribute, please open an issue or start a discussion before putting significant effort into a feature or refactor. This project has a specific scope and direction, and not all pull requests will be accepted. A conversation upfront is the best way to make sure your time is well spent. Detailed contribution guidelines are not yet available, but the basics are covered here.
All contributors are required to sign a Contributor License Agreement (CLA) before their pull request can be merged. The CLA process is automated via CLA Assistant and will prompt you automatically when you open a pull request.
A personal note on AI: I use AI assistance where it makes sense, writing boilerplate, surfacing bugs, and exploring ideas. But it can't replace correctness and safety, since AI is probabilistic, and a safety-relevant application like a dive planner must be deterministic.
Abysner is not a vibe-coded project. Every architectural decision is made deliberately, every algorithm and its results are validated against known references and diving organization standards, peer-reviewed by subject-matter experts including active technical diving instructors, and every line of code is reviewed by a person. AI tools are, in my opinion, a means to better quality through efficiency, not a substitute for careful and deliberate development.
This project builds on a lot of prior work: decompression research, open-source planning software, and the broader diving community. Credit where credit is due.
Details
- The Theoretical Diver Blog:
- Particularly helpful for understanding gradient factors, which are not as straightforward to implement as the theory makes you believe.
- Also, a useful reference for the Schreiner equations used in CCR planning.
- Erik C. Baker's publications:
- Understanding M-Values
- Clearing Up The Confusion About "Deep Stops"
- Oxygen Toxicity Calculations
- Open-source software used for validation, comparison, and inspiration (in no particular order): GasPlanner, nyxtom/dive, Subsurface, DecoTengu
- ScubaBoard: a genuinely valuable source of diving discussions and technical knowledge. For example this thread on the Schreiner equations for CCR.
