# Bloomsteader

**An offline garden planner that runs from a single file.**

No account, no subscription, no internet, no server. A one-time purchase from
$9.99. 446 plants with companion, spacing and rotation checks; a calendar built
from your own frost dates; drag-and-drop bed layouts; harvest planning; and the
full reference text, searchable, inside the app. Everything stays on your
device.

Works on a desktop and on a phone.

**About the catalog:** the full reference — all 446 plants, including the 122
whose entries carry safety or legal warnings, each shown in red on its plant.
A pre-v2 snapshot of the build is kept working in `archive/pre-v2/` — see the
README there.

**v6.2 is the diagnosis release** — a fifteenth view that answers the question
a gardener actually asks out loud: *what is wrong with this plant?* A guided
read (which plant, where it shows, what you can see, what changed lately)
ranks 37 causes and says plainly when several of them fit; a symptom key
behind the second tab works from 42 symptoms back to their causes. The half
that was missing is the abiotic half — over- and under-watering, seven nutrient
deficiencies with their look-alike traps, heat, frost, light, herbicide drift,
transplant shock, root-bound pots, pH lockout, bolting and pollination failure
— sitting as equals beside the pests and diseases, because "why is my plant
failing" is answered *the hose* more often than *a beetle*. Every candidate
carries how to be sure, what to do least-drastic-first, and what it is most
often mistaken for. In every tier, all of it: diagnosis is correctness.
See CHANGELOG.md.

**v6.0 is the pricing release** — Bloomsteader is a paid app in three tiers,
each a one-time purchase with founder pricing until launch closes:

| Tier | Founder | After launch | What it is |
|---|---|---|---|
| **Bloomsteader** | $9.99 | $14.99 | The planner, the whole 446-plant catalog, every safety warning, 60 photos |
| **Bloomsteader Lite** | $19.99 | $24.99 | Plus themes and dark mode, unlimited photos, dated succession schedules, plan-into-bed planting, the premium PDF exports, germination tests, the reorder list and the Year in review |
| **Bloomsteader Full** | $29.99 | $34.99 | Plus all five content packs, unlocked inside the app — nothing to import |

Content packs are still sold on their own ($4.99–7.99 each, $24.99 for all
five) as signed `.rwpack` files, for anyone below Full. A key carries its
tier, is verified offline, and works on every device you own; upgrading is a
new key, never a new app. **The gate never traps a garden** — Export is on
the licence screen with no key entered, and always will be. Keys issued
before v6.0 (`p:'pro'`) are honoured as Lite. Inside the app you bought,
nothing correctness- or safety-related is ever behind a paywall: the
catalog, the warnings, the beds, the calendar, the journal and the reference
text are in every tier. See CHANGELOG.md for the full list and
LAUNCH-CHECKLIST.md before publishing.

**v5.0 is the tending release** — the care-task engine (the dated jobs
between sowing and harvest, checkable into the journal), a seed drawer with
honest viability odds, pest & disease strips, per-bed soil and microclimates,
season-extension arithmetic, sun-geometry shading checks, rain logging,
garden areas, backup nudges, a sample garden on first run, a keyboard and
screen-reader pass on the planner — and four new content-pack types (Pests &
Disease, Soil & Compost, Season Extension, Preserving), with their payloads
and signing tooling in `packs-unsigned/`. The paid tiers grow germination tests, the
reorder list, the printable seed-starting calendar and the Year in review.
See CHANGELOG.md for the full accounting.

**v5.1 is the kitchen release** — a Kitchen view of recipes keyed to the
crops you grow: 44 baked into every tier across the twenty most-grown food crops,
46 more plus technique essays in a purchasable **Recipes pack**
(`recipe-book`, payload in `packs-unsigned/`), "In the kitchen" strips on
catalog pages, and printable recipe cards with Lite. No canning recipes exist in
either tier, by schema: recipe methods are freezer, dryer, ferment and
refrigerator only, and shelf-stable canning stays with the tested sources
the Preserving pack names. Every recipe carries a per-pound scaling basis —
the hook the harvest-aware phase will hang from. See RECIPES-PLAN.md for
the design record and CHANGELOG.md for the accounting.

**v5.2 is the growth release** — the app learns to earn its install. The
welcome screen leads with the promise instead of the warning, the sample
garden is a proper button, an empty Today points at making your first bed,
and the install prompts — including Add-to-Home-Screen guidance for iOS
Safari, which previously got none — wait until there is a garden worth
keeping before they speak. Plus a polish sweep: a truthful version badge,
a scroll fade on the phone's top strip, toasts that clear the bottom bands,
and a safety strip that folds to its ⚠ for the session. See
UI-RECOMMENDATIONS.md for the thinking and CHANGELOG.md for the accounting.

