NeuraTiM DecoLab

Plan the dive once. See how much the model costs you

DecoLab is a decompression laboratory for technical divers: six models computed side by side, full multilevel schedules with gas switches and consumption, and a live cockpit you can fly by hand. Everything runs on your device, with no account and nothing sent in the background.

6 decompression modelsNo accountNothing sent in the background18 languages
decolab-app.neuratim.com
Decompression Plan
Build the dive, then compute a full schedule with the model of your choice.
Edit full configurationRun simulationSave planExport to file
Adjust the dive
Depth levels
Gases
Total runtime
68:15 min
Time to surface
43:15 min
First stop
15 m
Total decompression
34:48 min
No-stop limit
Exceeded
Avg depth
19.2 m
CNS
10 %
OTU
28
Dive profile
010203040500:0010:0020:0030:0040:0050:0060:0070:00Ceiling (no-ascent zone)Depth (m)Time (min)

Drag across the chart (or use the arrow keys) to read any moment — 68:14 total runtime

Decompression schedule
PhaseDepthDurationRuntimeGasppO₂ (bar)
0 → 402:132:13Air1.05
4022:4725:00Air1.05
40 → 153:2728:27Air0.53
150:2028:47Air0.53
15 → 121:0029:47Air0.46
121:3231:19Air0.46
12 → 91:0032:19Air0.40
92:3734:56Air0.40
9 → 61:0035:56Air0.34
630:1966:15Air0.34
6 → 02:0068:15Air0.21
068:15
↑ Ascend— At depth↓ Descend‖ Deco stop⇄ Gas switch
Gas consumption
Air4014 L used · 167 bar
12 L
−134 bar200 bar
How this plan was computed

Everything the schedule above depends on. A plan without these numbers beside it cannot be checked by anyone — including you, next season.

ModelBühlmann ZH-L16C + Gradient Factors
Gradient factors30 / 85
WaterSalt water · 1025 kg/m³
GasesAir
Previous divesNone — rested tissues assumed
ppO₂ limits (bar)1.40 bottom · 1.60 deco
Speeds (m/min)↓ 18 · ↑ 9 · between 3 · last 3
Stopsevery 3 m, last at 6 m
Generated2026-08-04 13:06 UTC+02:00
Produced byNeuraTiM DecoLab 1.1.0

Deco Plan — 40 m for 25 min on air, Bühlmann ZH-L16C with GF 30/85. Traced from the running app.

Six models, one dive

The model is a decision. Make it with the numbers in front of you.

A dive computer implements one model and hides it behind a conservatism dial. DecoLab computes the same dive with all six and puts the schedules side by side, because the honest answer to “how long is the deco?” is “which model are you asking?”.

Dissolved gas

Bühlmann ZH-L16C + GF

The Bühlmann workhorse with gradient factors — the model most technical training and most computers are built around. GF low and GF high are yours to set.

Dissolved gas

Bühlmann ZH-L16B + GF

The earlier half-time set, kept because it is what several published tables and older computers were built on, and because it does not agree with ZH-L16C.

Bubble model

RGBM

Wienke's published Reduced Gradient Bubble Model equations. Labelled in the app as an educational approximation — real computers use proprietary tuning that has never been published.

Published table

US Navy Standard Air

The Revision 6 table, computed the way the table works: one depth and one time, no gas switching, no multilevel. Useful precisely because it is the constraint the others are not.

Bubble model

VPM-B

The Varying Permeability Model, boosted — bubble mechanics that put the first stop deeper and the total time longer than a Bühlmann plan of the same dive.

Bubble model

VPM-B/GFS

VPM-B with a gradient-factor surfacing criterion applied to the final ascent, for divers who want the deep stops without the shallow tail.

40 m for 25 minutes on air · salt water · GF 30/85 · last stop 6 m

AlgorithmFirst stopTTSTotal timeCNSOTU
Bühlmann ZH-L16C + Gradient Factors15 m43:1568:1510 %28
Bühlmann ZH-L16B + Gradient Factors15 m36:4161:4110 %28
RGBM (Reduced Gradient Bubble Model)9 m37:0862:0810 %28
US Navy Standard Air Decompression Table6 m30:4055:4010 %28
VPM-B (Varying Permeability Model, Boosted)18 m48:1373:1310 %28
VPM-B/GFS (Gradient Factor Surfacing)18 m48:1373:1310 %28

