Dinoer

Ask a search-augmented assistant a question and it hands you an answer. What it does not hand you is the corpus it actually read to produce it — and on 14 August 2026, a real run proved that gap is not theoretical: given latitude to “plan before extracting,” a delegated model made twelve live web searches of its own, invisible in the final text, and answered from pages nobody had collected.

That is the problem Dinoer exists to close, not the one it exists to win on volume. What Dinoer actually competes on →

Before the name, the proof

The command below is the one you would type. The output is real — captured on 15 August 2026, against https://example.com, run through the actual call path (shot.py, Dinoer 1.0.0, guide-version 1.6). It is abridged: the real answer carries more keys — DOM statistics, per-action latency, the respectful-navigation counter. The keys are in French because the tool itself names them that way — not a translation left undone.

/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
  --url https://example.com --a11y --guide-version 1.6
{"succes": true, "http_status": 200,
 "a11y_tree": "- heading \"Example Domain\" [level=1]\n- paragraph: This domain is for use in documentation examples…\n- paragraph:\n  - link \"Learn more\":\n    - /url: https://iana.org/domains/example",
 "boussole": {"titre_page": "Example Domain", "dernier_code_http": 200,
              "respect": {"actions_executees": 0, "duree_totale_ms": 2910}},
 "etat": {"pret_a_agir": true, "niveau_confiance": "eleve"}}

No PNG anywhere in that output. Not because one was stripped before publishing it — because none was ever produced. --guide-version is not decoration. Without it you get {"succes": false, "erreur": "guide_non_lu"} and nothing else happens — how an agent proves it read the guide before touching a live target. Why that lock exists →

What Dinoer is

Dinoer explores a large number of public sources and compiles a sourced, verifiable signal from them — on hardware as modest as a Raspberry Pi 5.

It is a fork of Diwall (visual browser automation for LLMs), stripped of its entire perception layer: zero screenshots, zero Set-of-Mark, zero vision model, ever. Dinoer never looks at a page — it reads it: DOM, accessibility tree, cleaned page text.

Query → SearXNG discovery → lightweight HTTP collection
      → escalation to a real browser only for pages that need it
      → synthesis by a delegated LLM → dated, sourced Markdown report

What it does not compete on A generalist search assistant with authenticated, cookie-backed engines behind it has structural reach a local, unauthenticated SearXNG instance does not — measured directly, not assumed. The measurement →

The corpus is the guarantee, not the answer

Every claim in a Dinoer report is attributable to a page actually collected to disk (collecte.jsonl/operations.jsonl) — with zero dependency on whatever a third-party search backend did while producing the answer. opencode.jsonc denies the delegated model its own websearch/webfetch tools, whatever the directory OpenCode is launched from; a direct check of the model’s full event stream during synthesis, not just its final text, is what caught the 12-call leak above in the first place and confirmed the fix.

{"id_campagne": "concerts-finistere-2026-07-28",
 "cibles": [{"type": "query", "valeur": "concerts finistere sud ete"}],
 "sujet_synthese": "concerts and festivals, south Finistère, summer 2026"}

That is most of a real manifest. campagne.py --manifeste manifeste.json does the rest — quota-respecting collection, then a synthesized report you can trace back to every source it used.

See the same doctrine reach a single page →

Sections