Dinoer

A research assistant that searches the web gives you its answer, not the pages it read. On 14 August 2026, a model asked to write a report from a set of pages already collected made twelve web searches of its own. None of them showed in the report, and part of the answer came from pages nobody had collected. Only a record of every event the model emitted revealed them.

The tool on this site keeps the pages a report relies on on your disk, and forbids the model that writes the report to fetch any other. It does not try to find more pages than a web search assistant does. What it is for, and what it is not →

Before the name, the proof

A command and its real output, captured on 15 August 2026 against https://example.com with Dinoer 1.0.0 and guide version 1.6. The output is abridged: the full answer also carries DOM statistics, the duration of each action and the navigation counter. The keys are in French because the program names them that way.

/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"}}

The output contains no image, because Dinoer never produces one. Without --guide-version, the program answers {"succes": false, "erreur": "guide_non_lu"} and does nothing else: an agent has to read the guide and quote its version number before it can act on a page. Why this lock →

What Dinoer is

Dinoer searches public sources, stores the pages it collects on your disk, and has a model write a report from those pages only. The list of sources at the end of the report is written by Dinoer, not by the model.

It is a fork of Diwall, a browser automation tool for language models that works from screenshots. Dinoer removed that layer entirely: no screenshot, no Set-of-Mark numbering, no vision model. It reads a page as text: the DOM, the accessibility tree, the cleaned text. It runs on Debian 13 and Ubuntu 24.04; the package has been installed and run on a Raspberry Pi 4 with 8 GB of memory.

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 do better A web search assistant backed by commercial, signed-in search engines finds pages that an unauthenticated SearXNG instance does not reach. Measured on 14 August 2026: the measurement →

The corpus is the guarantee, not the answer

Every page a campaign keeps is written to collecte.jsonl; every attempt, successful or not, to operations.jsonl. The report is written from collecte.jsonl alone: on every call, Dinoer forbids the model its websearch and webfetch tools. One opening remains: the model keeps bash, and one has already reached the web through curl. What this covers and what it does not →

{"id_campagne": "concerts-finistere-2026-07-28",
 "cibles": [{"type": "query", "valeur": "concerts finistere sud ete"}]}

A manifest needs only these two keys. campagne.py --manifeste manifeste.json collects the pages, pausing between requests, then writes the report. Running a campaign →

How Dinoer reads a single page →

Sections