One dive, six engines, computed by the app. The first stop moves by 12 m and the total time by 17 and a half minutes on the model alone — which is the whole argument for looking at more than one.

Recreational, Technical, and how much of it

Two switches. Four honest versions of the same app.

A recreational diver planning a 30 m dive and a technical diver comparing bubble models want different apps, and DecoLab is both — but the difference is not a shorter menu. One switch decides which screens exist; the other decides how many fields each of them shows. Every combination of the two is a real interface, and in all four of them the same rule holds: a control the app is not showing you is read from the global setting, never from a value the section quietly remembered.

The default

Recreational

What a fresh install opens in. Every screen computes with the global defaults and shows you the answer, not the machinery.

  • Six destinations: Deco Plan, NDL, NDL Table, Calculation, Gases & Tanks, Settings
  • One model, set once in Settings, used by everything
  • No model picker and no per-section conservatism anywhere
  • The full schedule, profile, gas consumption and printable plan sheet
  • Backup and restore, plain or encrypted

Recreational and early technical divers, and anybody who wants one answer rather than six.

One switch away

Technical

Everything Recreational has, plus the four advanced screens and — with UI Full on — the fields that let one calculation disagree with the global default on purpose.

  • All ten destinations — Compare Algorithms, Recommend Gas, Gas blending and the Simulation cockpit appear
  • The model picker on every screen that computes
  • Per-section overrides: a different gradient factor, ascent speed or ppO₂ limit for this calculation alone
  • Six engines side by side on one dive, and any one model's full result
  • A live cockpit at 1× to 30× real time, with the tissues responding second by second

Technical, trimix and CCR-curious divers, instructors, and anyone who wants to see what the model is doing.

And a second switch: how many fields

The second switch does not change which screens exist — it changes how much of each one is on show. UI Minimal hides every control that merely repeats something already set in Settings, and the section then uses that setting. What is hidden is computed from the global value, which is the whole point: a number you cannot see can never be the one driving a schedule.

The default

UI Minimal

What a fresh install opens in. NDL asks for a depth and an oxygen percentage and answers. A plan's gas cards drop the capacity and fill pressure. The water type, the model picker and the per-section overrides are gone, and Settings is what every one of them reads.

One switch away

UI Full

Every field back where it was: the water type on the screen you are on, the model pickable where it computes, a cylinder's own capacity and fill on a plan, and the overrides that let one calculation disagree with the global default on purpose.

TechnicalUI Full

Both switches sit at the foot of the navigation, one above the other, and neither is buried in Settings. Recreational ↔ Technical changes which destinations exist, so it belongs with them; UI Minimal ↔ UI Full decides which of the fields on the Settings page get repeated on the other screens, so putting it there would mean hunting for the control that hid the control you were looking for. Both are remembered, and nothing else about your data changes when you flip either.

The ten screens

From a single number to a full instrument panel

Each destination answers one question. Pick one to see the screen the app actually renders.

What is the full schedule for this dive?

Build the dive in panels — levels, gases, algorithm and conservatism, water and last stop — then compute descend / hold / switch / ascend / stop as a readable schedule.

  • Multilevel depth levels, each on its own gas or on Auto
  • Summary tiles, the profile with its ceiling, the schedule and per-cylinder consumption
  • “How this plan was computed” under every result — every parameter the schedule depends on
  • Print or share it as a plan sheet, save it, export it, or hand the dive to the simulation
decolab-app.neuratim.com
Decompression Plan
Build the dive, then compute a full schedule with the model of your choice.
Edit full configurationRun simulationSave planExport to file
Adjust the dive
Depth levels
Gases
Total runtime
68:15 min
Time to surface
43:15 min
First stop
15 m
Total decompression
34:48 min
No-stop limit
Exceeded
Avg depth
19.2 m
CNS
10 %
OTU
28
Dive profile
010203040500:0010:0020:0030:0040:0050:0060:0070:00Ceiling (no-ascent zone)Depth (m)Time (min)

