Native iOS · Apache-2.0Working name

You ramble.
It files.
You confirm.

A local clerk for people who inject from vials. Dictate what happened, drop a photo of a vial you already have, and accept the rows. Nothing is written until you tap.

FIG. 001 / CAPTURE LOOPLISTENING
Ramble

uh yeah just did 250 micrograms of BPC in the left abdomen

Proposal

ledger.jsonl  // nothing written yet
01 / CaptureRamblemic · text · photo
02 / ProposeRows + gapson-device model call
03 / ConfirmYou filenothing auto-writes
04 / KeepJSONLledger.jsonl

BYOK Keychain on this phone0 company serversSwift reconstitution math17+ · not a medical device

Say what happened. File what is true.

The model drafts. The ledger waits. You are the one who commits.

  1. 01

    Bring a mess.

    Type or dictate. Optionally drop a vial label. Vision reads the photo on the phone. The clerk asks a model you keyed for a proposal, not a protocol.

  2. 02

    See the holes.

    Each proposed row has a kind, an excerpt, and a gap list. Lot missing, volume unknown, site blank: those stay on the card until you know them.

  3. 03

    Tap to file.

    Confirmed events append. A correction is a new event that supersedes. The old row remains. Export the JSONL or a CSV whenever you want.

Show the work. Keep the units tagged.

Reconstitution is ordinary Swift. You type mass, diluent, and dose. The app prints concentration, draw volume, and syringe marks, and every input it used. The model does not do this arithmetic.

  • mg and mcg are different types. Mixing them is a flagged conversion, not a silent scale.
  • IU does not become mass unless you supply a compound-specific factor.
  • A dose larger than the vial mass, or a draw past the remaining volume, raises a flag.
Tools / reconstitution5 mg · 2 mL · 250 mcg · U-100
// DrawVolume.compute, not a chat reply
concentration = 5 mg / 2 mL
              = 2.5 mg/mL  (2500 mcg/mL)
draw mL       = 250 mcg / 2.5 mg/mL
              = 0.1 mL
U-100 marks   = mL × 100
              = 10
dose_exceeds_vial

Off. 250 mcg is inside 5 mg.

iu_without_factor

Off. This example is mass, not IU.

It will not tell you what to take.

Personal record-keeping on one phone. Source in the open. No account.

01 / Advice

No dose, compound, protocol, or vendor.

The clerk files what you already decided. It does not suggest a stack, a cadence, or a source. That line is in the system prompt and in the UI.

02 / Network

Your key. Your host. No company box.

Paste a model key. It lives in the iOS Keychain. Propose sends the ramble, optional OCR text, and a ledger summary to the host you typed. There is no backend that receives health data.

03 / Device

Not a medical device. 17 or older.

This is software for a personal log. It is not diagnostic and not a substitute for a clinician. Read intended usebefore you build or install it.

04 / Storage

JSONL on the phone. Face ID at launch.

Events and clerk sessions sit under Application Support. No HealthKit, no iCloud store in this release, no analytics SDK.What stays on the phone.

The filing cabinet is the phone.

Native SwiftUI. Apache-2.0. A working name. Clone it, read the clerk loop, run ./verify in the app repo.

github.com/Mr-Neutr0n/peptide-ledger
FIG. 002 / On this phoneNo company copy
Application Support/PeptideLedger
  • ledger.jsonlappend-only events
  • sessions.jsonlclerk session tree
  • Keychainmodel key, this device
  • UserDefaultsprovider and model id. not the key

Face ID at launch · export via share sheet