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.
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?”.
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.
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.
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.
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.
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.
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
| Algorithm | First stop | TTS | Total time | CNS | OTU |
|---|---|---|---|---|---|
| Bühlmann ZH-L16C + Gradient Factors | 15 m | 43:15 | 68:15 | 10 % | 28 |
| Bühlmann ZH-L16B + Gradient Factors | 15 m | 36:41 | 61:41 | 10 % | 28 |
| RGBM (Reduced Gradient Bubble Model) | 9 m | 37:08 | 62:08 | 10 % | 28 |
| US Navy Standard Air Decompression Table | 6 m | 30:40 | 55:40 | 10 % | 28 |
| VPM-B (Varying Permeability Model, Boosted) | 18 m | 48:13 | 73:13 | 10 % | 28 |
| VPM-B/GFS (Gradient Factor Surfacing) | 18 m | 48:13 | 73:13 | 10 % | 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.
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.
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.
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.
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.
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
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
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.
- 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
Decompression schedule
| 2:13 min | Descend · 0 → 40 m · 2:13 min · Air |
| 25:00 min | At depth · 40 m · 22:47 min · Air |
| 28:27 min | Ascend · 40 → 15 m · 3:27 min · Air |
| 28:47 min | Deco stop · 15 m · 0:20 min · Air |
| 66:15 min | Deco 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.
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.
No previous dives — the plan starts from fully rested tissues.
Compartment loading on surfacing
The NDL screen at 390 × 844 — the narrowest phone the app is designed for.
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.
Version 1.1.0
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.
0/4000
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.
➤ SendSettings → 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.
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.