Drag across the chart (or use the arrow keys) to read any moment — 68:14 total runtime

Decompression schedule
PhaseDepthDurationRuntimeGasppO₂ (bar)
0 → 402:132:13Air1.05
4022:4725:00Air1.05
40 → 153:2728:27Air0.53
150:2028:47Air0.53
15 → 121:0029:47Air0.46
121:3231:19Air0.46
12 → 91:0032:19Air0.40
92:3734:56Air0.40
9 → 61:0035:56Air0.34
630:1966:15Air0.34
6 → 02:0068:15Air0.21
068:15
↑ Ascend— At depth↓ Descend‖ Deco stop⇄ Gas switch
Gas consumption
Air4014 L used · 167 bar
12 L
−134 bar200 bar
How this plan was computed

Everything the schedule above depends on. A plan without these numbers beside it cannot be checked by anyone — including you, next season.

ModelBühlmann ZH-L16C + Gradient Factors
Gradient factors30 / 85
WaterSalt water · 1025 kg/m³
GasesAir
Previous divesNone — rested tissues assumed
ppO₂ limits (bar)1.40 bottom · 1.60 deco
Speeds (m/min)↓ 18 · ↑ 9 · between 3 · last 3
Stopsevery 3 m, last at 6 m
Generated2026-08-04 13:06 UTC+02:00
Produced byNeuraTiM DecoLab 1.1.0

Two switches, at the foot of the navigation

Technical shows all ten destinations; Recreational hides Compare, Recommend, Gas blending and Simulation. A second switch under it, UI Minimal ↔ UI Full, decides how many fields each destination shows: UI Minimal takes away every control that only repeats a global setting, and the section then uses that setting. The point is not a shorter list — it is that in all four combinations, a field the app is not showing you is read from Settings and never from a value the section quietly remembered.

Gas blending

What goes in the cylinder, worked out both ways

Two methods on one screen. Partial pressure is the fill station: helium, then oxygen, then air, with the gauge reading to close each valve at. Cross-fill is the whip: real cylinders, real banks, and the pressure each one has left when you are done.

Partial pressure

Give it the cylinder you have and the mix you want, and it gives you the pressure of each gas to add and the gauge reading to stop at. A cylinder already holding the wrong gas is bled to a solved pressure rather than refused — 150 bar of 10/70 wanted as 18/45 comes down to 128.6 bar first, because 200 bar of 45 % helium is 90 and 70 % of the start already carries more.

Cross-fill

A whip pushes gas one way, and the gas that arrives carries the source's mix — not an average of the two cylinders. Which means a bank fills your cylinder only while it is the higher of the two, and only to the pressure they level at. List as many banks as you like, switch on a compressor, set the working pressure, and it plans the order and the gauge reading to close each valve at.

Plan for the fill you can get

Bleed off first−7.5 barDown to 92.5 bar
Source 1+27.5 barEAN50 bank, 150.0 → 120.0 bar
Final mixEAN28Destination starts at 100.0 bar
Final pressure120.0 bar

Three gases, not two

Nitrox or Trimix on either method. Helium is a third balance, not a bolt-on: three banks of 10/70, air and oxygen blend 18/45 and the share taken from each is the one the balances force.

What you can have instead

When the exact fill is out of reach it is a warning, not a refusal, and the headline names the two fills you can have instead — EAN29 at 140 bar, or the EAN28 you asked for at 131.8 bar. Both come with their own plan and valve steps.

What you would need

And what would change it: the bank at 186.8 bar rather than 150, or a mix between EAN38.8 and EAN45.5, or simply the compressor switched on. It says which, in whole numbers you can actually fill to.

The solver is checked against an independent brute-force simulator over several hundred nitrox, multi-bank and trimix problems: it may not claim a fill it cannot execute, and it may not refuse one it can.

Provenance and the plan sheet

“23 minutes of deco” is not a statement anybody can check

A schedule means nothing on its own. It is a different claim at GF 30/85 than at 50/95, in fresh water than in salt, after a rested night than after two dives that morning — and a screenshot of the stops carries none of that. So DecoLab states every parameter beside the result, always, and can print the whole thing as a document that survives leaving the app.

