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 eval 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 /ov-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 eval
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/ov-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 /ov-versa:osm-tools-layer "CRITICAL: martin caches pmtiles file
mtime at startup" — same restart-race pattern applies.
/ov-versa:versa — image composing this layer/ov-versa:shortbread — produces the PMTiles files versatiles serves/ov-versa:versatiles-style — MapLibre style generator paired with
versatiles serve as tile backend/ov-versa:versatiles-frontend — pre-built SPA on port 28002 for
visually exploring tile content/ov-versa:osm-tools-layer — sibling martin tile server (port
23000); the two run in parallel for the comparison surface/ov-versa:notebook-osm — the versatiles convert round-trip demo
cell + the shortbread MapLibre celldevelopment
Claude Code multi-agent support in Overthink — sub-agents, dynamic workflows, and agent teams, and how each drives the existing `ov eval` disposable beds to test and verify. MUST be invoked before authoring or invoking an ov sub-agent / dynamic workflow / agent team, wiring agent-lifecycle hooks, or asking "which primitive should drive the R10 beds?".
tools
Mounts a virtiofs share tagged `workspace` at /workspace inside a VM guest via a systemd .mount unit. Use when a kind:vm entity shares a host directory into the guest and you need it auto-mounted (and re-mounted at every boot).
development
MUST be invoked before any work involving: the `kind: android` schema kind, a `target: android` deploy, the `apk:` layer package format (installing Android apps declaratively), AndroidDeployTarget, an in-pod emulator OR a remote/physical adb-endpoint device, or nested `pod → android` deployment. The first-class Android device + app surface that sits above `ov eval adb`/`appium`.
tools
Use when committing, branching, pushing, merging, tagging, creating PRs, or approving/merging PRs with gh — the feat/-branch, R10-gated, never-force-push landing workflow across the main repo + the plugins submodule + image/<distro> submodules. Covers sync-to-upstream, branch/worktree pruning, the fork+PR path for contributors without write access, and cross-repo @github landing order.