ArboTools
All of Tomáš Bouda's tree tools on one page: tree encyclopedia, tree mapping and assessment, arborist directory and firewood prices.
ArboTools
A landing page at https://arbotools.tomlabs.xyz that links Tomáš Bouda's tools for trees:
| Tool | Address |
|---|---|
| Stromopedie — tree encyclopedia | https://stromopedie.cz |
| TreeMap — tree mapping and assessment | https://treemap.cz |
| Katalog arboristů — directory of Czech arborists | https://katalogarboristu.cz |
| DřevoBot — firewood prices | https://drevobot.tomlabs.xyz |
boudakaci.cz (his tree-felling business) is credited in the footer as the author, not listed as a tool, so the arborist directory on the same page stays neutral.
Plain HTML, CSS and JavaScript, no framework and no dependencies. The UI is Czech.
npm run build # src/ → dist/, stamps the version from package.json, writes dist/health
npm run dev # build and serve dist/ on http://127.0.0.1:8110
npm run icon # regenerate icon.png
GET /health is a static file written by the build: {"status":"Healthy","version":"…","name":"arbotools"}.
In production nginx serves dist/ and location = /health with application/json.
Analytics
GA4 through the shared consent banner src/tomlabs-consent.js (repo TomLabs.Consent; update the copy with
pwsh F:\Root\GIT\TomLabs.Consent\Sync-Consent.ps1 -Repo F:\Root\GIT\ArboTools). Nothing goes to Google before
the visitor accepts; the "Cookies" link in the footer reopens the banner. The measurement ID is never in the
source: the build replaces __GA_MEASUREMENT_ID__ with the GA_MEASUREMENT_ID environment variable (pipeline
variable group web-analytics). Without it the page has no banner and no tag.
Deployment
Azure Pipelines (azure-pipelines.yml, project ArboTools) on every push to main:
- Build on
ubuntu-latestwith Node:npm run build, then checks the health document, that every placeholder is filled, that every referenced file exists and thatCHANGELOG.mdhas a section for the version. - DeployVps copies
dist/(tarball),deploy/deploy-vps.shanddeploy/nginx-arbotools.tomlabs.xyz.confover SSH tocodexdeploy@37.205.12.163and runs the script. It unpacks into/opt/arbotools/releases/<timestamp>/, switches the/opt/arbotools/currentsymlink (the nginx root), installs the nginx site, lets certbot add TLS, then checks/healththrough nginx and TLS on the box; anything butHealthywith the new version switches back to the previous release and fails the run. The last five releases are kept. The pipeline checkshttps://arbotools.tomlabs.xyz/healthonce more from the outside, then uploads the catalogue entry to the app store (templates/publish-web-app.yml@appstore).
Variable groups in the ArboTools project: arbotools-deployment (VPS_SSH_PRIVATE_KEY_B64, secret),
appstore-publish (APPSTORE_TOKEN), web-analytics (GA_MEASUREMENT_ID). One idempotent command creates
or refreshes them, the pipeline and its authorizations, with every value taken from the TomLabs vault:
pwsh F:\Root\GIT\ArboTools\tools\Setup-Pipeline.ps1 -SshKeyPath <path to the codexdeploy private key> # first time
pwsh F:\Root\GIT\ArboTools\tools\Setup-Pipeline.ps1 # later
Manual rollback on the VPS:
ls -1 /opt/arbotools/releases
ln -sfn /opt/arbotools/releases/<previous> /opt/arbotools/current.next && mv -Tf /opt/arbotools/current.next /opt/arbotools/current
Changelog
Changelog
0.1.1 — 2026-10-08
- Fixed: Stromopedie and TreeMap links point to their new addresses stromopedie.cz and treemap.cz.
0.1.0 — 2026-10-07
- Added: the first version of ArboTools — one page linking Stromopedie, TreeMap, Katalog arboristů and DřevoBot,
with a light/dark switch, the version in the footer and
GET /health. - Added: anonymous visit statistics (Google Analytics) only after consent in the cookie banner; the "Cookies" link in the footer reopens it.