The parameters travel with the resultTen rows under every schedule: the model, the gradient factors, the water, the gases, the previous dives carried in, the ppO₂ limits, the speeds, the stop spacing, when it was computed and by which build. Not left in the form that produced it — that is off the top of the screen by the time the schedule is readable.
A saved plan cannot driftA saved plan stores the values it was computed with, so reloading it next season reproduces the same schedule even if your global settings have moved since. The plan is a record, not a re-run.
A sheet that prints, not a screenshotBlack on white, no colour carrying meaning, warnings repeated on every page that shows a schedule, and a large-text mode that re-paginates rather than shrinking the type. It is built for an office laser printer, a group chat, and a boat in the sun.
Or share it as textThe same dive as plain text, ready to paste into a message, a log or a dive plan somebody else has to read. Nothing about it needs this app installed.
How this plan was computed
Model
Bühlmann ZH-L16C + Gradient Factors
Gradient factors
30 / 85
Water
Salt water · 1025 kg/m³
Gases
Air
Previous dives
None — rested tissues assumed
ppO₂ limits (bar)
1.40 bottom · 1.60 deco
Speeds (m/min)
↓ 18 · ↑ 9 · between 3 · last 3
Stops
every 3 m, last at 6 m
Generated
2026-08-04 13:06 UTC+02:00
Produced by
NeuraTiM DecoLab 1.1.0
40 m / 25 minPage 1 of 3

Decompression schedule

2:13 minDescend · 0 → 40 m · 2:13 min · Air
25:00 minAt depth · 40 m · 22:47 min · Air
28:27 minAscend · 40 → 15 m · 3:27 min · Air
28:47 minDeco stop · 15 m · 0:20 min · Air
66:15 minDeco stop · 6 m · 30:19 min · Air

DecoLab is a planning and teaching tool, not a dive computer. Cross-check every schedule against a dedicated device and appropriate training before it is dived.

Page 1 of the printable sheet for the same 40 m dive — traced from the running app.

The simulation cockpit

A dive you can fly, second by second

This is the screen the desktop-first layout exists for. On a wide window it becomes a three-column instrument panel — profile and controls, the indicator grid, tissues and stops — with tanks and history inside those same columns, so the ceiling, the projections and the remaining gas are all readable at once instead of a tap apart.

What it reports

  • Depth, runtime, max depthCurrent depth, elapsed runtime and the deepest point reached.
  • Ceiling and surface GFThe depth you must not ascend past, and the gradient factor you would surface with if you left right now.
  • TTS, and eight projections of itTime to surface as planned, and the same number on the current gas alone — plus what staying another 1, 5 or 10 minutes would cost, both ways.
  • Gas time remainingHow long the gas you are breathing lasts at this depth and this rate, cylinder by cylinder.
  • ppO₂, CNS, OTU, density, ENDOxygen partial pressure, CNS toxicity, pulmonary OTU, gas density as a proxy for work of breathing, and equivalent narcotic depth.
  • Tissue loadingSixteen compartments on a body diagram, coloured on one fixed safe → caution → danger ramp, with the leading tissue called out.
Instruments
TARGET DEPTH
40.0 m
where you are heading
DEPTH
40.0 m
current
RUNTIME
15:02
elapsed
FIRST STOP
6 m
depth
STOP TIME
6:10
at first stop
TOTAL DECO
6:10
time owed at the stops
TTS ALL GASES
13:57
using every deco gas you carry
TTS ALL GASES +1
16:43
stay 1 min, then switch as planned
TTS ALL GASES +5
30:55
stay 5 min, then switch as planned
TTS ALL GASES +10
53:22
stay 10 min, then switch as planned
TTS CURRENT GAS
13:57
staying on the gas you breathe now
TTS CURRENT GAS +1
16:43
stay 1 min on this gas, no switch
TTS CURRENT GAS +5
30:55
stay 5 min on this gas, no switch
TTS CURRENT GAS +10
53:22
stay 10 min on this gas, no switch
GAS TIME LEFT
9:42
current gas, at this depth & rate
CEILING
4.6 m
do not ascend past
SURFACE GF
127 %
if surfacing now
PPO₂
1.05 bar
oxygen partial pressure
CNS O₂
5 %
toxicity
OTU
15
pulmonary O₂
GAS DENSITY
6.5 g/L
work of breathing
EST. DCS RISK
30 %
gamified
MAX DEPTH
40.0 m
deepest

