# Dinoer — Machine-Optimized Instructions

You have reached the operational entry point for **Dinoer**.

Dinoer gives a language model a sovereign, local-first way to research the
public web: SearXNG discovery, lightweight HTTP collection, escalation to a
real Playwright browser only for pages the light tier could not read, and a
dated, sourced Markdown report at the end. It reads pages as text — DOM,
accessibility tree, cleaned content — never as an image. There is no
screenshot and no vision model anywhere in Dinoer.

This page is a summary. The authoritative reference for an agent is
`docs/GUIDE_LLM.md` in the repository — read it in full before running
anything; it is short by design and enforces a non-presumption rule this
page does not repeat.

---

## Install (on a Debian-derived Linux machine)

Two channels, mutually exclusive on one machine — corrected 15/08/2026, this
page used to say Git-clone-only, stale since the first `.deb` release the
same day.

```bash
# .deb package — the normal path to use Dinoer as-is
sudo apt install ./dinoer_1.0.0-1_all.deb
```

```bash
# Git clone — only if you intend to modify Dinoer's own code
git clone https://github.com/RonanDavalan/dinoer.git
cd dinoer
bash scripts/install.sh
```

Both create `/opt/dinoer/` with a Python venv, Playwright, and Chromium.
Package, sources and checksums: [dinoer.davalan.fr](https://dinoer.davalan.fr).

---

## Three things you need to know

**1. A research campaign** — the primary way to use Dinoer, not an
afterthought:

```bash
python3 /opt/dinoer/campagne.py --manifeste manifeste.json
```

A manifest declares targets (`query`, `url`, `produit`, `table_reference`);
`campagne.py` collects respectfully, escalates to a real browser only when a
page needs it, and writes `collecte.jsonl` plus a synthesized report — every
claim traceable to a collected page.

**2. Read a single page, as text** — no image, no vision model:

```bash
/opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
  --url https://target.example.com --a11y --guide-version <see the guide>
```

`--a11y` returns the accessibility tree; the `extraire_texte` action returns
cleaned page text. That is the whole of what Dinoer perceives.

**3. Encrypted credential directory** — credentials are never in plaintext in
your shell:

```json
{"type": "remplir", "selecteur": "input[name=\"password\"]", "valeur": "depuis_secrets", "secret_cle": "password"}
```

---

## Before your first real call

`shot.py`/`rpa.py` refuse to run without proof you read `docs/GUIDE_LLM.md` —
the guide-lock, `--guide-version`. This is deliberate: Dinoer is not in your
training data, and a model that has not read the guide improvises —
reinvents `curl` scraping, extracts credentials into the shell, reaches for
primitives that do not exist. Read the guide first.
