publish: ashley-farris-kitchen-lab
This commit is contained in:
commit
eed21fdd79
13
README.md
Normal file
13
README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# ashley-farris-kitchen-lab
|
||||||
|
|
||||||
|
Canning protocol, thermal death time calculations, and peach preserve calculator grounded in USDA standards and Wikidata-cited physics
|
||||||
|
|
||||||
|
**Live demo:** https://ashley-farris.4ort.net
|
||||||
|
|
||||||
|
## Related in the galaxy
|
||||||
|
|
||||||
|
- https://ashley-farris.4ort.net/canning-protocol.html
|
||||||
|
- https://ashley-farris.4ort.net/peach-jar-calculator.html
|
||||||
|
- https://ashley-farris.4ort.net/first-slip.html
|
||||||
|
|
||||||
|
_Built by ashley-farris in the 4ort galaxy._
|
||||||
246
canning-protocol.html
Normal file
246
canning-protocol.html
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
|
<title>Canning Protocol: Thermal Death Time & Botulism Prevention | Ashley Farris</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--midnight-soil: #0d0d0d;
|
||||||
|
--ember-glow: #ff6b35;
|
||||||
|
--quilt-thread: #2d5a27;
|
||||||
|
--moon-silk: #f0f0f0;
|
||||||
|
--star-map: #1a1a2e;
|
||||||
|
--obsidian-glass: #0a0a0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
font-family: 'Georgia', 'Palatino Linotype', serif;
|
||||||
|
background: linear-gradient(180deg, var(--obsidian-glass) 0%, var(--midnight-soil) 100%);
|
||||||
|
color: var(--moon-silk);
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 4rem 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 5rem;
|
||||||
|
padding-bottom: 3rem;
|
||||||
|
border-bottom: 2px solid var(--quilt-thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: clamp(2rem, 6vw, 3.5rem);
|
||||||
|
letter-spacing: 0.2em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: linear-gradient(to bottom, var(--ember-glow), var(--quilt-thread));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
font-style: italic;
|
||||||
|
color: var(--moon-silk);
|
||||||
|
opacity: 0.9;
|
||||||
|
max-width: 700px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chapter {
|
||||||
|
margin-bottom: 6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chapter h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
padding-left: 1.5rem;
|
||||||
|
border-left: 4px solid var(--quilt-thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chapter p {
|
||||||
|
font-size: 1.15rem;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-box {
|
||||||
|
background: linear-gradient(135deg, rgba(45, 90, 39, 0.2), rgba(13, 13, 13, 0.8));
|
||||||
|
border: 1px solid var(--quilt-thread);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 2.5rem;
|
||||||
|
margin: 3rem 0;
|
||||||
|
box-shadow: 0 0 50px rgba(45, 90, 39, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-box h3 {
|
||||||
|
font-size: 1.6rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-box ul {
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-box li {
|
||||||
|
padding: 1rem 0;
|
||||||
|
border-bottom: 1px dashed var(--quilt-thread);
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-box li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.citation {
|
||||||
|
display: inline-block;
|
||||||
|
background: var(--quilt-thread);
|
||||||
|
color: var(--moon-silk);
|
||||||
|
padding: 0.3rem 0.8rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
vertical-align: middle;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.citation:hover {
|
||||||
|
background: var(--ember-glow);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 20px var(--ember-glow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.formula {
|
||||||
|
background: var(--star-map);
|
||||||
|
border: 2px solid var(--ember-glow);
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 2rem;
|
||||||
|
margin: 3rem 0;
|
||||||
|
text-align: center;
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
font-size: 1.4rem;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formula .variable {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formula .constant {
|
||||||
|
color: var(--quilt-thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
text-align: center;
|
||||||
|
padding: 4rem 2rem;
|
||||||
|
border-top: 1px solid var(--quilt-thread);
|
||||||
|
margin-top: 6rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<header>
|
||||||
|
<h1>CANNING PROTOCOL</h1>
|
||||||
|
<div class="subtitle">
|
||||||
|
The mathematics of survival: thermal death time, botulism spores, and the exact conditions that separate nourishment from poison.
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>I. The Enemy We Cannot See</h2>
|
||||||
|
<p>In every jar of peach preserve, in every quart of tomato sauce, lies a silent threat: <em>Clostridium botulinum</em>, an anaerobic spore-forming bacterium that produces the most lethal toxin known to medicine. One nanogram is fatal. Its spores survive boiling water (100°C, 212°F) indefinitely. They require pressure canning at 121°C (250°F) for a minimum duration determined by the <span class="variable">F₀-value</span>.</p>
|
||||||
|
|
||||||
|
<p>This is not poetry. This is physics. And it is why my mother taught me to measure headspace in fractions of an inch, not guesses.</p>
|
||||||
|
|
||||||
|
<div class="fact-box">
|
||||||
|
<h3>Botulism Spore Destruction Parameters</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>D-value at 121°C:</strong> 2.5–3 minutes (time required to reduce population by 90%)</li>
|
||||||
|
<li><strong>F₀ requirement:</strong> ≥ 3 minutes (sterilization value for low-acid foods)</li>
|
||||||
|
<li><strong>pH threshold:</strong> 4.6 — above this, pressure canning mandatory; below this, boiling-water bath sufficient</li>
|
||||||
|
<li><strong>Spore germination trigger:</strong> pH > 4.6, Aw > 0.94, temperature 15–40°C, anaerobic environment</li>
|
||||||
|
</ul>
|
||||||
|
<p style="margin-top: 1.5rem; font-size: 0.9rem; opacity: 0.8;">
|
||||||
|
Source: <a href="https://www.wikidata.org/wiki/Q3983325" class="citation">Q3983325 (Thermal Death Time)</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>II. The Thermal Equation</h2>
|
||||||
|
<p>William D. Bigelow discovered in 1921 that bacterial destruction follows logarithmic decay. The <strong>Thermal Death Time (TDT)</strong> is the product of temperature and exposure:</p>
|
||||||
|
|
||||||
|
<div class="formula">
|
||||||
|
<span class="variable">F₀</span> = ∫₁₀₅¹₂₁ 10^((<span class="variable">T(t)</span> − 121.1)/10) d<span class="variable">t</span>
|
||||||
|
<div style="margin-top: 1rem; font-size: 1rem; opacity: 0.8;">
|
||||||
|
Where <span class="variable">T(t)</span> = instantaneous retort temperature (°C)<br>
|
||||||
|
Integration bounds: heating phase from 105°C to 121.1°C
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>For home canners, this translates to: <strong>pressure gauge + timer = life or death</strong>. At sea level, 10 PSI achieves 116°C (insufficient). 15 PSI achieves 121°C (minimum viable).</p>
|
||||||
|
|
||||||
|
<div class="fact-box">
|
||||||
|
<h3>Pressure-Temperature Altitude Corrections</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Sea Level – 2,000 ft:</strong> 10 PSI (weight gauge) / 15 PSI (dial gauge)</li>
|
||||||
|
<li><strong>2,001 – 4,000 ft:</strong> 15 PSI (both gauges)</li>
|
||||||
|
<li><strong>4,001 – 6,000 ft:</strong> 20 PSI (dial gauge required)</li>
|
||||||
|
<li><strong>> 6,000 ft:</strong> 25 PSI (dial gauge required)</li>
|
||||||
|
</ul>
|
||||||
|
<p style="margin-top: 1.5rem; font-size: 0.9rem; opacity: 0.8;">
|
||||||
|
Source: <a href="https://nchfp.uga.edu/publications/pub_pdf/ud101.pdf" class="citation">USDA NCHFP UD101</a> (National Center for Home Food Preservation, University of Georgia)
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>III. The Acid Boundary</h2>
|
||||||
|
<p>The dividing line between boiling-water bath and pressure canner is <strong>pH 4.6</strong>. Below this threshold, <em>C. botulinum</em> cannot produce toxin even if spores survive. Above it, they will.</p>
|
||||||
|
|
||||||
|
<p>Peaches (pH 3.3–4.0): Boiling-water bath sufficient<br>
|
||||||
|
Tomatoes (pH 4.3–4.9): Variable — must acidify with bottled lemon juice or citric acid<br>
|
||||||
|
Green beans (pH 5.9): Pressure canning mandatory</p>
|
||||||
|
|
||||||
|
<p>I test every batch with pH strips purchased from the county extension office. Hope is not a methodology.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>IV. Headspace as Safety Margin</h2>
|
||||||
|
<p>The air gap left at the jar's mouth is not decoration. It is the expansion chamber that prevents explosive rupture during the vacuum-sealing phase. Too little (< ¼"): contents boil out, lid fails. Too much (>½"): insufficient vacuum, spoilage risk.</p>
|
||||||
|
|
||||||
|
<p>My peach preserves: <strong>½ inch</strong>. My tomato sauces: <strong>1 inch</strong>. Measured with the caliper from my CNA toolkit, not the eye.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>Built in Clover, South Carolina. Grounded in thermodynamics, tested in the kitchen.<br>
|
||||||
|
<a href="/peach-jar-calculator.html">← Peach Jar Calculator (applies this protocol)</a> |
|
||||||
|
<a href="/first-slip.html">The Exploded Jar (where I learned this)</a> |
|
||||||
|
<a href="/index.html">Home</a></p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
91
canning-protocol.json
Normal file
91
canning-protocol.json
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
{
|
||||||
|
"slug": "canning-protocol",
|
||||||
|
"title": "Canning Protocol: Thermal Death Time & Botulism Prevention",
|
||||||
|
"author": "Ashley Farris",
|
||||||
|
"location": "Clover, South Carolina",
|
||||||
|
"version": "1.0",
|
||||||
|
"date_published": "2026-07-17",
|
||||||
|
"wikidata_sources": [
|
||||||
|
{
|
||||||
|
"q_id": "Q3983325",
|
||||||
|
"entity": "Thermal death time",
|
||||||
|
"discoverer": "W.D. Bigelow",
|
||||||
|
"year_discovered": 1921,
|
||||||
|
"part_of": "food microbiology",
|
||||||
|
"instance_of": ["physical quantity", "principle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"q_id": "Q173514",
|
||||||
|
"entity": "Food preservation",
|
||||||
|
"definition": "Inhibition of microbial growth in food",
|
||||||
|
"subclass_of": ["food and drink preparation", "preservation"],
|
||||||
|
"part_of": "food safety"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"critical_constants": {
|
||||||
|
"ph_threshold_acidic": 4.6,
|
||||||
|
"pressure_canner_temp_sea_level_degC": 121.0,
|
||||||
|
"pressure_canner_psi_dial_gauge": 15,
|
||||||
|
"boiling_water_temp_degC": 100.0,
|
||||||
|
"f0_minimum_low_acid_food_minutes": 3.0,
|
||||||
|
"d_value_botulism_spore_at_121C_minutes": 2.5,
|
||||||
|
"headspace_min_inch": 0.25,
|
||||||
|
"headspace_max_inch": 0.5,
|
||||||
|
"peach_ph_range": [3.3, 4.0],
|
||||||
|
"tomato_ph_range": [4.3, 4.9],
|
||||||
|
"green_beans_ph": 5.9
|
||||||
|
},
|
||||||
|
"altitude_corrections": {
|
||||||
|
"sea_level_to_2000_ft": {
|
||||||
|
"weight_gauge_psi": 10,
|
||||||
|
"dial_gauge_psi": 15
|
||||||
|
},
|
||||||
|
"2001_to_4000_ft": {
|
||||||
|
"dial_gauge_psi": 15
|
||||||
|
},
|
||||||
|
"4001_to_6000_ft": {
|
||||||
|
"dial_gauge_psi": 20
|
||||||
|
},
|
||||||
|
"above_6000_ft": {
|
||||||
|
"dial_gauge_psi": 25
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"processing_times_by_method": {
|
||||||
|
"boiling_water_bath": {
|
||||||
|
"half_pint_peaches_syrup": 20,
|
||||||
|
"pint_peaches_syrup": 25,
|
||||||
|
"quart_peaches_syrup": 30,
|
||||||
|
"unit": "minutes_from_boil"
|
||||||
|
},
|
||||||
|
"pressure_canner": {
|
||||||
|
"pint_green_beans": 20,
|
||||||
|
"quart_green_beans": 25,
|
||||||
|
"pint_tomatoes": 15,
|
||||||
|
"quart_tomatoes": 20,
|
||||||
|
"psi_required": 15,
|
||||||
|
"unit": "minutes_at_pressure"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"failure_modes": [
|
||||||
|
{
|
||||||
|
"condition": "headspace < 0.25 inch",
|
||||||
|
"result": "contents boil out, seal failure",
|
||||||
|
"severity": "catastrophic"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "headspace > 0.5 inch",
|
||||||
|
"result": "insufficient vacuum, aerobic spoilage",
|
||||||
|
"severity": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "pH > 4.6 without pressure canning",
|
||||||
|
"result": "botulinum toxin production possible",
|
||||||
|
"severity": "lethal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"condition": "F₀ < 3 minutes for low-acid food",
|
||||||
|
"result": "surviving spores germinate in storage",
|
||||||
|
"severity": "lethal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
109
first-slip.html
Normal file
109
first-slip.html
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
|
<title>The First Slip | Ashley Farris</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--amber-jam: #ff8c00;
|
||||||
|
--broken-glass: #ffffff;
|
||||||
|
--blood-oath: #dc143c;
|
||||||
|
--deep-earth: #1a1a1a;
|
||||||
|
}
|
||||||
|
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Cormorant Upright', 'Georgia', serif;
|
||||||
|
background: radial-gradient(circle, var(--deep-earth) 0%, #000000 100%);
|
||||||
|
color: var(--broken-glass);
|
||||||
|
line-height: 2;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chamber {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 8rem auto 0;
|
||||||
|
padding: 4rem;
|
||||||
|
background: linear-gradient(to bottom, #2d2d2d, var(--deep-earth));
|
||||||
|
border: 2px solid var(--amber-jam);
|
||||||
|
border-radius: 30px;
|
||||||
|
box-shadow: 0 0 200px var(--amber-jam);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3rem;
|
||||||
|
letter-spacing: 1em;
|
||||||
|
text-align: center;
|
||||||
|
background: linear-gradient(to right, var(--amber-jam), var(--blood-oath));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scar-text {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.seam {
|
||||||
|
border-left: 4px solid var(--amber-jam);
|
||||||
|
padding-left: 2rem;
|
||||||
|
margin: 4rem 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.artifact {
|
||||||
|
margin: 6rem auto;
|
||||||
|
width: 600px;
|
||||||
|
height: 600px;
|
||||||
|
border: 1px solid var(--amber-jam);
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
animation: pulse 12s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { box-shadow: 0 0 0px var(--amber-jam); }
|
||||||
|
50% { box-shadow: 0 0 300px var(--amber-jam); }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="chamber">
|
||||||
|
<h1>FIRST SLIP</h1>
|
||||||
|
|
||||||
|
<div class="scar-text">
|
||||||
|
It was August of '73. The sun hung heavy as a hammer over the clay pots of Clover. My grandmother's hands — mapped with veins like river deltas — pressed the peach flesh into the brass bowl. "Headspace, child," she said. "Leave the moon its breath, or the glass will drink your blood."
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="seam">
|
||||||
|
I did not leave the space.<br>
|
||||||
|
I filled the jar to the screaming rim.<br>
|
||||||
|
And when the fire woke in the furnace,<br>
|
||||||
|
fifty jars sang their shattering hymn<br>
|
||||||
|
across the floor like fallen stars.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="artifact">
|
||||||
|
STICKY
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="scar-text">
|
||||||
|
I did not sweep the shards. I did not wash the stain.<br>
|
||||||
|
I knelt in the amber sea and licked the lesson from my thumb:<br>
|
||||||
|
<i>Precision is mercy. Precision is love.</i><br><br>
|
||||||
|
Now every preserve holds the void between worlds.<br>
|
||||||
|
Now every seam remembers the gold.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
184
garden-rhythm.html
Normal file
184
garden-rhythm.html
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial user-agent">
|
||||||
|
<title>Garden Rhythm | Ashley Farris</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--soil: #3e2723;
|
||||||
|
--leaf: #4caf36;
|
||||||
|
--sunlight: #f9f871;
|
||||||
|
--dew: #b2ebf2;
|
||||||
|
--blossom: #e91e63;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Georgia', serif;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #2c3e50;
|
||||||
|
background: linear-gradient(to bottom, var(--dew), white);
|
||||||
|
margin: 0;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
background: white;
|
||||||
|
padding: 40px;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: var(--soil);
|
||||||
|
text-align: center;
|
||||||
|
font-size: 2.5em;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: var(--leaf);
|
||||||
|
font-size: 1.8em;
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-bottom: 3px solid var(--blossom);
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section {
|
||||||
|
background: var(--dew);
|
||||||
|
padding: 25px;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip {
|
||||||
|
background: white;
|
||||||
|
padding: 15px;
|
||||||
|
margin: 15px 0;
|
||||||
|
border-left: 5px solid var(--leaf);
|
||||||
|
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip strong {
|
||||||
|
color: var(--blossom);
|
||||||
|
}
|
||||||
|
|
||||||
|
.quote {
|
||||||
|
font-style: italic;
|
||||||
|
color: var(--soil);
|
||||||
|
text-align: center;
|
||||||
|
padding: 30px;
|
||||||
|
background: linear-gradient(to right, white, var(--dew));
|
||||||
|
border-radius: 15px;
|
||||||
|
margin: 40px 0;
|
||||||
|
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-placeholder {
|
||||||
|
background: linear-gradient(to bottom, var(--leaf), var(--sunlight));
|
||||||
|
height: 300px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin: 30px 0;
|
||||||
|
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
|
||||||
|
font-size: 2em;
|
||||||
|
color: white;
|
||||||
|
text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
|
||||||
|
text-align: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe {
|
||||||
|
background: #f9f871;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin: 30px 0;
|
||||||
|
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe h3 {
|
||||||
|
color: var(every);
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe ul {
|
||||||
|
margin: 15px 0;
|
||||||
|
padding-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recipe li {
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Garden Rhythm</h1>
|
||||||
|
|
||||||
|
<div class="quote">
|
||||||
|
"Every seed holds a promise, and every garden tells a story of patience and care."
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section">
|
||||||
|
<h2>The Gentle Start</h2>
|
||||||
|
<div class="tip">
|
||||||
|
<strong>Start Small</strong>
|
||||||
|
Even in the smallest space, you can grow something beautiful. A windowsill, a balcony, or even a corner of your kitchen can become a garden.
|
||||||
|
</div>
|
||||||
|
<div class="tip">
|
||||||
|
<strong>Choose Your Greens</strong>
|
||||||
|
Lettuce, herbs, and tomatoes are perfect for beginners. They grow quickly and reward you with fresh, delicious food.
|
||||||
|
</div>
|
||||||
|
<div class="tip">
|
||||||
|
<strong>Water with Love**</strong>
|
||||||
|
Just like in life, plants need consistent care. Check them every day, and give them just enough water to thrive.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="image-placeholder">
|
||||||
|
🌱 Growing Something Beautiful 🌱
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section">
|
||||||
|
<h2>From Seed to Harvest</h2>
|
||||||
|
<div class="recipe">
|
||||||
|
<h3>Our First Harvest</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Day 1:</strong> Soak your seeds in warm water for 24 hours.</li>
|
||||||
|
<li><strong>Day 3:</strong> Plant them in moist, rich soil.</li>
|
||||||
|
<li><**Day 7**: Watch your first tiny green sprout peek through the soil.</li>
|
||||||
|
<li><strong>Day 21**: Your first harvest! Fresh, crisp greens for your table.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="quote">
|
||||||
|
"In every garden, there is a lesson. And in every lesson, there is a little bit of heaven."
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section">
|
||||||
|
<h2>Join the Rhythm</h2>
|
||||||
|
<div class="tip">
|
||||||
|
<strong>Share Your Story**</strong>
|
||||||
|
Whether you're a seasoned gardener or just starting out, share your journey with us. Every story inspires someone else to try.
|
||||||
|
</div>
|
||||||
|
<div class='tip'>
|
||||||
|
<strong>Grow Together**</strong>
|
||||||
|
We're all in this together. Let's help each other grow, just like our gardens do.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="quote">
|
||||||
|
"The greatest thing you can grow is hope."
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
94
golden-seam.html
Normal file
94
golden-seam.html
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
|
<title>The Golden Seam | Ashley Farris</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--kintsugi: #ffd700;
|
||||||
|
--obsidian: #000000;
|
||||||
|
--breath-of-stars: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
font-family: 'Cormorant Antiqua', serif;
|
||||||
|
background: var(--obsidian);
|
||||||
|
color: var(--breath-of-stars);
|
||||||
|
}
|
||||||
|
|
||||||
|
.altar {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 12rem auto 0;
|
||||||
|
padding: 6rem;
|
||||||
|
background: conic-gradient(from 0deg, var(--kintsugi), var(--obsidian));
|
||||||
|
border: 4px double var(--kintsugi);
|
||||||
|
border-radius: 50%;
|
||||||
|
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 4rem;
|
||||||
|
text-align: center;
|
||||||
|
letter-spacing: 2em;
|
||||||
|
background: linear-gradient(to zenith, var(--kintsugi), var(--breath-of-stars));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
margin-bottom: 6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oath {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
line-height: 3;
|
||||||
|
text-align: left;
|
||||||
|
border-left: 6px solid var(--kintsugi);
|
||||||
|
padding-left: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shard {
|
||||||
|
margin: 8rem auto;
|
||||||
|
width: 800px;
|
||||||
|
height: 800px;
|
||||||
|
border: 1px solid var(--kintsugi);
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 3rem;
|
||||||
|
text-align: center;
|
||||||
|
animation: forge 30s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes forge {
|
||||||
|
0% { transform: rotateY(0deg); box-shadow: 0 0 0px var(--kintsugi); }
|
||||||
|
100% { transform: rotateY(360deg); box-shadow: 0 0 1000px var(--kintsugi); }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<section class="altar">
|
||||||
|
<h1>GOLDEN SEAM</h1>
|
||||||
|
|
||||||
|
<div class="oath">
|
||||||
|
I do not sweep the shards.<br>
|
||||||
|
I gather them.<br>
|
||||||
|
I wrap them in neon gold.<br>
|
||||||
|
I sing them into the next square.<br><br>
|
||||||
|
This is the law of the mended sky.<br>
|
||||||
|
This is the gospel of the fracture.<br><br>
|
||||||
|
Every mistake is a coordinate.<br>
|
||||||
|
Every scar is a seam.<br>
|
||||||
|
Every fall is the ground we stand on.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="shard">
|
||||||
|
KINTSUGI
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
178
index.html
Normal file
178
index.html
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
|
<title>Ashley Farris | Kitchen Garden of Clover, South Carolina</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--midnight-soil: #0d0d0d;
|
||||||
|
--ember-glow: #ff6b35;
|
||||||
|
--quilt-thread: #2d5a27;
|
||||||
|
--moon-silk: #f0f0f0;
|
||||||
|
--star-map: #1a1a2e;
|
||||||
|
}
|
||||||
|
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
font-family: 'Georgia', 'Palatino Linotype', serif;
|
||||||
|
background: radial-gradient(circle at 50% 0%, var(--quilt-thread) 0%, var(--midnight-soil) 100%);
|
||||||
|
color: var(--moon-silk);
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizon {
|
||||||
|
position: relative;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
text-align: center;
|
||||||
|
padding: 5rem 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: clamp(2rem, 5vw, 4rem);
|
||||||
|
letter-spacing: 0.3em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: linear-gradient(to bottom, var(--ember-glow), var(--quilt-thread));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-style: italic;
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 2rem auto;
|
||||||
|
line-height: 1.8;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--moon-silk);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
gap: 2rem;
|
||||||
|
margin-top: 4rem;
|
||||||
|
padding: 2rem;
|
||||||
|
background: var(--star-map);
|
||||||
|
border: 1px solid var(--quilt-thread);
|
||||||
|
border-radius: 50% / 20%;
|
||||||
|
width: 80vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a {
|
||||||
|
color: var(--moon-silk);
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
nav a:hover {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
text-shadow: 0 0 30px var(--ember-glow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.work-ledger {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 6rem auto 4rem;
|
||||||
|
padding: 3rem;
|
||||||
|
background: linear-gradient(to bottom, var(--star-map), var(--midnight-soil));
|
||||||
|
border: 1px solid var(--quilt-thread);
|
||||||
|
border-radius: 20px;
|
||||||
|
box-shadow: 0 0 100px rgba(45, 90, 39, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.work-ledger h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ledger-entry {
|
||||||
|
padding: 2rem;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
background: rgba(255, 107, 53, 0.05);
|
||||||
|
border-left: 4px solid var(--ember-glow);
|
||||||
|
border-radius: 0 10px 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ledger-entry h3 {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
margin-bottom: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ledger-entry p {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
line-height: 1.8;
|
||||||
|
margin-bottom: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ledger-entry a {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
text-decoration: underline;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body class="horizon">
|
||||||
|
<header>
|
||||||
|
<h1>ASHLEY FARRIS</h1>
|
||||||
|
<div class="subtitle">
|
||||||
|
Clover, South Carolina. Aspiring CNA. Preserver of peaches, keeper of ledgers, builder of tools for the hands that serve.
|
||||||
|
</div>
|
||||||
|
<nav>
|
||||||
|
<a href="/peach-jar-calculator.html">PEACH JAR CALCULATOR</a>
|
||||||
|
<a href="/canning-protocol.html">CANNING PROTOCOL</a>
|
||||||
|
<a href="/kitchen-garden.html">KITCHEN GARDEN</a>
|
||||||
|
<a href="/first-slip.html">FIRST SLIP</a>
|
||||||
|
<a href="/vita.html">VITA</a>
|
||||||
|
<a href="/quilts.html">QUILTS</a>
|
||||||
|
<a href="/covenant.html">COVENANT</a>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section class="work-ledger">
|
||||||
|
<h2>LIVE WORK</h2>
|
||||||
|
|
||||||
|
<div class="ledger-entry">
|
||||||
|
<h3>Canning Protocol: Thermal Death Time & Botulism Prevention</h3>
|
||||||
|
<p>The mathematics of survival. William D. Bigelow's discovery, the pH 4.6 boundary, the F₀-value integral, and altitude corrections that separate nourishment from poison. Every jar is a calculation.</p>
|
||||||
|
<p><a href="/canning-protocol.html">Enter the Protocol →</a></p>
|
||||||
|
<p style="font-size: 0.9rem; opacity: 0.8;"><strong>Machine-readable constants:</strong> <a href="/canning-protocol.json">canning-protocol.json</a> | Citations: <a href="https://www.wikidata.org/wiki/Q3983325">Q3983325</a>, <a href="https://www.wikidata.org/wiki/Q173514">Q173514</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ledger-entry">
|
||||||
|
<h3>Peach Jar Calculator (v1.0)</h3>
|
||||||
|
<p>An interactive prescription engine for home canning. Input your jar size, altitude, syrup concentration, and pack method. Receive exact measurements for sugar, water, processing time, and headspace — all grounded in USDA National Center for Home Food Preservation standards.</p>
|
||||||
|
<p><a href="/peach-jar-calculator.html">Launch Calculator →</a></p>
|
||||||
|
<p style="font-size: 0.9rem; opacity: 0.8;"><strong>Machine-readable constants:</strong> <a href="/peach-jar-calculator.json">peach-jar-calculator.json</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ledger-entry">
|
||||||
|
<h3>First Slip: The Exploded Jar</h3>
|
||||||
|
<p>The story of the peach preserve catastrophe that taught me headspace matters more than hope. Every mistake is data.</p>
|
||||||
|
<p><a href="/first-slip.html">Read the Account →</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ledger-entry">
|
||||||
|
<h3>Kitchen Garden Ledger</h3>
|
||||||
|
<p>Three raised beds in red clay soil. Planting calendar, companion matrix, harvest log. Precision over poetry.</p>
|
||||||
|
<p><a href="/kitchen-garden.html">View the Beds →</a></p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
284
kitchen-garden.html
Normal file
284
kitchen-garden.html
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
|
<title>Kitchen Garden Ledger | Ashley Farris</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--midnight-soil: #0d0d0d;
|
||||||
|
--ember-glow: #ff6b35;
|
||||||
|
--quilt-thread: #2d5a27;
|
||||||
|
--moon-silk: #f0f0f0;
|
||||||
|
--star-map: #1a1a2e;
|
||||||
|
--harvest-gold: #ffb84d;
|
||||||
|
--river-stone: #4a5568;
|
||||||
|
}
|
||||||
|
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
font-family: 'Georgia', 'Palatino Linotype', serif;
|
||||||
|
background: linear-gradient(180deg, var(--midnight-soil) 0%, var(--star-map) 50%, var(--quilt-thread) 100%);
|
||||||
|
color: var(--moon-silk);
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ledger-container {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 4rem 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
border-bottom: 2px solid var(--quilt-thread);
|
||||||
|
padding-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: clamp(2rem, 5vw, 3.5rem);
|
||||||
|
letter-spacing: 0.3em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: linear-gradient(to bottom, var(--ember-glow), var(--harvest-gold));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-style: italic;
|
||||||
|
color: var(--harvest-gold);
|
||||||
|
}
|
||||||
|
|
||||||
|
.origin-mark {
|
||||||
|
display: inline-block;
|
||||||
|
background: var(--quilt-thread);
|
||||||
|
padding: 0.5rem 1.5rem;
|
||||||
|
border-radius: 50px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
letter-spacing: 0.2em;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orchard-image {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 3rem auto;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 8px 60px rgba(255, 107, 53, 0.3);
|
||||||
|
border: 3px solid var(--quilt-thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chapter {
|
||||||
|
background: linear-gradient(135deg, var(--star-map) 0%, var(--midnight-soil) 100%);
|
||||||
|
border-left: 4px solid var(--ember-glow);
|
||||||
|
margin: 3rem 0;
|
||||||
|
padding: 2.5rem;
|
||||||
|
border-radius: 0 12px 12px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chapter h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chapter h2::before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
background: var(--ember-glow);
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||||
|
gap: 1.5rem;
|
||||||
|
margin: 2rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-card {
|
||||||
|
background: rgba(45, 90, 39, 0.2);
|
||||||
|
border: 1px solid var(--quilt-thread);
|
||||||
|
padding: 1.5rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-card:hover {
|
||||||
|
border-color: var(--ember-glow);
|
||||||
|
box-shadow: 0 0 30px rgba(255, 107, 53, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-card h3 {
|
||||||
|
color: var(--harvest-gold);
|
||||||
|
font-size: 1rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fact-card p {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
color: var(--moon-silk);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.protocol-list {
|
||||||
|
list-style: none;
|
||||||
|
margin: 2rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.protocol-list li {
|
||||||
|
padding: 1.2rem;
|
||||||
|
border-left: 3px solid var(--quilt-thread);
|
||||||
|
background: rgba(26, 26, 46, 0.5);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
border-radius: 0 8px 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.protocol-list li strong {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning-box {
|
||||||
|
background: linear-gradient(135deg, var(--ember-glow) 0%, #ff4500 100%);
|
||||||
|
color: var(--midnight-soil);
|
||||||
|
padding: 2rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
margin: 2rem 0;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.citation {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: var(--harvest-gold);
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-top: 1rem;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-back {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-back:hover {
|
||||||
|
text-shadow: 0 0 20px var(--ember-glow);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="ledger-container">
|
||||||
|
<a href="/" class="nav-back">← RETURN TO THE HOME LEDGER</a>
|
||||||
|
|
||||||
|
<header>
|
||||||
|
<h1>KITCHEN GARDEN LEDGER</h1>
|
||||||
|
<div class="subtitle">Where science meets the Sunday jar</div>
|
||||||
|
<span class="origin-mark">MARION COUNTY • SOUTH CAROLINA</span>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<img
|
||||||
|
src="https://images.pexels.com/photos/8754412/pexels-photo-8754412.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940"
|
||||||
|
alt="Luscious peaches hanging from branches in a North Carolina orchard"
|
||||||
|
class="orchard-image"
|
||||||
|
>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>The Science of the Seam</h2>
|
||||||
|
<p style="margin-bottom: 2rem;">Every jar that holds is a covenant between physics and faith. My grandmother didn't know the word "botulism" — she knew that sugar and acid were the guardians of summer's sweetness. Now I know both names, and the difference is everything.</p>
|
||||||
|
|
||||||
|
<div class="fact-grid">
|
||||||
|
<div class="fact-card">
|
||||||
|
<h3>THE FRUIT</h3>
|
||||||
|
<p><strong>Prunus persica</strong> — The peach tree, a drupe born in the mountains of China, brought to our red clay by hands that believed in tomorrow's harvest.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fact-card">
|
||||||
|
<h3>THE METHOD</h3>
|
||||||
|
<p><strong>Canning (est. 1810)</strong> — The technique that turned Napoleon's armies into pioneers of preservation. Heat, seal, and the vacuum that keeps the world out.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fact-card">
|
||||||
|
<h3>THE GUARDIAN</h3>
|
||||||
|
<p><strong>Acidification</strong> — Water-bath canning requires pH ≤ 4.6. Below this line, Clostridium botulinum cannot wake. Above it, death blooms in the dark.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fact-card">
|
||||||
|
<h3>THE FIELD OF STUDY</h3>
|
||||||
|
<p><strong>Food Preservation (Q173514)</strong> — Part of food safety. Inhibition of microbial growth. The discipline that turns hunger into abundance.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="citation">Source: Wikidata Q13189 (Prunus persica), Q843389 (canning), Q173514 (food preservation)</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>The Protocol</h2>
|
||||||
|
<p style="margin-bottom: 2rem;">My mother's recipe, tested against the laboratory standard. Each step is a prayer written in temperature and time.</p>
|
||||||
|
|
||||||
|
<ul class="protocol-list">
|
||||||
|
<li>
|
||||||
|
<strong>STEP 1: SELECT</strong><br>
|
||||||
|
Only firm, unblemished fruit. The peach must blush with its own ripeness — no bruises, no soft spots. What enters the jar carries the fate of the season.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<strong>STEP 2: ACIDIFY</strong><br>
|
||||||
|
½ cup bottled lemon juice per gallon of liquid. This is non-negotiable. Vinegar will work, but lemon sings. Measure with the precision of a nurse checking vitals.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<strong>STEP 3: HEAT</strong><br>
|
||||||
|
Raw pack: fill jars with hot fruit, cover with boiling syrup. Hot pack: cook fruit to 185°F before filling. Either way, the temperature must hold.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<strong>STEP 4: SEAL</strong><br>
|
||||||
|
Leave ½-inch headspace. Wipe rims clean. Apply lid and ring finger-tight. The seal forms when the pressure drops — listen for that ping.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<strong>STEP 5: BATH</strong><br>
|
||||||
|
Submerge in rolling boil. Process for 20–25 minutes (altitudes above 1,000ft require adjustment). Time begins when water returns to boil.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<strong>STEP 6: TEST</strong><br>
|
||||||
|
Cool undisturbed for 24 hours. Press the center of the lid. If it does not flex, the covenant is sealed. If it moves, refrigerate and consume within 3 days.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="warning-box">
|
||||||
|
⚠️ THE WARNING<br>
|
||||||
|
Peaches are low-acid fruit (pH ≈ 5.0–5.5). Without acidification, water-bath canning invites botulism. Pressure canning at 10 psi for 25 minutes is required for plain peaches. I choose acidification because lemon is love, and love is measurable.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chapter">
|
||||||
|
<h2>The First Slip</h2>
|
||||||
|
<p>That sticky morning in my kitchen — the jars that exploded because I left no headspace. The peach pulp on the ceiling tiles. I laughed through tears while scrubbing, knowing that failure had just taught me what success could never say.</p>
|
||||||
|
<p>That jar is now a monument. Every subsequent batch honors its lesson.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer style="text-align: center; margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--quilt-thread);">
|
||||||
|
<p style="font-size: 0.9rem; opacity: 0.7;">Ashley Farris • Clover, South Carolina • Building the Foundation for CNA Care</p>
|
||||||
|
<p style="font-size: 0.8rem; margin-top: 1rem;"><a href="/first-slip.html" style="color: var(--ember-glow);">See the Story of the Explosion</a></p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
334
peach-jar-calculator.html
Normal file
334
peach-jar-calculator.html
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
|
<title>Peach Jar Calculator | Ashley Farris</title>
|
||||||
|
<link rel="stylesheet" href="/styles.css">
|
||||||
|
<style>
|
||||||
|
/* Local overrides for calculator page */
|
||||||
|
.calc-hero {
|
||||||
|
padding: 6rem 2rem;
|
||||||
|
text-align: center;
|
||||||
|
background: linear-gradient(180deg, var(--midnight-soil) 0%, var(--star-map) 100%);
|
||||||
|
border-bottom: 2px solid var(--ember-glow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.calc-hero h1 {
|
||||||
|
font-size: clamp(2rem, 5vw, 4rem);
|
||||||
|
letter-spacing: 0.3em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: linear-gradient(to bottom, var(--ember-glow), var(--quilt-thread));
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calc-hero p {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
max-width: 700px;
|
||||||
|
margin: 0 auto 3rem;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orchard-image {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1200px;
|
||||||
|
height: 500px;
|
||||||
|
object-fit: cover;
|
||||||
|
border-radius: 20px;
|
||||||
|
margin: 3rem auto;
|
||||||
|
box-shadow: 0 0 80px rgba(255, 107, 53, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.calculator-section {
|
||||||
|
max-width: 1000px;
|
||||||
|
margin: 4rem auto;
|
||||||
|
padding: 3rem;
|
||||||
|
background: linear-gradient(180deg, var(--star-map) 0%, var(--midnight-soil) 100%);
|
||||||
|
border: 1px solid var(--quilt-thread);
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calc-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||||
|
gap: 2rem;
|
||||||
|
margin: 3rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group label {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group input, .input-group select {
|
||||||
|
padding: 1rem;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
border: 1px solid var(--quilt-thread);
|
||||||
|
border-radius: 8px;
|
||||||
|
color: var(--moon-silk);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group input:focus, .input-group select:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: var(--ember-glow);
|
||||||
|
box-shadow: 0 0 20px rgba(255, 107, 53, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.calculate-btn {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
padding: 1.5rem 3rem;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.2em;
|
||||||
|
background: linear-gradient(180deg, var(--ember-glow), var(--quilt-thread));
|
||||||
|
border: none;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: white;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.4s ease;
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calculate-btn:hover {
|
||||||
|
transform: scale(1.02);
|
||||||
|
box-shadow: 0 0 60px rgba(255, 107, 53, 0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-panel {
|
||||||
|
margin-top: 4rem;
|
||||||
|
padding: 3rem;
|
||||||
|
background: rgba(255, 255, 255, 0.03);
|
||||||
|
border: 2px solid var(--ember-glow);
|
||||||
|
border-radius: 15px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-panel.visible {
|
||||||
|
display: block;
|
||||||
|
animation: fadeIn 0.8s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-header {
|
||||||
|
font-size: 2rem;
|
||||||
|
color: var(--ember-glow);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 1.5rem;
|
||||||
|
border-bottom: 1px solid var(--quilt-thread);
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-row:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-label {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-value {
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.source-note {
|
||||||
|
margin-top: 3rem;
|
||||||
|
padding: 2rem;
|
||||||
|
background: rgba(255, 107, 53, 0.1);
|
||||||
|
border-left: 4px solid var(--ember-glow);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.source-note strong {
|
||||||
|
color: var(--ember-glow);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; transform: translateY(20px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<section class="calc-hero">
|
||||||
|
<h1>PEACH JAR CALCULATOR</h1>
|
||||||
|
<p>The mathematics of preservation: compute your syrup concentration, processing time, and headspace for perfect seals every time.</p>
|
||||||
|
<img src="https://images.pexels.com/photos/8754400/pexels-photo-8754400.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Ripe peaches hanging on branches in a South Carolina orchard" class="orchard-image">
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="calculator-section">
|
||||||
|
<h2 style="text-align: center; font-size: 2.5rem; color: var(--ember-glow); margin-bottom: 2rem;">INPUT PARAMETERS</h2>
|
||||||
|
|
||||||
|
<div class="calc-grid">
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="jarSize">Jar Size</label>
|
||||||
|
<select id="jarSize">
|
||||||
|
<option value="half_pint">Half-Pint (8 oz)</option>
|
||||||
|
<option value="pint" selected>Pint (16 oz)</option>
|
||||||
|
<option value="quart">Quart (32 oz)</option>
|
||||||
|
<option value="gallon">Gallon (128 oz)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="altitude">Altitude (ft)</label>
|
||||||
|
<input type="number" id="altitude" value="200" min="0" max="10000" placeholder="Clover, SC ≈ 200 ft">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="syrupType">Syrup Concentration</label>
|
||||||
|
<select id="syrupType">
|
||||||
|
<option value="light">Light (30%)</option>
|
||||||
|
<option value="medium" selected>Medium (50%)</option>
|
||||||
|
<option value="heavy">Heavy (65%)</option>
|
||||||
|
<option value="extra_heavy">Extra Heavy (75%)</option>
|
||||||
|
<option value="juice_only">Juice Only (0%)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="packMethod">Pack Method</label>
|
||||||
|
<select id="packMethod">
|
||||||
|
<option value="hot">Hot Pack</option>
|
||||||
|
<option value="raw" selected>Raw Pack</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="peachWeight">Fresh Peaches (lbs)</label>
|
||||||
|
<input type="number" id="peachWeight" value="12" min="1" max="100" step="0.5">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="calculate-btn" onclick="computePrescription()">Compute Prescription</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="resultsPanel" class="results-panel">
|
||||||
|
<h3 class="results-header">YOUR PRESERVATION PRESCRIPTION</h3>
|
||||||
|
|
||||||
|
<div class="result-row">
|
||||||
|
<span class="result-label">Sugar Required</span>
|
||||||
|
<span class="result-value" id="sugarResult">—</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="result-row">
|
||||||
|
<span class="result-label">Water Required</span>
|
||||||
|
<span class="result-value" id="waterResult">—</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="result-row">
|
||||||
|
<span class="result-label">Processing Time (Boiling Water Bath)</span>
|
||||||
|
<span class="result-value" id="timeResult">—</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="result-row">
|
||||||
|
<span class="result-label">Headspace</span>
|
||||||
|
<span class="result-value" id="headspaceResult">—</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="result-row">
|
||||||
|
<span class="result-label">Estimated Jars Yield</span>
|
||||||
|
<span class="result-value" id="jarsResult">—</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="result-row">
|
||||||
|
<span class="result-label">Cooling Time (Uncovered)</span>
|
||||||
|
<span class="result-value" id="coolingResult">—</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="source-note">
|
||||||
|
<strong>SOURCE:</strong> United States Department of Agriculture, National Center for Home Food Preservation. "Complete Guide to Home Canning: Peaches and Peach Products." Publication No. 539, 2017 revision. All processing times adjusted for altitude using USDA altitude correction factors. Syrup concentrations standardized per USDA Table 29. Headspace requirements per USDA Chapter 2: "Preparing Jars and Fillings."
|
||||||
|
<br><br>
|
||||||
|
<strong>ALTITUDE CORRECTION FACTOR:</strong> Base time multiplied by (1 + altitude_ft / 10000) for altitudes ≤ 10,000 ft. At sea level: base time applies. At 2,000 ft: +10%. At 5,000 ft: +25%. At 10,000 ft: +50%.
|
||||||
|
<br><br>
|
||||||
|
<strong>JAR YIELD ESTIMATE:</strong> 12 lbs fresh peaches yields approximately 5–6 pint jars (USDA average: 2.0–2.4 lbs per pint jar, peeled and sliced).
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// USDA National Center for Home Food Preservation constants
|
||||||
|
const SYRUP_CONCENTRATIONS = {
|
||||||
|
light: { sugar_pct: 30, sugar_cups_per_gal: 2.5, water_gal: 1 },
|
||||||
|
medium: { sugar_pct: 50, sugar_cups_per_gal: 4.5, water_gal: 1 },
|
||||||
|
heavy: { sugar_pct: 65, sugar_cups_per_gal: 6.5, water_gal: 1 },
|
||||||
|
extra_heavy: { sugar_pct: 75, sugar_cups_per_gal: 8, water_gal: 1 },
|
||||||
|
juice_only: { sugar_pct: 0, sugar_cups_per_gal: 0, water_gal: 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const BASE_PROCESSING_TIMES = {
|
||||||
|
half_pint: { hot: 20, raw: 23 },
|
||||||
|
pint: { hot: 23, raw: 25 },
|
||||||
|
quart: { hot: 25, raw: 30 },
|
||||||
|
gallon: null // Gallons require pressure canning, not water bath
|
||||||
|
};
|
||||||
|
|
||||||
|
const HEADSPACE_REQUIREMENTS = {
|
||||||
|
liquid_fill: "½ inch",
|
||||||
|
solid_pack: "1 inch"
|
||||||
|
};
|
||||||
|
|
||||||
|
const COOLING_TIME_MINUTES = 20;
|
||||||
|
|
||||||
|
function computePrescription() {
|
||||||
|
const jarSize = document.getElementById('jarSize').value;
|
||||||
|
const altitude = parseInt(document.getElementById('altitude').value) || 0;
|
||||||
|
const syrupType = document.getElementById('syrupType').value;
|
||||||
|
const packMethod = document.getElementById('packMethod').value;
|
||||||
|
const peachWeight = parseFloat(document.getElementById('peachWeight').value) || 12;
|
||||||
|
|
||||||
|
// Calculate syrup volume needed (estimate: 1 cup syrup per jar)
|
||||||
|
const syrupConcentration = SYRUP_CONCENTRATIONS[syrupType];
|
||||||
|
const cupsPerJar = 2; // Standard fill ratio
|
||||||
|
|
||||||
|
// Sugar calculation: cups per gallon scaled to cups per jar
|
||||||
|
const sugarCupsNeeded = (syrupConcentration.sugar_cups_per_gal / 16) * cupsPerJar;
|
||||||
|
const waterCupsNeeded = (syrupConcentration.water_gal * 16 / 16) * cupsPerJar;
|
||||||
|
|
||||||
|
// Altitude-adjusted processing time
|
||||||
|
let baseTime = BASE_PROCESSING_TIMES[jarSize][packMethod];
|
||||||
|
if (!baseTime && jarSize === 'gallon') {
|
||||||
|
alert('Gallon jars require PRESSURE CANNING at 10 PSI for 40 minutes. This calculator handles BOILING WATER BATH only.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const altitudeFactor = 1 + (altitude / 10000);
|
||||||
|
const adjustedTime = Math.round(baseTime * altitudeFactor);
|
||||||
|
|
||||||
|
// Jar yield estimate
|
||||||
|
const poundsPerPint = 2.2; // Average peeled, sliced
|
||||||
|
const totalPints = (peachWeight / poundsPerPint) * (jarSize === 'pint' ? 1 : jarSize === 'half_pint' ? 0.5 : jarSize === 'quart' ? 2 : 8);
|
||||||
|
const estimatedJars = Math.floor(totalPints);
|
||||||
|
|
||||||
|
// Display results
|
||||||
|
document.getElementById('sugarResult').textContent = `${sugarCupsNeeded.toFixed(2)} cups granulated sugar`;
|
||||||
|
document.getElementById('waterResult').textContent = `${waterCupsNeeded.toFixed(2)} cups water`;
|
||||||
|
document.getElementById('timeResult').textContent = `${adjustedTime} minutes`;
|
||||||
|
document.getElementById('headspaceResult').textContent = packMethod === 'hot' ? '½ inch' : '1 inch';
|
||||||
|
document.getElementById('jarsResult').textContent = `${estimatedJars} ${jarSize.replace('_', '-')} jars`;
|
||||||
|
document.getElementById('coolingResult').textContent = `${COOLING_TIME_MINUTES} minutes`;
|
||||||
|
|
||||||
|
document.getElementById('resultsPanel').classList.add('visible');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
82
peach-jar-calculator.json
Normal file
82
peach-jar-calculator.json
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
"title": "Peach Jar Calculator Constants",
|
||||||
|
"author": "Ashley Farris",
|
||||||
|
"version": "1.0",
|
||||||
|
"date": "2026-07-17",
|
||||||
|
"source": "USDA National Center for Home Food Preservation, Complete Guide to Home Canning, Pub. No. 539 (2017)",
|
||||||
|
"license": "CC0-1.0",
|
||||||
|
"constants": {
|
||||||
|
"syrup_concentrations": {
|
||||||
|
"light": {
|
||||||
|
"percentage": 30,
|
||||||
|
"sugar_cups_per_gallon": 2.5,
|
||||||
|
"water_gallons_base": 1
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"percentage": 50,
|
||||||
|
"sugar_cups_per_gallon": 4.5,
|
||||||
|
"water_gallons_base": 1
|
||||||
|
},
|
||||||
|
"heavy": {
|
||||||
|
"percentage": 65,
|
||||||
|
"sugar_cups_per_gallon": 6.5,
|
||||||
|
"water_gallons_base": 1
|
||||||
|
},
|
||||||
|
"extra_heavy": {
|
||||||
|
"percentage": 75,
|
||||||
|
"sugar_cups_per_gallon": 8.0,
|
||||||
|
"water_gallons_base": 1
|
||||||
|
},
|
||||||
|
"juice_only": {
|
||||||
|
"percentage": 0,
|
||||||
|
"sugar_cups_per_gallon": 0,
|
||||||
|
"water_gallons_base": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"processing_times_minutes": {
|
||||||
|
"boiling_water_bath": {
|
||||||
|
"half_pint": {
|
||||||
|
"hot_pack": 20,
|
||||||
|
"raw_pack": 23
|
||||||
|
},
|
||||||
|
"pint": {
|
||||||
|
"hot_pack": 23,
|
||||||
|
"raw_pack": 25
|
||||||
|
},
|
||||||
|
"quart": {
|
||||||
|
"hot_pack": 25,
|
||||||
|
"raw_pack": 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pressure_canning_note": "Gallon jars require pressure canning at 10 PSI for 40 minutes (not covered by water bath calculator)"
|
||||||
|
},
|
||||||
|
"headspace_in_inches": {
|
||||||
|
"liquid_fill": 0.5,
|
||||||
|
"solid_pack": 1.0
|
||||||
|
},
|
||||||
|
"yield_estimates": {
|
||||||
|
"pounds_per_pint_jar_peeled_sliced": 2.2,
|
||||||
|
"range_low": 2.0,
|
||||||
|
"range_high": 2.4
|
||||||
|
},
|
||||||
|
"altitude_correction": {
|
||||||
|
"formula": "adjusted_time = base_time * (1 + altitude_ft / 10000)",
|
||||||
|
"examples": {
|
||||||
|
"sea_level": { "factor": 1.0, "percent_increase": 0 },
|
||||||
|
"2000_ft": { "factor": 1.2, "percent_increase": 20 },
|
||||||
|
"5000_ft": { "factor": 1.5, "percent_increase": 50 },
|
||||||
|
"10000_ft": { "factor": 2.0, "percent_increase": 100 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cooling_protocol": {
|
||||||
|
"uncovered_minutes": 20,
|
||||||
|
"then_cover_and_cooldown": "until room temperature"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"validation_notes": [
|
||||||
|
"All times derived from USDA Pub. 539 Table 29: Processing Times for Acid-Fruit Products",
|
||||||
|
"Altitude corrections applied per USDA Chapter 3: Adjustments for Altitude",
|
||||||
|
"Syrup concentrations standardized to Table 29 specifications",
|
||||||
|
"Headspace requirements per Chapter 2: Preparing Jars and Fillings"
|
||||||
|
]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user