**v4.0 adds a Shop** — a curated, every-tier storefront of seeds,
tools, supplies, work clothes and Bloomsteader's own merch, with a cart that
hands off to the stores. Nothing is sold *by* the app: every product is a
link that opens the store in a new tab only when you tap it, so the app
itself still sends nothing anywhere. Some links may earn a commission
(disclosed in the app); the catalog can be corrected after release by signed
`shop-catalog` packs. See CHANGELOG.md.

![Bloomsteader planning a raised bed](screenshots/desktop-bed.png)

---

## Getting it

**On a phone or tablet — open it and add it to your Home Screen.**

1. Open the app in your phone's browser.
2. **iPhone / iPad:** Share → **Add to Home Screen**. It must be Safari; Chrome on
   iOS cannot do this.
   **Android:** tap **Install** in the app's top bar, or use the browser menu.
3. Open it from the icon from then on. It works with no signal and keeps your
   garden indefinitely.

**On a desktop — download the file.**

Download `download/bloomsteader.html`, put it anywhere, and double-click it.
That is the whole installation. It is yours; nothing can withdraw it.

> **Why not just download the file to a phone?** On iOS a downloaded HTML file
> often opens in a preview that will not run properly, and Safari erases the
> stored data of a local file after about a week without warning. Added to the
> Home Screen it is exempt from that. On a desktop the downloaded file has no
> such problem.

---

## What is in the box

```
index.html          the landing page — what you upload as the front door
app/                the hosted copy: index.html + manifest.json + sw.js + icons
download/           bloomsteader.html, the single downloadable file
archive/pre-v2/     the retired original build (446 plants, its own README) —
                    complete and working, not part of what you publish
screenshots/        images used by the landing page and this file
tests/              nine regression suites, 792 checks — see "Running the
                    tests"; all pass against this build
packs-unsigned/     the five pack payloads (four from v5, the v5.1
                    Recipes pack), SIGNING.md, and the
                    make-bloomsteader-pack.html seller tool (move that file
                    to your seller folder; never publish the seller folder)
LICENSE             MIT, plus a plain-language notice about plants
CHANGELOG.md        what changed, version by version
GITHUB-STEPS.txt    how to publish this, written for someone who has never
                    used GitHub
```

`app/index.html` and `download/bloomsteader.html` are **byte-identical**.
It is one build. The manifest link, the Apple touch icon and the service worker
are added by the app itself at runtime, and only when it detects it is being
served over http(s) — the download folder holds nothing but the HTML, so a
static link to any of them would be a guaranteed 404 there. So
the same file works correctly from a web address and from a local disk, with no
separate "web version" to keep in step. (The same rule holds for the archived
pair in `archive/pre-v2/`.)

This build saves under the storage keys `rootwork.v2` and `rootwork-photos-v2`
— kept from when it was introduced, deliberately, so no one's garden is
orphaned by a rename — which are distinct from the archived original's keys,
so it can sit beside an installed copy of that build on the same device
without either touching the other's garden.

---

## What it does

**446 plants** parsed from the reference, with zones, season, sun, water,
spacing, days to harvest, container fit, root depth, difficulty, US nativity,
harvest window and deer rating, with companion guidance and plant families
throughout. Every safety or legal warning in the reference — 122 plants carry
one — is shown in red on its plant.

**Smart checks** — pairwise and group-level keep-apart, same-family
co-planting, rhizomatous runners, acid-soil plants, Verticillium hosts after
nightshades, walnut root zones, family rotation intervals per bed per year,
sun / zone / container-depth fit, water-regime mismatch, spacing overflow and
physical overlap.

**A frost engine** — zone averages for USDA zones 3–10, overridable with your
own dates. It drives every sowing, transplant, harvest and cover-crop window,
with garlic and cover crops special-cased and three weeks added to fall sowings
for shortening days.

**A harvest planner** — state a target in pounds, servings or quart jars and it
returns plants needed, bed area, succession sowings and years to bearing.
Backed by yield data researched for 343 food crops: 140 extension-published
figures and 203 estimates, each tagged and sourced in the interface. It refuses
to answer rather than guess.

**Bed layouts** — grid or free placement with a snap toggle, drawn to scale,
printable. On a phone: pinch to zoom, drag with a finger.

**A care-task engine** (v5) — the tending calendar derived from the same
frost engine: thinning, potting up, hardening off, staking, hilling, netting,
side-dressing, pruning — dated rows on Today with the why, checkable into the
journal, snoozable, deepened by the Pests & Disease pack's prevention tasks.

**A seed drawer** (v5) — the packets you own, with extension-published
viability odds and (Lite) your own germination tests; the supply list says
"in the drawer" instead of "buy it", and Lite diffs next year's plan against
the drawer into a reorder list.

