* fix: mixed up migrations
* feat: semantic similarity first take
* feat: semantic similarity first round of fixes
* feat: more work on making semantic similarity work properly
* feat: getPostBySlug for the AI
* feat: show similarity in post-link-insert-modal
* chore: remove done doc
---------
Co-authored-by: hugo <hugoms@me.com>
* Expose chat.analyzeMediaImage in Python API for batch image metadata generation
* Fix updateMedia losing linkedPostIds by reading existing sidecar before overwriting
* Also preserve author from sidecar when DB value is null (data drift)
* Extend MetadataDiffEngine to cover media, scripts, and templates
* Redesign MetadataDiffPanel: item-first view with field pills, filtering, and per-item multi-field diffs
* Fix task:progress startsWith crash (taskId not id) and nested button violation in field pills
* Populate field diffs for file-missing items and show fileMissing badge in UI
* feat: extended meta diff
* feat: meta diff als reconstructs orphans
* chore: updated documentation
---------
Co-authored-by: hugo <hugoms@me.com>
* feat: implementation of language detection
* run utility scripts in tasks
* fix: addiitonal fixes for background utilities
* feat: toast() also for utility scripts
---------
Co-authored-by: hugo <hugoms@me.com>
* chore: just a plan update
* Add LM Studio as local AI provider (OpenAI-compatible, like Ollama)
* Convert WebP thumbnails to JPEG before image analysis for LM Studio compatibility
* Strengthen language enforcement in image analysis prompt for local models
* Use i18n localized prompts for image analysis instead of English instructions
* Add airplane mode (Flugmodus) with status bar toggle and offline model preferences
* Fix flightmode: persist model IDs, skip network when offline, airplane icon
* Auto-fallback to offline models in airplane mode for chat, title, and image analysis
* Auto-select first local model as offline fallback when no explicit offline model configured
* Block git fetch/pull/push and site upload in airplane mode
* fix: thumbnails optimized for AI
* fix: error handling in airplane mode
---------
Co-authored-by: hugo <hugoms@me.com>
- Add SecureKeyStore class using safeStorage encrypt/decrypt with base64 in SQLite
- Update chatHandlers to store/retrieve API keys via SecureKeyStore
- Delete old plain-text opencode_api_key on startup (no migration, re-enter key)
- Add deleteSetting() to ChatEngine
- Add 14 SecureKeyStore unit tests and 6 chatHandlers keychain integration tests
- Update existing chatHandlers test mocks for SecureKeyStore
- Update MISTRAL_PLAN.md: mark PR 1 done, remove legacy fallback from PR 2 scope
- Fix OpenAI path using accumulatedText instead of round-specific text
in assistant messages for multi-round tool conversations
- Guard JSON.parse in both SSE parsers against corrupted events
- Extract cacheReadTokens from OpenAI prompt_tokens_details when available
- Add tests for JSON parse resilience and cache token extraction (7 new tests)