The deco engine, in the open

Last updated 2026-06-01

How the Dive Kit decompression engine works

A plain-language tour of how the engine works: the decisions a serious planner has to make, and where and why our numbers differ from the MultiDeco mobile app, the planner we measure ourselves against.

If you plan technical dives, be skeptical of any new tool's decompression model. “It uses Bühlmann” tells you almost nothing. The published Bühlmann algorithm is the easy part. What separates a serious planner from a weekend script is the dozens of decisions the algorithm doesn't make for you, the edge cases it never mentions, and the work of proving the whole thing against an established reference. This page walks through that work: the reasoning behind each decision, the published sources we checked it against, and a scenario-by-scenario comparison you can reproduce yourself.

Why we decompress at all

Underwater, the gas you breathe is at higher pressure, so inert gas (nitrogen, plus helium on trimix) dissolves into your body. Picture a sealed fizzy drink. Under pressure the gas stays dissolved; crack the cap and the sudden pressure drop makes it fizz. Ascending is cracking the cap. Come up slowly and the gas leaves through your lungs. Come up too fast and it fizzes out as bubbles in your tissues, which is decompression sickness. A decompression model estimates how slowly to ascend, and where to pause, so the gas leaves safely. It is an estimate, not a guarantee.

22
cross-validated scenarios
≤ 1 step
decozone vs MultiDeco, all scenarios
7
primary sources, cited

The foundation

Bühlmann ZH-L16C with Gradient Factors

Our engine is a dissolved-gas model (a “Haldane-type” model, named after the physiologist who pioneered the idea). It is the same family Shearwater, Subsurface and MultiDeco use.

Tissue compartments. The model can't track every cell, so it represents your body as 16 compartments. These are mathematical stand-ins, from “fast” tissues like blood and brain that fill and empty quickly, to “slow” ones like joints and bone. Each one has a fixed half-time: the published ZH-L16C nitrogen values run from 4 minutes up to 635 minutes (helium's are faster, about 1.5 to 240 minutes).

Tension and on/off-gassing. The amount of inert gas dissolved in a compartment is its tension. We compute it with the standard Haldane equation, and we recompute it in 1-second steps as your depth changes, so loading stays right while you're moving, not only at fixed depths. Much of the realism lives there.

Helium and trimix, done properly. Each compartment tracks nitrogen and helium separately (helium loads and unloads about 2.65× faster than nitrogen, the ratio of the published half-times). When a compartment holds both, its coefficients are the correctly weighted blend, recomputed continuously as your gas mix changes.

The two lines, and the decompression zone

Draw tissue tension against ambient pressure. The ambient-pressure line is where tension equals the pressure around you. Ascend past it and your tissue holds more gas than its surroundings, a state called supersaturation: the “fizzing” zone. The M-value line is the most supersaturation a compartment can tolerate before the risk crosses into unacceptable, a hard ceiling. The band between the two lines is the decompression zone, and decompression is the work of ascending into it to off-gas fast without punching through the ceiling.

Gradient Factors are your conservatism dial. Plain Bühlmann lets you ascend right up to the M-value line. We implement Erik Baker's Gradient Factor method, the de-facto standard. A GF sets how far across the band you allow yourself to go. GF-Low is your margin at the first and deepest stop; GF-High is your margin at the surface; in between, it is interpolated linearly with depth. Lower numbers are more conservative. GF 30/70 is a common conservative choice, and GF 100/100 is plain Bühlmann. We checked our coefficient algebra against Baker's published equations to machine precision.

The judgment calls

The decisions that shape your schedule

These are the choices Bühlmann leaves open. Each one changes the stops you get.

Where stops land, and how long you hold them

