quivr-search/ at commit 63d7fc52035190732b2c810c63645a295ece672e, now a monitoring dashboard (THE-765); ingestion, search and source reading now use the real V2 API. No simulated Agent answers, corpus, scores, totals or pagination remain.
Run locally
Prerequisites: the repository’s Linux/Docker/Go/Python setup, Node 22+ and npm (see root README). From the repository root:make demo-reset deletes only this demo’s volumes. Set DEMO_PORT to use another port. Optional DEMO_PASSWORD enables a shared demo password locally.
The app is a monitoring dashboard with three tabs, Fil, Alertes and Sources, and a search box in the top bar (/ or Ctrl+K). Ajouter du texte pastes a note: it is limited to 256 KiB, whitespace and Unicode are preserved, drafts and retry identity survive reloads within the same browser tab, and ambiguous network failures reuse the same ingestion identity.
Fil
The Fil tab (default;?view=veille still works) lists everything entering the demo corpus, newest first, with source (namespace, or Ajouté à la main), time, title and the alerts that caught it. The server builds it from the change feed and catalog (feed.mjs; needs changes:read), with the RSS item’s link (http/https only) and the date of a new Version of an article it already had. Time is when Quivr accepted the item’s current Version (accepted_at on the Version read), so it survives a restart of the web server. New articles arrive live; while an article is open, the list is scrolled or arrivals are paused (En direct / En pause), they wait behind a N nouveaux articles button. Non lus is kept in this browser only (localStorage). Chips filter the unread and caught articles; each alert and source on the right filters the feed too.
Search is lexical, or hybrid with Idées proches, which marks articles found by meaning only as Même sujet, autres mots; Créer une alerte turns the query into a keyword alert. A source picked on the right while searching is searched on its own: the engine ranks that source’s articles before keeping the top 50 (filter.source_namespaces, relayed unchanged by the facade). On a corpus the engine cannot filter yet (source_filter_unavailable, until it is rebuilt), the demo narrows the top 50 of every source instead. The reader shows the text as collected, why an alert caught the article, a correction notice that says what changed word by word and opens the earlier text, Sur le même sujet (a semantic search seeded by the article) and Ouvrir l’original. ↑ ↓ open the next article and Échap closes it.
Sources
The Sources tab (?view=sources) collects news sites into the demo corpus (see
From the web interface):
- Paste a site address or a feed address. Once you pause typing (or press Entrée), the
server fetches it, recognises a feed or finds the feeds the page advertises
(
<link rel="alternate" type="application/rss+xml">, Atom or JSON Feed), and refuses private, loopback and link-local addresses. - If the page advertises several feeds, pick one. The name comes from the feed title; choose how often to check it (5 min to 1 h, never below the deployment’s minimum).
- Commencer la collecte creates an
rssConnector Instance whose Source Namespace is that name. Its articles become searchable after the first poll.
POST /v0/connectors/{id}/runs) and shows the result.
make demo also enables the test fixture kind, under Ajouter un connecteur
d’un autre type. Its token field accepts any value, except values starting with
fixture-revoked, which produce an access error. The demo uses its own key and
Organization, so texts added before this change are not shown. The local stack lets
the core reach private addresses; the web server still refuses them, so private
feeds get the same error as in production.
Alertes
The Alertes tab (?view=alerts) sets alerts on new articles, from RSS or added by hand.
A keyword alert is written as words to watch (any or all of
them), words to ignore (NOT) and the sources to watch (source: filters); any other query,
such as (port OR quai) AND grève, goes in Écrire une requête avancée, and the form shows
how Quivr reads it (src/lib/alertForm.ts; src/lib/notation.ts ports the plugin’s parser).
With DEMO_DESCRIBED_ALERTS, Un sujet décrit offers described alerts:
a sentence judged by Jev, whose note says article text goes to TypeSafe and a catch can take a
minute; they can watch chosen sources too. Without it, a line says why the choice is missing.
The form previews what the alert would have caught among the newest articles (saving nothing):
as typed, or on a click for described alerts, since each article is a classifier call. Each alert
lists what it caught, live, with the matched words or the score; it can be paused, resumed,
edited, renamed and deleted. alerts.mjs explains how alerts are stored and read.
Frontend development and checks
Withmake demo running, npm run dev --prefix quivr-search serves Vite on 5182 and proxies to the facade on 5183. Change the proxy target in vite.config.ts if you changed DEMO_PORT. Design tokens sit at the top of src/styles.css and src/dashboard.css (the dashboard’s layout); the Geist font is bundled from src/fonts/ (SIL Open Font License, src/fonts/OFL.txt), so the page loads no font from another origin; loading, empty and error states come from src/components/ui.tsx. tests/dashboard.spec.ts runs the dashboard’s flows against a fake engine behind the facade routes (tests/fake-engine.ts).
make verify also runs these browser/HTTP tests against an isolated real core. Feeds come from a local test site (scripts/fake_feeds.py), so no test reaches the internet. Chromium system dependencies can be installed with npx --yes --package=@playwright/test@1.63.0 playwright install-deps chromium. Screenshots and reports live under .scratch/quivr-demo-verify-*/. Browser traces may contain demo passwords/texts and remain local; CI uploads only screenshots and reports. Test data are synthetic.
Server configuration
npm run build --prefix quivr-search then npm start --prefix quivr-search uses:
Example, with placeholder addresses to replace with the feeds you want to offer:
quivr.thevibecompany.co are tracked separately in THE-664.