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/
| Path | What it is |
|---|---|
shot.py, rpa.py, campagne.py | the three programs you run: an action sequence, a scenario file, a research campaign |
journal.py | reads 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.txt | the 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 need | When | Detail |
|---|---|---|
| Network access | during installation | pip downloads the Python dependencies and Playwright downloads Chromium; the package carries neither |
| System libraries | always | apt 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 instance | for a campaign with a query target | Dinoer 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) |
| OpenCode | for a campaign to write its report | Dinoer 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 |
| Ollama | optional | local 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 directory | for scenarios that sign in | The 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.