vialfile

Weekly digest

Last seven days, on one page — what you injected, what hurt, what's due. Print it for your prescriber or keep it in your own records.

Injections

Side-effects (severity 3 and above)

Bloodwork due in next 4 weeks

Inventory — low or running out

What changed since last week

Weekly-digest FAQ

What's the "Active stack:" header at the top of the digest?

When you have an active stack set on the stack page, the digest opens with a one-line header naming the peptides in the cycle and how long the cycle has been running — e.g. "Active stack: BPC-157 + GHK-Cu + CJC-1295 (started 41d ago)". Names are alphabetical for deterministic output; the elapsed-days figure is computed from the earliest startDateIso across items so the number reflects the age of the cycle the rollup is describing, not any individual item's add-date. Unknown peptide ids (stale stacks from older releases, etc.) are filtered silently so the line never shows a bare id. When no stack is active, the slot is hidden. Same header prefixes the "Copy as text" output as ACTIVE STACK: so a prescriber gets the cycle identity before the INJECTIONS section.

What's the "Adherence: …" line under the Active stack header?

A one-line execution-side mirror of the active-stack header — e.g. "Adherence: BPC-157 5x · CJC-1295 2x · GHK-Cu 3x". For each peptide on the active stack, we count valid log entries in the trailing 7-day window (the same "is this stack actually current?" window that drives the per-item sparkline on the stack page). The header tells the prescriber which peptides you set out to run; this line tells them what you actually did. Names are alphabetical (matching the header), peptides with zero recent injections are hidden so the line stays a positive-signal scan rather than a checklist of misses, and the slot collapses entirely when no item has any logged dose in the window — meaning you have an active stack on paper but haven't run it yet, or all entries fell outside the 7-day window. The count is byte-aligned with the per-item sparkline on the stack page via a single shared stackItemActivityCount primitive, so the two surfaces can never silently disagree on the same stack-and-log fixture (a freeze test in the test runner guards against drift). Mirrors into the "Copy as text" output as an ADHERENCE: sub-line directly under the ACTIVE STACK: header. Pure derivation — read-only over vialfile-stack-v1 + vialfile-log-v1, no new storage, no network.

What's the "N injections across M peptides this week" line?

A week-over-week totals glance sitting above the per-peptide injection roster. It counts every entry in your log in the last seven days, breaks it by unique peptide, and compares to the prior seven-day window so you can spot cadence drift at a glance. The muted parenthetical shows last week's count, peptide breadth, and the signed delta — "up 4" if you stepped up injection frequency, "down 2" if you pulled back, "no change" if identical. The first week you track, it says "first week tracked" instead of "(0 last week)" so a brand-new account doesn't read as a drop-off. Nothing is sent anywhere; the totals are derived from the same vialfile-log-v1 storage the rest of the digest reads from.

Why only severity 3 and above?

Below severity 3 is usually expected-and-managed (mild injection soreness, slight appetite change). Surfacing those crowds the signal. Severity 3+ is the threshold where a reasonable clinician would want to hear it. You can still view all entries on the side-effect log directly.

Why 4 weeks ahead for bloodwork?

Four weeks is the typical booking lag for a lipid panel or IGF-1 draw at most clinics. If it's due within four weeks we flag it so you can book the appointment now. Already-overdue protocols are surfaced regardless of how long ago they drifted.

What's the "Next: …" line above the bloodwork cards?