**A journal** — notes, waterings, rain, amendments, tasks done, harvests and photos. **A seed & supply list**
built from what is actually planted, exportable as text or CSV. **The full
reference**, searchable, inside the app.

**A kitchen** (v5.1) — recipes keyed to catalog crops, glut-first: searchable,
filterable by crop and category, echoed on each crop's catalog page, and
deepened by the Recipes pack. Preserving recipes are freezer, dryer, ferment
and refrigerator only — no canning process figures appear anywhere, and the
pack sanitizer drops any recipe that states one.

**Putting up** (v6.1) — the season a food garden peaks in. A crop-first
decision helper answers *"I have twelve pounds of beans; now what?"* in honest
order: eat it fresh with the storage clock attached, cure and store,
freeze/dry/ferment/fridge with each recipe scaled against the pounds in hand,
and then the jars. It plans the canning day in jars and lids — the researched
pounds-per-quart run backwards, refusing where no figure is published — puts
dated putting-up reminders on Today through the care engine, and lists what
each method's day actually needs. **No process figures, ever:** times,
pressures and headspace come from your tested source (NCHFP, USDA, Ball) for
your jar size and altitude, every canning row says so, and the same scan that
guards pack prose guards the app's own copy.

**The Pantry** (v6.1) — the seed drawer for the other end of the year. What
you put up, in what, when, and — for canned goods — from which tested recipe,
because a jar's provenance is its safety record. Honest shelf life, stated as
what it is: for home-canned goods the clock measures *quality*, not safety.
Oldest first, checked off as you eat it.

**Diagnose** (v6.2) — why is this plant failing? Answer four questions — which
plant, where it shows, what you can actually see, what has changed lately —
and the likely causes rank, each with how to be sure, what to do
least-drastic-first, and the look-alike it is most often confused with.
Watering, nutrition, weather and culture are weighed as seriously as pests and
disease, because most failing plants are not being eaten. Where the top two
candidates are within a point of each other it says so before it says anything
else. A symptom key runs the same engine backwards for scanning, the plant
drawer opens it pre-filled, the crop's own troubles strip (and the Pests &
Disease pack's depth) is cross-matched in, and a confirmed diagnosis can be
logged to the journal and put dated rechecks on Today. Free at every tier.

**Share cards** (v6.1) — the bed plan, the year at a glance, a harvest, the
pantry shelf and the putting-up season, rendered to PNG on canvas, offline.
Free at every tier.

**A shop** (v4.0) — five shelves of curated products with a cart that hands
off to the stores. Every link opens in a new tab and loads only when tapped;
the printed and exported supply lists never carry shop links.

---

## Your data

Bloomsteader saves as you work, in your browser's own storage, on that one device.
It is not synced anywhere and there is no copy in the cloud.

**Use Settings → Export garden file regularly.** It writes a real `.json` file
you can back up, keep dated versions of, or move to another computer. Import
reads it back, photos included. Clearing your browser's site data will erase
the garden; an exported file survives it.

---

## Limits, stated plainly

- **Frost dates** default to zone averages, which can be two to three weeks off
  for a particular site. The app says so on every screen that derives a date
  from them, and invites the override.
- **Yield figures** are ranges, and wide ones. 203 of 343 are estimates; nine
  crops have no usable figure at all. All of it is labelled rather than smoothed
  over.
- **Bed area** is the larger of two lower bounds — the spacing footprint and the
  researched lb-per-square-foot — because each is a floor for a different
  reason. Where they disagree by more than 2.5×, the app shows both and names
  the one it used.
- **Container yield factors** exist for only 37 crops; the rest use the
  open-ground figure and say so.
- **Rotation warnings** are only as good as the recorded history. Past years can
  be entered by hand in Edit bed.
- **Photos** are capped at 60 on Bloomsteader (no cap with Lite or Full) and shrunk to
  1000 px.
- **Two tabs**: the second one goes read-only rather than merging, and says so.
- **29 February** is treated as 1 March by the day-of-year helper. Known,
  measured at exactly one day once every four years, and deliberately left
  alone.
- **Zones** are USDA 3–10. Useful elsewhere if you know your equivalent, but the
  plant list and the frost model are US-centred.
- **Very long beds** draw their markers at a minimum size, so on something like
  a 30 ft row the markers overlap each other however far apart the plants
  actually are, and a tap can land on the neighbour. Zoom in to separate them.
  This is unchanged from v1.4 — the touch work was explicitly capped so it does
  not make it worse.

---

## Safety

**Bloomsteader is a planning aid — not medical, safety, legal or foraging advice,
and not a substitute for expert identification.**

Many of the plants described here are toxic in some or all of their parts, cause
skin reactions, interact with medication, are invasive, or are restricted or
illegal to grow in some places. Several closely resemble plants that are
dangerous. Where the reference carries a warning, Bloomsteader shows it in red on
that plant.

