marola-site¶
The map at marola.dev: every beach in an area ranked hour by hour for sea, wind, waves, water quality and tide, computed a few times a day and served as a static page, over a Mapbox base map with animated wind and wave layers drawn from the same boards. No server, no tracking of its own, and no per-visitor cost while Mapbox's map loads stay in its free tier.
Live, rebuilt every three hours (MIP-0005, split out by MIP-0070). This repo holds the page,
the areas it covers and the workflow that publishes it. The boards themselves are written by the
marola app's image, pinned in marola-image; this repo never builds the app. It is
one of the marola repos under the umbrella, and its history
before the split is marola's, filtered to these files.
Run it¶
nix develop # or have node, python3 and docker on PATH
just site-build floripa # one area's boards from the pinned image, plus the page, into site/dist
just site-serve # http://localhost:8000
Without docker, node scripts/site_check.js renders site/static/app.js against
site/fixtures/board.json in a stub DOM.
How it is published¶
site.yml runs every three hours, on a push to main that touches the page or the pin, and when
a site-data writer dispatches site-data-updated. It pulls the pinned image, checks the page
against the image's board schema, builds every area's boards, adds the page and the coverage/,
smoke/ and stats/ panels from the site-data branch, and deploys to GitHub Pages under
marola.dev. 404.html forwards marola.dev/docs/* to docs.marola.dev.
Repo map¶
| Piece | Where |
|---|---|
| The page | site/static/ |
| The areas | site/areas.json |
| The board contract | the image's board.schema.json, vendored as site/board.schema.json |
| The deploy workflow | site.yml |
Contracts¶
| Direction | What |
|---|---|
| Consumes | the app image pinned in marola-image, run with --site --areas site/areas.json; the site-data branch's coverage/ and smoke/ (written by the app), stats/ (written by the umbrella) |
| Publishes | the static site at marola.dev; site/areas.json and site/fixtures/board.json, which the app keeps checked-in copies of; README.md and docs/, aggregated into docs.marola.dev |
| Pinned by | nothing — this repo is a leaf |
Checks¶
node scripts/site_check.js:app.jsandflow.jsin a stub DOM and Mapbox GL against the fixture board, which must match the schema.node scripts/redirect_check.js: the 404 page sends/docs/*todocs.marola.dev, path kept, and leaves every other missing path on the not-found page.scripts/board-schema.sh --check: the vendored schema is the pinned image's.python3 scripts/site_live_check.py: what marola.dev serves, every six hours (site-health.yml).
More: docs/1-design.md (files, the board → markers mapping, CSP), its
sibling docs/1-design_chat-widget.md (the chat widget),
docs/2-libraries.md (vendored Mapbox GL JS and the rest of vendor/, no
build step), docs/3-development.md (the build and deploy, the site-data
layout, health checks, i18n, bumping the app image, the MIP: trailer),
docs/4-reference.md (areas.json fields, the tile policy, the board schema
pin), and AGENTS.md.
Gemini review¶
Request the reviewer marola-dev/gemini on a pull request (sidebar → Reviewers, or
gh pr edit <N> --add-reviewer marola-dev/gemini). marola-gemini-bot posts one review with at
most 10 inline comments tagged [high]/[medium]/[low], then pushes one commit with the fixes
it is sure of, after node scripts/site_check.js passes. Request it again after new commits for a fresh review. It runs only when
asked, reviews fork pull requests without pushing to them, and never edits .github/. .github/workflows/gemini.yml
calls the devkit's gemini-review
workflow.
Built from marola-dev/marola-site@8907503.