TomLabs Apps
← All applications

ArboTools

All of Tomáš Bouda's tree tools on one page: tree encyclopedia, tree mapping and assessment, arborist directory and firewood prices.

web static trees arboriculture landing Public Homepage

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:

  1. Build on ubuntu-latest with Node: npm run build, then checks the health document, that every placeholder is filled, that every referenced file exists and that CHANGELOG.md has a section for the version.
  2. DeployVps copies dist/ (tarball), deploy/deploy-vps.sh and deploy/nginx-arbotools.tomlabs.xyz.conf over SSH to codexdeploy@37.205.12.163 and runs the script. It unpacks into /opt/arbotools/releases/<timestamp>/, switches the /opt/arbotools/current symlink (the nginx root), installs the nginx site, lets certbot add TLS, then checks /health through nginx and TLS on the box; anything but Healthy with the new version switches back to the previous release and fails the run. The last five releases are kept. The pipeline checks https://arbotools.tomlabs.xyz/health once 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

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.