Before you eat, brew, apply, handle or plant anything: confirm the
identification and the legal position with your local cooperative extension
service, a qualified botanist, or an equivalent authority in your country.
Never use a plant medicinally without advice from a qualified practitioner.

Provided as-is. No liability is accepted for any loss, illness, injury or
damage arising from use of this software.

---

## Running the tests

Nine suites, 792 checks, against a built file. As of v6.0 **all of them have
been executed against the published build and pass** — the long-standing
"never run on the build machine" caveat is retired. The v5 triage (restored
pre-split APIs, the rootwork.v2 storage key, two real phone bugs the suites
caught, and a handful of assertions that predated documented v4.2.2 fixes)
is recorded in CHANGELOG.md.

```
npm install playwright
npx playwright install chromium
node tests/suite.js  download/bloomsteader.html   # 82 — first code review
node tests/suite2.js download/bloomsteader.html   # 60 — second
node tests/suite3.js download/bloomsteader.html   # 53 — the v1.3 additions
node tests/suite4.js download/bloomsteader.html   # 87 — third review
node tests/suite5.js download/bloomsteader.html   # 159 — v2.0: phone, install, notice
node tests/suite6.js download/bloomsteader.html   # 49 — v4.0: the Shop, cart, packs
node tests/suite7.js download/bloomsteader.html   # 121 — v5.0/5.1: tending, drawer, packs, Kitchen
node tests/suite8.js download/bloomsteader.html   # 76 — v6.0: the licence, tiers, baked packs, the gate as a layer
node tests/suite9.js download/bloomsteader.html   # 105 — v6.2: Diagnose — the key, the engine, both doors, the follow-ups
```

All nine must pass. Two known flaky spots, neither of them the app: suite 1's
check #30 is a timing check and is mildly flaky on a loaded machine, and
**suite 6's cart section fails eight checks in roughly one run in three** — a
race in that suite's own `reload()`-then-`sleep(1600)` step, which the
untouched v6.1 build reproduces at the same rate. Re-run before believing
either. Suite 5's nav counts track the sidebar (fifteen views since v6.2), the
phone More sheet (ten items) and the version badge; suite 6 pins the sidebar
count and the service-worker major version; suite 8 pins the badge too.

**Since v6.0 every suite needs a licence key**, because the app opens on the
licence gate. None is committed: `tests/licence.js` mints one at run time
from the private JWK in the seller folder (`../Rootwork/rootwork-v4-seller/`,
overridable with `BLOOMSTEADER_SELLER_DIR`), or takes a ready-made key from
`BLOOMSTEADER_TEST_KEY_BASE` / `_LITE` / `_FULL`. Suites 1–7 seed the **base**
tier, which is the state they have always run in: the app open, `RW.pro`
false, no packs. Suite 9 does too, and only reaches for a Full key to prove
that Diagnose looks identical under one. Without either source they exit 2 and
say so.

Suites 1–4 are unchanged from v1.4 and run at 1280 × 900. That is deliberate:
they are the gate that proves the desktop app was not altered by the responsive
work.

Suite 5 runs at phone, tablet and desktop widths. It was run against v1.4 as
well: 159 of its checks apply there and **127 of them fail**, which is what
makes them evidence rather than decoration. The 32 that pass on v1.4 are
supposed to — most assert that the desktop and the `file://` build did *not*
change; the rest are "no page errors" guards, preconditions for other checks,
and blocks that skip themselves. Four checks in an earlier draft passed against
v1.4 for the wrong reason and were rewritten; see the header of `suite5.js`.

Section I of suite 5 is separate: those checks cover the fourteen defects a
code review found in the *first* v2.0 build, before release. They fail against
that build rather than against v1.4.

---

## Building on it

The built `bloomsteader.html` is self-contained and is the artifact that matters.
To edit it, split on the `<style id="rw-css">`, `<script id="rw-data">` and
`<script>` boundaries, change the parts, and concatenate them back in order —
verifying the round trip is byte-identical *before* you edit anything.

The JS is one script. Module `00-core` is at top level; `10-model` through
`99-boot` are IIFEs that close over core's names and destructure from the
global `RW` object at entry, so anything a later module destructures must be
assigned to `RW` in core first. The concatenation order is **not** alphabetical:
`45-export` and `50-harvest` come after `90-list`.

---

## Credits and licence

Plant data, companion guidance and the reference text come from *Edible &
Useful Plants for the Home Garden*, which draws on Garden.org, the USDA PLANTS
Database, The Old Farmer's Almanac and US cooperative extension services.

MIT licence — see [LICENSE](LICENSE). Use it, change it, share it, sell it if
you like; keep the licence with it, and understand that it comes with no
warranty.
