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 /etc/dinoer/ nor the /usr/bin commands: 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 scenario JSON schema and 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. Add your own account to that group to run Dinoer: sudo usermod -aG dinoer $USER.

What to have ready first

Where it runs Debian and its derivatives. Other systems are not supported — not as a matter of principle, simply the perimeter actually tested.

You needWhenDetail
Network accessduring installation, alwayspip 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 research campaign with a query targetDinoer neither ships one nor has a public default. With none configured, 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 (package channel: from 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 by DINOER_OPENCODE_MODEL. There is no default model: the list OpenCode offers changes over time, and on 25 September 2026 (OpenCode 1.18.32) the model Dinoer used to default to was gone. Without the variable, the report step says so and stops. Choose a model from opencode models; opencode models | grep deepseek narrows the list to one family, and other families are worth trying. Then set DINOER_OPENCODE_MODEL to it. A failed call reports OpenCode’s own error and says whether the model is missing from the list. Without a working OpenCode, collection still runs and the corpus is kept; only the report is not written
OllamaoptionalLocal embeddings (nomic-embed-text at http://localhost:11434, changeable with DINOER_OLLAMA_URL and DINOER_EMBED_MODEL) for the semantic ranking of collected pages. Unreachable, the ranking falls back to the order received
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 25 September 2026. The campaign side is covered in Research campaign.

Two channels, mutually exclusive on one machine

The .deb package is the normal path if you want to use Dinoer — see Downloads for the file, the install command, and what that 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, an isolated Python virtual environment, deploys the code to /opt/dinoer/, installs Playwright and Chromium inside that environment, and runs a smoke test against a real URL before declaring itself done.

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, the Chromium cache, and the dinoer user and group — including the ones a clone installation was using. 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: JSON has none.

Then, before anything else

Dinoer refuses to run until whoever drives it has read the guide and can quote its version number. This is not a formality: an agent that has not read it improvises, and improvisation around credentials and live requests is exactly what the lock exists to prevent.

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

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

Your first run →