A decompression stop is a depth where you pause to off-gas while staying under the M-value ceiling. Two engines can agree on the physics and still print different stop lists, because turning a smooth ascent into a list of fixed stops takes choices:

  • Stops sit on a grid (every 3 m by default), and a ceiling always rounds up, so you're never asked to hold shallower than your true ceiling.
  • The last stop is a real stop, not an afterthought. Mix a coarse grid with a small last stop and a naive tool sends you back to a deeper grid depth. Ours holds at the last stop the way a diver would. The last stop also carries a one-minute minimum, so the final safety hold never vanishes even when little obligation is left at that depth.
  • The last stop ends exactly at your GF-High. Between stops, the engine counts the gas you breathe off while you climb, which is why your first stop can sit shallower than other tools put it (the deep-dive comparison below walks through this). The last stop is the exception. The engine holds it until your leading tissue can surface within your GF-High limit, and it does not shorten the hold by assuming the swim up to the surface will finish the off-gassing. So you leave the last stop the moment you are clear to surface, and not before. We checked this: the length of the last stop does not change when you change the final ascent speed.
  • Whole-minute stops (the default): a clean, followable table. The engine works out each stop to the second, then rounds it up to a whole minute. That is the table you can hold to on the line, and the way a printed deco schedule reads. The rounding runs inside the engine, not on the screen: the engine holds each stop in whole-minute steps and only leaves on a minute boundary. The rule for leaving is one-way. It can turn a “leave” into a “hold”, never a “hold” into a “leave”. So a rounded stop lasts at least as long as the exact schedule asked for, and you never leave a stop sooner or shallower than the continuous engine allows. A whole-minute stop runs a little longer than the exact one, never shorter, and because the engine rounds before it works out the rest, every downstream number (runtime, CNS, OTU, gas) matches the schedule you dive.
  • Precise and 30-second modes (opt-in): the exact number. To see the real obligation instead of the rounded table, switch to precise mode. It shows each stop to the second in MM'SS" notation: a hold of one minute five seconds reads 1'05" instead of a rounded 2', and a 20-second touch reads 0'20" instead of folding into the next minute. A 30-second mode sits between the two. The engine computes to the second whichever mode you pick; the setting only changes how the stop is written.

Whole minutes are the default because that is the schedule you can dive: the number you hold on the line, the way printed tables and dive computers show it. It is also safe, because the engine rounds each stop up, never down, so a rounded stop is always at least as long as the exact one. The exact number is still there underneath, and precise mode shows it. We round for the diver, not because the sub-minute number is wrong.

A design choice we made, then took back.

This is about rounded mode only. Precise mode never rounds, so it has nothing to release early. The first version of rounded mode had a smarter rule: leave a stop a minute early when the off-gassing during the swim up to the next stop would clear the ceiling before you arrived. It saved a minute and passed the easy tests. On a deep dive it surfaced the diver early and under-decompressed them, because proving that a planned ascent never crosses the ceiling is hard while the slow tissues are still loading at depth. We chose a rule we can prove correct over saving a minute. So rounded mode uses the one-way rule above. Its worst case is holding a stop under a minute too long, never leaving it early.

Switching gases on the way up

Richer mixes off-gas faster but turn toxic under pressure, so each gas has a Maximum Operating Depth set by its oxygen partial pressure (ppO₂).

  • Switch depth is set by the gas's oxygen content. A lean mix (under 28% O₂) is capped at a ppO₂ of 1.4 bar, a mid mix (28 to 45%) at 1.5, a rich mix (45% or more) at 1.6. The same cap sets both the switch depth and the hyperoxia warning, so the MOD you see is always the depth the engine switches at. These three numbers are your pO₂ Limits; set all three equal and you get a plain single-cap model. MultiDeco caps gases by oxygen content the same way, so at its defaults of 1.4/1.5/1.6 every gas switch matches MultiDeco within one deco step.
  • A gas switch can take time, and that time counts against the old gas. You can set a gas-switch time: a short pause at the switch depth, the way a diver stops to change regulators and confirm the gas. The default is 0 minutes. When you do set it, the engine keeps you on the old, leaner gas for that pause, so your tissues keep loading at the old rate. You get no credit for the new gas until you switch to it.
  • A boundary case worth showing. Pure oxygen capped at 1.6 bar gives a maximum operating depth of about 5.9 m in salt water, a touch shallower than the 6 m last stop. At 6 m its ppO₂ works out to about 1.61 bar, a hair over the cap. Read strictly, the engine would refuse to switch you to oxygen at 6 m, the exact stop oxygen is meant for, and leave you on a leaner gas. We allow a small tolerance of about 0.1 m at that boundary so the switch happens.

Oxygen toxicity: two clocks

We track both risks against the NOAA limits. CNS % is the acute convulsion risk, which decays with a half-life when ppO₂ drops. OTU is the slower whole-body pulmonary load, a cumulative daily dose. Both accumulate from the ambient ppO₂ with no water-vapour subtraction, which is Erik Baker's published method and matches Shearwater, Garmin and Subsurface. It is the slightly more conservative choice, so the oxygen clock ticks a little faster. (NOAA's tables say “inspired ppO₂,” but in diving that means oxygen fraction × ambient. It does not subtract the alveolar water vapour the clinical term implies. We checked this against the primary literature.)

Salt water, fresh water and altitude

