vialfile

Injection log

Log each injection — peptide, dose, route, site, notes. Your log stays in this browser. No account, no server, no ads.

Site rotation

No entries yet.

Why log injections

  1. Rotate sites. Repeat injection into the same site causes local irritation, fibrosis, and slower absorption. Seven-site rotation is the baseline standard.
  2. Catch dose drift. Multi-peptide stacks are easy to mis-time. A written record surfaces accidental double-doses or long gaps before they affect your bloodwork.
  3. Correlate side effects. Mark notes on water retention, sleep change, injection soreness, mood — the pattern only shows up in weeks of data, not a single entry.

This v1 is intentionally narrow: one peptide + one dose + one site per entry. Side-effect severity tracking and bloodwork reminders ship in later releases.

Log FAQ

What's the bar chart above my injection list?

That's a 7-day injection cadence sparkline. Each of the seven bars represents one calendar day (UTC), with the leftmost bar being 6 days ago and the rightmost being today. Bar height is proportional to how many injections you logged that day — the tallest bar represents your busiest day in the window. Zero-injection days render as a small 4px stub so the 7-day axis stays visible even on quiet weeks. Hover or tap a bar to see the exact day and count in the tooltip. Useful for spotting "I always skip Wednesdays" patterns without scrolling through individual entries. The sparkline counts all peptides combined — it answers "how consistent is my overall injection cadence?" not "how often did I inject BPC-157 specifically?" (the per-peptide missed-dose tracker above handles that). Updates automatically every time you save or delete an entry.

Where is my data stored?

In your browser's localStorage under key vialfile-log-v1. Nothing is sent to a server in this v1. When we add sync (opt-in), your existing entries will migrate over cleanly.

Can I export or back up my log?

Export + import are coming in the next release. For now you can inspect the raw JSON in browser devtools (localStorage.getItem('vialfile-log-v1')) and copy it elsewhere as a backup.

Why only 7 sites?

Because that's the rotation peptide users actually follow — both delts, abdomen, both glutes, both thighs. Granular sub-quadrants (upper-left abdomen vs lower-right abdomen) added visual complexity without behavioral value in v1.

What happens if I switch browsers?

Your log stays on the original browser until you export and re-import, or until we ship cloud sync. Private-mode windows have their own storage scope that clears on close.

What's the "→ vial #<id>" cue under each entry?

Each row's trailing "→ vial #<id>" cue tells you which open vial the FIFO allocation walk drew this dose from — the same walk that drives the days-of-supply projection on /inventory.html (and the low-supply banners on /digest.html and /stack.html). Open vials are sorted by openedAtIso ascending; doses logged after the oldest open vial was opened are allocated to it first, and overflow advances to the next open vial when the leading one fills. The id is the first 8 hex chars of the vial uuid — enough entropy to disambiguate the typical user's vials at-a-glance, while keeping the row compact alongside the dose / route / site triple. The cue collapses to nothing when no vial allocates (no open vials for that peptide, the entry pre-dates the oldest open vial, or the FIFO walk exhausted before reaching this entry). Pure projection over vialfile-inventory-v1 + vialfile-log-v1 — no separate storage key, no derived state to drift.

What's the "side-effect 6h later: severity 3 (headache)" line under each entry?

When you log a side-effect on /sideeffects.html for the same peptide within 24 hours after a logged injection, this row picks up a one-line shadow: "side-effect <Xm or Xh> later: severity <1-5> (<symptom>)". It closes the consequences-attribution loop on the LOG page — answers "did this dose cause something?" right where you're looking at the dose. The shadow window is half-open [entry timestamp, entry timestamp + 24h) — an effect logged at the exact dose time is included, an effect logged at the 24h mark is excluded. Sub-hour deltas render in minutes, ≥1h renders in floored hours. The cue picks the EARLIEST eligible side-effect after the dose — ties (same timestamp) broken by first-seen order. If two doses are minutes apart and a single side-effect lands inside both 24h shadows, the cue attaches to BOTH rows by design — you can't always tell which dose caused it, both candidates surface. Severity gate mirrors the side-effect form's validation byte-for-byte (integer 1-5); hand-crafted or legacy entries with non-integer or out-of-range severity skip silently. Pure projection over vialfile-log-v1 + vialfile-sideeffects-v1 — no separate storage key, no derived state to drift. Mirrors the calc page's "Last effect: severity 3 — 5 days ago (headache)" aside, but answers the *forward-looking* question "what happened after this dose?" rather than the *backward-looking* "what did I feel last time?".

What's the warn-tinted "inventory mismatch" line under an entry?

When the cumulative dose you've logged for a peptide first exceeds the total capacity of all your recorded vials (open + sealed combined), the crossing entry gets a warn-tinted "inventory mismatch — log claims X mg, inventory has Y mg" cue. It fires exactly once — on the first entry that pushed the cumulative over the limit — telling you "your log claims more was drawn than your inventory records can account for." Use this as a prompt to add missing vials on /inventory.html, or to check for erroneous duplicate log entries. The calculation uses raw mgInVial for all non-empty vials — the injection log is treated as the authoritative record of usage, so it intentionally ignores any manually-set mgUsed baseline (subtracting it from the same entries we're summing would double-count). Collapses silently when no inventory is recorded for the peptide — you can use the log without tracking vials. Pure projection over vialfile-log-v1 + vialfile-inventory-v1; no separate storage key, no derived state to drift.

What's the "Bloodwork due in Nd — book your draw soon" line under an entry?

When you log an injection for a peptide that has a bloodwork protocol set up on /bloodwork.html with a next-due date within 7 days, the log row surfaces a one-line muted reminder: "Bloodwork due in Nd — book your [peptide] draw soon." If the bloodwork date has already passed, the hint reads "Bloodwork overdue — book your draw soon." The reminder closes the pre-draw loop on the LOG page — when you're recording an injection days before a scheduled panel, the question is often "should I do this dose now or wait until after the draw?" surfacing the upcoming bloodwork right at the injection moment helps you decide. Hidden when no bloodwork protocol exists for that peptide or when the next draw is more than 7 days out. Pure read-only derivation from vialfile-bloodwork-v1 — the log page never writes bloodwork data. Manage protocols on /bloodwork.html.

What's the "Side effects this week: N flags (avg sev X.X)" banner after I save an injection?

After a successful log save, if you have logged any side effects on /sideeffects.html for the same peptide in the past 7 days, a dismissable banner appears showing how many side-effect entries you recorded and their average severity (1–5 scale). Average severity is rounded to one decimal place. This gives you an at-a-glance sense of how well-tolerated your recent injections have been, without switching pages. The banner auto-dismisses after 10 seconds or when dismissed. Disappears silently when no side effects exist for that peptide in the 7-day window.

What's the "~$X/dose · ~$Y/day at current rate" banner after I save an injection?

After a successful log save, a dismissable cost-efficiency banner appears showing the per-dose and per-day cost based on your most recent non-empty vial with a recorded purchase price. Per-dose cost = (vial cost ÷ vial mg) × dose mg. Per-day cost = per-dose × doses-per-day derived from the peptide's library frequency. If you have an active stack set up on /stack.html, the banner uses your stack's dose for this peptide instead of the library default. The banner is read-only — it never writes to your inventory — and disappears after 10 seconds or when dismissed. Only appears when you have at least one sealed or open vial with a cost entered for the logged peptide. Track vials and costs on /inventory.html.