Repository navigation
v0.3.0
PDFs that used to fail now get indexed, duplicates stop counting as errors, and the library gained filters and bulk actions.
Ingestion
- A PDF whose content stream the Rust extractor cannot parse no longer fails the whole source: extraction falls back to
pdftotext, page numbering intact, and OCR is kept for the pages that really hold no text. Two kinds of failure are covered, a parse error and an outright panic, the second of which used to abort the source before any fallback could run. - Content duplicates get their own status instead of being reported as errors. The message names the source already holding those bytes, and watch counters no longer inflate their error totals.
- Stage labels are stored in one language and translated on display. Labels written by older versions are migrated on start.
Sources
- Clickable status chips filter the library: queued or running, needing a check, duplicates. A chip disappears once its sources are gone, and releases the filter with it.
- One button processes again every failed source of the current view, so a filter by name or type narrows what gets queued. Duplicates are excluded, since processing them again changes nothing.
- When the duplicates filter is on, the same button offers to remove them instead, keeping the source that already holds the content.
- A watch detail now lists duplicates in their own section.
Retrieval
- SQLite connections are pooled. The first question after launch no longer pays for a cold page cache, which was the bulk of its latency.
- Vectors are stored normalized, so similarity is a dot product in
f32rather than a cosine inf64. Existing vectors are converted once on start. - Passages are cut on sentence boundaries when one is within reach of the window, instead of mid-word.
- Candidates per search arm, passages per source, passage length and overlap are now settings. The last two apply to sources indexed from then on; existing passages keep the length they were cut with until a reindex.
Exported chatbot
- The page carries a Content-Security-Policy with a per-response nonce, so nothing loads that the page did not ship.
Referrer-Policy,X-Frame-OptionsandX-Content-Type-Optionscome with every response. - Safe areas, PWA meta tags and scroll containment for iOS: the notch and the keyboard no longer cover the composer.
- Questions are rationed per address, twelve a minute, so serving the page to a network cannot pin the machine.
Under the hood
- Tauri commands are split by domain, and the sources page moved out of the main component.
- The HTTP surface gained tests; it had none.
- The Playwright suite pins its locale and asserts on source strings, so it no longer depends on the machine's browser language.
Assets
Installers for macOS (universal .dmg), Windows (.exe) and Linux (.deb, .rpm, .AppImage), plus chatbot-runners-*.zip holding the launchers used by exported chatbots.
macOS builds are ad hoc signed. On first launch, right click the app and pick Open.