We use a water-type-aware conversion (salt 10.0, fresh 10.3, EN13319 10.08, Red Sea 9.87 m per bar) and a configurable surface pressure for altitude. That factor feeds both the gas-loading and the M-value/ceiling maths, not only one of them. Feeding only one is a subtle but real bug in naive implementations. For the same gauge depth, fresh water sits at slightly lower absolute pressure, so loading and total decompression come out a little less than salt. MultiDeco's fresh-water mode shows the same direction.

Beyond the schedule

The hazards a missed stop doesn't cover

A mature planner also warns about what can hurt you besides decompression. Each is surfaced as a warning in the app.

  • Gas density. Gas too dense to move through your airways drives up CO₂. We compute the worst-case density across the whole profile, pairing each level with the gas breathed there, and flag it against the ~6.2 g/L ceiling. Air at 55 m runs over 8 g/L, well into the danger zone, and we say so.
  • Narcosis (END). We compute Equivalent Narcotic Depth and flag it so a deep-air or thin-helium plan can't impair you without warning.
  • Surface hypoxia. A hypoxic bottom mix like 15/55 trimix (15% oxygen, 55% helium) is fine at depth but dangerous at the surface, where its low oxygen fraction can't sustain you. We check ppO₂ at the surface, not only at depth, a check some tools skip.
  • Isobaric counter-diffusion (ICD). Switching from a helium-rich to a nitrogen-rich gas at the same depth can drive helium out of slow tissues while fast tissues are still taking nitrogen on. Two gases move in opposite directions at once, which is how bubbles can form even though the surrounding pressure never changed. We show one advisory when a switch crosses the commonly cited threshold (roughly: the helium drop is more than 5× the nitrogen increase), not a flag on every gas change.

Cause and effect

What changes your deco, and why

When you tune a plan and watch a stop appear, lengthen, or vanish, here is what the engine is doing underneath. This is the cause and effect a deco-literate diver wants to verify rather than take on faith, and every one of them is reproducible in the comparison data below.

