{"id":4977,"date":"2026-07-03T08:17:04","date_gmt":"2026-07-03T08:17:04","guid":{"rendered":"https:\/\/aiper.com\/blogs\/pool-water-troubleshooting-wizard\/"},"modified":"2026-10-21T09:14:00","modified_gmt":"2026-10-21T09:14:00","slug":"pool-water-troubleshooting-wizard","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/pool-water-troubleshooting-wizard\/","title":{"rendered":"Pool Water Troubleshooting Wizard \u2013 Diagnose &#038; Fix Green or Cloudy Water"},"content":{"rendered":"\n<style>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   Pool Water Troubleshooting Wizard \u2014 Brand: #1ecad3 + #9486f7 blended\n   v2: LABELS-driven for i18n. All UI strings injected via {\"steps\": {\"1\": \"Color\", \"2\": \"Texture\", \"3\": \"Chemistry\", \"4\": \"Diagnosis\"}, \"colorQ\": \"What does your pool water look like?\", \"colorHint\": \"Pick the closest match to help narrow down the root cause.\", \"colorKeys\": [\"green\", \"cloudy\", \"yellow\", \"clear\", \"brown\", \"black\"], \"colors\": {\"green\": {\"line1\": \"Green\", \"line2\": \"(any shade)\"}, \"cloudy\": {\"line1\": \"Cloudy \/\", \"line2\": \"Milky White\"}, \"yellow\": {\"line1\": \"Yellow \/\", \"line2\": \"Mustard tint\"}, \"clear\": {\"line1\": \"Clear but\", \"line2\": \"smells \/ irritates\"}, \"brown\": {\"line1\": \"Brown \/\", \"line2\": \"Tea-colored\"}, \"black\": {\"line1\": \"Black spots\", \"line2\": \"on walls\/floor\"}}, \"textureQ\": \"Touch the pool wall. How does it feel?\", \"textureHint\": \"Texture reveals which type of algae or deposit you are dealing with.\", \"textureKeys\": [\"slimy\", \"rough\", \"smooth\"], \"textures\": {\"slimy\": \"Slimy \/ Slippery\", \"rough\": \"Rough \/ Sandy\", \"smooth\": \"Smooth \/ Normal\"}, \"chemQ\": \"What are your latest test readings?\", \"chemHint\": \"Accurate numbers lead to a precise diagnosis. Estimate if unsure.\", \"cyaLabel\": \"CYA (Cyanuric Acid \/ Stabilizer) Level\", \"phLabel\": \"pH Level\", \"cyaKeys\": [\"\", \"low\", \"normal\", \"elevated\", \"high\", \"unknown\"], \"cyaOptions\": {\"\": \"-- Select --\", \"low\": \"Below 30 ppm (low)\", \"normal\": \"30 to 50 ppm (ideal range)\", \"elevated\": \"50 to 80 ppm (elevated)\", \"high\": \"Above 80 ppm (too high)\", \"unknown\": \"I do not know my CYA level\"}, \"phKeys\": [\"\", \"low\", \"normal\", \"high\", \"unknown\"], \"phOptions\": {\"\": \"-- Select --\", \"low\": \"Below 7.2 (too low)\", \"normal\": \"7.2 to 7.6 (ideal range)\", \"high\": \"Above 7.6 (too high)\", \"unknown\": \"I do not know my pH level\"}, \"btnNext\": \"Next\", \"btnBack\": \"Back\", \"btnDiagnose\": \"Diagnose My Pool\", \"btnRestart\": \"Diagnose another problem\", \"stepLabel\": \"Step\", \"ctaText\": \"<strong>Reduce manual scrubbing:<\/strong> A robotic pool cleaner runs autonomously to scrub walls, floor, and waterline \u2014 keeping algae from gaining a foothold between treatments.\", \"ctaLink\": \"Explore Aiper Robotic Cleaners\", \"diagnoses\": {\"green_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Green Algae Bloom\", \"summary\": \"Your pool has an active green algae infestation, typically caused by low free chlorine levels allowing algae spores to take hold.\", \"steps\": [{\"title\": \"Brush and Circulate\", \"body\": \"Vigorously brush all pool surfaces \u2014 walls, floor, steps, and behind ladders. Set your pump to run <strong>24\/7<\/strong> until the water clears. Algae clings to surfaces; brushing dislodges it so chlorine can attack.\"}, {\"title\": \"Shock to SLAM Level\", \"body\": \"Based on your CYA reading, raise Free Chlorine to <strong>SLAM level<\/strong> (40% of CYA). For example, CYA 40 means target FC 16 ppm. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-chlorine-calculator\/\\\">pool chlorine calculator<\/a> for exact dosing. Use liquid chlorine for fastest results.\"}, {\"title\": \"Filter, Backwash and Verify\", \"body\": \"Backwash or clean your filter daily. Run the pump continuously until water is crystal clear <strong>AND<\/strong> overnight FC loss is less than 1 ppm. This typically takes 3 to 7 days.\"}], \"note\": \"<strong>Prevention tip:<\/strong> Maintain FC at 7.5% of CYA at all times. Never let FC drop below this floor \u2014 algae spores are always present and waiting for a chlorine dip.\", \"tools\": [\"chlorine\", \"volume\"]}, \"black_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Black Algae\", \"summary\": \"Black algae is the toughest pool algae to eliminate. It forms a protective waxy layer and roots into plaster or grout. Spot-scrubbing and aggressive chlorination are mandatory.\", \"steps\": [{\"title\": \"Break the Protective Layer\", \"body\": \"Use a <strong>stainless steel algae brush<\/strong> (not nylon) to vigorously scrub every black spot. You must break through the waxy coating. For vinyl liners, use a nylon brush with extra pressure \u2014 do NOT use steel brushes on vinyl.\"}, {\"title\": \"Spot-Treat with Granular Shock\", \"body\": \"Turn off the pump. Sprinkle <strong>cal-hypo shock granules directly onto the black spots<\/strong> and let them sit for 15 to 30 minutes. Alternatively, use a copper-based algaecide specifically labeled for black algae. Then turn the pump back on.\"}, {\"title\": \"Sustain High Chlorine and Monitor\", \"body\": \"Maintain FC at <strong>20% of CYA for 1 to 2 weeks<\/strong> after spots disappear. Scrub the spots daily. Black algae roots deep \u2014 stopping early guarantees a comeback. Replace any affected filter media after treatment.\"}], \"note\": \"<strong>Critical:<\/strong> Black algae can survive in filter media, brushes, and vacuum heads. Sanitize ALL equipment with a bleach solution after treatment, or you will reintroduce it.\", \"tools\": [\"chlorine\", \"volume\"]}, \"chlorine_lock\": {\"cssClass\": \"diag-lock\", \"title\": \"Chlorine Lock (High CYA Over-Stabilization)\", \"summary\": \"Your CYA is so high that chlorine molecules are bound too tightly to be effective. Even though you add chlorine, it cannot sanitize the water \u2014 so algae and bacteria thrive despite normal FC readings.\", \"steps\": [{\"title\": \"Partial Drain and Refill\", \"body\": \"To lower CYA, you must dilute the water. <strong>Drain and replace 25 to 50% of your pool water<\/strong> with fresh water. The exact percentage: if CYA is 100 and you want 40, drain 60%. Test CYA after refilling to confirm the new level is below 50 ppm.\"}, {\"title\": \"Super-Shock After Refill\", \"body\": \"Once CYA is in range, shock to <strong>30+ ppm FC<\/strong> to eliminate any algae or bacteria that took hold during the lock period. Run the pump continuously for 48 hours and retest.\"}, {\"title\": \"Switch Chlorine Source\", \"body\": \"Going forward, use ONLY <strong>unstabilized chlorine<\/strong> (liquid chlorine \/ sodium hypochlorite). Avoid trichlor tablets and dichlor granular \u2014 they keep adding CYA. Test CYA monthly to ensure it stays under 50 ppm.\"}], \"note\": \"<strong>Why this happened:<\/strong> Trichlor tablets and dichlor shock both add CYA with every dose. Over months, CYA creeps up silently. The only way to remove CYA is dilution \u2014 no chemical breaks it down.\", \"tools\": [\"chlorine\", \"volume\"]}, \"mustard_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Mustard Algae (Yellow Algae)\", \"summary\": \"Mustard algae is chlorine-resistant and notorious for reinfection. It appears as a yellow or mustard-colored dust, often in shaded areas, and easily spreads via swimsuits, toys, and cleaning equipment.\", \"steps\": [{\"title\": \"Aggressive Brushing and Clean Equipment\", \"body\": \"Brush all surfaces thoroughly. Remove and <strong>soak all pool equipment, toys, floats, and swimsuits in a bleach solution<\/strong> (1:10 dilution) for 30 minutes. Mustard algae hitchhikes on anything that touches the water.\"}, {\"title\": \"Shock to Mustard-Algae Level\", \"body\": \"Raise FC to <strong>60% of CYA<\/strong> (the mustard-algae SLAM target). Example: CYA 40 means target FC 24 ppm. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-shock-calculator\/\\\">pool shock calculator<\/a> for the exact dose. Brush 3x daily during treatment.\"}, {\"title\": \"Maintain Elevated FC for 72 Hours\", \"body\": \"Keep FC at the mustard-algae target for a <strong>minimum of 72 hours after water clears<\/strong>. This ensures eradication of the chlorine-resistant spores. Then bring FC back to normal maintenance level (7.5% of CYA).\"}], \"note\": \"<strong>Reinfection risk:<\/strong> Mustard algae spores can survive on pool covers, ladders, and diving boards. Wipe down everything that hangs over the water with a bleach solution, including the underside of the pool cover.\", \"tools\": [\"shock\", \"volume\"]}, \"calcium_clouding\": {\"cssClass\": \"diag-cloudy\", \"title\": \"Calcium Clouding (High pH Precipitation)\", \"summary\": \"High pH has caused dissolved calcium to precipitate out of solution, creating a milky-white haze. This is a water chemistry problem, not an algae or filtration issue.\", \"steps\": [{\"title\": \"Lower pH Immediately\", \"body\": \"Add <strong>muriatic acid or dry acid (pH decreaser)<\/strong> to bring pH down to 7.0 to 7.2. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-ph-calculator\/\\\">pool pH calculator<\/a> for precise dosing. Add acid in small increments, waiting 4 hours between doses.\"}, {\"title\": \"Test Calcium Hardness\", \"body\": \"Test your calcium hardness (CH) level. If CH is above <strong>400 ppm<\/strong>, the clouding will recur as soon as pH rises again. Ideal CH is 200 to 400 ppm for plaster pools and 150 to 250 ppm for vinyl\/fiberglass.\"}, {\"title\": \"Dilute or Use Scale Inhibitor\", \"body\": \"If CH over 400 ppm, <strong>partially drain and refill<\/strong> with fresh (lower-calcium) water. If CH is borderline, add a <strong>scale inhibitor \/ sequestrant<\/strong> to keep calcium dissolved. Maintain pH at 7.4 to 7.6 going forward.\"}], \"note\": \"<strong>Root cause:<\/strong> Calcium comes out of solution when pH exceeds about 7.8 (the exact threshold depends on temperature and total alkalinity). Heated pools and salt-chlorine generators (which constantly raise pH) are especially prone to this.\", \"tools\": [\"ph\", \"volume\"]}, \"dead_algae_filter\": {\"cssClass\": \"diag-filter\", \"title\": \"Dead Algae \/ Filtration Problem\", \"summary\": \"Fine particles \u2014 likely dead algae killed by a previous shock treatment \u2014 are suspended in the water because your filter is not capturing them effectively. The chemistry is likely balanced, but the water stays hazy.\", \"steps\": [{\"title\": \"Deep-Clean or Backwash Filter\", \"body\": \"Sand filter: <strong>backwash thoroughly<\/strong> until sight glass runs clear, then rinse for 30 seconds. Cartridge filter: remove and <strong>spray-clean each pleat<\/strong> with a hose, then soak overnight in filter cleaner. DE filter: backwash and <strong>recharge with fresh DE powder<\/strong>.\"}, {\"title\": \"Add Clarifier or Flocculant\", \"body\": \"If water stays hazy after cleaning the filter, add a <strong>pool clarifier<\/strong> (which coagulates fine particles so the filter can catch them). For extreme cases, use a <strong>flocculant<\/strong> \u2014 let particles sink overnight, then <strong>vacuum to WASTE<\/strong> (bypassing the filter entirely).\"}, {\"title\": \"Verify Flow and Run Time\", \"body\": \"Check that your pump is running long enough for at least <strong>2 full turnovers per day<\/strong>. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-turnover-rate-calculator\/\\\">pool turnover rate calculator<\/a>. Also check for clogged skimmer baskets, dirty pump strainer, or a blocked impeller.\"}], \"note\": \"<strong>Quick check:<\/strong> Shine a flashlight into the water at night. If you see millions of tiny particles floating (not swimming), it is dead material that needs mechanical removal \u2014 more chemicals will not fix it.\", \"tools\": [\"turnover\", \"volume\"]}, \"bacterial_bloom\": {\"cssClass\": \"diag-cloudy\", \"title\": \"Bacterial Bloom (Low Sanitizer)\", \"summary\": \"A bacterial bloom occurs when sanitizer levels drop too low, allowing bacteria to multiply rapidly. The water looks dull or slightly hazy, often with a subtle odor. This can happen overnight, especially after heavy use or rain.\", \"steps\": [{\"title\": \"Shock to Breakpoint\", \"body\": \"Raise FC to <strong>10x the combined chlorine (CC) level<\/strong> \u2014 this is called breakpoint chlorination. If you do not know CC, shock to 30 ppm as a safe default. Use liquid chlorine for fastest action. Run the pump 24\/7.\"}, {\"title\": \"Oxidize and Circulate\", \"body\": \"Keep FC elevated for <strong>24 to 48 hours<\/strong>. The water should begin clearing within 12 hours. If using a non-chlorine shock (MPS), note that it oxidizes but does NOT sanitize \u2014 pair it with chlorine.\"}, {\"title\": \"Retest and Stabilize\", \"body\": \"After 48 hours, test FC, CC, and CYA. CC should be <strong>below 0.5 ppm<\/strong> and FC should be at normal maintenance level (7.5% of CYA). If CC is still elevated, repeat the shock. Resume normal pump schedule only when water is crystal clear.\"}], \"note\": \"<strong>Prevention:<\/strong> A bacterial bloom often precedes an algae bloom. If you caught it at the dull\/hazy stage, you may have prevented a full green-water event. Test FC 2 to 3x per week during swim season.\", \"tools\": [\"turnover\", \"volume\"]}, \"chloramines\": {\"cssClass\": \"diag-chem\", \"title\": \"Chloramines (Combined Chlorine Buildup)\", \"summary\": \"The chlorine smell is not chlorine \u2014 it is chloramines, formed when chlorine binds to ammonia from sweat, urine, and body oils. High chloramines mean your free chlorine is being consumed faster than it is being replenished.\", \"steps\": [{\"title\": \"Test FC and TC to Find CC\", \"body\": \"Test Free Chlorine (FC) and Total Chlorine (TC). <strong>Combined Chlorine (CC) = TC minus FC<\/strong>. Any CC above 0.5 ppm indicates chloramines that need to be oxidized. The higher the CC, the stronger the smell.\"}, {\"title\": \"Breakpoint Shock Treatment\", \"body\": \"Add chlorine to reach <strong>10x the CC reading<\/strong> (breakpoint). Example: CC = 2 ppm means add enough chlorine to raise FC by 20 ppm. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-shock-calculator\/\\\">pool shock calculator<\/a>. Use unstabilized chlorine (liquid).\"}, {\"title\": \"Verify CC Drops Below 0.5 ppm\", \"body\": \"Run the pump continuously. Retest after 8 to 12 hours. <strong>CC must drop below 0.5 ppm<\/strong>. If it has not, continue shocking. Chloramines are fully oxidized when you no longer smell chlorine and the water feels soft, not irritating.\"}], \"note\": \"<strong>Did you know?<\/strong> A well-maintained pool should have virtually NO chlorine smell. That sharp odor is the calling card of chloramines. When someone says the chlorine is too strong, what they really mean is the chloramines are too high \u2014 the solution is more chlorine (to oxidize them), not less.\", \"tools\": [\"shock\", \"volume\"]}, \"metals\": {\"cssClass\": \"diag-metals\", \"title\": \"Metal Contamination (Iron \/ Copper \/ Manganese)\", \"summary\": \"Dissolved metals in your water \u2014 most commonly iron from well water or copper from corroded heater cores \u2014 are oxidizing and causing discoloration. The brown\/tea color is a telltale sign.\", \"steps\": [{\"title\": \"Test for Metals\", \"body\": \"Take a water sample to a pool store for a <strong>metals test<\/strong> (iron, copper, manganese). Home test kits rarely detect metals at low levels. Iron above 0.3 ppm, copper above 0.2 ppm, or manganese above 0.05 ppm can cause visible staining and discoloration.\"}, {\"title\": \"Add Metal Sequestrant\", \"body\": \"Add a <strong>metal sequestrant \/ stain remover<\/strong> following the label dosage based on your pool volume. Sequestrants bind to dissolved metals and keep them in solution so they can be filtered out. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-volume-calculator\/\\\">pool volume calculator<\/a> if unsure of your pool size.\"}, {\"title\": \"Identify and Fix the Source\", \"body\": \"If you fill from a well, install a <strong>pre-filter on your fill line<\/strong>. If you have a gas heater, inspect the heat exchanger for corrosion (copper). Check for rusty pool components (iron). Without fixing the source, metals will return with every top-off.\"}], \"note\": \"<strong>Warning:<\/strong> Do NOT shock the pool with chlorine while metals are present \u2014 chlorine oxidizes dissolved iron and copper, turning them into visible stains that are much harder to remove. Always sequester metals FIRST, then adjust chemistry.\", \"tools\": [\"volume\", \"chemical\"]}, \"low_fc_early_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Low Free Chlorine \/ Early Stage Algae\", \"summary\": \"Your chlorine has dropped too low and algae is beginning to take hold \u2014 but you have caught it early, before a full bloom. The green tint with smooth walls means algae is suspended in the water but has not yet adhered to surfaces.\", \"steps\": [{\"title\": \"Test Your Full Chemistry Panel\", \"body\": \"Get accurate readings for <strong>FC, CC, CYA, pH, and TA<\/strong>. You need all five to calculate the correct SLAM target. The FC\/CYA ratio determines how much chlorine you actually need \u2014 ignore the outdated 1 to 3 ppm rule.\"}, {\"title\": \"Bring FC to SLAM Level Immediately\", \"body\": \"SLAM FC target = <strong>40% of your CYA reading<\/strong>. (CYA 30 means FC 12 ppm; CYA 50 means FC 20 ppm). Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-chlorine-calculator\/\\\">pool chlorine calculator<\/a> for your exact dose. Add liquid chlorine at dusk.\"}, {\"title\": \"Maintain Until Overnight FC Loss Below 1 ppm\", \"body\": \"Test FC at sunset and again at sunrise (before UV hits). If the overnight loss is <strong>less than 1 ppm<\/strong>, the algae is dead. If more than 1 ppm, continue SLAM. This is the gold-standard test \u2014 clear water alone is not enough proof.\"}], \"note\": \"<strong>You caught it early!<\/strong> Early intervention means this will likely clear in 1 to 2 days rather than 5 to 7. But do NOT wait \u2014 green tint today means a swamp by next weekend.\", \"tools\": [\"chlorine\", \"volume\"]}}} JSON.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#pool-wizard {\n    max-width: 650px;\n    margin: 20px auto;\n    padding: 0 16px;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n    box-sizing: border-box;\n}\n#pool-wizard *, #pool-wizard *::before, #pool-wizard *::after { box-sizing: border-box; }\n\n\/* \u2500\u2500 Step Indicator \u2500\u2500 *\/\n.wiz-steps { display: flex; justify-content: center; gap: 0; margin-bottom: 28px; }\n.wiz-step {\n    display: flex; align-items: center; gap: 8px;\n    padding: 10px 16px; font-size: 13px; font-weight: 600;\n    color: #94a3b8; background: #f5f7fa; border: 1px solid #e2e8f0;\n    transition: all 0.3s ease;\n}\n.wiz-step:first-child { border-radius: 8px 0 0 8px; }\n.wiz-step:last-child { border-radius: 0 8px 8px 0; }\n.wiz-step .step-num {\n    width: 26px; height: 26px; border-radius: 50%;\n    background: #cbd5e1; color: #fff;\n    display: flex; align-items: center; justify-content: center;\n    font-size: 12px; font-weight: 700; flex-shrink: 0;\n}\n.wiz-step.active {\n    color: #1ecad3; background: #e8f7f8;\n    border-color: #1ecad3;\n}\n.wiz-step.active .step-num {\n    background: linear-gradient(135deg, #1ecad3, #9486f7);\n}\n.wiz-step.done {\n    color: #fff;\n    background: linear-gradient(135deg, #1ecad3, #9486f7);\n    border-color: transparent;\n}\n.wiz-step.done .step-num { background: #fff; color: #6b5ce7; }\n@media (max-width: 500px) {\n    .wiz-steps { flex-wrap: wrap; }\n    .wiz-step { flex: 1; min-width: 70px; justify-content: center; padding: 8px 6px; font-size: 11px; }\n    .wiz-step .step-num { width: 22px; height: 22px; font-size: 11px; }\n}\n\n\/* \u2500\u2500 Question Cards \u2500\u2500 *\/\n.wiz-panel { display: none; }\n.wiz-panel.active { display: block; animation: fadeIn 0.35s ease; }\n@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n\n.wiz-q-label {\n    font-size: 1.15rem; font-weight: 700; color: #1a202c;\n    margin-bottom: 6px; text-align: center;\n}\n.wiz-q-hint { font-size: 13px; color: #64748b; text-align: center; margin-bottom: 20px; }\n\n\/* Color option cards *\/\n.color-options { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 12px; margin-bottom: 20px; }\n.color-card {\n    display: flex; align-items: center; gap: 12px;\n    padding: 14px 16px; border: 2px solid #e2e8f0; border-radius: 12px;\n    cursor: pointer; transition: all 0.2s ease; background: #fff;\n}\n.color-card:hover { border-color: #b2dfdb; background: #f8fdfc; }\n.color-card:focus, .color-card:active { color: #2c3e50; outline: none; }\n.color-card.selected {\n    border-color: #9486f7;\n    background: #f5f3ff;\n    color: #2c3e50;\n    box-shadow: 0 0 0 3px rgba(148,134,247,0.12);\n}\n.color-swatch {\n    width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0;\n    border: 2px solid rgba(0,0,0,0.08);\n}\n.swatch-green { background: linear-gradient(135deg, #68d391, #276749); }\n.swatch-cloudy { background: linear-gradient(135deg, #e2e8f0, #a0aec0); }\n.swatch-yellow { background: linear-gradient(135deg, #f6e05e, #b7791f); }\n.swatch-clear { background: linear-gradient(135deg, #bee3f8, #2b6cb0); }\n.swatch-brown { background: linear-gradient(135deg, #d6bcb0, #7b4b3a); }\n.swatch-black { background: linear-gradient(135deg, #718096, #1a202c); }\n.color-label { font-size: 13px; font-weight: 600; color: #2c3e50; line-height: 1.3; }\n\n\/* Texture options *\/\n.texture-options { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 20px; }\n.texture-btn {\n    flex: 1; min-width: 120px; padding: 16px 12px;\n    border: 2px solid #e2e8f0; border-radius: 12px;\n    background: #fff; cursor: pointer; text-align: center;\n    font-size: 14px; font-weight: 600; color: #2c3e50;\n    transition: all 0.2s ease;\n}\n.texture-btn:hover { border-color: #b2dfdb; }\n.texture-btn:focus, .texture-btn:active { color: #2c3e50; outline: none; }\n.texture-btn.selected {\n    border-color: #9486f7;\n    background: #f5f3ff;\n    color: #2c3e50;\n}\n.texture-icon { font-size: 14px; display: block; margin-bottom: 4px; }\n\n\/* Dropdown fields *\/\n.wiz-field { margin-bottom: 16px; }\n.wiz-field label { display: block; font-size: 13px; font-weight: 600; color: #34495e; margin-bottom: 6px; }\n.wiz-field select {\n    width: 100%; padding: 12px 14px; border: 2px solid #e2e8f0; border-radius: 10px;\n    font-size: 15px; color: #2c3e50; background: #fff;\n    -webkit-appearance: none; appearance: none;\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M6 8L1 3h10z' fill='%2394a3b8'\/%3E%3C\/svg%3E\");\n    background-repeat: no-repeat; background-position: right 14px center;\n    cursor: pointer;\n}\n.wiz-field select:focus { outline: none; border-color: #9486f7; box-shadow: 0 0 0 3px rgba(148,134,247,0.1); }\n\n\/* \u2500\u2500 Buttons \u2500\u2500 *\/\n.wiz-btn-row { display: flex; gap: 10px; justify-content: center; margin-top: 20px; flex-wrap: wrap; }\n.wiz-btn {\n    padding: 12px 32px; border: none; border-radius: 10px;\n    font-size: 15px; font-weight: 700; cursor: pointer;\n    transition: all 0.2s ease;\n}\n.wiz-btn-primary {\n    background: linear-gradient(135deg, #1ecad3, #9486f7);\n    color: #fff;\n}\n.wiz-btn-primary:hover {\n    background: linear-gradient(135deg, #169fa6, #7b6be0);\n    transform: translateY(-1px);\n    box-shadow: 0 4px 16px rgba(148,134,247,0.35);\n}\n.wiz-btn-primary:disabled {\n    background: #cbd5e1; cursor: not-allowed;\n    transform: none; box-shadow: none;\n}\n.wiz-btn-outline {\n    background: #fff; color: #6b5ce7;\n    border: 2px solid #9486f7;\n}\n.wiz-btn-outline:hover { background: #f5f3ff; }\n\n\/* \u2500\u2500 Diagnosis Result \u2500\u2500 *\/\n.wiz-result { display: none; }\n.wiz-result.active { display: block; animation: fadeIn 0.5s ease; }\n\n.diag-header {\n    padding: 24px 20px; border-radius: 4px 12px 12px 4px;\n    margin-bottom: 24px;\n    background: #f8fafc;\n    border-left: 5px solid #94a3b8;\n}\n.diag-header h2 {\n    font-size: 1.5rem; margin: 0 0 6px; font-weight: 800;\n    color: #1a202c;\n}\n.diag-header p {\n    font-size: 14px; margin: 0;\n    color: #4a5568; line-height: 1.6;\n}\n.diag-algae  { border-left-color: #38a169; background: #f0fff4; }\n.diag-lock   { border-left-color: #dd6b20; background: #fffaf0; }\n.diag-cloudy { border-left-color: #718096; background: #f7fafc; }\n.diag-metals { border-left-color: #a0523e; background: #fffaf5; }\n.diag-chem   { border-left-color: #2b6cb0; background: #ebf8ff; }\n.diag-filter { border-left-color: #2c7a7b; background: #f0fcfc; }\n\n.treat-card {\n    background: #fff; border: 1px solid #e2e8f0; border-radius: 14px;\n    padding: 20px 24px; margin-bottom: 14px;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.04);\n    position: relative; overflow: hidden;\n}\n.treat-step {\n    display: inline-block;\n    background: linear-gradient(135deg, #1ecad3, #9486f7);\n    color: #fff;\n    font-size: 11px; font-weight: 800; padding: 4px 10px; border-radius: 20px;\n    margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.5px;\n}\n.treat-card h4 { font-size: 1.05rem; font-weight: 700; color: #1a202c; margin: 0 0 6px; }\n.treat-card p { font-size: 14px; color: #4a5568; margin: 0; line-height: 1.6; }\n.treat-card a { color: #6b5ce7; text-decoration: underline; font-weight: 600; text-transform: lowercase; }\n\n.wiz-note {\n    background: #fffbeb; border-left: 4px solid #f59e0b; border-radius: 4px 10px 10px 4px;\n    padding: 14px 18px; margin-top: 16px; font-size: 13px; color: #5d4037; line-height: 1.6;\n}\n.wiz-note strong { color: #b45309; }\n\n.wiz-tools { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 20px; }\n.wiz-tool-link {\n    flex: 1; min-width: 150px; padding: 12px 16px;\n    background: #f5f3ff; border: 1px solid #ddd6fe; border-radius: 10px;\n    text-align: center; text-decoration: none; text-transform: lowercase;\n    color: #6b5ce7; font-size: 13px; font-weight: 600;\n    transition: all 0.2s ease;\n}\n.wiz-tool-link:hover {\n    background: #ede9fe; color: #5a4bd1;\n    border-color: #9486f7;\n}\n\n\/* Product CTA *\/\n.wiz-cta {\n    margin-top: 20px; padding: 16px 20px;\n    background: #f0fcfc; border-radius: 12px;\n    border: 1px solid #b2dfdb; text-align: center;\n}\n.wiz-cta p { margin: 0 0 8px; font-size: 13px; color: #475569; line-height: 1.5; }\n.wiz-cta a {\n    display: inline-block; padding: 10px 24px;\n    background: linear-gradient(135deg, #1ecad3, #9486f7);\n    color: #fff; border-radius: 8px; text-decoration: none;\n    font-weight: 700; font-size: 14px;\n    transition: all 0.2s ease;\n}\n.wiz-cta a:hover {\n    transform: translateY(-1px);\n    box-shadow: 0 4px 16px rgba(148,134,247,0.35);\n}\n\n\/* Back link *\/\n.wiz-back { text-align: center; margin-top: 20px; }\n.wiz-back a { color: #64748b; font-size: 13px; text-decoration: underline; cursor: pointer; }\n<\/style>\n\n<div id=\"pool-wizard\">\n    <!-- Step Indicator -->\n    <div class=\"wiz-steps\">\n        <div class=\"wiz-step active\" data-step=\"1\"><span class=\"step-num\">1<\/span> <span id=\"wiz-step-label-1\">Color<\/span><\/div>\n        <div class=\"wiz-step\" data-step=\"2\"><span class=\"step-num\">2<\/span> <span id=\"wiz-step-label-2\">Texture<\/span><\/div>\n        <div class=\"wiz-step\" data-step=\"3\"><span class=\"step-num\">3<\/span> <span id=\"wiz-step-label-3\">Chemistry<\/span><\/div>\n        <div class=\"wiz-step\" data-step=\"4\"><span class=\"step-num\">4<\/span> <span id=\"wiz-step-label-4\">Diagnosis<\/span><\/div>\n    <\/div>\n\n    <!-- Step 1: Color -->\n    <div class=\"wiz-panel active\" id=\"panel-color\">\n        <div class=\"wiz-q-label\" id=\"wiz-color-q\">What does your pool water look like?<\/div>\n        <div class=\"wiz-q-hint\" id=\"wiz-color-hint\">Pick the closest match to help narrow down the root cause.<\/div>\n        <div class=\"color-options\" id=\"color-options\"><\/div>\n        <div class=\"wiz-btn-row\">\n            <button class=\"wiz-btn wiz-btn-primary\" id=\"btn-color-next\" disabled>Next<\/button>\n        <\/div>\n    <\/div>\n\n    <!-- Step 2: Texture (conditional) -->\n    <div class=\"wiz-panel\" id=\"panel-texture\">\n        <div class=\"wiz-q-label\" id=\"wiz-texture-q\">Touch the pool wall. How does it feel?<\/div>\n        <div class=\"wiz-q-hint\" id=\"wiz-texture-hint\">Texture reveals which type of algae or deposit you&#8217;re dealing with.<\/div>\n        <div class=\"texture-options\" id=\"texture-options\"><\/div>\n        <div class=\"wiz-btn-row\">\n            <button class=\"wiz-btn wiz-btn-outline\" id=\"btn-texture-back\">Back<\/button>\n            <button class=\"wiz-btn wiz-btn-primary\" id=\"btn-texture-next\" disabled>Next<\/button>\n        <\/div>\n    <\/div>\n\n    <!-- Step 3: Chemistry -->\n    <div class=\"wiz-panel\" id=\"panel-chem\">\n        <div class=\"wiz-q-label\" id=\"wiz-chem-q\">What are your latest test readings?<\/div>\n        <div class=\"wiz-q-hint\" id=\"wiz-chem-hint\">Accurate numbers lead to a precise diagnosis. Estimate if unsure.<\/div>\n        <div class=\"wiz-field\">\n            <label for=\"cya-level\" id=\"wiz-cya-label\">CYA (Cyanuric Acid \/ Stabilizer) Level<\/label>\n            <select id=\"cya-level\"><\/select>\n        <\/div>\n        <div class=\"wiz-field\">\n            <label for=\"ph-level\" id=\"wiz-ph-label\">pH Level<\/label>\n            <select id=\"ph-level\"><\/select>\n        <\/div>\n        <div class=\"wiz-btn-row\">\n            <button class=\"wiz-btn wiz-btn-outline\" id=\"btn-chem-back\">Back<\/button>\n            <button class=\"wiz-btn wiz-btn-primary\" id=\"btn-diagnose\">Diagnose My Pool<\/button>\n        <\/div>\n    <\/div>\n\n    <!-- Step 4: Result -->\n    <div class=\"wiz-panel\" id=\"panel-result\">\n        <div class=\"wiz-result\" id=\"diagnosis-result\"><\/div>\n        <div class=\"wiz-back\"><a id=\"btn-restart\">Diagnose another problem<\/a><\/div>\n    <\/div>\n<\/div>\n\n<script>\n(function() {\n    var LABELS = {\"steps\": {\"1\": \"Color\", \"2\": \"Texture\", \"3\": \"Chemistry\", \"4\": \"Diagnosis\"}, \"colorQ\": \"What does your pool water look like?\", \"colorHint\": \"Pick the closest match to help narrow down the root cause.\", \"colorKeys\": [\"green\", \"cloudy\", \"yellow\", \"clear\", \"brown\", \"black\"], \"colors\": {\"green\": {\"line1\": \"Green\", \"line2\": \"(any shade)\"}, \"cloudy\": {\"line1\": \"Cloudy \/\", \"line2\": \"Milky White\"}, \"yellow\": {\"line1\": \"Yellow \/\", \"line2\": \"Mustard tint\"}, \"clear\": {\"line1\": \"Clear but\", \"line2\": \"smells \/ irritates\"}, \"brown\": {\"line1\": \"Brown \/\", \"line2\": \"Tea-colored\"}, \"black\": {\"line1\": \"Black spots\", \"line2\": \"on walls\/floor\"}}, \"textureQ\": \"Touch the pool wall. How does it feel?\", \"textureHint\": \"Texture reveals which type of algae or deposit you are dealing with.\", \"textureKeys\": [\"slimy\", \"rough\", \"smooth\"], \"textures\": {\"slimy\": \"Slimy \/ Slippery\", \"rough\": \"Rough \/ Sandy\", \"smooth\": \"Smooth \/ Normal\"}, \"chemQ\": \"What are your latest test readings?\", \"chemHint\": \"Accurate numbers lead to a precise diagnosis. Estimate if unsure.\", \"cyaLabel\": \"CYA (Cyanuric Acid \/ Stabilizer) Level\", \"phLabel\": \"pH Level\", \"cyaKeys\": [\"\", \"low\", \"normal\", \"elevated\", \"high\", \"unknown\"], \"cyaOptions\": {\"\": \"-- Select --\", \"low\": \"Below 30 ppm (low)\", \"normal\": \"30 to 50 ppm (ideal range)\", \"elevated\": \"50 to 80 ppm (elevated)\", \"high\": \"Above 80 ppm (too high)\", \"unknown\": \"I do not know my CYA level\"}, \"phKeys\": [\"\", \"low\", \"normal\", \"high\", \"unknown\"], \"phOptions\": {\"\": \"-- Select --\", \"low\": \"Below 7.2 (too low)\", \"normal\": \"7.2 to 7.6 (ideal range)\", \"high\": \"Above 7.6 (too high)\", \"unknown\": \"I do not know my pH level\"}, \"btnNext\": \"Next\", \"btnBack\": \"Back\", \"btnDiagnose\": \"Diagnose My Pool\", \"btnRestart\": \"Diagnose another problem\", \"stepLabel\": \"Step\", \"ctaText\": \"<strong>Reduce manual scrubbing:<\/strong> A robotic pool cleaner runs autonomously to scrub walls, floor, and waterline \u2014 keeping algae from gaining a foothold between treatments.\", \"ctaLink\": \"Explore Aiper Robotic Cleaners\", \"diagnoses\": {\"green_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Green Algae Bloom\", \"summary\": \"Your pool has an active green algae infestation, typically caused by low free chlorine levels allowing algae spores to take hold.\", \"steps\": [{\"title\": \"Brush and Circulate\", \"body\": \"Vigorously brush all pool surfaces \u2014 walls, floor, steps, and behind ladders. Set your pump to run <strong>24\/7<\/strong> until the water clears. Algae clings to surfaces; brushing dislodges it so chlorine can attack.\"}, {\"title\": \"Shock to SLAM Level\", \"body\": \"Based on your CYA reading, raise Free Chlorine to <strong>SLAM level<\/strong> (40% of CYA). For example, CYA 40 means target FC 16 ppm. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-chlorine-calculator\/\\\">pool chlorine calculator<\/a> for exact dosing. Use liquid chlorine for fastest results.\"}, {\"title\": \"Filter, Backwash and Verify\", \"body\": \"Backwash or clean your filter daily. Run the pump continuously until water is crystal clear <strong>AND<\/strong> overnight FC loss is less than 1 ppm. This typically takes 3 to 7 days.\"}], \"note\": \"<strong>Prevention tip:<\/strong> Maintain FC at 7.5% of CYA at all times. Never let FC drop below this floor \u2014 algae spores are always present and waiting for a chlorine dip.\", \"tools\": [\"chlorine\", \"volume\"]}, \"black_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Black Algae\", \"summary\": \"Black algae is the toughest pool algae to eliminate. It forms a protective waxy layer and roots into plaster or grout. Spot-scrubbing and aggressive chlorination are mandatory.\", \"steps\": [{\"title\": \"Break the Protective Layer\", \"body\": \"Use a <strong>stainless steel algae brush<\/strong> (not nylon) to vigorously scrub every black spot. You must break through the waxy coating. For vinyl liners, use a nylon brush with extra pressure \u2014 do NOT use steel brushes on vinyl.\"}, {\"title\": \"Spot-Treat with Granular Shock\", \"body\": \"Turn off the pump. Sprinkle <strong>cal-hypo shock granules directly onto the black spots<\/strong> and let them sit for 15 to 30 minutes. Alternatively, use a copper-based algaecide specifically labeled for black algae. Then turn the pump back on.\"}, {\"title\": \"Sustain High Chlorine and Monitor\", \"body\": \"Maintain FC at <strong>20% of CYA for 1 to 2 weeks<\/strong> after spots disappear. Scrub the spots daily. Black algae roots deep \u2014 stopping early guarantees a comeback. Replace any affected filter media after treatment.\"}], \"note\": \"<strong>Critical:<\/strong> Black algae can survive in filter media, brushes, and vacuum heads. Sanitize ALL equipment with a bleach solution after treatment, or you will reintroduce it.\", \"tools\": [\"chlorine\", \"volume\"]}, \"chlorine_lock\": {\"cssClass\": \"diag-lock\", \"title\": \"Chlorine Lock (High CYA Over-Stabilization)\", \"summary\": \"Your CYA is so high that chlorine molecules are bound too tightly to be effective. Even though you add chlorine, it cannot sanitize the water \u2014 so algae and bacteria thrive despite normal FC readings.\", \"steps\": [{\"title\": \"Partial Drain and Refill\", \"body\": \"To lower CYA, you must dilute the water. <strong>Drain and replace 25 to 50% of your pool water<\/strong> with fresh water. The exact percentage: if CYA is 100 and you want 40, drain 60%. Test CYA after refilling to confirm the new level is below 50 ppm.\"}, {\"title\": \"Super-Shock After Refill\", \"body\": \"Once CYA is in range, shock to <strong>30+ ppm FC<\/strong> to eliminate any algae or bacteria that took hold during the lock period. Run the pump continuously for 48 hours and retest.\"}, {\"title\": \"Switch Chlorine Source\", \"body\": \"Going forward, use ONLY <strong>unstabilized chlorine<\/strong> (liquid chlorine \/ sodium hypochlorite). Avoid trichlor tablets and dichlor granular \u2014 they keep adding CYA. Test CYA monthly to ensure it stays under 50 ppm.\"}], \"note\": \"<strong>Why this happened:<\/strong> Trichlor tablets and dichlor shock both add CYA with every dose. Over months, CYA creeps up silently. The only way to remove CYA is dilution \u2014 no chemical breaks it down.\", \"tools\": [\"chlorine\", \"volume\"]}, \"mustard_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Mustard Algae (Yellow Algae)\", \"summary\": \"Mustard algae is chlorine-resistant and notorious for reinfection. It appears as a yellow or mustard-colored dust, often in shaded areas, and easily spreads via swimsuits, toys, and cleaning equipment.\", \"steps\": [{\"title\": \"Aggressive Brushing and Clean Equipment\", \"body\": \"Brush all surfaces thoroughly. Remove and <strong>soak all pool equipment, toys, floats, and swimsuits in a bleach solution<\/strong> (1:10 dilution) for 30 minutes. Mustard algae hitchhikes on anything that touches the water.\"}, {\"title\": \"Shock to Mustard-Algae Level\", \"body\": \"Raise FC to <strong>60% of CYA<\/strong> (the mustard-algae SLAM target). Example: CYA 40 means target FC 24 ppm. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-shock-calculator\/\\\">pool shock calculator<\/a> for the exact dose. Brush 3x daily during treatment.\"}, {\"title\": \"Maintain Elevated FC for 72 Hours\", \"body\": \"Keep FC at the mustard-algae target for a <strong>minimum of 72 hours after water clears<\/strong>. This ensures eradication of the chlorine-resistant spores. Then bring FC back to normal maintenance level (7.5% of CYA).\"}], \"note\": \"<strong>Reinfection risk:<\/strong> Mustard algae spores can survive on pool covers, ladders, and diving boards. Wipe down everything that hangs over the water with a bleach solution, including the underside of the pool cover.\", \"tools\": [\"shock\", \"volume\"]}, \"calcium_clouding\": {\"cssClass\": \"diag-cloudy\", \"title\": \"Calcium Clouding (High pH Precipitation)\", \"summary\": \"High pH has caused dissolved calcium to precipitate out of solution, creating a milky-white haze. This is a water chemistry problem, not an algae or filtration issue.\", \"steps\": [{\"title\": \"Lower pH Immediately\", \"body\": \"Add <strong>muriatic acid or dry acid (pH decreaser)<\/strong> to bring pH down to 7.0 to 7.2. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-ph-calculator\/\\\">pool pH calculator<\/a> for precise dosing. Add acid in small increments, waiting 4 hours between doses.\"}, {\"title\": \"Test Calcium Hardness\", \"body\": \"Test your calcium hardness (CH) level. If CH is above <strong>400 ppm<\/strong>, the clouding will recur as soon as pH rises again. Ideal CH is 200 to 400 ppm for plaster pools and 150 to 250 ppm for vinyl\/fiberglass.\"}, {\"title\": \"Dilute or Use Scale Inhibitor\", \"body\": \"If CH over 400 ppm, <strong>partially drain and refill<\/strong> with fresh (lower-calcium) water. If CH is borderline, add a <strong>scale inhibitor \/ sequestrant<\/strong> to keep calcium dissolved. Maintain pH at 7.4 to 7.6 going forward.\"}], \"note\": \"<strong>Root cause:<\/strong> Calcium comes out of solution when pH exceeds about 7.8 (the exact threshold depends on temperature and total alkalinity). Heated pools and salt-chlorine generators (which constantly raise pH) are especially prone to this.\", \"tools\": [\"ph\", \"volume\"]}, \"dead_algae_filter\": {\"cssClass\": \"diag-filter\", \"title\": \"Dead Algae \/ Filtration Problem\", \"summary\": \"Fine particles \u2014 likely dead algae killed by a previous shock treatment \u2014 are suspended in the water because your filter is not capturing them effectively. The chemistry is likely balanced, but the water stays hazy.\", \"steps\": [{\"title\": \"Deep-Clean or Backwash Filter\", \"body\": \"Sand filter: <strong>backwash thoroughly<\/strong> until sight glass runs clear, then rinse for 30 seconds. Cartridge filter: remove and <strong>spray-clean each pleat<\/strong> with a hose, then soak overnight in filter cleaner. DE filter: backwash and <strong>recharge with fresh DE powder<\/strong>.\"}, {\"title\": \"Add Clarifier or Flocculant\", \"body\": \"If water stays hazy after cleaning the filter, add a <strong>pool clarifier<\/strong> (which coagulates fine particles so the filter can catch them). For extreme cases, use a <strong>flocculant<\/strong> \u2014 let particles sink overnight, then <strong>vacuum to WASTE<\/strong> (bypassing the filter entirely).\"}, {\"title\": \"Verify Flow and Run Time\", \"body\": \"Check that your pump is running long enough for at least <strong>2 full turnovers per day<\/strong>. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-turnover-rate-calculator\/\\\">pool turnover rate calculator<\/a>. Also check for clogged skimmer baskets, dirty pump strainer, or a blocked impeller.\"}], \"note\": \"<strong>Quick check:<\/strong> Shine a flashlight into the water at night. If you see millions of tiny particles floating (not swimming), it is dead material that needs mechanical removal \u2014 more chemicals will not fix it.\", \"tools\": [\"turnover\", \"volume\"]}, \"bacterial_bloom\": {\"cssClass\": \"diag-cloudy\", \"title\": \"Bacterial Bloom (Low Sanitizer)\", \"summary\": \"A bacterial bloom occurs when sanitizer levels drop too low, allowing bacteria to multiply rapidly. The water looks dull or slightly hazy, often with a subtle odor. This can happen overnight, especially after heavy use or rain.\", \"steps\": [{\"title\": \"Shock to Breakpoint\", \"body\": \"Raise FC to <strong>10x the combined chlorine (CC) level<\/strong> \u2014 this is called breakpoint chlorination. If you do not know CC, shock to 30 ppm as a safe default. Use liquid chlorine for fastest action. Run the pump 24\/7.\"}, {\"title\": \"Oxidize and Circulate\", \"body\": \"Keep FC elevated for <strong>24 to 48 hours<\/strong>. The water should begin clearing within 12 hours. If using a non-chlorine shock (MPS), note that it oxidizes but does NOT sanitize \u2014 pair it with chlorine.\"}, {\"title\": \"Retest and Stabilize\", \"body\": \"After 48 hours, test FC, CC, and CYA. CC should be <strong>below 0.5 ppm<\/strong> and FC should be at normal maintenance level (7.5% of CYA). If CC is still elevated, repeat the shock. Resume normal pump schedule only when water is crystal clear.\"}], \"note\": \"<strong>Prevention:<\/strong> A bacterial bloom often precedes an algae bloom. If you caught it at the dull\/hazy stage, you may have prevented a full green-water event. Test FC 2 to 3x per week during swim season.\", \"tools\": [\"turnover\", \"volume\"]}, \"chloramines\": {\"cssClass\": \"diag-chem\", \"title\": \"Chloramines (Combined Chlorine Buildup)\", \"summary\": \"The chlorine smell is not chlorine \u2014 it is chloramines, formed when chlorine binds to ammonia from sweat, urine, and body oils. High chloramines mean your free chlorine is being consumed faster than it is being replenished.\", \"steps\": [{\"title\": \"Test FC and TC to Find CC\", \"body\": \"Test Free Chlorine (FC) and Total Chlorine (TC). <strong>Combined Chlorine (CC) = TC minus FC<\/strong>. Any CC above 0.5 ppm indicates chloramines that need to be oxidized. The higher the CC, the stronger the smell.\"}, {\"title\": \"Breakpoint Shock Treatment\", \"body\": \"Add chlorine to reach <strong>10x the CC reading<\/strong> (breakpoint). Example: CC = 2 ppm means add enough chlorine to raise FC by 20 ppm. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-shock-calculator\/\\\">pool shock calculator<\/a>. Use unstabilized chlorine (liquid).\"}, {\"title\": \"Verify CC Drops Below 0.5 ppm\", \"body\": \"Run the pump continuously. Retest after 8 to 12 hours. <strong>CC must drop below 0.5 ppm<\/strong>. If it has not, continue shocking. Chloramines are fully oxidized when you no longer smell chlorine and the water feels soft, not irritating.\"}], \"note\": \"<strong>Did you know?<\/strong> A well-maintained pool should have virtually NO chlorine smell. That sharp odor is the calling card of chloramines. When someone says the chlorine is too strong, what they really mean is the chloramines are too high \u2014 the solution is more chlorine (to oxidize them), not less.\", \"tools\": [\"shock\", \"volume\"]}, \"metals\": {\"cssClass\": \"diag-metals\", \"title\": \"Metal Contamination (Iron \/ Copper \/ Manganese)\", \"summary\": \"Dissolved metals in your water \u2014 most commonly iron from well water or copper from corroded heater cores \u2014 are oxidizing and causing discoloration. The brown\/tea color is a telltale sign.\", \"steps\": [{\"title\": \"Test for Metals\", \"body\": \"Take a water sample to a pool store for a <strong>metals test<\/strong> (iron, copper, manganese). Home test kits rarely detect metals at low levels. Iron above 0.3 ppm, copper above 0.2 ppm, or manganese above 0.05 ppm can cause visible staining and discoloration.\"}, {\"title\": \"Add Metal Sequestrant\", \"body\": \"Add a <strong>metal sequestrant \/ stain remover<\/strong> following the label dosage based on your pool volume. Sequestrants bind to dissolved metals and keep them in solution so they can be filtered out. Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-volume-calculator\/\\\">pool volume calculator<\/a> if unsure of your pool size.\"}, {\"title\": \"Identify and Fix the Source\", \"body\": \"If you fill from a well, install a <strong>pre-filter on your fill line<\/strong>. If you have a gas heater, inspect the heat exchanger for corrosion (copper). Check for rusty pool components (iron). Without fixing the source, metals will return with every top-off.\"}], \"note\": \"<strong>Warning:<\/strong> Do NOT shock the pool with chlorine while metals are present \u2014 chlorine oxidizes dissolved iron and copper, turning them into visible stains that are much harder to remove. Always sequester metals FIRST, then adjust chemistry.\", \"tools\": [\"volume\", \"chemical\"]}, \"low_fc_early_algae\": {\"cssClass\": \"diag-algae\", \"title\": \"Low Free Chlorine \/ Early Stage Algae\", \"summary\": \"Your chlorine has dropped too low and algae is beginning to take hold \u2014 but you have caught it early, before a full bloom. The green tint with smooth walls means algae is suspended in the water but has not yet adhered to surfaces.\", \"steps\": [{\"title\": \"Test Your Full Chemistry Panel\", \"body\": \"Get accurate readings for <strong>FC, CC, CYA, pH, and TA<\/strong>. You need all five to calculate the correct SLAM target. The FC\/CYA ratio determines how much chlorine you actually need \u2014 ignore the outdated 1 to 3 ppm rule.\"}, {\"title\": \"Bring FC to SLAM Level Immediately\", \"body\": \"SLAM FC target = <strong>40% of your CYA reading<\/strong>. (CYA 30 means FC 12 ppm; CYA 50 means FC 20 ppm). Use our <a href=\\\"https:\/\/aiper.com\/blogs\/pool-chlorine-calculator\/\\\">pool chlorine calculator<\/a> for your exact dose. Add liquid chlorine at dusk.\"}, {\"title\": \"Maintain Until Overnight FC Loss Below 1 ppm\", \"body\": \"Test FC at sunset and again at sunrise (before UV hits). If the overnight loss is <strong>less than 1 ppm<\/strong>, the algae is dead. If more than 1 ppm, continue SLAM. This is the gold-standard test \u2014 clear water alone is not enough proof.\"}], \"note\": \"<strong>You caught it early!<\/strong> Early intervention means this will likely clear in 1 to 2 days rather than 5 to 7. But do NOT wait \u2014 green tint today means a swamp by next weekend.\", \"tools\": [\"chlorine\", \"volume\"]}}};\n\n    var state = { color: '', texture: '', cya: '', ph: '' };\n\n    var $ = function(id) { return document.getElementById(id); };\n    var panelColor = $('panel-color');\n    var panelTexture = $('panel-texture');\n    var panelChem = $('panel-chem');\n    var panelResult = $('panel-result');\n    var diagResult = $('diagnosis-result');\n    var steps = document.querySelectorAll('.wiz-step');\n\n    \/\/ Helper: set textContent from LABELS key (dot-path like \"colors.green.line1\")\n    function L(path) {\n        var keys = path.split('.');\n        var v = LABELS;\n        for (var i = 0; i < keys.length; i++) { v = v[keys[i]]; if (v === undefined) return ''; }\n        return v;\n    }\n\n    function setText(id, txt) { var e = $(id); if (e) e.textContent = txt; }\n    function setHTML(id, html) { var e = $(id); if (e) e.innerHTML = html; }\n\n    \/\/ \u2500\u2500 Populate UI from LABELS \u2500\u2500\n    function initUI() {\n        \/\/ Step indicator labels\n        setText('wiz-step-label-1', L('steps.1'));\n        setText('wiz-step-label-2', L('steps.2'));\n        setText('wiz-step-label-3', L('steps.3'));\n        setText('wiz-step-label-4', L('steps.4'));\n\n        \/\/ Step 1: Color\n        setText('wiz-color-q', L('colorQ'));\n        setText('wiz-color-hint', L('colorHint'));\n        $('btn-color-next').textContent = L('btnNext');\n\n        \/\/ Step 2: Texture\n        setText('wiz-texture-q', L('textureQ'));\n        setText('wiz-texture-hint', L('textureHint'));\n        $('btn-texture-back').textContent = L('btnBack');\n        $('btn-texture-next').textContent = L('btnNext');\n\n        \/\/ Step 3: Chemistry\n        setText('wiz-chem-q', L('chemQ'));\n        setText('wiz-chem-hint', L('chemHint'));\n        setText('wiz-cya-label', L('cyaLabel'));\n        setText('wiz-ph-label', L('phLabel'));\n        $('btn-chem-back').textContent = L('btnBack');\n        $('btn-diagnose').textContent = L('btnDiagnose');\n\n        \/\/ Restart\n        $('btn-restart').textContent = L('btnRestart');\n\n        \/\/ Build color cards\n        var colorDiv = $('color-options');\n        colorDiv.innerHTML = '';\n        L('colorKeys').forEach(function(key) {\n            var c = L('colors.' + key);\n            var card = document.createElement('div');\n            card.className = 'color-card';\n            card.setAttribute('data-color', key);\n            card.innerHTML = '<div class=\"color-swatch swatch-' + key + '\"><\/div><span class=\"color-label\">' + c.line1 + '<br>' + c.line2 + '<\/span>';\n            colorDiv.appendChild(card);\n        });\n\n        \/\/ Build texture buttons\n        var texDiv = $('texture-options');\n        texDiv.innerHTML = '';\n        L('textureKeys').forEach(function(key) {\n            var btn = document.createElement('button');\n            btn.className = 'texture-btn';\n            btn.setAttribute('data-texture', key);\n            btn.innerHTML = '<span class=\"texture-icon\">' + L('textures.' + key) + '<\/span>';\n            texDiv.appendChild(btn);\n        });\n\n        \/\/ Build dropdowns\n        buildSelect($('cya-level'), L('cyaKeys'), 'cyaOptions');\n        buildSelect($('ph-level'), L('phKeys'), 'phOptions');\n    }\n\n    function buildSelect(el, keys, labelPath) {\n        el.innerHTML = '';\n        keys.forEach(function(key) {\n            var opt = document.createElement('option');\n            opt.value = key;\n            opt.textContent = L(labelPath + '.' + key);\n            el.appendChild(opt);\n        });\n    }\n\n    initUI();\n\n    function setStep(n) {\n        steps.forEach(function(s) {\n            var sn = parseInt(s.getAttribute('data-step'));\n            s.classList.remove('active', 'done');\n            if (sn < n) s.classList.add('done');\n            if (sn === n) s.classList.add('active');\n        });\n        [panelColor, panelTexture, panelChem, panelResult].forEach(function(p, i) {\n            p.classList.toggle('active', i === n - 1);\n        });\n        if (n === 4) { diagResult.classList.add('active'); runDiagnosis(); }\n    }\n\n    \/\/ Color selection \u2014 rebind after initUI\n    function bindColorCards() {\n        var cards = document.querySelectorAll('.color-card');\n        cards.forEach(function(card) {\n            card.addEventListener('click', function() {\n                cards.forEach(function(c) { c.classList.remove('selected'); });\n                card.classList.add('selected');\n                state.color = card.getAttribute('data-color');\n                $('btn-color-next').disabled = false;\n            });\n        });\n    }\n    bindColorCards();\n\n    $('btn-color-next').addEventListener('click', function() {\n        if (!state.color) return;\n        var needsTexture = (state.color === 'green' || state.color === 'black');\n        if (needsTexture) { setStep(2); }\n        else { state.texture = 'n\/a'; setStep(3); }\n    });\n\n    \/\/ Texture selection \u2014 rebind after initUI\n    function bindTextureBtns() {\n        var btns = document.querySelectorAll('.texture-btn');\n        btns.forEach(function(btn) {\n            btn.addEventListener('click', function() {\n                btns.forEach(function(b) { b.classList.remove('selected'); });\n                btn.classList.add('selected');\n                state.texture = btn.getAttribute('data-texture');\n                $('btn-texture-next').disabled = false;\n            });\n        });\n    }\n    bindTextureBtns();\n\n    $('btn-texture-next').addEventListener('click', function() {\n        if (!state.texture) return; setStep(3);\n    });\n    $('btn-texture-back').addEventListener('click', function() { setStep(1); });\n\n    \/\/ Chemistry\n    $('btn-chem-back').addEventListener('click', function() {\n        var needsTexture = (state.color === 'green' || state.color === 'black');\n        setStep(needsTexture ? 2 : 1);\n    });\n    $('btn-diagnose').addEventListener('click', function() {\n        state.cya = $('cya-level').value;\n        state.ph = $('ph-level').value;\n        setStep(4);\n    });\n\n    \/\/ Restart\n    $('btn-restart').addEventListener('click', function() {\n        state = { color: '', texture: '', cya: '', ph: '' };\n        var cards = document.querySelectorAll('.color-card');\n        cards.forEach(function(c) { c.classList.remove('selected'); });\n        var btns = document.querySelectorAll('.texture-btn');\n        btns.forEach(function(b) { b.classList.remove('selected'); });\n        $('btn-color-next').disabled = true;\n        $('btn-texture-next').disabled = true;\n        $('cya-level').value = '';\n        $('ph-level').value = '';\n        diagResult.classList.remove('active');\n        diagResult.innerHTML = '';\n        setStep(1);\n    });\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/  DIAGNOSIS ENGINE (driven by LABELS.diagnoses)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var BASE = 'https:\/\/aiper.com\/blogs';\n\n    function runDiagnosis() {\n        var c = state.color, t = state.texture, cya = state.cya, ph = state.ph;\n        var key = '';\n\n        if (c === 'green') {\n            if (t === 'slimy') key = 'green_algae';\n            else if (t === 'rough') key = 'black_algae';\n            else if (t === 'smooth') {\n                if (cya === 'high' || cya === 'elevated') key = 'chlorine_lock';\n                else key = 'low_fc_early_algae';\n            }\n        } else if (c === 'cloudy') {\n            if (ph === 'high') key = 'calcium_clouding';\n            else if (cya === 'high' || cya === 'elevated') key = 'chlorine_lock';\n            else if (cya === 'low') key = 'bacterial_bloom';\n            else key = 'dead_algae_filter';\n        } else if (c === 'yellow') {\n            key = 'mustard_algae';\n        } else if (c === 'clear') {\n            key = 'chloramines';\n        } else if (c === 'brown') {\n            key = 'metals';\n        } else if (c === 'black') {\n            key = 'black_algae';\n        }\n\n        var d = L('diagnoses.' + key);\n        if (!d || !d.title) { d = L('diagnoses.low_fc_early_algae'); }\n\n        var stepsHtml = '';\n        d.steps.forEach(function(s, i) {\n            stepsHtml += '<div class=\"treat-card\">' +\n                '<span class=\"treat-step\">' + L('stepLabel') + ' ' + (i + 1) + '<\/span>' +\n                '<h4>' + s.title + '<\/h4>' +\n                '<p>' + s.body + '<\/p>' +\n                '<\/div>';\n        });\n\n        \/\/ Tool links\n        var toolsHtml = '';\n        if (d.tools && d.tools.length) {\n            d.tools.forEach(function(tk) {\n                var tl = L('toolLinks.' + tk);\n                if (tl) {\n                    toolsHtml += '<a class=\"wiz-tool-link\" href=\"' + tl.href + '\">' + tl.label + '<\/a>';\n                }\n            });\n        }\n\n        \/\/ Product CTA (algae-related diagnoses)\n        var algaeKeys = ['green_algae', 'black_algae', 'mustard_algae', 'low_fc_early_algae', 'chlorine_lock', 'dead_algae_filter'];\n        var productHtml = '';\n        if (algaeKeys.indexOf(key) !== -1 && L('ctaText')) {\n            productHtml = '<div class=\"wiz-cta\">' +\n                '<p>' + L('ctaText') + '<\/p>' +\n                '<a href=\"https:\/\/aiper.com\/\">' + L('ctaLink') + '<\/a>' +\n                '<\/div>';\n        }\n\n        diagResult.innerHTML =\n            '<div class=\"diag-header ' + d.cssClass + '\">' +\n            '<h2>' + d.title + '<\/h2>' +\n            '<p>' + d.summary + '<\/p>' +\n            '<\/div>' +\n            stepsHtml +\n            (toolsHtml ? '<div class=\"wiz-tools\">' + toolsHtml + '<\/div>' : '') +\n            '<div class=\"wiz-note\">' + d.note + '<\/div>' +\n            productHtml;\n    }\n})();\n<\/script>\n\n\n\n\n<h2 class=\"wp-block-heading\">How the Pool Water Troubleshooting Wizard Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This diagnostic tool uses a <strong>decision-tree engine<\/strong> that cross-references four key symptom dimensions \u2014 water color, wall texture, CYA (stabilizer) level, and pH \u2014 to narrow your pool problem down to the single most likely root cause. Rather than one-size-fits-all advice, it delivers a <strong>personalized 3-step treatment protocol<\/strong> based on the specific chemistry and physics of your situation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Diagnostic Logic Behind the Tool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The wizard maps <strong>10 distinct pool conditions<\/strong> across a symptom matrix. Here is the underlying diagnostic grid:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Symptom<\/th><th>Most Likely Cause<\/th><th>Key Indicator<\/th><\/tr><\/thead><tbody><tr><td>Green + Slimy walls<\/td><td>Green Algae Bloom<\/td><td>Low FC allowed algae to colonize surfaces<\/td><\/tr><tr><td>Green + Rough\/dark spots<\/td><td>Black Algae<\/td><td>Waxy coating resists normal chlorine levels<\/td><\/tr><tr><td>Green + Smooth + High CYA<\/td><td>Chlorine Lock<\/td><td>CYA &gt;80 ppm binds FC into inactivity<\/td><\/tr><tr><td>Green + Smooth + Normal CYA<\/td><td>Early Stage Algae<\/td><td>FC dropped below 7.5% of CYA threshold<\/td><\/tr><tr><td>Cloudy + High pH<\/td><td>Calcium Precipitation<\/td><td>pH &gt;7.8 triggers CaCO3 coming out of solution<\/td><\/tr><tr><td>Cloudy + Normal pH\/CYA<\/td><td>Dead Algae \/ Filtration<\/td><td>Particles pass through underperforming filter<\/td><\/tr><tr><td>Cloudy + Low CYA<\/td><td>Bacterial Bloom<\/td><td>Insufficient sanitizer allowed rapid bacteria growth<\/td><\/tr><tr><td>Yellow\/Mustard tint<\/td><td>Mustard Algae<\/td><td>Chlorine-resistant; spreads via equipment<\/td><\/tr><tr><td>Clear + Strong &#8220;chlorine&#8221; odor<\/td><td>Chloramines (Combined Chlorine)<\/td><td>CC &gt;0.5 ppm; ammonia-bound chlorine<\/td><\/tr><tr><td>Brown\/Tea-colored<\/td><td>Metal Contamination<\/td><td>Iron, copper, or manganese oxidation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Key Chemistry Principles Referenced<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>FC\/CYA Ratio:<\/strong> The industry-standard benchmark (per CDC and ANSI\/APSP standards) that free chlorine should be maintained at a minimum of 7.5% of the cyanuric acid level to prevent algae. SLAM-level targets use 40% of CYA for green algae and 60% for mustard algae.<\/li><li><strong>Breakpoint Chlorination:<\/strong> The stoichiometric principle that 10x the combined chlorine (CC) reading is needed to fully oxidize chloramines into nitrogen gas and water, eliminating the &#8220;chlorine smell&#8221; and eye irritation.<\/li><li><strong>LSI (Langelier Saturation Index):<\/strong> Governs calcium carbonate equilibrium. When pH exceeds 7.8, the LSI tilts positive, and dissolved calcium precipitates as visible cloudiness \u2014 a physics problem, not a sanitation problem.<\/li><li><strong>CYA Over-Stabilization:<\/strong> Cyanuric acid binds reversibly to chlorine (equilibrium chemistry). Above ~70\u201380 ppm, the equilibrium shifts so far that the free, active chlorine fraction drops below the level needed to kill algae, even though a DPD test still reads &#8220;normal&#8221; FC.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pool Water Troubleshooting FAQs<\/h2>\n\n\n\n<div class=\"schema-faq wp-block-yoast-faq-block\"><div class=\"schema-faq-section\" id=\"faq-1\"><strong class=\"schema-faq-question\">My water is green but I just added chlorine yesterday. Why didn&#8217;t it work?<\/strong> <p class=\"schema-faq-answer\">This is almost always a CYA (stabilizer) issue. If your cyanuric acid level is above 80\u2013100 ppm, the chlorine molecules are bound so tightly to the stabilizer that they cannot effectively sanitize. Your test kit will show adequate Free Chlorine, but the active (hypochlorous acid) fraction is too small to kill algae. The wizard checks for this exact scenario \u2014 if your walls feel smooth but water is green with high CYA, it flags Chlorine Lock and recommends a partial drain as the only reliable fix. Adding more chlorine without lowering CYA compounds the problem because most chlorine products (tablets, dichlor) add even more stabilizer.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-2\"><strong class=\"schema-faq-question\">The water is cloudy white but my chlorine and pH both test normal. What else could it be?<\/strong> <p class=\"schema-faq-answer\">When chemistry is balanced but water stays hazy, the culprit is almost always mechanical \u2014 your filter is not capturing fine suspended particles. Possible causes: a sand filter that needs backwashing or has channeled sand, a cartridge that needs deep-cleaning or replacement, a DE filter with torn grids, or simply insufficient pump run time (less than 8 hours\/day). Dead algae cells from a previous shock treatment that were never vacuumed to waste will also remain suspended indefinitely. The wizard directs you to deep-clean your filter, add a clarifier to coagulate fine particles, and verify you are achieving at least 2 full water turnovers per day.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-3\"><strong class=\"schema-faq-question\">How do I tell the difference between mustard algae and green algae?<\/strong> <p class=\"schema-faq-answer\">Mustard algae (yellow algae) has three distinguishing traits: (1) it appears as a yellow-brown dust or film \u2014 never bright green; (2) it favors shaded areas of the pool (under ledges, on the shady side of walls, behind ladders); and (3) it brushes off easily but returns within 24 hours, often in the exact same spots. Green algae, by contrast, turns the entire water column green, makes walls slimy, and responds quickly to normal shock levels. The diagnostic wizard treats these as completely separate conditions because mustard algae requires roughly 50% higher chlorine levels (60% vs 40% of CYA) and demands that you sanitize all pool equipment and swimwear to prevent reinfection.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-4\"><strong class=\"schema-faq-question\">Why does my pool smell strongly of chlorine even though the test strip says chlorine is low?<\/strong> <p class=\"schema-faq-answer\">The sharp &#8216;chlorine smell&#8217; is not chlorine \u2014 it is chloramines (combined chlorine), formed when free chlorine reacts with ammonia from sweat, urine, and skin oils. The nose detects trichloramine gas off-gassing from the water surface. A well-sanitized pool with adequate free chlorine and zero combined chlorine has virtually no odor. This is the single most misunderstood pool chemistry fact: &#8216;too much chlorine smell&#8217; actually means &#8216;not enough free chlorine to oxidize the waste.&#8217; The wizard&#8217;s chloramines diagnosis calculates your breakpoint target \u2014 you need to add 10x the combined chlorine reading to fully oxidize the chloramines \u2014 which often means shocking with much more chlorine than pool owners expect.<\/p> <\/div> <div class=\"schema-faq-section\" id=\"faq-5\"><strong class=\"schema-faq-question\">Can I use this tool for a saltwater pool?<\/strong> <p class=\"schema-faq-answer\">Yes, absolutely. A saltwater chlorine generator (SWG) produces the exact same sanitizing agent \u2014 hypochlorous acid \u2014 as manually added chlorine. The diagnostic logic (FC\/CYA ratio, breakpoint chlorination, calcium saturation) applies identically. The only operational difference is that SWG pools tend to have a naturally rising pH (due to hydrogen gas off-gassing at the cell), which makes them slightly more prone to calcium clouding. If the wizard diagnoses calcium precipitation for your saltwater pool, pay extra attention to maintaining pH at 7.4\u20137.6 with regular acid additions, and check your salt cell for scale buildup.<\/p> <\/div> <\/div>\n","protected":false},"excerpt":{"rendered":"<p>1 Color 2 Texture 3 Chemistry 4 Diagnosis What does your pool water look like? Pick the closest match to help narrow down the root cause. Next Touch the pool wall. How does it feel? Texture reveals which type of algae or deposit you&#8217;re dealing with. Back Next What are your latest test readings? Accurate&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-4977","page","type-page","status-publish","hentry"],"lang":"en","translations":{"en":4977,"es":4987,"de":4985,"fr":4986},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/4977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/comments?post=4977"}],"version-history":[{"count":8,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/4977\/revisions"}],"predecessor-version":[{"id":11865,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/4977\/revisions\/11865"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=4977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}