Dinoer

Install

What the installation leaves on your machine, what to have ready before it starts, and the two channels: the .deb package, or a Git clone for whoever intends to modify the code.

What the installation leaves on your machine

This is the tree the .deb package produces. The clone channel builds the /opt/dinoer/ and /var/log/dinoer/ parts, keeps its configuration in /opt/dinoer/dinoer.conf, and has neither the directory /etc/dinoer/ nor the commands in /usr/bin: you call the programs by their path.

/opt/dinoer/
├── shot.py  rpa.py  campagne.py  journal.py
├── lib/
├── scenarios/
├── skills/
├── scripts/
├── docs/
├── dinoer.conf.d/
├── references/
├── requirements.txt
├── venv/
└── .cache/ms-playwright/
/etc/dinoer/
/usr/bin/  dinoer-shot  dinoer-rpa  dinoer-campaign
           dinoer-monter-secrets  dinoer-demonter-secrets  dinoer-monitor-verifier
/var/log/dinoer/
PathWhat it is
shot.py, rpa.py, campagne.pythe three programs you run: an action sequence, a scenario file, a research campaign
journal.pyreads the operations journal: what was done on a given target, and when
lib/the modules they import
scenarios/, skills/the JSON schema of scenarios and the examples, and the scenarios you promote
scripts/mounting and unmounting the encrypted directory, and the monitoring check
docs/the guides, including GUIDE_LLM.md, whose version number the lock asks for
dinoer.conf.d/an example operator profile
references/the structural references rpa.py writes, shared with the dinoer group
requirements.txtthe Python dependencies, at exact versions
venv/the Python environment, built during installation
.cache/ms-playwright/Chromium, downloaded during installation
/etc/dinoer/dinoer-sample.conf, a template. dinoer.conf is never created for you: copy the sample and edit it
/usr/bin/dinoer-*the six commands; the manual page is man dinoer
/var/log/dinoer/the operations journal, and the evidence archived for authenticated pages

The package also creates the dinoer system user and group. To run Dinoer from your own account, add it to that group, then open a new session: sudo usermod -aG dinoer $USER.

What to have ready first

Where it runs Debian 13 and Ubuntu 24.04. Debian 12 and Ubuntu 22.04 cannot install the package: three of its dependencies carry the t64 names that only these newer releases provide. Linux Mint 22 is based on Ubuntu 24.04 but has not been tested as such.

You needWhenDetail
Network accessduring installationpip downloads the Python dependencies and Playwright downloads Chromium; the package carries neither
System librariesalwaysapt installs what the package declares: Python 3 with venv and pip, FUSE and gocryptfs for the encrypted directory, and the libraries Chromium runs on
A SearXNG instancefor a campaign with a query targetDinoer ships none and has no public default instance. Without one, campagne.py stops with an explicit message. Set DINOER_SEARXNG_URL, or the searxng_url key of the configuration file: /opt/dinoer/dinoer.conf on the clone channel, /etc/dinoer/dinoer.conf on the package channel (read there since 1.0.1)
OpenCodefor a campaign to write its reportDinoer runs opencode run as a subprocess (~/.opencode/bin/opencode, or DINOER_OPENCODE_BIN) with the model named in DINOER_OPENCODE_MODEL. There is no default model: choose one from opencode models, hosted, or a local Ollama model declared to OpenCode. Without the variable, the report step says so and stops; a failed call reports OpenCode’s own error and whether the model is missing from the list. Without a working OpenCode, collection still runs and the corpus is kept; only the report is missing
Ollamaoptionallocal embeddings (nomic-embed-text at http://localhost:11434, changed with DINOER_OLLAMA_URL and DINOER_EMBED_MODEL) to rank the collected pages by meaning. If it cannot be reached, the pages keep the order in which they arrived
The encrypted directoryfor scenarios that sign inThe credential directory

Sources: debian/control, debian/postinst, requirements.txt, lib/searxng.py, lib/modeles.py and lib/vector.py, version 1.0.1, read on 27 September 2026. The campaign side is covered in Running a research campaign.

Two channels, mutually exclusive on one machine

The .deb package is the normal path to use Dinoer: see Downloads for the file, the install command, and what the apt sandbox notice means.

Clone the source instead if you intend to modify Dinoer:

git clone https://github.com/RonanDavalan/dinoer.git
cd dinoer
bash scripts/install.sh

This creates the dinoer system user and group and an isolated Python environment, deploys the code to /opt/dinoer/, installs Playwright and Chromium in that environment, then runs a test call (shot.py --a11y) against a real URL.

Why one machine takes one channel. Both write to /opt/dinoer/ and create the same dinoer user and group, and neither detects the other: dpkg knows nothing of what install.sh put there. Removing the package deletes /opt/dinoer/venv and the Chromium cache; purging it also deletes the dinoer user and group, which a clone installation uses too. The configuration is read from two places as well: /etc/dinoer/dinoer.conf for the package, /opt/dinoer/dinoer.conf for the clone. Both are plain JSON, without comments, which JSON does not allow.

Then, before anything else

Dinoer refuses to run until whoever drives it has read the guide and can quote its version number:

grep notice-version /opt/dinoer/docs/GUIDE_LLM.md

The number it prints is what you pass as --guide-version.

Your first run →