LeeWard
Sheltered Side · Steady Course

Chart a steadier
course through rough water.

WardStock is a personal health log for anxiety, cardiac symptoms, sleep, and everything that steadies a hard day — built to be exact when it matters and simple enough to reach for in the moment.

LEEWARD, N. — the side sheltered from the wind. Where a ship finds its steadiest water.

LeeWard emblem
Bearing

Anxiety and cardiac episodes don't wait for a calm moment to happen. WardStock is built to be opened one-handed, mid-squall, and to hold everything steady until you can look back and see the pattern.

Ship's Manifest

Everything aboard

HOLD 1
Incident Log
Anxiety and cardiac episodes, logged the moment they happen — symptoms, duration, what helped, whether it matched the usual pattern. Multiple entries a day, no limit, because real episodes don't schedule themselves.
HOLD 2
Daily Log
Sleep, exercise, caffeine, alcohol, medication, and mood — the daily readings that put every incident in context. Sleep tracked the way you actually think about it: hours and minutes, not decimals.
HOLD 3
Medications
Full dosage history, not just a current list — every change preserved, every due date calculated correctly, whether it's daily, weekly, or once a fortnight.
HOLD 4
Therapy
Session notes, a recurring schedule with its own reminders, and a "since last time" report — incident counts, averages, and totals — ready before you sit down.
HOLD 5
Oura Ring Sync
Sleep, resting heart rate, and HRV pulled in automatically — one less thing to type in by hand on a day that's already asking a lot.
HOLD 6
Export & Import
Your log is always yours — a complete, portable export, restorable anywhere. Nothing locked to one vessel.
Two Vessels, One Fleet

At sea, and at harbor.

WardStock is built in two pieces, deliberately. One is the vessel you sail — always reachable, wherever you are. The other stays at harbor, at home, doing the deeper work in private. Nothing about how it's split is an accident: the thing you need to always be able to open stays simple and open; the thing doing the heavy analysis runs quietly ashore, on hardware you own — never shipped out to someone else's cloud.

At Sea — WardStock

The vessel you sail

  • Reachable from anywhere, any time — the app you actually open
  • Incident log, daily log, medications, therapy, dashboard
  • Built to be exact in the moment, not just after the fact
At Harbor — The wherewhen Engine

The work done ashore

  • Runs privately on your own home server — not a shared cloud
  • High-resolution readings and long-range trend analysis
  • Raw data and analytics never leave your house
Reading The Deck

Signal flags, at a glance

All clear
Worth a look
Needs attention
Nothing logged

The seven-day dashboard reads like a deck of signal flags — color carries the meaning, so a glance tells you more than a paragraph could. Every flag opens straight into the log behind it.

Sample Log Entry
DATE — Tuesday, 06:42
CATEGORY — Anxiety
DURATION — 14 min
PATTERN — Consistent with prior
SLEEP (7 days) — 6h 51m avg
STATUS — Logged, steady

Built to be exact when it matters most.

Not a dashboard for its own sake — a steadier way to hold the details, so the pattern is there to see when you need it, and out of the way when you don't.

Personal use only. One vessel, one crew, one log.

The Chart Room

What the wherewhen engine reads.

Every analysis below runs quietly at harbor, on the wherewhen engine — never in the cloud. Reference numbers and names match the Analysis page exactly, so a chart on screen and an entry here are always the same thing. "Input" is what feeds it; "Reads" is what it actually computes from that input — a trend, a correlation, a count, or (for a few) just a clean record with nothing computed at all.

