versa/skills/versatiles/SKILL.md
VersaTiles CLI (versatiles-rs) — a single Rust binary that handles `convert` / `serve` / `probe` / `dev` for the `.versatiles`, `.pmtiles`, `.mbtiles`, and `.tar` tile-container formats. Installed from the pre-built linux-x86_64-gnu tarball on GitHub releases. Ships a supervisord service running `versatiles serve` on port 8090 (host 28090) that watches `/workspace/tiles/shortbread/`, parallel to martin on 3000/23000. The `convert` subcommand is symmetric — PMTiles ↔ .versatiles ↔ MBTiles round-trip — and is exercised end-to-end by both the layer's deploy-scope check probe and a dedicated notebook cell. MUST be invoked before building, deploying, or troubleshooting the versatiles layer.
npx skillsauth add overthinkos/overthink-plugins versatilesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Property | Value |
|----------|-------|
| Dependencies | supervisord |
| Distros | arch + fedora (binary download) |
| Build deps | curl, jq (for the dynamic release-asset URL resolution) |
| Ports | 8090 (versatiles serve HTTP; host-mapped to 28090) |
| Service | versatiles (supervisord, restart: always) |
| Tile dir | /workspace/tiles/shortbread/ (parallel to martin's /workspace/tiles/pmtiles/) |
versatiles-rs ships pre-built linux-x86_64-gnu binaries on every
release. cargo install versatiles would compile 200+ transitive
crates inside the versa image — wasteful when the upstream CI
already publishes a ready binary. Download pattern mirrors martin's
in /charly-versa:osm-tools-layer: GitHub release API → asset URL
matching versatiles-*linux*x86_64*gnu*.tar.gz → curl + tar →
install -m 0755 versatiles /usr/local/bin/.
service:
- name: versatiles
exec: /usr/local/bin/versatiles-wrapper.sh
restart: always
priority: 37
The wrapper:
#!/usr/bin/env bash
set -euo pipefail
DIR="/workspace/tiles/shortbread"
mkdir -p "$DIR"
exec /usr/local/bin/versatiles serve --port 8090 "$DIR"
Same mkdir -p defensive pattern as martin-wrapper.sh — first-deploy
state has no PMTiles files yet; versatiles serve starts cleanly on an
empty dir and auto-discovers files as the DAG produces them.
versatiles serve exposes:
| URL | Purpose |
|---|---|
| GET / | Server root (HTML directory listing) |
| GET /tiles/<source>/{z}/{x}/{y}.pbf | Vector tile fetch (the shortbread DAG outputs monaco-shortbread.pmtiles, so the source name is monaco-shortbread) |
| GET /tiles/<source>/tilejson.json | TileJSON metadata |
| GET /tiles/<source>/style.json | Default style (if shipped in the container) |
URL format differs from martin's /<source>/{z}/{x}/{y} (no /tiles/
prefix). The notebook's shortbread cell hardcodes the
/tiles/monaco-shortbread/{z}/{x}/{y} pattern in the MapLibre style
override.
versatiles convert <input> <output> infers format from extension:
# PMTiles → .versatiles
versatiles convert monaco.pmtiles monaco.versatiles
# .versatiles → PMTiles (lossless round-trip)
versatiles convert monaco.versatiles monaco-rt.pmtiles
# MBTiles → PMTiles
versatiles convert legacy.mbtiles new.pmtiles
# Directory of PNGs → .versatiles (for raster tilesets)
versatiles convert /tiles-dir/ tiles.versatiles
Tile content (MVT-PBF blobs for vector, image bytes for raster) is copied verbatim — only the container changes. Conversions involving re-encoding (PNG → WebP, etc.) are also supported via subcommand flags but not exercised by this image.
The layer's deploy-scope versatiles-convert-roundtrip check
probe runs the PMTiles → .versatiles → PMTiles round-trip on the
OSM DAG's monaco.pmtiles output every time R10 runs, asserting
both intermediate files are readable via versatiles probe. The
notebook's dedicated versatiles convert demo cell re-runs the
round-trip and renders a polars.DataFrame comparing tile counts +
file sizes across all three steps for visual inspection.
Build-scope:
versatiles-installed — versatiles --version exit 0versatiles-convert-help — versatiles convert --help exit 0 (verifies the subcommand is linked into the binary)versatiles-wrapper-installed — /usr/local/bin/versatiles-wrapper.sh exists with mode 0755Deploy-scope:
versatiles-running — supervisord service RUNNINGversatiles-port-reachable — TCP 8090 reachableversatiles-http-up — GET / returns 200versatiles-convert-roundtrip — end-to-end PMTiles round-trip via
the OSM DAG output; cleanly SKIPs when monaco.pmtiles isn't
present yet (pre-DAG fresh deploy) so the probe doesn't false-fail
on first-run stateParallel DAGs that call supervisorctl restart versatiles race
exactly like the four reload_martin calls do. The shortbread DAG's
reload_versatiles task uses the same proper synchronization
primitives:
fcntl.flock("/tmp/charly-versatiles-restart.lock") — serializes the
supervisorctl invocations globally./ 200 assertion — verifies the END STATE, not the
supervisorctl exit code (which can be non-zero even when versatiles
ends up healthy).See /charly-versa:osm-tools-layer "CRITICAL: martin caches pmtiles file
mtime at startup" — same restart-race pattern applies.
/charly-versa:versa — image composing this layer/charly-versa:shortbread — produces the PMTiles files versatiles serves/charly-versa:versatiles-style — MapLibre style generator paired with
versatiles serve as tile backend/charly-versa:versatiles-frontend — pre-built SPA on port 28002 for
visually exploring tile content/charly-versa:osm-tools-layer — sibling martin tile server (port
23000); the two run in parallel for the comparison surface/charly-versa:notebook-osm — the versatiles convert round-trip demo
cell + the shortbread MapLibre celltools
Use when authoring or modifying a charly PLUGIN — a candy with a `plugin:` block that contributes Providers (verbs/kinds/deploy-targets/steps/builders/commands), its own CUE schema, builtin (compiled-in) or external (out-of-tree git repo). Covers the unified Provider model, the per-plugin CUE-schema contract (single source → Go params for dev + schema-over-Describe RPC for runtime), the SDK, and the loader.
tools
The CUE data-validation / configuration CLI (cue), pinned to v0.16.1. Use when working with the cue candy, installing the cue binary into a box or onto a target:local dev host, or running the offline schema-vendoring pipeline that feeds charly's egress validation.
tools
CUE EGRESS validation — validating (and, where it adds value, generating) the config files charly WRITES to a system BEFORE the bytes hit disk. MUST be invoked before working on charly/egress.go, the vendored schemas under candy/plugin-egress/egress-schemas/vendor/, the ValidateEgress / registerVendoredEgressKind path, the offline `task cue:vendor` pipeline, or adding an egress schema for any written artifact (cloud-init, k8s manifests, traefik routes, runtime config, install ledger, systemd/quadlet units, ssh_config, libvirt XML).
tools
Kubernetes cluster-probe declarative check verb — the `kube:` check verb (nodes, pods, ingress, storage class, addon health, apply/delete, and arbitrary resource GETs) served out-of-process by the candy/plugin-kube plugin (vendored client-go; no external kubectl required).