Lower GF-Low → a deeper first stop.
A lower GF-Low makes you stop deeper and start decompressing sooner. On most dives it shifts time deeper without changing the total by much. On a deep or long dive it can add total time, because holding deeper keeps the slow tissues loading while the fast ones unload. The depth where supersaturation first begins (the decozone start) does not move, because it sits on the ambient line, which no gradient factor changes.
Lower GF-High → longer shallow stops, later to the surface.
The leading tissue must sit further from its limit before you can surface, so the shallow holds stretch out. This is the lever that most changes total runtime.
Switch to a richer gas → shorter stops.
Your tissues unload nitrogen faster when there is less nitrogen in the gas you breathe. A richer mix (more oxygen, so less nitrogen) widens the gap between the nitrogen in your tissues and the nitrogen in your lungs, and the wider that gap, the faster you off-gas. That is why divers switch to EAN50 (50% oxygen) and then to oxygen in the shallows. The engine recomputes this every second, so the faster unloading starts the moment you switch, not at the next stop.
Add helium → far less narcosis, and a re-shaped deco profile.
Helium carries no narcosis but loads/unloads ~2.65× faster than nitrogen. Because we track the two gases separately, this falls out of the physics: flip air → trimix at the same depth and the END drops while the stop shape changes (deeper first stop, brisker early off-gassing).
Go deeper, or stay longer → disproportionately more deco.
The slow tissues load the whole time you're down, and loading is exponential toward equilibrium, so an extra few metres or minutes adds more decompression than a linear rule of thumb suggests.
A lean deco gas switches shallower than a single-cap model would.
Capped at 1.4 rather than 1.6, a Tx21/35 (21% oxygen, 35% helium) switches at ~54 m instead of the ~66 m a flat cap would give. That keeps ppO₂ and the CNS clock lower through the deep part. The effect on stop times is small.
Fresh water or altitude → a lighter or heavier obligation.
Fresh water is slightly less absolute pressure (lighter deco); altitude lowers your surface pressure, making the ascent a bigger relative pressure drop (heavier). The water-type factor feeds both loading and the ceiling, so the effect is consistent.
A second dive soon after → more deco.
You start with residual gas still dissolved, so you reach any given ceiling sooner and owe more time.
Why a stop sometimes vanishes when you nudge a setting.
Stops snap to the grid, so a small change that pulls a ceiling barely under a grid line can drop a whole listed stop while total decompression barely moves. (In rounded mode a stop can also merge into its neighbour when both round to the same minute; in precise mode you'd still see the brief touch as e.g. 0'15".) Compare total time-to-surface, not stop count.

The full range

Beyond the basic open-circuit dive

Closed-circuit rebreathers (CCR)

A rebreather holds a constant oxygen partial pressure (the “setpoint”). As you change depth, the engine works out the diluent mix that holds that setpoint and the tissue loading it produces, which an open-circuit model cannot do. We compute the loop mix at every depth step and run the decompression on it. A real dive uses more than one setpoint, so we model three stages. A low descent setpoint, applied only on the way down to a depth you set. A bottom setpoint for the working part of the dive. And for the ascent, a full deco-setpoint schedule: a series of setpoint changes you key to depth (for example 1.3 at the first deep stops, then 1.5 higher up, then 1.6 in the shallows), with diluent switches at the depths you pick. If a setpoint is higher than the depth allows (you cannot hold 1.6 bar of oxygen in 5 m of water), the engine caps it at what the depth can give instead of faking it. It also handles a mix of loop and open-circuit deco, and it builds an open-circuit bailout plan from the worst realistic moment, the end of bottom time at full depth, at a raised breathing rate for stress. Against the MultiDeco mobile app, our CCR loop schedules land within 1 percentage point on CNS and 2 to 3 OTU units across air, trimix and deep high-helium diluents.

Repetitive dives

A second dive starts with leftover gas in your tissues. We carry it forward across the surface interval: nitrogen and helium keep off-gassing, the CNS clock decays on its half-life, and OTU accumulates as the daily dose it is meant to be. A second 30 m dive an hour after the first comes out much heavier, as it should.

Oxygen breaks

Long stretches on high-concentration oxygen run up the CNS clock, and the standard mitigation is an air break. When enabled, we insert breaks on the schedule you choose and model them in full. During a break your fast tissues take a little inert gas back on, and that re-loading carries through the rest of the plan rather than getting glossed over.

Rounded mode (the default) has one detail worth spelling out. The air-break timer counts how long you have been breathing the high-oxygen gas without a break, and that count includes the time you spent climbing to the stop while already on that gas. Left to fall where it lands, a break could start partway through a minute and split a stop into a part-minute row. So in rounded mode the engine waits for the next whole minute of that stop to start the break. The cost is up to about 59 extra seconds on oxygen before the break, which is how a whole-minute printed table reads anyway. Precise mode starts the break at the exact second.

The proof

How we validate against MultiDeco

We compare against the MultiDeco mobile app (iOS and Android), the planner many technical divers already trust. Every MultiDeco number here comes from that mobile app. We have not tested the desktop version, so we make no claims about it. Identical numbers are not the goal: two correct engines differ a little on the judgment calls above, so the aim is to agree on the physics that matters and to explain every difference. To line the two up, the Dive Kit column runs in rounded mode (whole-minute stops) for every scenario, since MultiDeco shows whole minutes too. We publish each scenario's inputs, MultiDeco's output and Dive Kit's output below, and the same scenarios run in our automated test suite, so the numbers cannot drift without us catching it.

A secondary check: where the deco zone begins

MultiDeco prints the depth where you first enter the decompression zone, where your most-loaded compartment crosses the ambient-pressure line. Our scheduler doesn't use this number at all: stops are driven by the M-value side and your gradient factors, while decozone start sits on the ambient line (Gradient Factor 0), which no setting touches. That makes it a clean, confound-free check of the tissue model, and it is gradient-factor-independent by design. It has a property that surprises people: it doesn't move when you change your Gradient Factors. The same 45 m / 22 min air dive gives a decozone start of 32 m at both GF 30/70 and GF 50/80, even though the first stop moves from 21 m to 15 m. Across all 22 scenarios it agrees with MultiDeco within about one 3 m step (at most 3.6 m, on the deepest high-helium dive). It is a secondary detail rather than the headline, though: it isn't shown in the app, and the comparison rests on stop depths, gas-switch depths, the oxygen clocks and total runtime.

Across all 22 scenarios (air, nitrox, trimix, open- and closed-circuit, salt and fresh, sea level and altitude, 3 m and 6 m last stops, and gradient factors of 20/75, 30/70, 35/75, 40/80 and 50/80), decozone start agrees within about one step, standard gas-switch depths match exactly (EAN50 at 21 m, oxygen at 6 m), and the oxygen clocks and total time-to-surface agree within 1 to 3 minutes on most dives. The exception is 6 m last-stop dives, where Dive Kit's time-to-surface runs 3 to 10 minutes shorter, explained below.

S1

Air 30 m / 23 min, GF 30/70 (salt)

Decozone within 1 deco step O₂ clock matches

The dive

one dive · two planners

30 m × 23 min · Air

Gradient factors
30/70
Water
Salt
Last stop
3 m
Gases
Air
▸ How each app was configured

MultiDeco

  • Bottom time entered 25 min (descent-inclusive)
  • Ascent 9/6/3 m/min (deep/deco/surface)
  • Bottom gas pinned per profile step; deco gases listed separately

Dive Kit

  • At-depth bottom time (descent counted separately)
  • Two-rate ascent 9/3 m/min, switching at 3 m
  • Profile + gas list kept separate; deco gas auto-selected by MOD

Same physical dive, entered in each tool's native style. That is why a few numbers are distributed differently while the physics agrees.

Metric MultiDeco Dive Kit Δ Agreement
Decozone start (m) 21 20.7 -0.3 match
First stop (m) 12 12 0 match
Time to surface (min) 22 24 +2 match
CNS (%) 6 6 0 conservative
OTU 18 17.9 -0.1 match
Gas density (g/L) 4.8 5.17 +0.37 conservative

A ✓ means within the documented tolerance for that metric. “≈” marks a deliberate, explained difference (e.g. stop distribution, or Dive Kit's more-conservative O₂ clock). See Why they differ below; it is never an error.

▸ Full stop-by-stop schedules

MultiDeco

DepthStopRunGas
12 m1min2821
9 m3min3121
6 m4min3521
3 m11min4621

Dive Kit

DepthStopRunGas
12 m3min3021
9 m4min3421
6 m6min4121
3 m7min4821

Why they differ

A clean match. The differences here are the usual documented conventions (stop distribution and the gas-density reference offset). See the shared explanations.

Where they differ, and why

What vs MultiDeco Why
First listed stop Often shallower, on deep helium dives We track off-gassing all through the ascent, the way a dive computer does, so on helium-rich dives the GF-Low ceiling drops faster than the diver climbs and we skip the brief deep stops MultiDeco lists. The total decompression is the same, placed shallower. Ascent rate is not the cause: we re-ran at MultiDeco's own 9 m/min deep rate and the first stop stayed put. The deep dive below traces it step by step. Compare total time-to-surface, not first-stop depth.
CNS % A little higher (more conservative) We use ambient ppO₂ (Baker's method). It shows up most when a high-oxygen gas sits on a steep part of the NOAA curve, for example oxygen at 6 m, where one scenario reads 76% vs MultiDeco's 65%. We accept the more conservative number on purpose.
Total time, 6 m last stop 3–10 min shorter at the 6 m hold Both planners run the deep stops the same way and reach 6 m equally loaded. The only difference is how long each one holds at 6 m. Dive Kit leaves as soon as it can bring you up within your GF-High setting. MultiDeco holds longer, so you surface with extra margin to spare. On a long 6 m stop that makes Dive Kit a few minutes shorter: 5 minutes at sea level, 10 minutes at altitude. This is the one case where MultiDeco is the more conservative planner.
In-between trimix switch Within one deco step With the O₂%-band caps at MultiDeco's default 1.4/1.5/1.6, intermediate mixes switch within one 3 m deco step of MultiDeco; the small residual is deco-stop snapping.
Gas density ~7–9% higher reading A different assumed gas temperature in the density formula. A reference figure, not a safety boundary; both flag the same thresholds.
Gas used (litres) Differs This follows entirely from your breathing-rate setting, a personal preference, not part of the decompression model.

Dive Kit runs more conservative on the oxygen clocks (CNS, OTU) and on the gas-density reading. On total time-to-surface, most dives agree within 1 to 3 minutes either way; Dive Kit can come out a little shorter or a little longer depending on how the stops round. The one steady exception is a dive with a 6 m last stop, where Dive Kit finishes 3 to 10 minutes sooner. It leaves the final hold as soon as it can surface you within your GF-High limit, about 2 percentage points inside it; MultiDeco holds longer and surfaces with more margin. Both stay within the limit. MultiDeco is the more conservative of the two here.

Deep dive: why MultiDeco lists more deep stops

This is the difference people notice first, and it looks alarming until you trace it. The obvious guess, that one engine is more conservative, turns out to be wrong. One honest limit on what we can say: we can read our engine line by line, but we cannot see MultiDeco's code. So below we describe exactly what our engine does, and we describe what we see in MultiDeco's output. We do not claim to know how MultiDeco works inside.

Take the most extreme dive in our data, S6: 80 m on 15/55 trimix (15% oxygen, 55% helium). MultiDeco puts its first stop at 48 m. Dive Kit's first stop is at 36 m, twelve metres shallower. That looks like a real disagreement, so we traced our engine step by step to see where the two split.

They agree on where decompression starts. At the bottom, with the tissues fully loaded, Dive Kit's GF-Low ceiling sits at 45.9 m, which rounds up to a 48 m stop on the 3 m grid. That is exactly MultiDeco's first stop. So both engines agree on the deepest stop and the ceiling that sets it. There is no disagreement about where you first owe a stop.

They split on the way up, because Dive Kit keeps recalculating as you climb. Dive Kit does not jump from stop to stop. It recomputes all sixteen tissues every second as you ascend, the same way the computer on your wrist does while you move. So it counts the gas you breathe off during the climb itself, not only the gas you breathe off while parked at a stop. Helium leaves your fast tissues quickly, so on a 55% helium dive the ceiling drops faster than you can climb. By the time you would reach 48, 45 or 42 m, the ceiling is already below you, so there is nothing to stop for. Dive Kit follows the dropping ceiling up without stopping, and only starts holding around 36 m, where the slower tissues take over and the ceiling settles. From 36 m down it holds longer at each stop than MultiDeco does.

So the total decompression is the same. It sits at different depths. The way to check that nothing was skipped is the surfacing limit, not the total time: Dive Kit's leading tissue still reaches the surface at exactly your GF-High, the same limit MultiDeco respects. Total time-to-surface comes within a minute or two either way on these dives. S6 is 82.6 vs 81 min, and A2 is 55.4 vs 56 min. Neither planner lets you surface more saturated than your GF-High allows.

The gap is biggest on deep dives with lots of helium. That is what you would expect. The more helium and the deeper the dive, the more gas your fast tissues breathe off on the way up, so the bigger the gap between the two first stops. It is 12 m on S6 (80 m, 55% helium), 6 m on S5 (60 m, 45% helium) and 6 m on FS5 (50 m, 35% helium). On the air and nitrox dives, which have no helium to drive it, the gap is at most one 3 m step.

It is not caused by ascent speed. You might think Dive Kit climbs slower through the deep part. It does not. We run Dive Kit at MultiDeco's own deep rate of 9 m/min, and we re-ran S6 at 3, 6, 9 and 12 m/min deep. The first stop lands at 30 m, 36 m, 36 m and 39 m. At MultiDeco's 9 m/min it is 36 m, still 12 m shallower than MultiDeco's 48 m. A faster climb brings the total time down (S6 goes from 88.8 to 82.6 min and CNS from 82% to 76%), but the first-stop gap stays. It comes from recomputing every second, not from how fast you climb.

What we can fairly say about MultiDeco. We can watch its output, not its code. What we see fits this picture: it finds the deepest stop, then lists a hold at each 3 m step on the way up, without counting the gas you breathe off during the deep climb. A second-by-second model counts that climb. We are not claiming that is how MultiDeco is built. We are saying that our approach, recomputing your obligation every second while you move, is the one that matches what a modern dive computer does on the dive.

It is also not the one-minute minimum stop. We run both planners with a one-minute minimum, which lines the two lists up as closely as the models allow. To be sure the minimum was not hiding the cause, we re-ran Dive Kit with no minimum at all, so it could show stops shorter than a minute. The first stop stayed at 36 m. The minimum only sets how short a listed stop can be. It does not change the depth where the dropping ceiling first lets you stop.

The differences, explained once

Every per-scenario note in the viewer points back to one of these shared explanations.

Ascent-rate match We run Dive Kit at the same ascent speeds we used in MultiDeco, so the comparison is fair. The deep speed that sets the first stop is 9 m/min in both.

Dive Kit and MultiDeco climb at the same speeds in these runs. The speed that decides where your first stop lands is the deep ascent, from the bottom up to the first stop, and that is 9 m/min in both tools, so that part is a like-for-like comparison. On the S and FS dives, MultiDeco moves a little slower between the shallower stops (6 m/min) than Dive Kit does, but that does not change where the first stop lands. We tested this directly: the difference in the first stop stays the same when we match the deep speed, so it comes from how Dive Kit recomputes your tissues while you climb, not from climbing faster or slower (see general/stopDistribution).

Decozone start Decozone start matches MultiDeco within about one deco step on every scenario (at most 3.6 m), and is GF-independent by design.

Dive Kit computes a 'decozone start', the depth where your decompression obligation begins. We use it here as a clean cross-check; it is not shown in the app. It is the deepest depth where a tissue's total inert-gas pressure (nitrogen plus helium) passes the surrounding pressure, and it does not depend on your gradient factors, because gradient factors move the M-value line, not the ambient line. You can see this in the data: S2 (GF 30/70) and S7 (GF 50/80) are the same 45 m / 22 min air dive and both show about 32 m, even though their first stops differ (21 vs 15 m). Across all 22 scenarios Dive Kit lands within about one 3 m step of MultiDeco (at most 3.6 m, on the deepest high-helium CCR dive, C3).

Stop distribution Dive Kit's first stop can be shallower than MultiDeco's. The total decompression is the same; it just sits at different depths.

MultiDeco lists a short stop at almost every 3 m step from the deepest stop up, often well under a minute. Dive Kit holds fewer, longer stops and skips the deepest ones, so its first listed stop is shallower (S6: 36 vs 48 m; S5: 27 vs 33; FS5: 21 vs 27). Both tools agree on the deepest depth where you owe a stop. They differ on the way up: Dive Kit recomputes all your tissues every second as you climb, the way the computer on your wrist does, so it counts the gas you breathe off during the climb itself. Helium leaves the fast tissues quickly, so on a helium dive the ceiling drops faster than you climb, and there is nothing to stop for in those first few metres. The gap is biggest on deep, high-helium dives (12 m on S6, 6 m on S5 and FS5) and at most one 3 m step on air and nitrox. The total time to surface stays within a minute or two either way (S6 82.6 vs 81, S5 45.3 vs 45, FS5 40.2 vs 42, A2 55.4 vs 56), and Dive Kit's leading tissue still reaches the surface exactly at your GF-High, so it never shortcuts your decompression. Compare total time to surface, not the depth of the first stop. The one exception is a dive with a long 6 m last stop, where Dive Kit finishes a few minutes sooner (see A4 and A5).

CNS basis (ambient ppO₂) Dive Kit uses ambient ppO2 for CNS (the more conservative, NOAA/Baker-aligned choice).

CNS oxygen-toxicity % is accumulated against the NOAA exposure limits using the AMBIENT ppO2 (fO2 x absolute pressure), with no alveolar water-vapour subtraction. This is Erik Baker's published method and matches Shearwater, Garmin and Subsurface; it is slightly more conservative than a water-vapour-reduced value. It runs ~1-3% higher than MultiDeco on most dives, and noticeably higher when a high-ppO2 deco gas sits right at a steep bracket of the NOAA curve (see S6).

Gas-switch caps Each gas switches at a depth set by its oxygen content (caps 1.4/1.5/1.6 bar). These match MultiDeco's switches within one stop.

Dive Kit caps each gas by its oxygen content: a lean mix (under 28% oxygen) at 1.4 bar, a mid mix (28 to 45%) at 1.5, a rich mix (45% or more) at 1.6. The same cap sets both the switch depth and the hyperoxia warning. MultiDeco caps gases the same way, so at its default 1.4/1.5/1.6 every gas switch in these scenarios matches within one 3 m stop: Tx21/35 at 54 vs 57 m, Tx35/25 at 30 vs 33 m, and EAN50 (21 m) and oxygen (6 m) exactly. The small differences are only which 3 m stop the switch lands on.

Gas density Small gas-density offset (~7-9%) from differing gas-temperature assumptions.

Dive Kit's worst-case gas density (e.g. S1 air at 30 m ~5.2 g/L) runs slightly above MultiDeco's (4.8 g/L) because the two tools assume different gas temperatures in the ideal-gas density calculation. Both flag the same density warning thresholds; the absolute number is a reference, not a safety boundary.

Gas usage (litres) Litres used depend on your breathing rate, so this is not a comparison of the deco math.

Gas consumption depends entirely on the breathing-rate (RMV/SAC) settings, which are a user preference, not a deco-model output. Dive Kit's figures here use RMV 20 (working) / 15 (deco) L/min, so absolute litres differ from a MultiDeco run configured with a different SAC. Match the SACs before comparing litres.

CCR loop deco CCR (rebreather) loop deco matches MultiDeco closely. CNS and OTU are near-exact, decozone within a step.

Pure-loop CCR deco (constant setpoint 1.3, no open-circuit switches) holds up well across air, trimix and deep high-helium diluents (C1 to C3): CNS within 1 percentage point (27/27, 37.8/37, 53.9/53), OTU within 2 to 3 units (71.8/70, 100.5/99, 143.4/140), and time to surface within 1 to 3 min. Decozone is within one 3 m step except on the deep 80 m high-helium dive C3 (65.6 vs 62, the same wider spread seen on the deep trimix dive S6). The first listed stop is shallower than MultiDeco, the usual stop-distribution effect on a helium diluent (see general/stopDistribution). Gas density runs about 8% higher (temperature assumption). CCR is also covered by our automated tests.

Run it yourself

You don't have to take our word for any of it. Enter these exact scenarios in Dive Kit and in the MultiDeco mobile app and compare them against the numbers above. We publish the full data set here: every scenario's inputs, both tools' outputs, and the per-scenario notes. Both columns show whole-minute stops, because the Dive Kit column runs in rounded mode, which is the app's default. So the app shows you these same numbers. (Switch the app to precise mode and the stops resolve to the second, but the total time-to-surface stays within a minute or two.)

Join the four files by scenario id. The Dive Kit engine is proprietary, but every output here is reproducible by running the same dive in the app. The comparison stands on the data, not on trust.

No hidden choices

The assumptions, in one place

A consolidated list of the modelling choices above, the things you are trusting when you read a Dive Kit schedule.

The model

  • Dissolved-gas Bühlmann ZH-L16C with Erik Baker gradient factors (interpolated linearly with depth); no bubble model and no separate deep-stop algorithm beyond what your GF-Low implies.
  • Tissue loading integrated in 1-second steps through every depth change, not only at fixed stops.
  • Nitrogen and helium tracked separately per compartment, with continuously re-blended coefficients as the mix changes.

Stops & ascent

  • Stops sit on a configurable grid (3 m default); a ceiling always rounds up, never shallower than your true ceiling.
  • Stop times rounded up to whole minutes by default, with the rounding done inside the engine (one-way, hold-longer-only, so never an early ascent); precise second-resolution (MM'SS") and round-to-30-seconds are opt-in. The last stop carries a one-minute minimum in every mode.
  • The last stop is a real stop, even when a coarse grid would otherwise force you deeper.
  • Ascent uses a two-rate model (deep + shallow, switching at a configurable depth); descent rate configurable.
  • A level's entered time is its at-depth time; the descent into it is accounted separately.

Gas switching (open circuit)

  • Each gas's switch depth and hyperoxia warning use one O₂%-band ppO₂ cap (lean/mid/rich, default 1.4/1.5/1.6), and the same number drives both.
  • An optional gas-switch (purge) time is spent at depth on the old gas; off by default.
  • The auto-gas picker takes the richest gas legal at each depth and never breathes a gas past its cap.

Oxygen toxicity

  • CNS and OTU accumulate from ambient ppO₂ (no water-vapour subtraction), against NOAA limits; CNS decays on a half-life, including across surface intervals.

Environment

  • A water-type metres-per-bar factor feeds both gas loading and the M-value/ceiling maths; surface pressure is configurable for altitude.

Closed-circuit (CCR)

  • Three setpoints (descent, bottom, deco), with a switch depth applied only on the first descent, an optional depth-keyed deco-setpoint and diluent schedule, and any setpoint capped at the achievable ambient ppO₂.
  • “Stay on the loop” by default; open-circuit bailout planned from the worst realistic failure point at an elevated stress breathing rate.

Other

  • Repetitive dives carry tissue tension, CNS and OTU across the surface interval; an oxygen break re-loads the fast tissues, and that loading carries through the rest of the plan.
  • Gas density uses a fixed temperature assumption: a reference reading, not a safety boundary.
  • Gas volume used depends entirely on your breathing-rate (RMV/SAC) setting, a personal preference.

Knowing the limits

What we deliberately don't claim

No model is a guarantee. Bühlmann is a dissolved-gas model fitted to data, and decompression sickness is probabilistic. Your Gradient Factors are your conservatism dial and your call, and a planner's job is to honour them faithfully, which is what ours does.

This is a planning tool, used on the surface before and between dives. It is not a substitute for training, a dive computer, a sensible personal margin, or judgement.

We don't invent physics. Where the literature is settled we follow it and cite it; where it leaves a genuine choice we make a defensible one, document it here, and validate the result against an independent reference.

References

The theory on this page was checked against primary and authoritative sources. Dive Kit's engine is an independent implementation written from the published papers and equations. The open-source projects below are independent cross-checks, not code we derived from.

Spotted something? Disagree?

This page makes specific, checkable claims about decompression theory. If you have thoughts, opinions, or corrections, we want to hear them. Come argue the details with us on Reddit.

Plan the Dive. Dive the Plan.

Download Dive Kit free. Try the 11+ tools, and upgrade to the Deco Planner when you're ready to plan decompression dives.