{"id":46457201,"url":"https://github.com/adametherzlab/fertigation-mix","last_synced_at":"2026-03-08T05:02:01.253Z","repository":{"id":342356838,"uuid":"1173700602","full_name":"AdametherzLab/fertigation-mix","owner":"AdametherzLab","description":"Complete tissue culture \u0026 hydroponics toolkit — beginner walkthrough, 10 SOPs, sterilization calculator, media formulations, growth regulators, EC/pH tools. Zero deps.","archived":false,"fork":false,"pushed_at":"2026-03-06T00:27:51.000Z","size":72,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-06T04:55:20.387Z","etag":null,"topics":["agriculture","beginner-guide","bun","fertigation","growth-regulators","hydroponics","micropropagation","ms-medium","nutrients","ph-calculator","plant-science","sop","sterilization","tissue-culture","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AdametherzLab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-05T16:50:36.000Z","updated_at":"2026-03-06T00:27:54.000Z","dependencies_parsed_at":"2026-03-05T20:01:39.605Z","dependency_job_id":null,"html_url":"https://github.com/AdametherzLab/fertigation-mix","commit_stats":null,"previous_names":["adametherzlab/fertigation-mix"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/AdametherzLab/fertigation-mix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdametherzLab%2Ffertigation-mix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdametherzLab%2Ffertigation-mix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdametherzLab%2Ffertigation-mix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdametherzLab%2Ffertigation-mix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AdametherzLab","download_url":"https://codeload.github.com/AdametherzLab/fertigation-mix/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdametherzLab%2Ffertigation-mix/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30246626,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agriculture","beginner-guide","bun","fertigation","growth-regulators","hydroponics","micropropagation","ms-medium","nutrients","ph-calculator","plant-science","sop","sterilization","tissue-culture","typescript"],"created_at":"2026-03-06T02:28:37.951Z","updated_at":"2026-03-08T05:02:01.238Z","avatar_url":"https://github.com/AdametherzLab.png","language":"TypeScript","readme":"# fertigation-mix\n\n**[Live Demo](https://che0md.tech/fertigation-mix)**\n\n[![CI](https://github.com/AdametherzLab/fertigation-mix/actions/workflows/ci.yml/badge.svg)](https://github.com/AdametherzLab/fertigation-mix/actions) [![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](https://www.typescriptlang.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nComplete tissue culture and hydroponics toolkit. Step-by-step walkthrough for beginners, 10 pre-built SOPs, sterilization calculator, 8 beginner plant protocols, media formulations (MS/B5/WPM/White's), EC/pH tools, and fertigation calculator. Zero runtime dependencies. Written so a high school student can do tissue culture.\n\n## Features\n\n- **Beginner walkthrough** -- 10-step guided process from workspace setup to acclimatization\n- **10 pre-built SOPs** -- Media prep, sterilization, aseptic transfer, subculture, rooting, acclimatization, stock solutions, autoclave, SAB setup, contamination response\n- **Sterilization calculator** -- Auto-calculates bleach dilution, soak time, and ethanol duration based on tissue type\n- **8 beginner plant protocols** -- African Violet, Pothos, Mint, Strawberry, Philodendron, Banana, Orchid, Potato with media recipes and tips\n- **Equipment guide** -- Budget list with DIY alternatives and cost estimates ($100-300 starter setup)\n- **Troubleshooting database** -- 8 common problems with symptoms, causes, solutions, and prevention\n- **Stock solution guides** -- 7 recipes (macro/micro/iron/vitamin/PGR stocks) with shelf life and storage\n- **Tissue culture media** -- MS, B5, WPM, and White's formulations with exact mg/L values\n- **Growth regulators** -- 8 PGRs (auxins, cytokinins, gibberellins) with molecular weights and solvent info\n- **Media preparation calculator** -- Exact amounts, stock solution volumes, and step-by-step instructions\n- **Fertigation calculator** -- EC targeting with dilution ratio solving for stock solutions\n- **Nutrient database** -- 11 common fertilizers with N-P-K-Ca-Mg-S-Fe profiles\n- **EC/PPM converter** -- US 500, US 700, and EU scale conversions\n- **pH adjustment calculator** -- Acid/base amount estimation with buffer capacity\n- **TypeScript-first** -- Full type safety with branded types, zero runtime dependencies\n\n## Installation\n\n```bash\nnpm install @adametherzlab/fertigation-mix\n# or\nbun add @adametherzlab/fertigation-mix\n```\n\n## Beginner Walkthrough\n\nFollow the step-by-step tissue culture guide from start to finish.\n\n```typescript\nimport {\n  getWalkthrough,\n  getEquipmentList,\n  estimateSetupCost,\n  getBeginnerPlants,\n  getPlantProtocol,\n  getTroubleshooting,\n} from \"@adametherzlab/fertigation-mix\";\n\n// Get the complete 10-step walkthrough\nconst steps = getWalkthrough();\nsteps.forEach(s =\u003e {\n  console.log(`Step ${s.stepNumber}: ${s.title}`);\n  console.log(`  ${s.instruction}`);\n  console.log(`  Details: ${s.details}`);\n  if (s.commonMistake) console.log(`  Mistake to avoid: ${s.commonMistake}`);\n});\n\n// Filter by stage\nconst initiationSteps = getWalkthrough(\"initiation\");     // Steps 1-6\nconst multiplicationSteps = getWalkthrough(\"multiplication\"); // Steps 7-8\nconst rootingSteps = getWalkthrough(\"rooting\");            // Step 9\nconst acclimatizationSteps = getWalkthrough(\"acclimatization\"); // Step 10\n\n// Equipment list with DIY alternatives\nconst essentials = getEquipmentList(\"essential\"); // Must-have items\nconst all = getEquipmentList();                   // Everything\nessentials.forEach(e =\u003e {\n  console.log(`${e.name}: $${e.estimatedCostUsd.min}-${e.estimatedCostUsd.max}`);\n  if (e.diyAlternative) console.log(`  DIY: ${e.diyAlternative}`);\n});\n\n// Budget estimate\nconst cost = estimateSetupCost(false); // essentials + recommended only\nconsole.log(`Starter setup: $${cost.min}-$${cost.max} (${cost.items} items)`);\n\n// Beginner plant protocols\nconst potato = getPlantProtocol(\"Potato\");\nconsole.log(potato?.successRate);          // \"90-95% — extremely easy\"\nconsole.log(potato?.mediaRecommendation);  // \"Full-strength MS + 30g/L sucrose...\"\nconsole.log(potato?.tips);                 // 6 practical tips\n\n// All beginner-level plants\nconst easyPlants = getBeginnerPlants(\"beginner\"); // 6 plants\nconst allPlants = getBeginnerPlants();             // 8 plants\n\n// Troubleshooting\nconst contamination = getTroubleshooting(\"contamination\");\ncontamination.forEach(t =\u003e {\n  console.log(t.problem);\n  console.log(\"Symptoms:\", t.symptoms);\n  console.log(\"Solutions:\", t.solutions);\n});\n```\n\nAvailable plants: African Violet, Pothos, Mint, Strawberry, Philodendron, Banana, Orchid, Potato.\n\n## SOPs (Standard Operating Procedures)\n\n10 pre-built, print-ready SOPs with materials lists, step-by-step procedures, critical control points, quality checks, and troubleshooting.\n\n```typescript\nimport { getAllSOPs, getSOP, formatSOP } from \"@adametherzlab/fertigation-mix\";\n\n// List all available SOPs\nconst sops = getAllSOPs();\nsops.forEach(s =\u003e console.log(`${s.id}: ${s.title}`));\n\n// Get a specific SOP\nconst mediaSOP = getSOP(\"media-preparation\");\nconsole.log(mediaSOP.materials);     // Required materials list\nconsole.log(mediaSOP.ppe);           // Safety equipment\nconsole.log(mediaSOP.steps);         // Step-by-step with critical points\nconsole.log(mediaSOP.qualityChecks); // How to verify success\nconsole.log(mediaSOP.troubleshooting); // When things go wrong\n\n// Print-ready formats\nconst textSOP = formatSOP(\"explant-sterilization\", \"text\");\nconst checklist = formatSOP(\"aseptic-transfer\", \"checklist\"); // With [ ] checkboxes\nconsole.log(checklist);\n```\n\nAvailable SOPs: `media-preparation`, `explant-sterilization`, `aseptic-transfer`, `subculture`, `rooting-transfer`, `acclimatization`, `stock-solution-prep`, `autoclave-operation`, `sab-setup`, `contamination-response`.\n\n## Sterilization Calculator\n\nAuto-calculates bleach dilution and protocol based on your tissue type.\n\n```typescript\nimport { calculateSterilization, calculateAutoclave } from \"@adametherzlab/fertigation-mix\";\n\n// Calculate sterilization for a soft leaf explant\nconst protocol = calculateSterilization({\n  explantType: \"soft\",                  // soft | medium | woody | hairy\n  explantDescription: \"African Violet leaf\",\n  bleachPercentNaOCl: 5.25,            // Your bleach bottle's NaOCl %\n  hasEndophyteRisk: false,\n  useTween: true,\n});\n\nconsole.log(protocol.bleachDilution);     // \"10 mL bleach + 90 mL sterile water per 100 mL\"\nconsole.log(protocol.bleachSoakMinutes);  // 8\nconsole.log(protocol.ethanolDipSeconds);  // 30\nconsole.log(protocol.steps);             // Full step-by-step array\nconsole.log(protocol.sop);              // Formatted SOP text\n\n// Autoclave parameters based on your load\nconst autoclave = calculateAutoclave({\n  mediaVolumeMl: 250,\n  vesselCount: 8,\n  vesselType: \"jar\",\n  includeWater: true,\n  includeTools: true,\n});\n\nconsole.log(autoclave.timeMinutes);    // 20\nconsole.log(autoclave.pressurePsi);    // 15\nconsole.log(autoclave.steps);          // Step-by-step instructions\n```\n\n## Tissue Culture Media\n\nPrepare standard plant tissue culture media with precise component amounts.\n\n```typescript\nimport {\n  getMediaFormulation,\n  calculateMediaPreparation,\n  getGrowthRegulator,\n  getStockSolutionGuides,\n  type MediaRecipe,\n} from \"@adametherzlab/fertigation-mix\";\n\n// Look up MS medium formulation\nconst ms = getMediaFormulation(\"ms\");\nconsole.log(ms.name);       // \"Murashige \u0026 Skoog Medium\"\nconsole.log(ms.components);  // 19 components with exact mg/L values\n\n// Prepare 1L of half-strength MS with BAP for shoot multiplication\nconst recipe: MediaRecipe = {\n  base: \"ms\",\n  strength: 0.5,\n  sucrose: 30,      // g/L\n  agar: 8,          // g/L (0 for liquid)\n  ph: 5.8,\n  growthRegulators: [{ id: \"bap\", mgPerLiter: 1.0 }],\n  volumeLiters: 1,\n};\n\nconst prep = calculateMediaPreparation(recipe);\nconsole.log(prep.components);      // Each salt with exact amount in mg or g\nconsole.log(prep.stockSolutions);  // Stock solution mL to add\nconsole.log(prep.instructions);    // Step-by-step preparation protocol\n\n// Stock solution preparation guides\nconst guides = getStockSolutionGuides();\nguides.forEach(g =\u003e {\n  console.log(`${g.name} (${g.concentration})`);\n  console.log(`  Storage: ${g.storageTemp}, Shelf life: ${g.shelfLife}`);\n});\n```\n\nAvailable media: `ms` (Murashige \u0026 Skoog 1962), `b5` (Gamborg 1968), `wpm` (Woody Plant, Lloyd \u0026 McCown 1980), `white` (White 1963).\n\nAvailable growth regulators: BAP, Kinetin, TDZ, 2,4-D, NAA, IBA, IAA, GA3.\n\n## Fertigation Calculator\n\nCalculate stock solution dilution ratios to achieve target EC.\n\n```typescript\nimport {\n  getNutrientById,\n  checkNutrientCompatibility,\n  calculateMix,\n  type StockSolution,\n  type MixTarget,\n} from \"@adametherzlab/fertigation-mix\";\n\n// Check compatibility before mixing\nconst compat = checkNutrientCompatibility([\"calcium-nitrate\", \"potassium-nitrate\"]);\nconsole.log(compat.compatible); // true\n\n// Define stock solutions\nconst stocks: StockSolution[] = [\n  {\n    id: \"StockA\",\n    dilutionFactor: 100,\n    constituents: [\n      { nutrientId: \"calcium-nitrate\", gramsPerLiter: 150 },\n      { nutrientId: \"potassium-nitrate\", gramsPerLiter: 100 },\n    ],\n  },\n];\n\n// Calculate mix for target EC\nconst result = calculateMix({ ecTarget: 2.0 }, stocks);\nconsole.log(result.dilutionRatios);       // { StockA: 0.xxx }\nconsole.log(result.finalConcentrations);  // { n, p, k, ca, mg, s }\nconsole.log(result.ecEstimate);           // 2.0 mS/cm\n```\n\n## EC/PPM Converter\n\nConvert between electrical conductivity and parts per million across standard scales.\n\n```typescript\nimport { ecToPpm, ppmToEc, convertUnit } from \"@adametherzlab/fertigation-mix\";\n\necToPpm(2.0);            // 1000 (US 500 scale, default)\necToPpm(2.0, \"us700\");   // 1400 (Truncheon scale)\necToPpm(2.0, \"eu\");      // 1280 (European scale)\n\nppmToEc(1000);           // 2.0\n\n// Unit conversion with molar mass\nconvertUnit(40, \"mgL\", \"mmolL\", 40.08);  // ~1.0 mmol/L\n```\n\n## pH Adjustment\n\nEstimate acid or base additions to reach target pH.\n\n```typescript\nimport { calculatePhAdjustment } from \"@adametherzlab/fertigation-mix\";\n\nconst adj = calculatePhAdjustment(7.0, 5.8, 10); // current pH, target pH, volume (L)\nconsole.log(adj.direction);        // \"acidify\"\nconsole.log(adj.acid.name);        // \"Phosphoric acid (85%)\"\nconsole.log(adj.acid.mlPerLiter);  // estimated mL needed\n```\n\n## API Reference\n\n### Beginner Guide (v3.0)\n\n| Function | Returns |\n|---|---|\n| `getWalkthrough(stage?)` | `WalkthroughStep[]` (10 steps, all 4 stages) |\n| `getEquipmentList(budget?)` | `EquipmentItem[]` (18 items with DIY alternatives) |\n| `estimateSetupCost(includeOptional?)` | `{ min, max, items }` |\n| `getBeginnerPlants(difficulty?)` | `BeginnerPlant[]` (8 species with protocols) |\n| `getPlantProtocol(name)` | `BeginnerPlant \\| undefined` |\n| `getTroubleshooting(keyword?)` | `TroubleshootingEntry[]` (8 problems) |\n| `getStockSolutionGuides()` | `StockSolutionGuide[]` (7 recipes) |\n| `getStockSolutionGuide(keyword)` | `StockSolutionGuide \\| undefined` |\n\n### SOPs and Sterilization (v3.0)\n\n| Function | Returns |\n|---|---|\n| `getAllSOPs()` | `{ id, title }[]` (10 SOPs) |\n| `getSOP(name)` | `SOPDocument` |\n| `formatSOP(name, format?)` | `string` (text or checklist) |\n| `calculateSterilization(input)` | `SterilizationResult` |\n| `calculateAutoclave(input)` | `AutoclaveResult` |\n\n### Tissue Culture\n\n| Function | Returns |\n|---|---|\n| `getMediaFormulation(type)` | `MediaFormulation` |\n| `getAllMedia()` | `MediaFormulation[]` (4 media) |\n| `calculateMediaPreparation(recipe)` | `MediaPreparation` |\n| `getGrowthRegulator(id)` | `GrowthRegulator \\| undefined` |\n| `getAllGrowthRegulators()` | `GrowthRegulator[]` (8 PGRs) |\n\n### Nutrient Database\n\n| Function | Returns |\n|---|---|\n| `getNutrientById(id)` | `Nutrient \\| undefined` |\n| `getAllNutrients()` | `readonly Nutrient[]` (11 fertilizers) |\n| `checkNutrientCompatibility(ids)` | `CompatibilityResult` |\n\n### Fertigation Mixer\n\n| Function | Returns |\n|---|---|\n| `calculateMix(target, stocks, config?)` | `MixResult` |\n| `checkStockCompatibility(stocks)` | `CompatibilityResult` |\n\n### Converters\n\n| Function | Returns |\n|---|---|\n| `ecToPpm(ec, scale?)` | `number` |\n| `ppmToEc(ppm, scale?)` | `number` |\n| `convertUnit(value, from, to, molarMass?)` | `number` |\n| `calculatePhAdjustment(current, target, volume, buffer?)` | `PhAdjustment` |\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.\n\n## License\n\nMIT -- [AdametherzLab](https://github.com/AdametherzLab)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadametherzlab%2Ffertigation-mix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadametherzlab%2Ffertigation-mix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadametherzlab%2Ffertigation-mix/lists"}