Headline — the core function of this page
#17
Full correlation matrix
Input — incidents, alcohol, caffeine, weight, mood, sleep efficiency, HRV, exercise minutes.
Reads — every pairwise combination of those eight, correlation coefficient plus how many paired days it's based on. The one chart meant to surface a link nothing else would think to check.
#18
Unreported-anxiety detection
Input — HRV, resting heart rate, and sleep efficiency, split into "days with a logged incident" vs. "days without."
Reads — flags a day with nothing logged whose HRV/resting-HR/sleep-efficiency all sit on the wrong side of the incident-day averages at once — a pattern match, not a diagnosis.
#19
Bedtime / wake-time trend
Input — Oura's own bedtime timestamp and time-in-bed per session.
Reads — one connected bar per night, bedtime to wake time, in real clock time — not duration, just when.
#20
Sleep-stage timeline (hypnogram)
Input — Oura's sleep stage every 15 minutes (deep/light/REM/awake), the longest session in range.
Reads — a colored timeline of one full night, not a statistic.
Automatic — Oura, scale, medication schedule
#1
Sleep duration trend
Input — Oura total sleep duration.
Reads — day-by-day trend, hours.
#2
Sleep efficiency trend
Input — Oura sleep efficiency.
Reads — day-by-day trend, percent. Kept separate from duration — a full-but-fragmented night and a short-but-efficient one are different problems.
#3
HRV trend
Input — Oura average HRV during sleep.
Reads — day-by-day trend, milliseconds. Watched for upward movement specifically — higher HRV generally reads as better recovery.
#4
Resting heart rate trend
Input — Oura lowest heart rate during sleep.
Reads — day-by-day trend, bpm. The other core autonomic marker alongside HRV.
#5
Body composition trend
Input — weight plus whatever else the scale reports (body fat%, muscle mass, visceral fat%).
Reads — day-by-day trend, one per field tracked.
#6
Exercise / activity trend
Input — steps, exercise minutes, standing minutes.
Reads — three separate day-by-day trends.
#7
Weight vs. medication cadence
Input — weight, plus every weekly/bi-weekly medication dose.
Reads — average weight in the 3 days before vs. 3 days after each dose.
#8
Medication dosage-change correlation
Input — dosage-change history, plus weight, HRV, mood, and incidents.
Reads — 14-day average of each, before vs. after every dosage change.
#9
Medication adherence vs. incidents
Input — "all medications taken?" from the Daily Log, plus incidents.
Reads — incident rate on missed-dose days vs. full-adherence days.
Reported — incidents + Daily Log + therapy
#10
Alcohol & caffeine vs. sleep
Input — Daily Log alcohol/caffeine counts, plus Oura sleep efficiency.
Reads — correlation coefficient, each factor against sleep efficiency.
#11
Mood / state-of-mind trend
Input — Daily Log mood rating and state of mind, plus sleep efficiency, alcohol, caffeine, and incidents.
Reads — trend for mood and state of mind, plus a correlation of mood against each of the other four.
#12
Symptom & category clustering
Input — incident category (anxiety/cardiac/medical) and symptom checkboxes.
Reads — count by category, and the most common symptom pairs seen together.
#13
Day-of-week / time-of-day incident clustering
Input — incident timestamps.
Reads — count by day of week and by hour of day, looking for a pattern in when episodes happen.
#14
Incident intensity/duration trend
Input — logged anxiety intensity and duration, per incident.
Reads — two day-by-day trends — the most direct "getting better or worse" view in the whole set.
#15
Therapy session effects
Input — mood before/after each therapy session, plus incidents.
Reads — average mood change per session, and incident counts in the 7 days before vs. after each one.
#16
Night-waking context
Input — free-text night-waking notes from the Daily Log.
Reads — a chronological list, not a statistic — why Ward woke, in his own words, alongside Oura's own sleep-stage record of when.
How sleep time is actually calculated

