20 Atlas — the static, in-browser scores, species and places app
21 Atlas
21.1 Overview
The Atlas (https://marinesensitivity.org/atlas/?ver=v5) is the MST’s interactive application: one static web app, built with Svelte and MapLibre, that runs entirely in the browser. Where the Scores and Species Shiny apps it replaced were server-rendered R processes, the Atlas has no application server of its own: scores, flowers, tables and reports are computed in your browser, by a DuckDB instance compiled to WebAssembly (DuckDB-WASM) querying the release’s published Parquet directly over HTTPS. It still depends on a few other services for what a browser cannot compute itself — score and species map tiles come from the project’s titiler, zone outlines from PMTiles on S3, and the basemap from CARTO — but there is no Atlas-specific backend.
On the public host the release is a query parameter (?ver=v7), resolved client-side against the published versions.json and defaulting to the promoted release when absent. A restricted pre-release is served only through the signed-in preview host, at https://preview.marinesensitivity.org/{ver}/atlas/ (the version as the URL path, since Cloudflare Access scopes its reviewer policies by path, never by query).
This chapter describes the Atlas as of version 0.10.93. Figure 21.1 shows the default Scores view: the 0.05° cell grid colored by a composite sensitivity score across U.S. waters, dark theme (the app’s default). In the current build the four-tool rail is attached to the panel, which opens docked on the left with Layers showing, the map’s legend sits at the bottom right, and the basemap’s attribution is just under it.
Desktop vs. phone layout. On a wide viewport the four rail tools — Layers, Details, Table, Report, the same in both lenses — open a single panel attached to the rail. It docks on the left by default, one header button moves it (and the rail) to the other side, and Table takes the whole stage instead of the side panel. On a phone the identical four tools sit in a labelled bottom tab bar, and the panel becomes a bottom sheet with three heights (peek, half, full). Figure 21.2 shows the phone layout, and Figure 21.3 its top bar’s More (⋯) menu.
21.2 Quick start
Desktop:
- Click a cell or a Program Area on the map, then open Details (the rail’s second tool, or the popup’s Details link) for its flower plot; Add to report keeps it as a place, and Open table lists its species.
- Or open Report, and under Add a place choose a Program Area, pick one on the map, draw a Rectangle (click, move, click, then Done), pick from the gazetteer, type coordinates or upload a file.
- Select a place in the list — Program Area or drawn — to see its results: a coverage note (or, for a Program Area, its published cell count, area and composite), a flower and component table, and (on request) its species table. Rename a drawn place inline if you like.
- Share at the foot of the Report tool opens the place-link dialog — the fastest way to hand someone the same place.
- Open report (the gold button at the foot of the Report tool) opens a printable, downloadable document (Print, HTML, ZIP or Word).
Phone: the tool rail is the bottom tab bar; use the Program Area picker or Enter coordinates rather than drawing, and the file picker rather than dropping a file on the map (that gesture needs a desktop pointer).
21.3 Getting around
The top bar, left to right on desktop: the MST mark and title; a release chip that opens the version picker; a Scores | Species lens switch; a search field (Program Areas, regions and coordinates in the Scores lens, Section 21.4; species in the Species lens); then, right-aligned and icon-only (each shows a tooltip on hover or focus), Share, Download (a PNG or SVG of the map view, a GeoTIFF of the current data layer, or a GeoJSON of the current places), a (?) Help menu (Take a tour, keyboard shortcuts, a Docs link), Feedback, About this release, and a sun/moon theme toggle. On a phone (below 900 px) the title collapses to the mark, and Share, Download, Feedback, About, Take a tour, Docs and the theme toggle fold into one More (⋯) menu beside a search button; below 381 px the mark hides too. The keyboard-shortcut list is desktop-only. Report is not a top-bar control on either viewport: it is a rail tool.
The tool rail is four controls, always in the same order, in both lenses and on every viewport: Layers · Details · Table · Report. Layers holds the map’s layer stack and the lens’s own data controls. Details shows what was last clicked — the flower plot in the Scores lens, the species information in the Species lens. Table is the species, zone and composition tables (the model inputs, in the Species lens). Report is the Places flow and the report itself.
The panel that a rail tool opens is attached to the rail and docks on the left by default; one header button moves both to the right, and the choice is remembered per browser. Resize it by dragging its map-facing edge or with arrow keys, or collapse it to a small labelled pill; clicking the active tool collapses the panel, and clicking any tool opens it. Table takes the whole stage beside the rail (its “← Map” button returns). The panel’s header says what is shown — the active layer and unit, the clicked cell or species name, “3 places” — rather than the tool’s name, which it shows only when nothing is selected (“Details”, “Table”, “Report”). The panel arrangement is chrome, not part of the shared view: only the top bar’s Share writes it into a link (as a ui= token), the address bar does not carry it. On a phone the same panel is the bottom sheet, with peek/half/full detents. On a desktop the map’s legend floats at the bottom right (mirroring to the bottom left when the panel is docked on the right), with a histogram of the whole layer’s values above its colour ramp and a marker for the clicked value; on a phone it is a compact Legend chip above the sheet that opens the full legend, moving into the sheet’s own header at full height.
21.4 Scores lens
The Scores lens shows the composite, extinction-risk-weighted score for every 0.05° cell (or, aggregated, every Program Area) of U.S. waters. Layers (Figure 21.4) opens with this lens’s own controls at the top: a Raster cells | Program areas switch for the spatial unit, and a Layer menu (the composite score or one component) with a short description of what it shows. Below them, Layers on the map lists the rows you can change, top to bottom: Selection (pinned at the top), Outlines, Data and Place labels. Expanding Data gives its Color palette and, where the release publishes that overlay, a Cells outside Program Areas switch; a Sphere (globe projection) switch sits under the list. Every row’s visibility and opacity can be changed and most can be reordered, but Data can never move above Outlines, so an opaque score raster can never hide the boundaries it is measured against. The basemap’s land, boundaries and roads are drawn under everything and have no row of their own. Reset layers restores the default stack.
Clicking a cell or a Program Area selects it: the URL gains a sel=cell:<id> or sel=zone:<unit>:<key> token, which the Details (flower plot) and Table tools then describe (Section 21.8). A click never switches tools: it updates Details in place and adds a “Last clicked” row to the Report tool. A click on land or outside the scored area shows “No scored cell here” with its coordinates and leaves the selection unchanged.
The top-bar search field also works here: it matches Program Areas (and any subregion/ecoregion archive the release happens to publish) by key (“ALA”) or by name (“Aleutian”), and coordinates typed as “lon, lat” (e.g. “-140, 57” — “lat, lon” is read correctly too, either by an explicit lat/lon label or because the default order would be out of range). Matching is entirely offline, against only what the release itself already publishes — no Nominatim, no third-party geocoder, no network call. Choosing a Program Area result selects it exactly as clicking it on the map would, and flies the camera there; choosing a coordinate result flies to the point and selects that cell. Results are a keyboard-navigable list (arrow keys, Enter to select, Esc to close), on both the desktop top-bar field and the phone’s search modal.
21.5 Species lens
Switching to Species turns the top-bar search into a species picker (common or scientific name, with an “Only species in US waters” checkbox). Layers then leads with a Model input picker — a bar headed ✓ Merged Model (maximum of N inputs) (▶ and the input’s name once an input is picked) with a gold left edge, the active layer as a gold-filled pill, plus one pill per contributing input dataset — a Zoom to layer on change checkbox (on by default; picking an input refits the camera to that surface, and zl=0 in the link turns it off), and, where the selected input publishes both, a labelled Show … as switch (“Original” vs. “Interpolated,” or “Delivered” vs. “As ingested” for a dataset already on the scoring grid). Below it the Data row carries the species title with its zoom actions. An input’s raster is found the way the retired Species Shiny app found it — through the release’s model-asset registry, looked up by model key — and an input whose registry row is missing renders as a struck-through, non-interactive pill, never simply omitted. The species’ own information — names, ESA listing, IUCN Red List category, WoRMS id, and the tree of values (the merged model and its inputs, the layer on screen in bold) — is in Details. Selecting a species flies the map to that model’s extent; clicking it then returns that cell’s modelled value, or “No scored cell here” outside the model’s range. The legend floats in a corner of the map (a legend chip on a phone), titled with the species’ common and scientific name, with a subtitle naming the layer and its 1–100 range.
21.6 Places
Places — the first part of the Report tool, listed with its count (“Places 2 / 20”) above an Add a place section — is what the two retired Shiny apps did not have: any area you outline gets the same scores and species results the built-in Program Areas get. The empty state reads exactly: “No places yet. Click the map, or add one below.” A click on the map shows up as a pink Last clicked row with an Add button, which hides once that place is in the list; a click never wipes places you have explicitly added.
- Pick a Program Area. The Add a Program Area chooser plus Add this Program Area needs no pointer and works on a phone. Or turn on Pick mode and click on the map — that only highlights it (Ctrl/Cmd-click, Shift-click or long-press to highlight several) — and “Add to places (n)” is the button that actually adds it; several picks become one place. Program Areas are shown as “Full Name (KEY)” — e.g. “St. George Basin (GEO)” — from an app-side name table generated off the canonical Program-Area geometry (no published release, v6 through v9, actually publishes a full name on its own Program Area rows; a release that does publish one is preferred when present), everywhere: Places, search, the map tooltip, the Details flower’s title, the Table header, the Zones table and the report.
- Pick from the gazetteer. Turn on Pick from gazetteer to show the gazetteer’s polygons on the map and click one to add it. The place is carried in the link by its gazetteer id, not its outline (Section 21.7); other gazetteer collections appear in a Gazetteer layer selector once the gazetteer publishes its layer list, and the map’s credit line names the gazetteer’s data while its polygons or places are shown.
- Draw a Polygon, Rectangle or Circle: click, move, click for each vertex or corner (not a drag), then press Done — a polygon also closes when you click its first vertex again, or press Enter. A circle is stored as a 64-sided polygon. Dragging a finished shape’s corner edits that place in place (same row, same name, re-analysed) rather than adding a new one.
- Enter coordinates — the keyboard/screen-reader alternative to drawing, in a modal dialog: a bounding box (
xmin, ymin, xmax, ymax), a list oflon, latvertices one per line, or pasted WKT/GeoJSON. A refusal is shown verbatim — what went wrong, why, and how to fix it. - Upload a file, through the picker or by dropping it anywhere on the map: “GeoJSON, zipped shapefile, KML, GPX, FlatGeobuf, WKT or GeoPackage, up to 10 MB.” GeoPackage is now read (polygons only, same as every other format), through the same resident DuckDB-WASM engine the scores boot, via its
spatialextension — fetched live, with consent, fromextensions.duckdb.org(the one deliberately non-mirrored third-party download, 22.4 MB); each.gpkgupload asks first, not just the first one in a session. A GeoPackage with no vector layer (raster tiles, or a plain attribute table) is refused whenST_Readfails to read it (see Known limitations), not by a dedicated check. Other rules that cause a refusal: polygons only (points and lines are refused, never buffered); a shapefile needs its.prj(projected coordinates are refused); at most 50,000 vertices; a zipped shapefile at most 50 MB uncompressed and 200 entries; and the shape must touch the U.S. study area. A feature’s own name (KML’s<name>, or aname/title/labelproperty on GeoJSON/shapefile/etc., case-insensitive) — auto-detected from the file’s first feature and applied to every feature — names each place; a file with no such property falls back to the file name, numbered. A file with several features becomes one place per feature (up to 20), each named this way, or one merged place, named after the file, your choice.
Each row shows its area and, as soon as it is analysed, its data coverage percentage and composite score directly in the row — for a drawn, typed or uploaded place the same analysis runs for every such place in the list, not only the one currently selected; a Program Area row shows its own published composite the same way (e.g. “Aleutian Arc (ALA) … 28.3 composite”). Row actions: an inline rename (≤ 60 characters, drawn/uploaded places only), zoom to, duplicate (drawn/uploaded only), delete, and Open in report. Selecting any place — drawn, typed, uploaded, or a Program Area — expands the same results panel below the list, though the note at its top differs by kind: a drawn, typed or uploaded place shows a coverage note (“N% of this place is inside the US study area (a of b cells)”, or “This place is outside US waters here: no scores can be computed”); a Program Area shows its own note instead (“N cells, A km²; published composite C.”). Both then show a flower plot and a component table, and a species table on request — a drawn/typed/uploaded place behind a “Loading species needs N tiles, about X MB. Continue?” prompt (species come from map tiles), a Program Area behind a plain Load species button with no such prompt (its species table is a precomputed release table, not tiles). A single selected Program Area reads all of this straight off the release (the same path the Scores lens’s Table › Zones tool uses, Section 21.8); a multi-Program-Area selection (several picks added as one place) still sums area and means the composite for the list row, but its flower/component/species panel asks you to select a single Program Area instead of guessing which one’s to draw. Show analysis cells paints the analysed 0.05° cells (up to 20,000 of them) for a drawn, typed or uploaded place; for a Program Area it reads plainly “Show analysis cells: not available for Program Areas yet” — the app bundle the Atlas reads does not yet carry per-zone cells, even though the release’s own tables do (see Known limitations) — rather than showing a disabled control with a misleading reason. The list caps at 20 places (“n / 20 places”); Recent (this browser only) offers to add a removed place back. The Report tool’s footer is pinned to the bottom of the pane: a sentence saying what the report is about (“Reporting on 2 places.”, “Reporting on the last clicked place. Add it to keep it.”, or “Add a place to open a report.”), the gold Open report button (disabled with nothing to report on), then Share and Download places (GeoJSON, with each gazetteer place’s id), the last two disabled with zero places.
Two different Share buttons. The top-bar Share simply copies the current address to the clipboard, plus a ui= token that records the panel arrangement — no dialog, no summary, no length check. The Share at the foot of the Report tool opens the real dialog described next, and is the one to use whenever places are involved.
21.7 How places are stored in the link
A place never lives on a server: it is encoded directly into the URL fragment (#pl=, never the query string, so it is never sent to a server or a referrer), so opening a shared link reproduces the sender’s exact area. Every analysis runs on the decoded geometry, never the geometry as drawn, so the numbers can never diverge between sender and recipient. Places are joined with ~:
#pl=z.pa.GAA~g1.Gulf%20box.EAMBAQSf_grYrQPQDwAA0A_PDwA~p.NMS%3ACINMS.Channel%20Islands
(the decoded form; the address bar itself percent-encodes ~ and other reserved characters)
z.<set>.<key>[,<key>...]— a reference to a built-in zone (paProgram Area,plPlanning Area,erecoregion,srsubregion); its geometry comes from the release’s own PMTiles.g1.<name>.<base64url bytes>— a drawn, typed or uploaded polygon, carried inline as a compact binary encoding (see “For developers” below).p.<place_id>.<name>— a gazetteer place, carried by reference: only the gazetteer’splace_idand a display name travel, e.g.p.NMS%3ACINMS.Channel%20Islands. It is fetched when the link opens and analysed like a drawn place; if the gazetteer cannot be reached the place stays in the list (and the link) with a “couldn’t load” note and a Retry. Links made before 0.10.88 open unchanged, but an older Atlas drops ap.place it cannot read.u.<name>.<8-hex-digit digest>— the fallback for a place too large to carry (see below): only a name and a digest travel.
g1 byte layout
Each ring is quantized to a fixed precision (3 decimal digits, ~110 m — 4 digits when the place’s bounding box is under 0.5° in both directions), delta-encoded vertex-to-vertex as zigzag varints running across rings and polygons, and base64url-encoded with no general-purpose compression (delta varints are already dense). Longitudes are stored unwrapped, so a place crossing the antimeridian round-trips without a special case. msens::place_decode() is the R decoder; the shared test fixture (tests/fixtures/place_codec.json) matches it byte for byte.
The link’s length is checked only when you open the Report tool’s Share dialog. Adding a place, or copying the top-bar Share link, carries the unsimplified geometry (already quantized to 3–4 decimals) regardless of length. In that dialog: up to 2,000 characters silently; between 2,000 and 8,000 a note reads “This link is over 2,000 characters — some chat apps and older browsers truncate very long links,” with Copy anyway; only above 8,000 does the Douglas-Peucker ladder run — 0.001° doubling to 0.016°, a rung accepted only while the area changes by no more than 1% and every ring stays simple — aiming to bring the link back under 2,000 characters; it stops at the first rung that does, or, if none does, uses the coarsest accepted rung provided that still fits under 8,000. This is never silent: the dialog shows the before/after (vertices, area change, cells, Figure 21.9), and you click “Simplify and update the numbers” to accept it — which is also what rewrites #pl=, so the copied link and the displayed numbers can never disagree. If even the coarsest rung is still too long, Copy link anyway copies every drawn, typed or uploaded place (zone places are unaffected) as a u. token instead — your own address bar and session keep the real shapes; the recipient of that copied link sees a named row with no results and a “not analysed yet” chip, never a prompt. The dialog’s own advice at that point is to download the place as GeoJSON and send that alongside the link. A single small rectangle almost always fits in the silent budget; that is not guaranteed for several places together, or a long base URL.
The rest of the view travels the same URL-is-the-state way, in the query string: ver, lens, lyr/sp (with in, rep and us for a species’ input, representation and US-waters filter), unit, area, map (camera), pal, sel, layers (the stack deltas from Section 21.4), zl (zoom to layer), theme and tour — each written only when it differs from its default. ?tool=report (or layers, details, table) opens that rail tool and counts as a deep link, so the first-visit welcome does not cover it; the top-bar Share adds a ui= token for the panel arrangement. A link from the retired Shiny apps (mdl_key, mdl_seq) is rewritten to sp (and in when it named an input) when the Atlas loads.
21.8 Details and Table
Details (the rail’s second tool) describes what was last clicked, and is the same tool in both lenses. In the Scores lens it is the Flower plot for the clicked cell or Program Area, headed by its subject (“Cell 3372565 · 28.275° N, 83.575° W” or the Program Area’s full name), with Add to report and Open table buttons; with nothing clicked it shows the flower for All US waters. In the Species lens it is the species’ information (see the Species lens above). A drawn place’s flower and species table live in the Report tool’s results panel instead (Section 21.6).
The flower draws one equal-width annular petal per score component, scaled to its rescaled score; the hub shows the plain mean of the components present (not a weighted mean). Since 0.10.41 the values also list in a real table (swatch, component, score, and a Mean row) below the plot.
Table takes the whole stage beside the rail, with a one-row header: a ← Map button that collapses the panel, what is shown (“Species in Cell …”, “Species in All US waters”, “Species for 2 places”), the column glossary and the CSV download. In the Species lens the Table lists the species’ model inputs instead (with its own CSV download). In the Scores lens it opens three underline tabs: a sortable species table (Category, Taxon, Scientific name, Common name, ER code, ER score, Model, MMPA, MBTA, Area (km²), Avg. suitability, % of category — ESA and IUCN status are folded into ER code), a zones table (every Program Area ranked by the current layer, with “report on selected” once some are ticked), and a composition treemap (one box per species category, sized by suitability × extinction risk × area). Only the species table has the phone’s compact default columns and a Columns control; both tables get sticky headers/first column and horizontal scrolling that never spills the panel. Only the species table’s Download CSV exports it; the zones table and the composition treemap have no export yet. A drawn place’s Components and Species tables in the Places results panel each have their own working Export CSV.
21.9 Report
The Open report button reports every place currently in the link (#pl=); with no places, it reports the single selected Program Area, or the single clicked cell (its square, the same place Add puts in the list); with none of these, it is disabled and the footer says “Add a place to open a report.” A row’s own Open in report reports just that row’s place. The report opens in a new tab and renders progressively as its data arrives:
- a header band — mark, release chip, generation time, permalink and QR code (a restricted release also gets a PREVIEW banner and print watermark);
- an introduction;
- a collapsible Parameters section (kind, keys or vertices, area, cell count, study-area share, token);
- a map — interactive on screen; a static snapshot only in print and the HTML export;
- one flower plot per place, under “Plot of Scores”;
- a Table of Scores — component and overall scores, with a footnote when a component covers under 99% of the area, or is missing entirely because the release’s own 5% coverage floor dropped it;
- a Summary of Species per place (a category × count cross-tab, plus the top 20 by score);
- Sources and Method, with the release’s own citations — each query behind these numbers is a parity-tested twin (
npm run parity, max|Δ| < 1e-9) of anmsensR function; “Reproduce in R” prints the exact calls tomsens::place_decode(),cells_in_polygon_grid()andscores_for_cells()that reproduce it, needingmsens≥ 0.44.0 and a local copy of the release’ssdm.duckdb; - a Provenance section (release, status/access, app build SHA, DuckDB-WASM version, tables read, SQL run).
t= title. Atlas 0.10.92, release v7, 2026-10-16.
Four exports, all built client-side: Print (the browser’s dialog; roughly five Letter pages); Download HTML (one self-contained file — the flowers stay inline SVG, only the map is an embedded PNG); a data package (ZIP) — README.md, CITATION.md, provenance.json, places.geojson (drawn/uploaded places only, not zone places), a scores_*.csv/species_*.csv pair per place, and query/*.sql; and a Word document (.docx) — the same tables as coded Word styles, plus the map and a rasterized flower per place.
21.10 Accessibility and performance notes
The Atlas ships a written WCAG 2.1 conformance note and a performance budget report in its own repository. As of the note’s own 0.10.24 (2026-09-23) evaluation the claim is “partially supports,” not full support, and it states plainly that no screen reader was actually driven in producing it — automated and manual keyboard testing stand in for that. Two skip links sit at the very top of the page: “Skip to the tools” and “Skip to the details panel.” The critical-path JavaScript was measured (0.10.20, 2026-09-23) at ~417 KB gzip against a 450 KB budget (it has been 460 KB since 0.10.89), plus ~140 KB for the MapLibre worker against 150 KB; a separate gate asserted the species lens paints its first data pixel within 2.5 s on a laptop and 4 s on CI. The measured numbers may have moved since; see the linked reports for current ones.
21.11 When a service is down
Since 0.10.58, the Atlas checks two external services it does not control: titiler-v8 (every score and species map tile) and the S3 data origin each release’s own files are fetched from. Both are checked at boot and on a manual Retry; a map tile that actually fails to load for a real reason — a 5xx, a network error, or a timeout, never a normal “this release has no data here” 403/404 — re-checks only the tile server. It never polls in the background while everything is fine.
When either is down, a dismissible banner — since 0.10.62 it sits in the map stage, below the top bar, so it never covers the top bar’s controls — names the failing host, the reason (timeout or HTTP status), and what still works — places, tables and reports already built from data already loaded, just no new tiles or new fetches from the down host; when it is specifically the tile server that is down, the legend also switches to a compact “tiles unavailable” state instead of a bare colour ramp. Built after titiler-v8 and the API were unreachable for an hour and the live app kept rendering a perfectly normal-looking map with no raster and no word to anyone.
What it cannot detect: a partial outage (some tiles or objects failing, others not — only a further real request surfaces it), a degraded-but-200 response (a tile that loads but paints wrong data), or a preview session’s own restricted data prefix (the probe always checks the public bucket origin, not a signed-in override). No release the Atlas reads from calls a separate API today, so there is nothing of that kind to probe; DuckDB-WASM’s own Parquet fetches, PMTiles zone archives and the basemap are likewise outside this check’s scope — a partial CDN problem affecting only one of those would not trip the banner.
21.12 Feedback and versions
Feedback opens a dialog: a kind (bug / idea / question / data), a title, a description, an optional email, an annotatable screenshot, and a privacy checkbox (off by default) for including the current view’s link. Send is live: it posts to a Google Apps Script endpoint that writes a Sheet row, mails the team, and — for a public release — also files a public GitHub issue in MarineSensitivity/atlas with the screenshot attached (your email, if given, is never included in it); a restricted release never gets a public issue either way. An email, if given, is kept only in the team’s Sheet row and mail (plus a copy to you), never in the issue (see docs/feedback.md in the atlas repo for the dialog’s exact privacy wording). The original zero-backend fallback stays alongside Send, not replaced by it: “Open as GitHub issue” opens its own prefilled public issue, labelled by kind, with the screenshot copied to your clipboard to paste in — offered on every public release whether or not Send is configured, and the only option on a build with no endpoint set. Tell an analyst plainly: on a public release, both routes end in a public GitHub issue. A restricted release never offers the GitHub route; on a build with no endpoint configured it says plainly that “feedback cannot be sent from here right now.”
GA4 receives interaction events as well as page views, and the app also logs those same events to the batched usage-log Sheet the retired Shiny scores/species apps also wrote (app = "atlas" distinguishes its rows) — never the URL fragment, which the app’s own analytics code is source-scanned to never read.
Versions follow the same public/restricted split as the rest of the MST (see Chapter 2): a public release opens directly on the public host; a restricted pre-release’s Atlas is reached only through the signed-in preview host, at its own /{ver}/atlas/ path. Requesting a release the current host cannot show opens the version picker automatically: a restricted one reads, for example, “v9 is a pre-release under review and is not shown on this host” and offers “Continue on the preview host” (a link straight to that release’s Atlas there, at https://preview.marinesensitivity.org/v9/atlas/?ver=v9), an unrecognized one reads “is not a version this host recognizes,” and either way the promoted release loads underneath while the picker explains why. In the picker, every public release other than the current one offers Switch.
21.13 Known limitations (as of 0.10.93)
- In v7, 1,873 of the 2,619
rng_iucnrange inputs have no model-asset registry row, so their pills in the Species lens show struck through (as they did in the retired Species Shiny app); every other input of v3, v6 and v7 resolves. The other pre-v8 releases (v1, v2, v4, v4b, v5, v7b, v7c) were not checked for this chapter. - GeoPackage is refused (see the Places section above) whenever
ST_Readfails to parse it, including a file with no vector layer — its declared-CRS and no-feature-table checks cannot actually run against an uploaded file, because DuckDB-WASM’ssqlite_scan()cannot open a file registered only throughregisterFileBuffer, the way an uploaded GeoPackage is, so both checks silently fall through andST_Read, or the normal out-of-range magnitude check, is left to catch a projected or empty file instead (still refused, just by a different, honest rule). - A multi-Program-Area selection (several picks added as one place) sums area and means the composite for its list row, but its flower, component table and species table are not aggregated — the results panel asks you to select a single Program Area for those.
- Show analysis cells is not available for a Program Area place: the app bundle the Atlas reads carries each zone’s count, area and scores but not its cells.
- The Atlas’s report is a print-first document built and exported entirely client-side (HTML/ZIP/DOCX from the same source), not the retired Shiny apps’ report.
21.14 Generating Screenshots
Every figure in this chapter was recaptured on 2026-10-16 from the live Atlas (0.10.91, release v7, dark theme; Figure 21.6, Figure 21.9, Figure 21.12 and Figure 21.13 from 0.10.92 later that day, after its Report fixes) with Playwright’s Chromium: desktop at 1280×800 and 1x, phone at 390×844 and 2x with touch, at https://marinesensitivity.org/atlas/. The atlas repository’s own scripts/eyes-shots.mjs covers the standard states (about 20 numbered shots per viewport) and was run against the live site:
ATLAS_URL=https://marinesensitivity.org/atlas OUT=.tmp/eyes ONLY=map,layers,more node scripts/eyes-shots.mjsIt does not reach every state in this chapter, so the figures were taken by one driver script (figs.mjs, kept outside both repositories) that uses the same helpers (go, explore, tool, and screenPointFor to click a map coordinate by projecting it) and loads each state from a URL or UI steps: ?ver=v7&theme=dark for the map, Layers, the version picker and the phone figures (the release chip opens the picker, More the phone menu); a click at 28.3° N, 83.6° W for the flower and the Table; ?ver=v7&lens=species and a search for “leatherback” for the Species lens; #pl=z.pa.GAA plus Open report (a new tab, then scrolled to the Table of Scores heading) for the two report figures and the Share dialog; Add a Program Area (Aleutian Arc) plus Enter coordinates (-93, 26, -90, 29) for the places list; a single point (-124.1, 40.2) for the refusal; and a 3,600-vertex noisy outline pasted into Enter coordinates, then Share, for the simplification ladder. Each PNG was then reduced with pngquant --quality=85-98. The guided-tour images of the Atlas user guide come from a different script, npm run tour:guide (scripts/tour-guide.mjs, from atlas 0.10.90).
21.15 Source Code
atlas on its own main branch — one static build for every release, the same “one checkout, not one per version” convention the retired Scores and Species apps followed.