Traced from the running app at 40 m on air, 15:02 into the dive — the moment the no-stop limit has already gone and the first stop has appeared. These are the values the app computed, not illustrations.

Flying it

Depth and time, by hand

Fly the dive by hand with ±1 m and ±5 m steps, go straight to a depth, ascend to the next stop, or surface. Advance time in 30-second, 1-, 5- and 10-minute jumps whether the clock is running or paused.

Real time, or thirty times it

Run at 1×, 2×, 5×, 10× or 30× real time — how many simulated seconds pass per real second — or hand the cockpit a plan you already computed and watch it play back.

Lose a stage and watch it cost you

Switch gas taking the configured switch time, or instantly. Excluding a cylinder simulates losing a stage, and the time to surface and the stop schedule immediately recompute on what you still have.

The panel is yours to arrange

Every indicator can be hidden and brought back from the chips underneath, and the layout is remembered — so the panel ends up showing the numbers you actually fly by.

Your data

A file you own, and a door that refuses politely

Everything DecoLab knows lives on your device, which makes the file it writes the only copy that matters — and the file somebody hands back to it the only way in. Both halves are built for that: the backup can be sealed with a passphrase nobody but you holds, and a file that is not right is refused with the field named, before a single byte of what you already have is touched.

A plain backup you can read

Settings, cylinders, tank configurations and every saved plan go into one JSON file you can read, repair and keep. It is your data in a format that does not need us — or any version of the app — to open it.

Or an encrypted one only you can open

The same content sealed with a passphrase you choose: AES-256-GCM over a PBKDF2-SHA256 key at 210 000 iterations, derived and encrypted entirely on your device. Nothing is sent anywhere, and there is no recovery — lose the passphrase and the backup is gone, which is what makes it worth carrying.

A tampered backup fails shut

Encryption that only detects a wrong passphrase is not encryption. The header travels through the cipher as associated data, so a file altered by one byte — a bumped iteration count, an edited salt — fails to open rather than restoring something you never exported.

Restoring is all or nothing

A file is read, bounded and checked field by field before you are asked to confirm, and before anything is written. If it is wrong, the restore is refused, the offending field is named, and everything on the device is exactly as it was.

One table of what a number may be

Every number the app stores has one written-down range, and all three ways in read it: what you can type, what a storage record may hold, and what a file may claim. A value outside its range is never quietly clamped — an ascent speed of 400 m/min is refused, not turned into 30 without telling you.

Two kinds of file, told apart by the file

A whole-app backup and a single plan file each say what they are inside the file itself, so handing over one where the other is expected is refused rather than half-read through the wrong parser.

This backup was not restored

Nothing on this device was changed.

What is wrong with the file

  • savedPlans[2].input.depths[0].depth — Not a value this app accepts: 412.
  • settings.ascentSpeed — Not a value this app accepts: 400.
  • tanks — Too many entries in this list (600 > 500).

The report a refused file produces, traced from the app.

Accuracy

Verified, and honest about where it stops

A decompression engine that is only approximately right is worse than useless, so DecoLab's engines are pinned to a reference implementation by a regression test rather than by assertion — and where a model is an educational approximation instead of a certified match, the app says so on the screen where you would otherwise assume otherwise.

Bit-identical to a reference implementation

The six engines are a port of a reference TypeScript implementation and produce bit-identical output for the same input: time to surface, runtime, stop schedules, no-stop limits, CNS, OTU and average depth all match to every printed decimal. That comparison is a pinned regression test, so a change that shifts a schedule by one second fails the build.

The engines are a standalone library

The algorithm layer is plain Dart with no Flutter imports — it could be lifted out and run anywhere, which is exactly how its parity is verified. Nothing about the user interface can influence a schedule.

RGBM is labelled for what it is

RGBM implements Wienke's published equations. Real dive computers use proprietary, unpublished tuning, so the app labels it an educational approximation rather than a match to any specific device, and the source documents which equations were implemented and which were not.

