Skip to content

Scanner redesign, SH/HH notebooks, search fixes, and UI cleanup#435

Merged
Movm merged 12 commits intotest-branchfrom
fix/nginx-dns-caching
Feb 1, 2026
Merged

Scanner redesign, SH/HH notebooks, search fixes, and UI cleanup#435
Movm merged 12 commits intotest-branchfrom
fix/nginx-dns-caching

Conversation

@Movm
Copy link
Copy Markdown
Collaborator

@Movm Movm commented Feb 1, 2026

Summary

  • Scanner redesign: Overhauled the scanner page with a minimal card-based upload zone, animated DotGrid background, and a new CameraScanner component using OpenCV.js for live document detection. Removed ProtokollTab in favour of inline results. Added jscanify and react-webcam dependencies.
  • Schleswig-Holstein & Hamburg notebooks: Added system collection config, notebook page config, and routes for Schleswig-Holstein. Enabled Hamburg notebook. Both are gated to dev-only in the gallery listing.
  • Search filter fix: Stripped intent-based should clauses (content_type, lang) from Qdrant filters — these turned soft preferences into hard filters when combined with must, causing 0 results on collections with different content_type values (e.g. Hamburg "beschluss" docs). Simplified QueryIntentService.generateSearchFilters() to return an empty filter.
  • suggest_edits fix: Mistral sometimes returns structured JSON objects instead of plain text for full_replace suggestions. Added structuredObjectToMarkdown() to coerce these into readable markdown.
  • Interaction controller fix: User-created collections don't have system filter config — return empty filters instead of 404 to avoid frontend errors.
  • UI cleanup: Removed unused citation navigation/clickable-link styles and refactored NotebookList to use the existing IndexCard component with a new reusable KebabMenu.
  • New hook: Added useApplyAiEdit for applying AI-suggested edits.
  • Scraper tooling: Added one-off scraper scripts for Hamburg and SH, reduced LandesverbandScraper crawl delay from 2s to 500ms.

Test plan

  • Verify scanner page loads with dot-grid background and upload works
  • Test camera scanner on a mobile device (or webcam)
  • Open Schleswig-Holstein and Hamburg notebooks (dev mode) and ask a question
  • Verify search returns results for Hamburg collection (previously 0 results)
  • Test AI edit suggestions on the Texte page — confirm structured JSON responses render as markdown
  • Open a user-created notebook and confirm no 404 error in the filter panel
  • Check NotebookList renders correctly with KebabMenu actions
  • Verify citation modal still works without the removed navigation button

Movm added 12 commits January 30, 2026 14:57
Replace static upstream blocks with resolver + variable pattern so
nginx re-resolves container IPs via Docker's embedded DNS (127.0.0.11)
every 10s instead of caching them forever at startup.
Increase --sidebar-expanded-width from 240px to 280px so the
"Early Access" status badge fits within the sidebar bounds without
truncating menu item titles.
Normalize property access in CitationSourcesDisplay to handle both
ExpandedChunkResult (title, snippet, similarity, source_url) and Source
(document_title, chunk_text, similarity_score, url) shapes from the backend.
Also hide the section when only 1 source is present.
Remove dead CSS for .citation-view-document, .ask-document-link,
.clickable-link, and the associated navigation logic from CitationModal.
These were remnants of a document-link feature that is no longer used.
Add reusable KebabMenu component for context actions and refactor
NotebookList to use the existing IndexCard component with gallery-grid
layout, replacing the bespoke profile-card markup.
Add system collection config, notebook page config, and routes for
Schleswig-Holstein. Un-comment Hamburg notebook and move it along with
SH to a dev-only list so they only appear in development mode.
In Qdrant, should clauses combined with must require at least one
should to match, turning soft content_type/lang preferences into hard
filters. This caused 0 results on collections with different
content_type values (e.g. Hamburg's "beschluss" docs). Simplify
QueryIntentService to return empty filters and let vectorSearch strip
intent-only should clauses defensively.
Mistral sometimes returns a structured JSON object instead of plain
text for full_replace suggestions. Add structuredObjectToMarkdown()
to recursively convert these objects into readable markdown before
the validation step discards them.
User-created collections don't have system filter config. Return an
empty filters response instead of a 404 to avoid noisy errors in the
frontend when loading user notebook filter panels.
Overhaul the scanner UI: replace marching-ants upload zone with a
minimal card design, add DotGrid animated background, introduce
CameraScanner component with OpenCV.js document detection, remove
ProtokollTab in favour of inline results, and simplify animations.
Adds jscanify and react-webcam dependencies.
Add one-off scraper scripts for Hamburg and Schleswig-Holstein
Landesverband data. Reduce LandesverbandScraper crawl delay from
2000ms to 500ms for faster ingestion.
@Movm Movm merged commit 1d0aa6c into test-branch Feb 1, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant