WEBVTT 00:00:00.000 --> 00:00:02.767 QA Scribe is a local-first testing notepad 00:00:02.767 --> 00:00:05.533 for people who turn exploratory testing into 00:00:05.533 --> 00:00:08.300 reusable Testware. It captures the raw work 00:00:08.300 --> 00:00:11.067 of a testing Session, then helps shape 00:00:11.067 --> 00:00:13.833 that material into Findings and Drafts. The 00:00:13.833 --> 00:00:16.600 important boundary is local control: storage is 00:00:16.600 --> 00:00:19.367 local SQLite, attachments are local files, and 00:00:19.367 --> 00:00:22.133 AI runs through local command-line tools. The 00:00:22.133 --> 00:00:24.900 user flow starts with a tester writing 00:00:24.900 --> 00:00:27.667 notes during a focused Session. Those notes 00:00:27.667 --> 00:00:30.433 can include context, observations, logs, API responses 00:00:30.433 --> 00:00:33.200 screenshots, and follow-up thoughts. When the tester 00:00:33.200 --> 00:00:35.967 is ready, the same material can become 00:00:35.967 --> 00:00:38.734 editable Testware or a structured Finding. The 00:00:38.734 --> 00:00:41.500 app keeps those records linked back to 00:00:41.500 --> 00:00:44.267 the testing evidence. The runtime has three 00:00:44.267 --> 00:00:47.034 layers. The React renderer owns the desktop 00:00:47.034 --> 00:00:49.800 interaction model. The Tauri bridge exposes typed 00:00:49.800 --> 00:00:52.567 commands to the renderer. The Rust core 00:00:52.567 --> 00:00:55.334 owns storage, validation, managed files, generation prompts 00:00:55.334 --> 00:00:58.100 and response persistence. SQLite and the attachment 00:00:58.100 --> 00:01:00.867 directory sit behind the core service layer 00:01:00.867 --> 00:01:03.634 Provider CLIs sit outside the app and 00:01:03.634 --> 00:01:06.400 are only called after explicit user action 00:01:06.400 --> 00:01:09.167 Session capture moves through a narrow path 00:01:09.167 --> 00:01:11.934 The editor calls a frontend action factory 00:01:11.934 --> 00:01:14.700 The action calls a typed Tauri command 00:01:14.700 --> 00:01:17.467 The command locks the app state and 00:01:17.467 --> 00:01:20.234 calls SessionService. SessionService validates ownership and writes 00:01:20.234 --> 00:01:23.000 the SQLite rows. That path keeps the 00:01:23.000 --> 00:01:25.767 UI simple and keeps data rules in 00:01:25.767 --> 00:01:28.534 Rust. The domain model is intentionally small 00:01:28.534 --> 00:01:31.300 A Session scopes the work. An Entry 00:01:31.300 --> 00:01:34.067 stores raw testing material. A Finding records 00:01:34.067 --> 00:01:36.834 a structured conclusion. A Draft stores editable 00:01:36.834 --> 00:01:39.600 Testware. Evidence connects conclusions back to Entries 00:01:39.600 --> 00:01:42.367 and managed attachments. An AI Run records 00:01:42.367 --> 00:01:45.134 each generation request and its outcome. Attachments 00:01:45.134 --> 00:01:47.900 are managed instead of being loose file 00:01:47.900 --> 00:01:50.667 references. When an image is pasted or 00:01:50.667 --> 00:01:53.434 uploaded, the backend sanitizes the path, writes 00:01:53.434 --> 00:01:56.201 it under the Session attachment folder, hashes 00:01:56.201 --> 00:01:58.967 the bytes, and stores metadata in SQLite 00:01:58.967 --> 00:02:01.734 Preview reads verify the hash before returning 00:02:01.734 --> 00:02:04.501 a data URL. Rich editor images use 00:02:04.501 --> 00:02:07.267 a QA Scribe attachment protocol instead of 00:02:07.267 --> 00:02:10.034 arbitrary local file paths. AI generation is 00:02:10.034 --> 00:02:12.801 explicit. The frontend opens a preflight step 00:02:12.801 --> 00:02:15.567 where the user chooses an action, provider 00:02:15.567 --> 00:02:18.334 model, and reasoning effort. The backend prepares 00:02:18.334 --> 00:02:21.101 a Generation Context and a running AI 00:02:21.101 --> 00:02:23.867 Run. Then a local Claude, Codex, or 00:02:23.867 --> 00:02:26.634 Copilot CLI receives the prompt on standard 00:02:26.634 --> 00:02:29.401 input. Streaming events update the UI until 00:02:29.401 --> 00:02:32.167 the final Draft, Finding, or summary is 00:02:32.167 --> 00:02:34.934 persisted. Provider readiness is a separate system 00:02:34.934 --> 00:02:37.701 QA Scribe checks whether each local CLI 00:02:37.701 --> 00:02:40.467 is installed and authenticated. It detects model 00:02:40.467 --> 00:02:43.234 choices where the CLI exposes them, caches 00:02:43.234 --> 00:02:46.001 readiness briefly, and never stores provider API 00:02:46.001 --> 00:02:48.767 keys. This keeps authentication with the provider 00:02:48.767 --> 00:02:51.534 tool that already owns it. On the 00:02:51.534 --> 00:02:54.301 frontend, one controller coordinates most app state 00:02:54.301 --> 00:02:57.067 useAppController owns the active Session, note body 00:02:57.067 --> 00:02:59.834 Drafts, Findings, provider state, generation jobs, busy 00:02:59.834 --> 00:03:02.601 flags, and notices. AppShell lays out the 00:03:02.601 --> 00:03:05.367 desktop frame. Views render Notes, Testware, Findings 00:03:05.367 --> 00:03:08.134 and Settings. The editor and workflow modules 00:03:08.134 --> 00:03:10.901 handle rich text, preflight, copy, and deletion 00:03:10.901 --> 00:03:13.668 flows. The codebase is compact but broad 00:03:13.668 --> 00:03:16.434 There are eighty-two Rust files, fifty-six TypeScript 00:03:16.434 --> 00:03:19.201 and TSX files, and a release pipeline 00:03:19.201 --> 00:03:21.968 that builds desktop artifacts and Linux package 00:03:21.968 --> 00:03:24.734 repository metadata. Recent churn concentrates around provider 00:03:24.734 --> 00:03:27.501 process execution, generated bindings, frontend controller tests 00:03:27.501 --> 00:03:30.268 and release automation. Those are the areas 00:03:30.268 --> 00:03:33.034 to test carefully after changes. You can 00:03:33.034 --> 00:03:35.801 remember the repository by its seams. Change 00:03:35.801 --> 00:03:38.568 domain rules in qa-scribe core. Change desktop 00:03:38.568 --> 00:03:41.334 commands in src-tauri. Change user workflows in 00:03:41.334 --> 00:03:44.101 frontend source. Change packaging in scripts and 00:03:44.101 --> 00:03:46.868 GitHub workflows. The design goal is steady 00:03:46.868 --> 00:03:49.634 capture testing evidence locally, keep it traceable 00:03:49.634 --> 00:03:52.401 and turn it into useful Testware without 00:03:52.401 --> 00:03:55.168 taking control away from the tester. For 00:03:55.168 --> 00:03:57.934 a new contributor, the safest starting point 00:03:57.934 --> 00:04:00.701 is the workflow seam closest to the 00:04:00.701 --> 00:04:03.468 change. If the behavior is about saved 00:04:03.468 --> 00:04:06.234 data, start in the Rust service tests 00:04:06.234 --> 00:04:09.001 If it is about how a tester 00:04:09.001 --> 00:04:11.768 moves through the app, start in the 00:04:11.768 --> 00:04:14.534 React action factories and view tests. If 00:04:14.534 --> 00:04:17.301 it is about generation reliability, start with 00:04:17.301 --> 00:04:20.068 the job runner, stream executor, and provider 00:04:20.068 --> 00:04:22.835 detection tests. That split makes the repository 00:04:22.835 --> 00:04:25.601 easier to reason about than its desktop 00:04:25.601 --> 00:04:28.368 shape first suggests. That is the tour 00:04:28.368 --> 00:04:31.135 a small desktop app, a clear core 00:04:31.135 --> 00:04:33.901 service boundary, and a testing workflow that 00:04:33.901 --> 00:04:36.668 preserves the tester's evidence. The useful mental 00:04:36.668 --> 00:04:39.435 model is capture first, structure second, and 00:04:39.435 --> 00:04:42.201 generate only when the user asks for 00:04:42.201 --> 00:04:42.597 it.