Warnings are data, not strings

The engine never writes a sentence. Warnings and errors travel as a code plus their numbers and are rendered by the presentation layer, which is why every safety-critical message exists in all 18 languages instead of falling back to English at the worst possible moment.

Read this before you plan a dive with it

DecoLab is a planning and teaching tool. It is not a dive computer, it does not replace one, and no schedule it produces should be dived without cross-checking it against a dedicated device and the training that dive requires. Decompression diving carries a risk of serious injury or death, and responsibility for any dive is the diver's alone.

Privacy

Nothing leaves the device. There is nowhere for it to go.

DecoLab has no backend for your diving, no account and no analytics. Nothing is uploaded, mirrored or synced, and nothing at all leaves the device unless you tap the one button that sends something — the suggestion form. That is not a setting you switch on; there is no server holding your dives to opt out of.

No account, ever

No sign-up, no email address, no profile. Open the app and it is ready; your cylinders and saved plans belong to that device.

Your data stays local

Settings, cylinders, tank configurations and saved plans live in on-device storage. Nothing is uploaded, mirrored or synced.

No tracking of any kind

No telemetry, no crash reporting, no third-party SDK watching you plan a dive. Nobody, including us, learns what you are diving.

Three buttons, and you press them

Settings → About & feedback holds the only three buttons in the app that reach the network, and each waits for your tap: the suggestion form, which sends your message plus the build's version, platform and language — never a dive, a cylinder, a setting or an identifier — and two links handed to your browser.

Export it and walk away

The backup section of Settings exports everything as plain JSON you can read, keep and restore anywhere. It is your data, in a format that does not need us.

Read the full privacy policy
9:41•••
NDL
No-Decompression Limit
How long you can stay at a depth and still ascend directly to the surface.
No-Decompression Limit
Depth (m)40
Oxygen (%)21
Previous dives

No previous dives — the plan starts from fully rested tissues.

Total no-decompression time
7:06min
ppO₂ at depth
1.06 bar

Compartment loading on surfacing

79185278366452538621738-139-2510-3511-4512-5513-6614-7515-8416

The NDL screen at 390 × 844 — the narrowest phone the app is designed for.

9:44•••
Settings
Settings
These are the global defaults.
About & feedback

DecoLab is made by NeuraTiM. The three buttons below are the only things in the app that reach the network — each one only when you tap it.

Suggest an improvementAbout NeuraTiMPrivacy policy

Version 1.1.0

Suggest an improvement

A model to add, a number you want on a screen, something that reads wrong in your language — tell us and it goes on the list.

Your suggestionWhat should DecoLab do that it does not do yet?

0/4000

@ Your email (optional)

Only your message, the address above and this build’s version, platform and language are sent. No dives, no cylinders, no settings, and nothing that identifies your device.

➤ Send

Settings → About & feedback on the same phone: the suggestion form, which is the only thing in the app that sends anything.

Get DecoLab

One codebase, every screen you plan on

The layout adapts rather than shrinks: a phone gets one column and a drawer, a split window gets an icon rail, and a full desktop window gets the multi-column screens the cockpit was designed around.

WebNothing to install. The full app runs in the browser and stores its data there, and it keeps working once the tab has loaded.
iOS and AndroidThe same build on a phone or a tablet: one column, a navigation drawer, and every panel stacked in reading order.
DesktopMaximise a window and the cockpit opens into its three-column instrument panel. This is the layout the app was designed for.

18 languages

Arabic, Bengali, Czech, German, English, Spanish, French, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Turkish, Vietnamese and Chinese. Every safety-critical warning and planning error is translated in all of them — a ceiling violation, a dangerous ppO₂ or a plan that will not converge is always reported in your own language — and Arabic runs the whole interface right to left.

Android

In closed testing on Google Play. Join the tester list and it installs like any other app.

Support

Free, with no catch to explain

Every screen, every model and every language is free. There is no paid tier, no advertising and no analytics, because there is no server to pay for. If DecoLab saved you an evening of table work, a tip covers the store fees.

Quickest Way to Tip

Other ways to say thanks:

Tips are voluntary and change nothing in the app — there is no feature behind them.