Sleep duration, sleep efficiency, HRV, resting heart rate, and the bedtime/wake-time chart (#1-4 and #19) all come from the same underlying idea, worth spelling out since it isn't obvious: a wearable ring or watch doesn't hand over one clean "you slept from X to Y" answer — it reports sessions, and wherewhen has to decide which session is actually last night.

This build reads an Oura ring, but nothing about the approach is specific to Oura — any device that reports a session's start and end time, whether it was real sleep or a false alarm, and roughly how long it lasted would fit the same model. Oura happens to be what Ward wears.

Oura itself already sorts sessions into a few kinds: a real overnight sleep, a shorter confirmed nap, a late-evening nap credited to the next day, and — usefully — sessions Ward reviewed and rejected as a false alarm (the ring mainly tracks movement on the hand it's worn on, so sitting still at a desk for long enough can occasionally get misread as a nap). Only the real-overnight kind counts as "the night" for these charts; false alarms and short naps are left out, and if more than one real overnight session somehow exists for one calendar night, the longer one wins.

Bedtime is simply when that session started. Wake time is Oura's own answer for when it truly ended — sustained time out of bed, not just the first stir — used directly whenever the device provides it. A brief middle-of-the-night wake-up that leads right back to sleep is the device's own call, not something wherewhen merges or splits; it just reads whatever boundaries the device already decided on. Any reading clearly outside what's physically possible (a negative duration, an efficiency over 100%) is dropped before it's ever considered, on any device.

The Engine Room

What keeps the ship running.

Every chart in the Chart Room is fed by one of these — the standing crew of automated jobs that run quietly at harbor, on the wherewhen engine, whether or not anyone's looking. "Runs" is how often; a few are deliberately hands-on-the-wheel only, for moments too consequential to leave to a timer.

Bringing data in
15 min
GoDaddy Pull
Pulls incidents, Daily Log, and Therapy entries down from WardStock as they're logged — feeds the charts, and doubles as a running disaster-recovery archive.
Every 4h
Oura Sync
Pulls sleep, readiness, and activity data from the ring, then pushes the same summary WardStock understands back up — anchored to 10am so the previous night's sleep is caught promptly.
Daily, ~noon
Body Composition Import
Watches for a fresh export from the smart scale, folds every metric it reports into the trend, and pushes just the day's weight up to WardStock.
Manual
Medical History Import
Watches for structured medical-history records and turns each into a proper cardiac/medical incident — a one-time on-ramp for history that predates WardStock itself.
Manual
Oura Backfill
A deliberate, wide historical pull for a chosen date range — the full-fidelity version of what Oura Sync only ever captures one day at a time.
Turning it into charts
Daily / Weekly / Monthly + Manual
wherewhen Analysis Engine
Computes all 20 analyses in the Chart Room and pushes each result back to the Analysis page — daily at ~12:15pm, weekly Sunday 4am, monthly on the 1st, plus an on-demand all-history run.
Keeping watch
15 min
Status Heartbeat
Checks in on every other flow's last run and reports one consolidated "is everything actually working" snapshot — the signal behind WardStock's own System Status page.
Keeping a spare
Daily 3am + Manual
GoDaddy Backup
Mirrors WardStock's full current state — incidents, Daily Log, Therapy, Medications, dosage history — into a local copy at harbor, so it exists somewhere besides the one hosted database.
Weekly Sun 3am + Manual
wherewhen Data Export
Backs up everything that only ever lived in the analysis engine itself — the high-fidelity Oura archive, body composition, computed results — so none of it is a total loss if the engine ever needs rebuilding.
In case of emergency — manual only, by design
Manual
GoDaddy Restore
Pushes GoDaddy Backup's local copy back up to WardStock — the recovery half of "keeping a spare," for if the hosted database itself is ever lost.
Manual
GoDaddy Restore (from file)
Same recovery, from an outside backup file instead of the local copy — for restoring from an export that predates GoDaddy Backup ever having run.
Manual
wherewhen Data Restore
Rebuilds the analysis engine's own data from a wherewhen Data Export backup — for a freshly rebuilt engine, not a routine restore.

Every one of these runs entirely at harbor — nothing here calls out to WardStock except to read or write the exact fields it already understands, and nothing raw ever leaves the home network.