# Mapbelt 1.0.0-rc.1 — pre-launch release candidate

Your GIS tool belt: eight browser-local GIS utilities. No accounts, telemetry, CDN runtime libraries or raster uploads. Public launch, domain work, contact details and payments are explicitly deferred by the user.

## Start

Extract the **complete ZIP** and open **Mapbelt.html** in a current Chrome, Edge or Firefox browser. No installation is needed for the toolkit itself. For browser acceptance or modular development on Windows, double-click **Start-Mapbelt.cmd**; then open the local address it prints. Node 20.11+ is required by the server; this release was tested with Node 22.11.0. Stop the server with Ctrl+C.

Alternatively run `node server.mjs` inside this folder and visit http://127.0.0.1:8087. Opening modular index.html directly is unsupported. Standalone Mapbelt.html embeds the source, stylesheet and two built-in XML examples. Guide/acceptance pages and extra fixtures remain companion files in the ZIP.

## Release status

This is **RC1**, not a claim of final browser acceptance. The engineering checks pass, but the authoring browser cannot reach the local preview. See RELEASE-STATUS.md for exact evidence and remaining sign-off. Do not treat a version label or a supplied test page as proof it was run.

## Tools

| Tool | Included behaviour | Main limits |
|---|---|---|
| Service inspector | WMS/WMTS capabilities, inherited metadata/attribution, layer filtering/CSV, style/dimension/CRS/extent controls, bounded preview, JSON snapshots | WMS preview needs advertised CRS:84/EPSG:4326; WMTS supports specified geographic/Mercator matrices. No authenticated proxy or mosaic. |
| GeoTIFF diagnoser | Classic TIFF/BigTIFF metadata, bands/sample format/NoData/alpha/layout, reduced imagery and mask directories, plain-language findings | Metadata only; no pixel validity or full COG certification. First image directory is the primary inspected image. |
| Footprint exporter | Affine/scale-tiepoint raster extent GeoJSON/KML; rotated and PixelIsPoint handling | Identified EPSG:4326/3857 with consistent units. No arbitrary projection or raster antimeridian splitting; corner edges are not densified. |
| XYZ calculator | XYZ/TMS indices, geographic bounds and GeoJSON, zoom 0–24 | Latitude clamps to Web Mercator limits; +180° uses easternmost tile. |
| Bounding boxes | Geographic validation, coordinate strings, WKT/GeoJSON | West > east crosses the seam and exports split polygons. Not arbitrary topology validation. |
| Batch audit | Up to 100 files, progress/cancellation, per-file review, summary/search/filter, CSV/JSON/GeoJSON/KML, prior report import | Sequential bounded metadata reads. Exports include all processed files, independent of table filters. |
| Raster export adviser | Four GDAL presets, metadata transfer, byte estimates, PowerShell/POSIX quoting, TXT/JSON recipes | Commands are generated, not run by the browser. Declared assumptions must match the actual source. JPEG is explicitly lossy and restricted. |
| Coverage planner | Spherical box area/intersection, overlap/IoU, compact multi-zoom XYZ ranges, JSON/CSV/GeoJSON/KML | Mathematical grid coverage, not provider availability. Box A determines tile counts; polar latitude clips. |

Coverage diagrams are labelled geographic grids, not basemaps. Seam-crossing collections fit a wrapped view. Large imported geometry keeps its exports but may omit its diagram. Editing inputs invalidates derived calculator results before download.

## Tools, routes and the admin

Each tool is its own file in `tools/` and lives at `/tools/<slug>` (for example `/tools/service-inspector`, `/tools/easy-crop`). A small Cloudflare Worker (`worker/`) can serve them and lets the owner switch each tool on or off from `/admin` (protected by Cloudflare Access): a tool that is off disappears from the navigation, returns 404 and its files are not served. Run `node scripts/dev-worker.mjs` to try the backend locally, `node server.mjs` (or Start-Mapbelt.cmd) for the plain local server with every tool on, or open Mapbelt.html for the offline edition. See worker/README.md.

## Privacy, requests and storage

Local files are read through bounded Blob slices and are not uploaded. Service inspections contact entered endpoints; image loading contacts advertised URLs only when requested. Requests omit stored browser credentials and referrers. URL parameters are preserved for server compatibility. The interactive map in the footprint, bounding-box and coverage tools loads OpenStreetMap street tiles from tile.openstreetmap.org, or Esri World Imagery satellite tiles from server.arcgisonline.com when you choose Satellite,; turn "Online basemap" off (or use the Offline diagram view) for no tile requests. Tile requests reveal the map area being viewed and send only your page's origin as the referrer; no files, coordinates you did not view, or reports are sent. The **Easy Crop** tool works entirely on your device: it reads the GeoTIFF in blocks from the file you choose (nothing is uploaded and the whole raster need not fit in memory) and writes the cropped GeoTIFF locally. The **Satellite Band Motion GIF** tool is a connected tool. By default it reads Sentinel-2 L2A directly from Microsoft Planetary Computer: the area and dates go to Microsoft's public STAC API and only the needed image tiles are fetched from its storage, with no account or credentials. Place search sends the typed place name to OpenStreetMap Nominatim. Every GIF carries a small "mapbelt" watermark bottom-right (edit MOTION_WATERMARK in motion.js). Optionally it can use a proxy you configure (see MOTION-WORKER.md), which receives your provider OAuth client ID/secret and the area; Mapbelt never stores them. There are no remote fonts or analytics.