A one-line scannable rollup naming the 1–2 closest-due protocols — e.g. "Next: IGF-1 in 5d · BPC-157 12d overdue". Sorted by ascending daysUntil so already-overdue draws surface first (they're the higher-priority ones to book), then the soonest in-future draw. Each label uses the canonical peptide name from the library, not the raw id. Three formats: "{peptide} in Nd" when due in the future, "{peptide} today" when the draw is on the current day, and "{peptide} Nd overdue" when the draw window has passed. Capped at 2 entries by default so the digest header doesn't crowd; the per-protocol cards immediately below carry the full picture (status pill, next-draw date, cadence, library cadence string). The slot is hidden when no protocols are due in the 4-week window. The same line mirrors into the Copy-as-text output as a NEXT: sub-line directly under the BLOODWORK section header so a prescriber gets the at-a-glance scan before reading the per-protocol detail.

What's the "Stack bloodwork: N protocols overdue (…)" line under the Next: rollup?

A focused rollup of bloodwork protocols that are both on your active stack and already past their next-draw date. Format: Stack bloodwork: 2 protocols overdue (BPC-157 12d, IGF-1 5d) (collapses to 1 protocol overdue (…) for a single match). Distinct from the Next: … rollup directly above it: that one mixes due-soon + already-overdue from all protocols capped at the closest 2 (broad scan); this one zooms in on what's actionable for the cycle the user is currently running. The intersection matters — a long-tail protocol you set up months ago for a peptide you're no longer taking would show up in Next: … as an overdue line, but it's not relevant to the cycle this week's digest is summarizing; this rollup intentionally hides it. Per-row format: {peptide name} {N}d with N = days past the next-draw date (positive integer; daysUntil = 0 is "due today" and not surfaced here). Order is most-overdue first (so the prescriber books the longest-lapsed draw first), with peptide-name alphabetical as tie-break for deterministic output. Mirrors into the Copy-as-text output as STACK BLOODWORK: 2 protocols overdue (BPC-157 12d, IGF-1 5d) directly under any NEXT: sub-line in the BLOODWORK section, before the per-protocol bullets. Pure derivation — read-only over vialfile-stack-v1 + vialfile-bloodwork-v1, no new storage, no network. Hidden when the active stack has no items, the active-stack peptides have no overdue protocols, or no active stack exists.

What's the "N injections in draw window" line under each bloodwork card?

A one-line cycle-execution rollup attached to each bloodwork card, counting injections you've logged since the start of the current draw window — e.g. "5 injections in draw window (first 2026-04-01, last 2026-04-14)". The window math matches the bloodwork page exactly: half-open [max(protocol-start, now − cadence·7d), now), so an 8-week-cadence protocol counts injections from the past 56 days (or from the protocol start if the protocol is fresher than that), and the count never includes the current moment. Singular collapse for N=1: "1 injection in draw window (on YYYY-MM-DD)". Only injections with the same peptideId as the protocol are counted — multi-peptide stacks roll up separately, no cross-leakage. The line is hidden when no in-window injections have been logged. Mirrors into the Copy-as-text output as a 4-space-indented child line directly under each - {peptide} — … BLOODWORK bullet, so the prescriber-formatted text carries the per-cycle execution context alongside the next-draw cadence. Pure derivation over the data already in your browser — read-only over vialfile-log-v1, no new storage, no network.

Is any data sent anywhere when I open this page?

No. The digest is static HTML plus a JavaScript module. The module reads your browser's localStorage — the same storage the other three pages already use — and renders the summary locally. The page loads one external resource at the moment: the shared stylesheet. There are no analytics beacons or third-party scripts.

Can I print this and bring it to my prescriber?

Yes — that's what the Print button does. The stylesheet collapses the nav, hides the FAQ, and expands every section so the full digest fits on a single A4 or Letter page. If you'd rather save a PDF, most browsers' Print dialog has a "Save as PDF" option.

What does Copy as text put on my clipboard?

A plain-text rollup of the same sections — header line, INJECTIONS, SIDE-EFFECTS (severity 3+), BLOODWORK (4-week window), INVENTORY (low or running out within 14 days), CHANGES FROM LAST WEEK — with peptide names, dose totals, dates, and days-of-supply. Paste it into a clinician portal message, an email, or a notes app. Nothing is sent over the network; it's a local clipboard write. Browsers without clipboard API access (or denied permission) get a textarea instead with the text pre-selected — Ctrl/Cmd+C copies it.

What's the "Library note: …" line under each Injections row?

A one-line library-sourced cue listing the most-commonly reported side-effects for that peptide, attached to each Injections row on this page. Source = the typicalSideEffects field of peptides.json (the same library that powers the calculator and stack pages) — not your own side-effect log. The point is to give a prescriber-scannable "what to watch for" prompt at the top of each peptide row without needing to leave the digest. Capped at four items by default so the note stays a single short line. Only peptides with the field populated get the note; long-tail peptides without it render unchanged. Mirrors into the Copy-as-text output as a 4-space-indented child line directly under each - {peptide}: … bullet so the prescriber-formatted text carries the same context. The list is static — it does not reflect anything you've personally logged.

Why surface inventory in the digest?

If you log vials on the inventory page and have an active stack set, the digest can show which peptides are running low at your current dose. The threshold is 14 days of supply — enough lead time to reorder before you miss a dose. Peptides with "running out" status have under 7 days. No active stack and we can't compute burn-rate, so this section stays empty.

What's the "Inventory: …" banner at the top of the digest?

A one-line at-a-glance reorder cue sitting between the "Active stack:" header and the per-section articles — e.g. "Inventory: BPC-157 running out (5d) · TB-500 low (12d)". Filters the same per-peptide burn-rate map the per-row INVENTORY pills below derive from, keeps only the running-out and low statuses (peptides comfortably above the 14-day threshold are skipped), sorts by ascending daysOfSupply so the most urgent peptide reads first, and caps at 3 entries by default so the banner doesn't crowd. Status word matches the per-row pill ("running out" / "low") so the banner reads as a TL;DR of the detail section further down. The slot is hidden when no peptide qualifies — i.e. you're well-stocked, no active stack, or no vials logged yet. Mirrors into the Copy-as-text output as a LOW SUPPLY: sub-line directly under the ACTIVE STACK: header (distinct prefix from the existing detailed INVENTORY (…) section header further down so the two reads cleanly). Pure derivation over the data already in your browser — read-only over vialfile-inventory-v1 + vialfile-stack-v1 + vialfile-log-v1, no new storage, no network.

What's the "Cost trends: …" line at the top of the Inventory section?

A one-line supplier-economics cue at the top of the Inventory section — e.g. "Cost trends: BPC-157 +24%, TB-500 -8%, GHK-Cu flat". Fires when you have logged ≥ 3 vials of a peptide with a non-zero costUsd and valid mgInVial on the inventory page. Uses the same per-mg normalization as the per-peptide cost sparkline on the inventory page (cost ÷ mg so a 5 mg vial at $40 and a 10 mg vial at $80 both read as $8/mg — supplier price, not vial price). Trend sign: "+" for rising cost, "−" for falling, "flat" for no change (0% round-trip). Peptides sorted alphabetically. Read-only over vialfile-inventory-v1 — same key as the per-row inventory cards, no new storage. Mirrors into the Copy-as-text output as a Cost trends: … sub-line directly under the INVENTORY section header so a prescriber reading the text export sees supplier-cost context alongside supply status.

How is "what changed since last week" computed?

We compare the current 7-day window to the prior 7-day window. Started = peptides present in this week's log and absent from last week's. Stopped = peptides present last week, absent this week. Severity shift = mean side-effect severity per peptide, this week minus last; we surface shifts of 0.5 or more on a 1–5 scale.