Skip to content

Commit b0a744e

Browse files
Release v0.10.0 — responsiveness, hardware honesty, working text import
Bump 0.9.1 -> 0.10.0 in package.json, src-tauri/Cargo.toml, src-tauri/tauri.conf.json (+ package-lock.json, Cargo.lock). Record the v0.10.0 batch in ROADMAP.md and the feature list in README.md. Highlights: Companion + text import run off the UI thread (no more freeze) and the model pre-warms; a compute watcher checks RAM/throughput and preflights downloads; text import is fixed (think:false + JSON schema + canonical names) and much clearer; first-run Companion opt-in; and a Settings feedback link that opens a prefilled GitHub issue. Also filed a future item: move import timestamp normalization into the backend. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent a79f786 commit b0a744e

7 files changed

Lines changed: 67 additions & 11 deletions

File tree

README.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ from your phone.
4040
- **Companion** — a calm, non-judgmental support chat that runs on a local AI
4141
model. It can be aware of your current session, look up references, and log
4242
things for you when you ask. Pick a support style ("just listen", "keep me
43-
grounded", …) and it honors it. It's improving but still rough in places —
44-
see [Companion quality](#companion-quality). You can also turn it off
45-
entirely and use everything else.
43+
grounded", …) and it honors it. It loads in the background so the window never
44+
freezes while it thinks, and it tells you up front if your machine is short on
45+
memory to run the model. It's improving but still rough in places — see
46+
[Companion quality](#companion-quality). You can also turn it off entirely and
47+
use everything else.
4648
- **Live session** — a quiet, altered-state-friendly screen for an ongoing
4749
experience: elapsed time, one-tap logging, the companion, and an always-visible
4850
**Get help now** button. Timeline notes can be edited after the fact — on the
@@ -51,8 +53,9 @@ from your phone.
5153
dangerous combination is logged, real emergency and peer-support contacts
5254
appear. This is driven by fixed rules, never by the AI — and your journal
5355
writing is never scanned.
54-
- **Import from text** — paste a past experience in your own words and the local
55-
model turns it into a structured entry you review before saving.
56+
- **Import from text** — paste a past experience in any form, from a one-line note
57+
to a full trip report with T+ timestamps, and the local model pulls out the
58+
substances, doses, and timeline into a structured entry you review before saving.
5659
- **Reference search** — search thousands of passages of substance information
5760
(pharmacology, tolerance, legality) offline.
5861
- **Encryption & backups** — optional password encryption for the whole journal,
@@ -72,6 +75,8 @@ from your phone.
7275
- **Contribute upstream** (consent-gated) — export substances you've catalogued
7376
that DoseWiki doesn't cover as a draft to submit by hand. Never automatic,
7477
never includes journal data.
78+
- **Send feedback** — a link in Settings opens a prefilled bug report or feature
79+
request on GitHub, in your browser. Nothing is sent from the app itself.
7580

7681
## Screenshots
7782

ROADMAP.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,45 @@ non-negotiables, each with a test:
123123

124124
---
125125

126+
## Shipped in v0.10.0
127+
128+
Responsiveness, honesty about hardware, and a text-import that actually works —
129+
plus a way for people to send feedback.
130+
131+
- **The Companion no longer freezes the app.** `companion_chat` was a synchronous
132+
command, so a turn — including the tens-of-seconds cold model load on the first
133+
message — ran on the UI thread and locked the whole window until it returned,
134+
which read as a crash. It's now async and runs off the UI thread (like the phone
135+
portal already did). The same fix landed on **text import** (`parse_experience`),
136+
which had the identical problem.
137+
- **The model pre-warms.** When the Companion comes into view the app quietly loads
138+
the model into memory (`ollama::warm``companion_warm`), so the first real
139+
message arrives at warm speed instead of paying a cold multi-second load.
140+
- **Compute watcher** (`compute.rs`) — local LLMs are memory-bound, so before
141+
someone leans on the Companion the app reads the machine (`sysinfo`) and gives a
142+
plain verdict: *ample / tight / insufficient*. It weighs available RAM against the
143+
model's footprint (using Ollama's `/api/ps` real resident size when the model is
144+
loaded, and flagging a GPU→CPU spill), preflights a model **before** the multi-GB
145+
download in setup, and folds in the **measured tokens/sec** of the last reply so a
146+
machine that fits the model but runs it too slowly is caught honestly. Read-only,
147+
advisory, never a gate.
148+
- **Import from text, fixed.** It was unreliable and opaque — on the default model
149+
(qwen3:8b) the parse ran with *thinking on*, took minutes (looked hung), and still
150+
under-extracted, so people saw "No doses were detected." Now it runs with
151+
`think: false` (a full trip report went from timing out to ~30 s with every dose
152+
found), grammar-constrains the reply to a **JSON schema** for a guaranteed shape,
153+
and uses the substance's standard name so the interaction checker recognises it
154+
(acid→LSD, shrooms→psilocybin, xanax→alprazolam). The UI says what to paste and
155+
what works best, shows the extracted intention/setting/notes (not just doses), and
156+
explains the no-dose case. When no real date was found, fabricated-but-spaced dose
157+
times are rebased onto the start you confirm.
158+
- **First-run Companion opt-in.** The disclaimer splash on a fresh install now asks
159+
whether to enable the Companion, once (it's optional, on-device, and the safety
160+
layers work either way).
161+
- **Send feedback → GitHub.** A Settings card opens a prefilled bug report or feature
162+
request as a GitHub issue in the browser. No backend, no telemetry — nothing leaves
163+
the journal; GitHub handles identity and the reports collect in one place.
164+
126165
## Shipped in v0.9.1
127166

128167
A round of Companion and Settings polish on top of v0.9.0, mostly driven by
@@ -360,6 +399,18 @@ using the model switch and reading the screens as a first-timer would.
360399

361400
</details>
362401

402+
0. **Backend timestamp normalization for imports.** Shipped in v0.10.0, text import
403+
rebases fabricated dose/timeline times onto the confirmed start **in the frontend**
404+
(`rebaseTimestamps` in `+page.svelte`), because that's where the `t+` date math
405+
already lives and the backend has no date library. That's solid for the common case
406+
but leaves the invariant split across two layers. A cleaner home is the backend: give
407+
`import_experience` (`commands.rs`) real timestamp parsing (add `chrono`, or the
408+
`time` crate) so it owns normalization — parse each `taken_at`/`at`, drop the ones it
409+
can't, and when no absolute `started_at` was extracted, shift the parseable ones so the
410+
earliest lands on the chosen start while preserving spacing. Then the phone portal's
411+
import path (if it ever gains one) and the desktop share one rule. Small, self-contained,
412+
worth a test that a T+ report rebases correctly and a real-dated one is left untouched.
413+
363414
1. **Phone portal — log from your phone over Tailscale.** ***Entirely optional; off by
364415
default.*** Field Notes stays a **fully offline, on-device app as it ships** — this
365416
adds an opt-in way to reach the journal from a phone during a session (the desktop is

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "field-notes",
3-
"version": "0.9.1",
3+
"version": "0.10.0",
44
"description": "Offline harm-reduction journal & trip-sitting workstation.",
55
"type": "module",
66
"private": true,

src-tauri/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "field_notes"
3-
version = "0.9.1"
3+
version = "0.10.0"
44
description = "Offline harm-reduction journal & trip-sitting workstation"
55
authors = ["sparkly-quasar"]
66
# Licensed under the PolyForm Noncommercial License 1.0.0 — see ../LICENSE.

src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://schema.tauri.app/config/2",
33
"productName": "Field Notes",
4-
"version": "0.9.1",
4+
"version": "0.10.0",
55
"identifier": "com.fieldnotes.journal",
66
"build": {
77
"beforeDevCommand": "npm run dev",

0 commit comments

Comments
 (0)