Pool LSI Calculator
The Langelier Saturation Index, computed the rigorous way — full saturation equation, continuous temperature and TDS, and the cyanurate correction every naive tool skips. Every fix it identifies routes to a shipped, engine-backed calculator.
Hook
Your test kit says everything's in range — pH 7.5, alkalinity 100, calcium 300. A naive balance calculator gives you a green light.
But you run 80 ppm of cyanuric acid, and that quietly drags your water corrosive without changing a single number on your test strip. Most calculators never catch it. This one does.
Promise
This calculator computes your pool's Langelier Saturation Index from the full saturation equation — pH, alkalinity, calcium, temperature, and total dissolved solids — and then does the correction almost every other tool skips: it subtracts the cyanurate share of your alkalinity, because the stabilizer that protects your chlorine doesn't protect your plaster. You'll get an honest balance verdict and the single most effective number to change — with a live calculator behind each fix. Every term derived on the page.
Here's the deal: water balance isn't about hitting five numbers individually — it's about whether, together, they leave your water hungry for calcium (corrosive) or oversaturated with it (scaling). The Langelier index rolls all five into one. We compute it the rigorous way, correct it for cyanuric acid, and tell you which lever moves it fastest.
What you'll give us
Six inputs: pH, total alkalinity, calcium hardness, cyanuric acid, water temperature, and total dissolved solids. The CYA input is the one most calculators skip — and the one that produces the wedge this page exists to surface.
The calculator
Fill the fields, pick your surface, hit Calculate. The result shows your LSI as one decimal + a verdict word (never false precision); under that, the cyanurate-correction callout shows how much of your “alkalinity” is actually carbonate. The result URL is shareable — your inputs encode into a deep link.
The cyanurate correction — why your “balanced” pool is corrosive
The page's reason to exist. Read slowly — this single correction is what makes the difference between a calculator that says “you're fine” and one that catches the etching nobody else explains.
Here's what almost every balance calculator gets wrong. When you titrate total alkalinity, cyanuric acid answers the call — a chunk of what reads as “alkalinity” is actually cyanurate, not carbonate. But CaCO₃ saturation only cares about carbonatealkalinity. So if you run 80 ppm of CYA and plug your total alkalinity straight into an LSI calculator, it overstates your buffering and tells you the water's balanced when it's actually pulling calcium out of your plaster.
The worked proof. Identical pool: pH 7.5, TA 100, CH 300, 80 °F, TDS 1000. With CYA 0 → LSI +0.02 (balanced). With CYA 80 → carbonate alkalinity is really 75 ppm, and LSI is -0.10 (corrosive). A naive tool reports +0.02 in both cases and never sees it. That 0.13swing is the gap between “your water's fine” and “your water is quietly etching your pool.”
What cyanurate alkalinity is
Cyanuric acid (HCY) has a pKa near pool pH. Part of your CYA exists in solution as the cyanurate anion (CY⁻), which titrates AS alkalinity in your test kit. But it's not bicarbonate — it doesn't buffer the carbonate equilibrium that controls CaCO₃ saturation. The titration counts it; the saturation chemistry doesn't.
Why the factor depends on pH
Cyanurate's share of your CYA — the part that reads as alkalinity — rises with pH (Henderson–Hasselbalch). We compute it exactly from the pKa: pH 7.2 → factor 0.262, pH 7.5 → 0.313, pH 8.0 → 0.360. Other calculators that use one rounded factor get it wrong at both ends of the range.
Reconciliation to the pool-world rule
At pH 7.5 our exact factor is 0.313— almost exactly the “subtract a third of your CYA” rule the careful pool-chemistry sources have been printing for years. We agree with that rule. We just compute it across the real pH range instead of using a single rounded number.
The wedge audience — the one looking specifically for “LSI with cyanuric acid” — should know this is also the math the cyanuric acid calculator treats as the trade-off for stabilization. Stabilizer protects your chlorine; it doesn't protect your plaster. The LSI correction is how you see the cost.
What the number means — corrosive, balanced, scaling
LSI is a number line, not a single threshold. Where you sit on it tells you the chemistry tendency; how far from zero tells you how strong the tendency is.
A negative LSI means your water is calcium-hungry — it will dissolve calcium out of plaster, grout, and the cement around tile, and it goes after metal too (heater cores fail this way). A positive LSI means the opposite: calcium is falling out of solution, coating your surfaces, your heater's heat exchanger, and your salt cell with scale. Zero (within ±0.3) means the water is at peace with its calcium — neither taking nor leaving.
The ±0.3 band is wide on purpose. LSI predicts a tendency, not a guarantee — a verdict at −0.1 doesn't mean your plaster is etching tonight, and +0.4 doesn't mean your heater scales by Friday. The band exists because the chemistry has real noise: test-kit precision, temperature drift, TDS guesswork. Take the verdict seriously when the index sits outside it; expect to see the consequence in weeks-to-months, not hours.
The temperature insight
The SAME water can be balanced in spring and scaling in summer, because warmer water holds less calcium in solution. This is why “I didn't change anything and now it's cloudy” happens — the season changed it. The SeasonSwing visual further down shows this directly for one fixed-chemistry pool.
What we don't do
We report LSI to one decimal + a verdict word. Not three decimals — the ±0.3 band makes a third decimal meaningless. We compute LSI only; we don't fake a CSI or Ryznar value if you came looking for those. And we don't add a borate correction without a borate input.
Which lever to pull — every fix routes to a shipped calculator
The capstone payoff. When LSI is off, the calculator above doesn't just tell you the number; it tells you which input is actually the lever, and it links you to the dosing tool that handles it.
LSI moves one-for-one with pH — it's the leading term in the equation, which makes pH the fastest correction. But pH is also the bounciest number in your pool (the carbonate system snaps back when you push it), so a pH fix may not hold. Calcium and alkalinity move LSI more slowly (they're logarithmic terms), but they stay put. The right lever depends on which of your inputs is actually out of its own healthy range.
That's the rule the “what to fix” output uses: don't fix a balance problem by pushing a healthy number to an unhealthy place. If your LSI is corrosive and your CH is below its band while everything else is in-band, the answer is to raise calcium — not to shove pH up out of its band. If multiple inputs are out, you get them in priority order, each with a live link to its dosing calculator.
pH
Fastest LSI lever; least durable. The pool pH calculator walks the acid + aeration sequence honestly.
Total alkalinity
The buffer behind pH. The pool alkalinity calculator handles the precise baking-soda dose and the acid + aeration sequence on the other side.
Calcium hardness
Slow but durable. The calcium hardness calculator covers the calcium-chloride dose and the dilution math when CH is too high.
Cyanuric acid
The wedge input. If your LSI is corrosive and your CYA is above its band, reducing it lifts your effective carbonate alkalinity directly. The cyanuric acid calculator handles the dilution math (no chemical reduces CYA, same one-way-ratchet rule as calcium).
TDS
High TDS nudges LSI corrosive. The pool salt calculator covers the salt-side TDS context; dilution is the same lever you use for high CYA or high CH.
Temperature
Not dosable. Seasonal. The fix when temperature drives a verdict is to expect the swing — your spring-balanced pool will read warmer-leaning-scaling in August. Re-test in-season.
Where the index comes from — the saturation equation
Most LSI calculators use lookup tables — pre-rounded factors for temperature, calcium, and alkalinity that you add together. We compute from the saturation equation directly. That's how we handle the cyanurate correction at all, and how we stay continuous with temperature.
Step 1 · the definition
LSI = pH − pHs, where pHs is the pH at which the water would be saturated with calcium carbonate. Negative LSI = water below its saturation pH = water wants to dissolve calcium. Positive LSI = water above saturation = calcium falls out of solution as scale.
Step 2 · the full form
pHs = 9.3 + A + B − C − D. The 9.3is the empirical anchor from Langelier's 1936 derivation; A is the TDS term, B is the temperature term, C is the calcium term, and D is the carbonate-alkalinity term. The simplified pool “factor tables” you see in pool books (TF, CF, AF) ARE these terms — pre-computed for a few values. We compute them continuously.
Step 3 · the four terms
- A (TDS): A = (log₁₀(TDS) − 1) ÷ 10. Higher TDS = higher pHs = LSI slightly more corrosive. Salt pools live here.
- B (temperature): B = −13.12 × log₁₀(°C + 273.15) + 34.55. Warmer water = higher B = LSI scaling. This is why your spring-balanced pool can scale by August.
- C (calcium): C = log₁₀(CH) − 0.4. The minus sign is there because C SUBTRACTS in pHs — more calcium pulls pHs down, pushes LSI up. Slow but durable.
- D (carbonate alkalinity): D = log₁₀(carbonate_alk). Same direction as C — more carbonate alk pulls pHs down. The carbonate-alk caveat is the entire reason this page exists.
Step 4 · the cyanurate correction (the wedge)
Naive calculators put raw TA into D. We don't. Carbonate alkalinity = TA − CYA × factor(pH), where factor(pH) = (50.04 ÷ 129.07) × the ionized fraction of CYA at your pH. The 50.04 is the same CaCO₃-equivalent constant the alkalinity calculator uses; the 129.07 is the cyanuric acid molecular weight (imported from the chlorine calculator's chemicals module). One source, two correct numbers.
Step 5 · sanity check
Balanced baseline (pH 7.5, TA 100, CH 300, CYA 0, 80 °F, TDS 1000) → A = 0.200, B = 2.054, C = 2.077, D = 2.000, pHs = 7.48, LSI = +0.02. These are the numbers every pool book calls “balanced,” and the equation agrees. That's how you know it's right.
The bridge to the lookup tables: those classic pool-book charts aren't magic, they're just log₁₀ values rounded to a chart row. We do the log directly instead of rounding. That precision matters most exactly where the lookup tables are weakest: high CYA (which they don't correct for), edge temperatures, and TDS outside the 500–2000 lookup range. For the math behind the dosing levers you might pull from here, the alkalinity calculator and the calcium hardness calculator share these same constants by construction.
Worked examples — eight common scenarios
Every LSI below is computed by the engine. Where the cyanurate correction matters (E2, E3), the naive-ignoring-CYA value is shown alongside — that's the wedge made visible.
Example 1
The balanced baseline (the reference)
pH 7.5, TA 100, CH 300, CYA 0, 80 °F, TDS 1000
+0.02 · Balanced
The textbook target, and proof the equation is right — these are the numbers every pool book calls 'balanced,' and the index agrees.
Example 2
The cyanurate wedge (THE example)
Same pool — but with 80 ppm of CYA
-0.10 · Balanced
Naive (ignoring CYA): +0.02 — calls this water balanced. Gap = 0.13 LSI units.
Nothing on your test strip changed, but 80 ppm of stabilizer pulled your water corrosive — and only a calculator that subtracts cyanurate alkalinity will tell you.
Example 3
Salt pool with high CYA — the double corrosive push
pH 7.6, TA 80, CH 350, CYA 80, 82 °F, TDS 3500 (salt pool)
-0.11 · Balanced
Naive (ignoring CYA): +0.06 — calls this water balanced. Gap = 0.17 LSI units.
Salt pools get hit twice — high TDS nudges LSI down, and salt systems often run high CYA, which the correction catches. This is why salt-pool plaster etches when the test kit looks fine.
Example 4
Scaling pool (the cloudy-water diagnosis)
pH 7.8, TA 120, CH 450, CYA 30, 88 °F, TDS 1500
+0.61 · Strongly scaling
High pH, high calcium, and warm water together push calcium out of solution — onto your heater, your cell, your tile line. Drop pH first (fastest lever).
Example 5
Corrosive cold-open (the spring pool-opening case)
pH 7.2, TA 60, CH 150, CYA 40, 65 °F, TDS 1000
-1.04 · Strongly corrosive
Cold water plus low pH, low alkalinity, low calcium is aggressively calcium-hungry — exactly the state a neglected pool opens in, and exactly when plaster damage happens. Raise calcium and alkalinity before chasing anything else.
Example 6
Same pool, two seasons (the temperature wedge)
pH 7.6, TA 90, CH 300, CYA 50, TDS 1200 — at 60 °F vs 90 °F
-0.23 · Balanced
90 °F: +0.09 · Balanced
The same chemistry reads corrosive in spring and balanced (heading toward scaling) in summer. 'I didn't touch anything and it went cloudy' is the season talking.
Example 7
Which lever fixes it (the hub payoff, worked)
pH 7.4, TA 70, CH 180, CYA 50, 78 °F, TDS 1000
-0.58 · Strongly corrosive
The fix isn't to shove pH up (it's already healthy) — it's to raise CH and TA back into their own ranges, which moves LSI back toward zero AND fixes the underlying low numbers. Don't fix a balance problem by pushing a healthy number to an unhealthy place.
Example 8
Hot spa (the spa-scaling case)
Hot tub: pH 7.6, TA 90, CH 250, CYA 40, 102 °F, TDS 1500
+0.14 · Balanced
Spas run hot, and heat pushes LSI up — so a spa that's 'balanced' cool will scale when you crank the temperature. Keep spa CH and pH on the lower side of their bands to leave headroom for the heat.
Reference tables
Three crawlable tables, CC BY 4.0. Every cell renders from the engine — no static numbers in this file. The Langelier “factor tables” (T1) are the classic pool-book lookups computed from the log formulas, not transcribed.
T1 · The Langelier factor tables, computed
The classic pool-book TF / CF / AF tables generated from the log formulas in §4.1 — TF = B = −13.12 × log₁₀(TK) + 34.55; CF = C = log₁₀(CH) − 0.4; AF = D = log₁₀(carbonate alk).
Temperature factor (TF)
| °F | TF |
|---|---|
| 40 | 2.49 |
| 50 | 2.38 |
| 60 | 2.27 |
| 70 | 2.16 |
| 80 | 2.05 |
| 90 | 1.95 |
| 100 | 1.85 |
Calcium factor (CF)
| CH (ppm) | CF |
|---|---|
| 25 | 1.00 |
| 50 | 1.30 |
| 75 | 1.48 |
| 100 | 1.60 |
| 150 | 1.78 |
| 200 | 1.90 |
| 300 | 2.08 |
| 400 | 2.20 |
| 600 | 2.38 |
| 800 | 2.50 |
Alkalinity factor (AF)
| TA (ppm) | AF |
|---|---|
| 25 | 1.40 |
| 50 | 1.70 |
| 75 | 1.88 |
| 100 | 2.00 |
| 150 | 2.18 |
| 200 | 2.30 |
| 300 | 2.48 |
| 400 | 2.60 |
AF uses raw TA in the classic table. When CYA is present, replace TA with carbonate alkalinity (TA − CYA × factor(pH) — see T2) before reading AF.
T2 · Cyanurate correction factor by pH
carbonate_alk = TA − CYA × factor. The pH-dependent factor handles the dissociation equilibrium of cyanuric acid (pKa1 ≈ 6.88). At pH 7.5 the factor is 31.3% — the published “subtract ⅓ of CYA” rule, computed exactly.
| pH | Factor | For CYA 80 → subtract |
|---|---|---|
| 7.0 | 0.220 | 17.6 ppm |
| 7.2 | 0.262 | 21.0 ppm |
| 7.4 | 0.298 | 23.8 ppm |
| 7.5 | 0.313 | 25.0 ppm |
| 7.6 | 0.326 | 26.1 ppm |
| 7.7 | 0.337 | 26.9 ppm |
| 7.8 | 0.346 | 27.7 ppm |
| 7.9 | 0.354 | 28.3 ppm |
| 8.0 | 0.360 | 28.8 ppm |
T3 · Worked-example LSIs
Engine-rendered. The naive column (LSI with raw TA in D) is shown for the wedge cases so the gap is visible.
| ID | Description | LSI | Verdict | Naive (raw TA) |
|---|---|---|---|---|
| E1 | Balanced baseline | +0.02 | Balanced | — |
| E2 | Cyanurate wedge | -0.10 | Balanced | +0.02 |
| E3 | Salt pool double push | -0.11 | Balanced | +0.06 |
| E4 | Scaling pool | +0.61 | Strongly scaling | +0.64 |
| E5 | Corrosive cold open | -1.04 | Strongly corrosive | -0.96 |
| E6c | Temp wedge (60 °F) | -0.23 | Balanced | -0.15 |
| E6h | Temp wedge (90 °F) | +0.09 | Balanced | +0.17 |
| E7 | Hub payoff | -0.58 | Strongly corrosive | -0.47 |
| E8 | Hot spa | +0.14 | Balanced | +0.21 |
All three tables released under CC BY 4.0. Attribute PoolSolver and link back.
Sources & methodology
The cluster capstone — the page closing the chemistry loop. Sources are short because the chemistry is well-established; the wedge is in the application, not the discovery.
The Langelier Saturation Indextraces to Langelier's 1936 paper on calcium carbonate saturation in water-treatment systems. The simplified pool form (pHs = 9.3 + A + B − C − D) is standard across water-treatment textbooks and pool-industry references. We use the full continuous formulation rather than the rounded lookup tables most pool calculators ship — the difference matters at edge temperatures, high CYA, and extreme TDS.
The cyanurate correction rests on cyanuric acid's first dissociation equilibrium (pKa1≈ 6.88) and the established distinction between carbonate alkalinity and the broader titrated total alkalinity. The carbonate-vs-cyanurate distinction is documented across the careful pool-chemistry literature (Trouble Free Pool / Falk references in particular); our contribution is to compute it pH-aware rather than apply a single rounded factor. At pH 7.5 our exact factor (≈ 0.31) reconciles to the published “subtract ⅓ of CYA” rule of thumb.
Imported constants, single source. The CaCO₃ equivalent weight (50.04) and cyanuric acid MW (129.07) used in the correction are the same constants the alkalinity calculator and the chlorine calculator use. The healthy-band thresholds in the “which lever to fix” routing are imported from the per-parameter pages (PH_ACCEPTABLE from the pH calc, TA_TYPICAL/TA_ACCEPTABLE from the alkalinity calc, CH_PLASTER/CH_VINYL_FG/CH_TYPICAL from the calcium calc, CYA_TYPICAL from the cyanuric calc) — one source per constant, the cluster cannot disagree with itself.
Temperature dependence (the Item-B realization). When the pH calculator shipped, it documented (acidbase.ts:25–51) that the LSI calculator would need pKa1(T) and would add a tempC parameter to a new helper. This page is that realization. The new saturationIndex() in lib/dosing/lsi.ts takes temperature as a first-class input; the existing acidbase/alkalinity/calcium functions are not touched.
The honesty paragraph (diagnostic edition)
LSI is a tendency, not a guarantee.The ±0.3 balanced band is a convention (Taylor / PHTA). We report the index to one decimal and a verdict word, never to three decimals — the band makes a third decimal meaningless. We compute LSI only; we don't fake a CSI or Ryznar value if you came looking for those (they're named honestly in the FAQ). And we don't add a borate correction term unless borate is an input. The cyanurate correction is shown PROMINENTLY in the result, under the headline — it's the page's differentiator and must not be buried.
The chemistry cluster closes here.Every dosable lever this page identifies routes to a shipped, engine-backed calculator: pH → /pool-ph-calculator/, total alkalinity → /pool-alkalinity-calculator/, calcium hardness → /pool-calcium-hardness-calculator/, cyanuric acid → /cyanuric-acid-calculator/, TDS context → /pool-salt-calculator/. Temperature isn't dosable; it's seasonal and we say so. The chemistry cluster has no prose-only deferrals remaining — every link on this page is live.
Frequently asked questions
What is a good LSI for a pool?
Why does cyanuric acid make my LSI lower?
My test numbers are all in range — why is my water corrosive?
Does temperature really change water balance?
What's the fastest way to fix unbalanced water?
Is LSI the same as the Ryznar or CSI index?
What should LSI be for a salt pool or plaster pool?
Can I just balance one number to fix LSI?
Related calculators
Next in Pool Chemistry: Pool Shock Calculator.
Related across clusters: Pool Heater Size Calculator, Pool Heating Cost Calculator.
All Pool Chemistry calculators: browse the hub.