Saved sessions persist selected settings only after an explicit Save. Up to 10 entries can be kept or exported as JSON; service URLs, paths, file contents and reports are excluded. Restoring settings does not fetch or recalculate. Storage can be blocked/full/cleared, especially under file://; use JSON portability. Stale session lists are detected before replacement/removal where possible.

Audit JSON import validates supported fields, counts, identities, findings and geographic polygon structure. Imports do not prove the report matches any raster. Unknown fields are dropped and imported origin is retained in exported collections/CSV/summaries. Individual file imports are renumbered to index 1 in a new one-file collection. Service snapshots redact common secret query keys only: arbitrary secrets in path segments or metadata may remain. Review reports before sharing.

## Resource/accuracy limits

- Capabilities XML: 8 MiB; WMS nesting 64 levels / 5000 named layers. Layer lists show the first 200 matches; filter to narrow, CSV exports all. Ordinary external DTD declarations are stripped without resolution; entities/internal subsets are rejected. UTF-8, declared supported encodings and UTF-16 BOMs are decoded.
- TIFF: 8 MiB total metadata reads, 1 MiB per field, 64 image directories and 1–1024 bands. Large/skipped fields produce incomplete-inspection findings. External world files/overviews are not read. Shared directories are deduplicated; real cycles fail.
- Previews: 15 seconds; 16 MiB compressed image / 64 KiB non-image diagnostics; PNG/JPEG header limits of 4096 pixels per side / 16 megapixels before decoding. Header checks are not full image validation.
- Reports: 8 MiB / 100 rows / bounded footprint complexity. Sessions: 128 KiB imports / 10 saved entries. KML supports geographic Polygon/MultiPolygon rings, holes and escaped text, not complete topology/schema validation.
- Area: radius 6,371,008.8 m with parallels/meridians; approximate spherical rectangles, not ellipsoidal surveys or valid-pixel area. Tile counts include positive-area intersections, exclude boundary-only contact, deduplicate seam columns and clip to ±85.0511287798066°. Extents need at least 1e-10° width/height. Distinct zoom levels count separately.
- Recipes: GDAL 3.2+ with supported drivers/compression. No type/CRS/NoData reassignment, scaling or reprojection is added. Base pixel bytes are not a compressed-size forecast. IF_SAFER is a BigTIFF heuristic. Source/output checks cannot detect filesystem aliases or existing files. Shell argument generation is unit-tested; GDAL CLI shell integration remains manual.

## Test and reproduce

`npm test` runs the standard Node/Python suite. Python 3 standard library is required by XML adapter tests; set PYTHON to its executable if needed. No third-party test packages are needed for this suite.

`npm run test:raster` additionally needs Python Rasterio/NumPy. It generates rasters under tests/generated/, uses real GDAL drivers for nine recipe conversions, and checks 18 metadata/footprint comparisons, lossless samples/masks and category overviews. Generated data is excluded from the ZIP.

`python scripts/build-standalone.py` rebuilds standalone HTML and runtime hashes. `python scripts/release.py --with-raster` runs checks and packages a deterministic ZIP under release/. Use `--out PATH` to choose an output folder. The archive includes CHECKSUMS.json. There is no network install step.

For browser acceptance, use the local server and open /acceptance.html. Run the 27 checks and save the JSON, then validate it with `python scripts/check-acceptance.py PATH_TO_JSON`. It matches version/source fingerprints and result consistency; it is self-reported evidence, not identity attestation. Visual/mobile/keyboard and live-service checks remain separate. The original 12 XML-only browser checks remain in tests/browser.html and tests/standalone.html.

## Project notes

See USER-GUIDE.html, ARCHITECTURE.md, TEST-REPORT.md, CHANGELOG.md and RELEASE-STATUS.md. One third-party library is bundled, unmodified: proj4js 2.12.1 (MIT licence, `vendor/proj4.js` with its licence in `vendor/proj4-LICENSE.md`), which the Reproject tool uses for coordinate-system maths. It is served from this site, not a CDN. No other browser libraries, fonts or external media are shipped. Development used locally installed Babel formatting and Rasterio/GDAL validation. Source licensing/public operator details should be chosen before any public source/site release; none is asserted here.

GeoBench's original v0.1 ZIP was unavailable. This code was rebuilt from the documented tools, then developed through v0.2–v0.6 into this release candidate. It is not a verified migration of that missing code.

References: https://docs.ogc.org/is/06-042/06-042.pdf · https://gdal.org/en/stable/drivers/raster/cog.html · https://gdal.org/en/stable/drivers/raster/gtiff.html · https://gdal.org/en/stable/programs/gdal_translate.html · https://www.openstreetmap.org/copyright
