Build the version registry (latest.txt, versions.json, manifest.json)

Published

2026-08-11

Every MST release so far has shipped by forking the apps repo — freeze apps at a commit, clone it to apps_v{n}, symlink /share/shiny_apps/{scores,species}_v{n} at it. Nine such forks exist, and every app improvement is stranded in the newest one: v6’s app will never get v8’s deep-link handling or a bug fix, because it is a different checkout of a different commit.

The cause is that the version is a code fact — ver <- "v8" hardcoded in each app, propagating into data paths, table names, a per-version titiler service and the symlink name. This notebook publishes the files that make it a data fact instead, so one app can render any release:

file what it settles
marine-atlas/latest.txt which version an app shows when the URL says nothing
marine-atlas/versions.json which versions exist, and whether each is showable
marine-atlas/{ver}/manifest.json everything needed to render that version

The manifest is the contract: publishing v9 means publishing a manifest, not editing an app.

Promotion is gated and separate from publishing. Writing data does not make it live — latest.txt is only rewritten under PROMOTE_LATEST=1, after the validation chunk passes. So latest.txt today names v7 (the default-live release), while v8 remains a prerelease reachable only as ?ver=v8. This mirrors the CalCOFI release registry, where promotion is gated on a query-test pass rather than done by the build.

1 Design

Code
flowchart LR
  csv["data/versions.csv<br/>(curated: status, date, title)"] --> vj["versions.json"]
  db[("{ver}/sdm.duckdb")] --> mb["msens::manifest_build()<br/>introspects tables, metrics,<br/>zones, public model id"]
  mb --> mj["{ver}/manifest.json"]
  vj --> s3[["s3://…/marine-atlas/"]]
  mj --> s3
  vj -.->|"PROMOTE_LATEST=1<br/>after validation"| lt["latest.txt"]
  lt --> s3
flowchart LR
  csv["data/versions.csv<br/>(curated: status, date, title)"] --> vj["versions.json"]
  db[("{ver}/sdm.duckdb")] --> mb["msens::manifest_build()<br/>introspects tables, metrics,<br/>zones, public model id"]
  mb --> mj["{ver}/manifest.json"]
  vj --> s3[["s3://…/marine-atlas/"]]
  mj --> s3
  vj -.->|"PROMOTE_LATEST=1<br/>after validation"| lt["latest.txt"]
  lt --> s3
Figure 1: Curated registry + release introspection → the three published registry files

2 Setup

Code
librarian::shelf(
  arrow, DBI, dplyr, duckdb, glue, jsonlite, knitr, readr,
  MarineSensitivity/msens, quiet = TRUE)
source(here::here("libs/paths.R"))

# env flags (default OFF, per the repo's reproducibility rule: expensive or
# side-effecting steps are opt-in, and every step lives in this notebook)
do_s3    <- Sys.getenv("MANIFEST_NO_S3")   == ""   # push to S3 unless told not to
promote  <- Sys.getenv("PROMOTE_LATEST")   != ""   # rewrite latest.txt (gated below)

s3_root  <- s3_atlas                                # s3://oceanmetrics.io-public/marine-atlas
http_root <- msens::atlas_base_url()
dir_reg  <- glue("{dir_big_v}/registry-files")      # local staging, mirrors the S3 layout
dir.create(glue("{dir_reg}/{ver}"), recursive = TRUE, showWarnings = FALSE)

message(glue("ver={ver}  s3={s3_root}  push_s3={do_s3}  promote_latest={promote}"))

3 The curated version registry

Release status and dates are editorial facts — they cannot be introspected from a database, and they must not be guessed. They live in a committed CSV so the registry is reviewable in a diff, and so the apps, the versioned docs and the storage index all read one source rather than three.

Deliberately a registry, not a changelog: ver, status, released, title and nothing more. What each release changed is prose, it already lives in the docs timeline, and a second copy here would drift from it — which is the very problem the versioned-docs work exists to fix.

Code
versions <- readr::read_csv(here::here("data/versions.csv"), show_col_types = FALSE)

stopifnot(
  "versions.csv has duplicate ver"        = !any(duplicated(versions$ver)),
  "unknown status in versions.csv"        = all(versions$status %in% c("released", "prerelease", "retired")),
  "current ver missing from versions.csv" = ver %in% versions$ver,
  "no released version to promote"        = any(versions$status == "released"))

# newest first, so a consumer can take the head without sorting
versions <- versions |> arrange(desc(released))
knitr::kable(versions |> select(ver, status, released, title))
ver status released title
v8 prerelease 2026-07-28 Marine Atlas
v7 released 2026-06-12 Validity decoupled from Program Areas
v6 retired 2026-04-09 IUCN range outside US EEZ
v5 retired 2026-03-24 MMPA spatial floor
v4b retired 2026-03-19 Turtle multiplicative merge
v4 retired 2026-03-01 SWOT sea turtles
v3 retired 2026-02-01 Merged models + extinction risk
v2 retired 2026-01-01 Program Areas
v1 retired 2023-09-01 Planning Areas

4 The manifest for this version

msens::manifest_build() introspects the release rather than being told about it — which model id is public (mdl_key from v8, mdl_seq before it), which tables exist, which metrics are cell-level, which spatial units were scored. That is what keeps a manifest from drifting from the data it describes, and it is why capabilities derive from presence and default to FALSE: a release without cell_model must not advertise a per-cell species list.

Code
con <- dbConnect(duckdb(), path.expand(sdm_db), read_only = TRUE)

# Some surfaces are NOT tables in the build database, and are not on S3 either.
# v8's `cell_model` (the per-cell species list) is a partitioned Parquet
# DIRECTORY that lives only on the server — deliberately, since its per-cell and
# per-polygon queries touch many partitions and fail outright over HTTPS. So:
#   - deriving from `con` alone advertises cell_species_list = FALSE and switches
#     off a panel that works today;
#   - checking S3 also says FALSE, because it is intentionally not published there.
# The authoritative test is the SERVING surface on the server. Check it there
# (read-only) and print the answer, so a manifest built from a laptop describes
# the release rather than the laptop.
srv_has <- function(path) {
  if (dir.exists(path.expand(glue("{dir_big_v}/{path}")))) return(TRUE)   # running ON the server
  out <- suppressWarnings(system2(
    "ssh", c("-o", "ConnectTimeout=15", "msens",
             shQuote(glue("test -e /share/data/big/{ver}/{path} && echo yes || echo no"))),
    stdout = TRUE, stderr = FALSE))
  isTRUE(any(grepl("^yes$", trimws(out))))
}

caps_override <- list(cell_species_list = srv_has("cell_model"))
message(glue("serving surface check: cell_model present = {caps_override$cell_species_list}"))

# score COGs, when published: their presence is what flips capabilities$score_cogs,
# so the app only offers a raster layer once the raster exists
f_scog   <- path.expand(glue("{dir_big_v}/tables/score_cog.parquet"))
scog_all <- if (file.exists(f_scog)) arrow::read_parquet(f_scog) else NULL

# `_`-prefixed keys are OVERLAYS, not metrics: the app's "cells outside Program
# Areas" mask is a raster it draws but not a quantity it scores. They must be
# separated, because manifest_build() left-joins metrics onto the release's
# `metric` table -- an overlay has no row there and was silently dropped.
scog <- if (!is.null(scog_all))
  scog_all |> filter(!startsWith(metric_key, "_")) |>
    transmute(metric_key, subregion_key, cog = cog_url,
              rescale_min, rescale_max, colormap) else NULL
overlays <- if (!is.null(scog_all))
  scog_all |> filter(startsWith(metric_key, "_")) |>
    transmute(overlay_key = metric_key, subregion_key, cog = cog_url, colormap) else NULL
message(glue("score COGs: {if (is.null(scog)) 0 else nrow(scog)} metric, ",
             "{if (is.null(overlays)) 0 else nrow(overlays)} overlay"))

# zone PMTiles by vintage, so the app resolves outlines from the manifest rather
# than a hardcoded unversioned filename on the file host
zone_sets <- readr::read_csv(here::here("data/zone_sets.csv"), show_col_types = FALSE)
zone_tiles <- setNames(
  as.list(glue("{http_root}/zones/{zone_sets$zone_set_key}/zones.pmtiles")),
  zone_sets$zone_set_key)
message(glue("zone tile sets: {length(zone_tiles)}"))

v_row <- versions |> filter(ver == !!ver)
mfst  <- msens::manifest_build(
  con, ver,
  status       = v_row$status,
  base         = http_root,
  metrics      = scog,
  zone_tiles   = zone_tiles,
  capabilities = caps_override,
  extra  = list(
    title    = v_row$title,
    released = as.character(v_row$released),
    overlays = overlays,
    # score COGs and the vintage-labelled zone-set registry arrive in later
    # phases; until then the manifest declares what is true today, and
    # `capabilities$score_cogs` stays FALSE so no app promises a layer it
    # cannot draw.
    grid     = as.list(msens::grid_spec_for(msens::grid_for_ver(ver))[
                 c("nc", "nr", "xmin", "ymax", "resx", "resy", "lon360")])))

dbDisconnect(con, shutdown = TRUE)

cat(glue(
  "ver={mfst$ver}  status={mfst$status}  grid={mfst$grid_id}  id_field={mfst$id_field}\n",
  "tables={length(mfst$tables)}  metrics={nrow(mfst$metrics)}  zone_sets={nrow(mfst$zones)}\n"))
ver=v8  status=prerelease  grid=global05  id_field=mdl_key
tables=11  metrics=102  zone_sets=3
Code
knitr::kable(mfst$zones)
zone_set_key tbl fld n pmtiles
ecoregion_2025-06 ply_ecoregions_2025 ecoregion_key 12 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/ecoregion_2025-06/zones.pmtiles
programarea_2026-01 ply_programareas_2026_v8 programarea_key 20 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/programarea_2026-01/zones.pmtiles
subregion_2025-06 ply_subregions_2026_v8 subregion_key 5 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/subregion_2025-06/zones.pmtiles
Code
knitr::kable(
  data.frame(capability = names(mfst$capabilities),
             supported  = unlist(mfst$capabilities)),
  row.names = FALSE)
capability supported
cell_species_list TRUE
native_representation TRUE
programareas TRUE
planareas FALSE
zone_taxon TRUE
score_cogs TRUE

5 Validate, then write

The same validate_manifest() the apps call on read is applied here on write, so a manifest that would break an app can never be published in the first place.

Code
msens::validate_manifest(mfst, ver = ver)
$ver
[1] "v8"

$status
[1] "prerelease"

$grid_id
[1] "global05"

$id_field
[1] "mdl_key"

$capabilities
$capabilities$cell_species_list
[1] TRUE

$capabilities$native_representation
[1] TRUE

$capabilities$programareas
[1] TRUE

$capabilities$planareas
[1] FALSE

$capabilities$zone_taxon
[1] TRUE

$capabilities$score_cogs
[1] TRUE


$tables
$tables$cell
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/cell.parquet"

$tables$taxon
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/taxon.parquet"

$tables$model
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/model.parquet"

$tables$metric
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/metric.parquet"

$tables$cell_metric
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/cell_metric.parquet"

$tables$zone
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone.parquet"

$tables$zone_cell
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone_cell.parquet"

$tables$zone_metric
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone_metric.parquet"

$tables$zone_taxon
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone_taxon.parquet"

$tables$dataset
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/dataset.parquet"

$tables$native_asset
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/native_asset.parquet"


$metrics
                                                    metric_key
1                                                 extrisk_bird
2                                                 extrisk_bird
3                                                 extrisk_bird
4                                                 extrisk_bird
5                                                 extrisk_bird
6                                                 extrisk_bird
7                              extrisk_bird_ecoregion_rescaled
8                              extrisk_bird_ecoregion_rescaled
9                              extrisk_bird_ecoregion_rescaled
10                             extrisk_bird_ecoregion_rescaled
11                             extrisk_bird_ecoregion_rescaled
12                             extrisk_bird_ecoregion_rescaled
13                                               extrisk_coral
14                                               extrisk_coral
15                                               extrisk_coral
16                                               extrisk_coral
17                                               extrisk_coral
18                                               extrisk_coral
19                            extrisk_coral_ecoregion_rescaled
20                            extrisk_coral_ecoregion_rescaled
21                            extrisk_coral_ecoregion_rescaled
22                            extrisk_coral_ecoregion_rescaled
23                            extrisk_coral_ecoregion_rescaled
24                            extrisk_coral_ecoregion_rescaled
25                                                extrisk_fish
26                                                extrisk_fish
27                                                extrisk_fish
28                                                extrisk_fish
29                                                extrisk_fish
30                                                extrisk_fish
31                             extrisk_fish_ecoregion_rescaled
32                             extrisk_fish_ecoregion_rescaled
33                             extrisk_fish_ecoregion_rescaled
34                             extrisk_fish_ecoregion_rescaled
35                             extrisk_fish_ecoregion_rescaled
36                             extrisk_fish_ecoregion_rescaled
37                                        extrisk_invertebrate
38                                        extrisk_invertebrate
39                                        extrisk_invertebrate
40                                        extrisk_invertebrate
41                                        extrisk_invertebrate
42                                        extrisk_invertebrate
43                     extrisk_invertebrate_ecoregion_rescaled
44                     extrisk_invertebrate_ecoregion_rescaled
45                     extrisk_invertebrate_ecoregion_rescaled
46                     extrisk_invertebrate_ecoregion_rescaled
47                     extrisk_invertebrate_ecoregion_rescaled
48                     extrisk_invertebrate_ecoregion_rescaled
49                                              extrisk_mammal
50                                              extrisk_mammal
51                                              extrisk_mammal
52                                              extrisk_mammal
53                                              extrisk_mammal
54                                              extrisk_mammal
55                           extrisk_mammal_ecoregion_rescaled
56                           extrisk_mammal_ecoregion_rescaled
57                           extrisk_mammal_ecoregion_rescaled
58                           extrisk_mammal_ecoregion_rescaled
59                           extrisk_mammal_ecoregion_rescaled
60                           extrisk_mammal_ecoregion_rescaled
61                                    extrisk_primary_producer
62                                    extrisk_primary_producer
63                                    extrisk_primary_producer
64                                    extrisk_primary_producer
65                                    extrisk_primary_producer
66                                    extrisk_primary_producer
67                 extrisk_primary_producer_ecoregion_rescaled
68                 extrisk_primary_producer_ecoregion_rescaled
69                 extrisk_primary_producer_ecoregion_rescaled
70                 extrisk_primary_producer_ecoregion_rescaled
71                 extrisk_primary_producer_ecoregion_rescaled
72                 extrisk_primary_producer_ecoregion_rescaled
73                                              extrisk_turtle
74                                              extrisk_turtle
75                                              extrisk_turtle
76                                              extrisk_turtle
77                                              extrisk_turtle
78                                              extrisk_turtle
79                           extrisk_turtle_ecoregion_rescaled
80                           extrisk_turtle_ecoregion_rescaled
81                           extrisk_turtle_ecoregion_rescaled
82                           extrisk_turtle_ecoregion_rescaled
83                           extrisk_turtle_ecoregion_rescaled
84                           extrisk_turtle_ecoregion_rescaled
85                                                    primprod
86                                                    primprod
87                                                    primprod
88                                                    primprod
89                                                    primprod
90                                                    primprod
91                                 primprod_ecoregion_rescaled
92                                 primprod_ecoregion_rescaled
93                                 primprod_ecoregion_rescaled
94                                 primprod_ecoregion_rescaled
95                                 primprod_ecoregion_rescaled
96                                 primprod_ecoregion_rescaled
97  score_extriskspcat_primprod_ecoregionrescaled_equalweights
98  score_extriskspcat_primprod_ecoregionrescaled_equalweights
99  score_extriskspcat_primprod_ecoregionrescaled_equalweights
100 score_extriskspcat_primprod_ecoregionrescaled_equalweights
101 score_extriskspcat_primprod_ecoregionrescaled_equalweights
102 score_extriskspcat_primprod_ecoregionrescaled_equalweights
                                               description subregion_key
1               Extinction-risk-weighted suitability, bird            AK
2               Extinction-risk-weighted suitability, bird            AT
3               Extinction-risk-weighted suitability, bird          FULL
4               Extinction-risk-weighted suitability, bird            GA
5               Extinction-risk-weighted suitability, bird            PA
6               Extinction-risk-weighted suitability, bird           USA
7                                                                     AK
8                                                                   FULL
9                                                                     PA
10                                                                    AT
11                                                                    GA
12                                                                   USA
13             Extinction-risk-weighted suitability, coral          FULL
14             Extinction-risk-weighted suitability, coral            GA
15             Extinction-risk-weighted suitability, coral            AK
16             Extinction-risk-weighted suitability, coral            AT
17             Extinction-risk-weighted suitability, coral            PA
18             Extinction-risk-weighted suitability, coral           USA
19                                                                    AK
20                                                                    AT
21                                                                    GA
22                                                                   USA
23                                                                  FULL
24                                                                    PA
25              Extinction-risk-weighted suitability, fish          FULL
26              Extinction-risk-weighted suitability, fish            AK
27              Extinction-risk-weighted suitability, fish            GA
28              Extinction-risk-weighted suitability, fish            PA
29              Extinction-risk-weighted suitability, fish            AT
30              Extinction-risk-weighted suitability, fish           USA
31                                                                    AK
32                                                                    GA
33                                                                   USA
34                                                                    AT
35                                                                  FULL
36                                                                    PA
37      Extinction-risk-weighted suitability, invertebrate            AK
38      Extinction-risk-weighted suitability, invertebrate          FULL
39      Extinction-risk-weighted suitability, invertebrate            GA
40      Extinction-risk-weighted suitability, invertebrate            AT
41      Extinction-risk-weighted suitability, invertebrate            PA
42      Extinction-risk-weighted suitability, invertebrate           USA
43                                                                    AK
44                                                                    AT
45                                                                    PA
46                                                                  FULL
47                                                                    GA
48                                                                   USA
49            Extinction-risk-weighted suitability, mammal            AT
50            Extinction-risk-weighted suitability, mammal            GA
51            Extinction-risk-weighted suitability, mammal            PA
52            Extinction-risk-weighted suitability, mammal            AK
53            Extinction-risk-weighted suitability, mammal          FULL
54            Extinction-risk-weighted suitability, mammal           USA
55                                                                    AK
56                                                                    PA
57                                                                    AT
58                                                                  FULL
59                                                                   USA
60                                                                    GA
61  Extinction-risk-weighted suitability, primary_producer            AT
62  Extinction-risk-weighted suitability, primary_producer            GA
63  Extinction-risk-weighted suitability, primary_producer            AK
64  Extinction-risk-weighted suitability, primary_producer          FULL
65  Extinction-risk-weighted suitability, primary_producer            PA
66  Extinction-risk-weighted suitability, primary_producer           USA
67                                                                    AK
68                                                                    AT
69                                                                    PA
70                                                                   USA
71                                                                  FULL
72                                                                    GA
73            Extinction-risk-weighted suitability, turtle            AK
74            Extinction-risk-weighted suitability, turtle          FULL
75            Extinction-risk-weighted suitability, turtle            PA
76            Extinction-risk-weighted suitability, turtle            AT
77            Extinction-risk-weighted suitability, turtle            GA
78            Extinction-risk-weighted suitability, turtle           USA
79                                                                    AK
80                                                                    AT
81                                                                  FULL
82                                                                    GA
83                                                                    PA
84                                                                   USA
85   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            AK
86   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            AT
87   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)          FULL
88   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            GA
89   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            PA
90   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)           USA
91                                                                    AK
92                                                                    AT
93                                                                  FULL
94                                                                    GA
95                                                                    PA
96                                                                   USA
97                                  Equal-weight composite            AK
98                                  Equal-weight composite            AT
99                                  Equal-weight composite          FULL
100                                 Equal-weight composite            GA
101                                 Equal-weight composite            PA
102                                 Equal-weight composite           USA
                                                                                                         cog
1   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/4d4bf870a8a4a2d7.tif
2   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c1a5efc175b1bd38.tif
3   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a3a8eb5ab4bec53b.tif
4   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/cca079b4bddb0bd1.tif
5   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/37ed3b42fd5c67f9.tif
6   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/2cc160b7fa38cc62.tif
7   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/cc3d4a6ab58d2635.tif
8   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a8a3f43d9bf7fc20.tif
9   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ffe6860977fd8686.tif
10  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/bde88a1b0626b296.tif
11  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/620d7f5e263d46e4.tif
12  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a8a3f43d9bf7fc20.tif
13  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e8162b5c0817f3b3.tif
14  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ba8fe6637bd2c577.tif
15  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9ad7ee7988ddf540.tif
16  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/3635824f0f14a453.tif
17  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/0b2882cfecb5d741.tif
18  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e0b01f54c9e0e1ea.tif
19  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/8e4e4a24ed724beb.tif
20  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/064c706c5b9fb13a.tif
21  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e684154a77f3dbfc.tif
22  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/69111f779e3dd7ee.tif
23  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/69111f779e3dd7ee.tif
24  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e3fa5890051936a4.tif
25  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/20967c84d644610d.tif
26  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7275912aefc29318.tif
27  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c3e940a501e50463.tif
28  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/0307ecbb86bcec85.tif
29  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5d9fa54e3e95a085.tif
30  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7af8ccd332cce776.tif
31  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a40f62a6684d9be0.tif
32  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/af9fac8a2c571e46.tif
33  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f33ef91629bdbf13.tif
34  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c0d3c2793ec9afb1.tif
35  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f33ef91629bdbf13.tif
36  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/fb0d1fe36d63b286.tif
37  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/366c247639026227.tif
38  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ea3d1ea8daf2bb55.tif
39  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/68032bf3923f8c6e.tif
40  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/36ef407e7227867b.tif
41  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/bf2b555fd00c71c6.tif
42  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/4d26c715bb115be5.tif
43  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/36083d6ee0ef663b.tif
44  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/cfbf3e3923ab8f74.tif
45  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7879f7e193dd6e20.tif
46  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9acb1a925dd3e915.tif
47  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/15a5548dcf62b9b9.tif
48  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9acb1a925dd3e915.tif
49  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f1bfc6a1f2dc50ff.tif
50  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/06311f0bfe0cecde.tif
51  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5150cc37aa10d9e0.tif
52  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/329d1137b975cf06.tif
53  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/da7a1d0987e9de35.tif
54  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/065eea11b2333237.tif
55  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/8a10f5e0f01c29b2.tif
56  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9ef98a97b8e95f62.tif
57  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c42c6efc5293371a.tif
58  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/83d308cbf604da07.tif
59  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/83d308cbf604da07.tif
60  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/078d15e4241639e4.tif
61  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/efd75d11c8f81e7d.tif
62  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ec7a79b8761742f0.tif
63  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9ee168a07189ea58.tif
64  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/660719ca45ed8d14.tif
65  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/dbb522c406b7234e.tif
66  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7b52e7173501dbda.tif
67  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/3417aca6848a9dba.tif
68  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/fe193bc6410ca6b5.tif
69  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/aec9811913d71a06.tif
70  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ae57c367b8f3d325.tif
71  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ae57c367b8f3d325.tif
72  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/3aa389d20ed309e1.tif
73  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/949980f51d3f6f10.tif
74  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/abec1e40eb986233.tif
75  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/4e4b341ae1c505ff.tif
76  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/42f3a3d82b05d950.tif
77  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7e9259e169eb1c7d.tif
78  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/8170f1a22edb638c.tif
79  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ebded9c04bbe5143.tif
80  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5db8a61ca29f4f10.tif
81  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/62c7ae796f1510cb.tif
82  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/46b58533228d217a.tif
83  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e60ad469f81565a9.tif
84  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/62c7ae796f1510cb.tif
85  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c86eed46ad518970.tif
86  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/0f1e2e45287eb165.tif
87  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a2bba0b1727fe688.tif
88  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/673abd8dc6c04560.tif
89  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5e3456208d98e8bb.tif
90  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/6a3ee6805a24bec8.tif
91  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f4d28a95925df3f1.tif
92  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/df414198689924ad.tif
93  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a507b19a3bf12a24.tif
94  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e3e65c6805b8442f.tif
95  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f5a8234439e8c998.tif
96  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a507b19a3bf12a24.tif
97  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/18aba8a262c67a32.tif
98  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5757b5b475d9cafc.tif
99  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9e7d054cb9905741.tif
100 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/76ceef5858505d69.tif
101 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/db1526abe78a8351.tif
102 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9e7d054cb9905741.tif
    rescale_min rescale_max   colormap
1         26.00      248.02 spectral_r
2        158.25      568.26 spectral_r
3         26.00      626.86 spectral_r
4         55.00      464.27 spectral_r
5         62.53      626.86 spectral_r
6         26.00      626.86 spectral_r
7          0.00      100.00 spectral_r
8          0.00      100.00 spectral_r
9          0.00      100.00 spectral_r
10         0.00      100.00 spectral_r
11         0.00      100.00 spectral_r
12         0.00      100.00 spectral_r
13         0.01     1844.30 spectral_r
14         1.49      985.75 spectral_r
15         0.01       36.30 spectral_r
16         0.01     1194.38 spectral_r
17         0.03     1844.30 spectral_r
18         0.01     1844.30 spectral_r
19         0.00      100.00 spectral_r
20         0.00      100.00 spectral_r
21         0.00      100.00 spectral_r
22         0.00      100.00 spectral_r
23         0.00      100.00 spectral_r
24         0.00      100.00 spectral_r
25         0.01     2648.03 spectral_r
26         0.01      966.30 spectral_r
27       556.94     1734.28 spectral_r
28       270.12     2648.03 spectral_r
29       368.40     2065.97 spectral_r
30         0.01     2648.03 spectral_r
31         0.00      100.00 spectral_r
32         0.00      100.00 spectral_r
33         0.00      100.00 spectral_r
34         0.00      100.00 spectral_r
35         0.00      100.00 spectral_r
36         0.00      100.00 spectral_r
37         1.63      869.18 spectral_r
38         1.63     3619.93 spectral_r
39        84.16     3120.82 spectral_r
40        36.08     3619.93 spectral_r
41        26.37     3388.46 spectral_r
42         1.63     3619.93 spectral_r
43         0.00      100.00 spectral_r
44         0.00      100.00 spectral_r
45         0.00      100.00 spectral_r
46         0.00      100.00 spectral_r
47         0.00      100.00 spectral_r
48         0.00      100.00 spectral_r
49       778.04     1276.87 spectral_r
50       798.50     1234.61 spectral_r
51       769.33     1435.14 spectral_r
52        54.00     1294.28 spectral_r
53         4.00     1435.14 spectral_r
54        54.00     1435.14 spectral_r
55         0.00      100.00 spectral_r
56         0.00      100.00 spectral_r
57         0.00      100.00 spectral_r
58         0.00      100.00 spectral_r
59         0.00      100.00 spectral_r
60         0.00      100.00 spectral_r
61         0.01      166.45 spectral_r
62         0.01      159.59 spectral_r
63         0.01       19.58 spectral_r
64         0.01      166.54 spectral_r
65         0.01      138.08 spectral_r
66         0.01      166.45 spectral_r
67         0.00      100.00 spectral_r
68         0.00      100.00 spectral_r
69         0.00      100.00 spectral_r
70         0.00      100.00 spectral_r
71         0.00      100.00 spectral_r
72         0.00      100.00 spectral_r
73         1.00       79.00 spectral_r
74         1.00      500.00 spectral_r
75         1.00      434.00 spectral_r
76        11.00      493.00 spectral_r
77        81.00      500.00 spectral_r
78         1.00      500.00 spectral_r
79         0.00      100.00 spectral_r
80         0.00      100.00 spectral_r
81         0.00      100.00 spectral_r
82         0.00      100.00 spectral_r
83         0.00      100.00 spectral_r
84         0.00      100.00 spectral_r
85        32.95     8580.00 spectral_r
86       139.60     4285.17 spectral_r
87        32.95    13743.47 spectral_r
88       261.06     5577.18 spectral_r
89        99.31     3554.19 spectral_r
90        32.95     8580.00 spectral_r
91         0.00      100.00 spectral_r
92         0.00      100.00 spectral_r
93         0.00      100.00 spectral_r
94         0.00      100.00 spectral_r
95         0.00      100.00 spectral_r
96         0.00      100.00 spectral_r
97         0.00       88.00 spectral_r
98         4.00       96.00 spectral_r
99         0.00       96.00 spectral_r
100        4.00       83.00 spectral_r
101        3.00       84.00 spectral_r
102        0.00       96.00 spectral_r

$zones
         zone_set_key                      tbl             fld  n
1   ecoregion_2025-06      ply_ecoregions_2025   ecoregion_key 12
2 programarea_2026-01 ply_programareas_2026_v8 programarea_key 20
3   subregion_2025-06   ply_subregions_2026_v8   subregion_key  5
                                                                                                         pmtiles
1   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/ecoregion_2025-06/zones.pmtiles
2 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/programarea_2026-01/zones.pmtiles
3   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/subregion_2025-06/zones.pmtiles

$title
[1] "Marine Atlas"

$released
[1] "2026-07-28"

$overlays
# A tibble: 1 × 4
  overlay_key  subregion_key cog                                        colormap
  <chr>        <chr>         <chr>                                      <chr>   
1 _outside_pra FULL          https://s3.us-east-1.amazonaws.com/oceanm… spectra…

$grid
$grid$nc
[1] 7200

$grid$nr
[1] 3600

$grid$xmin
[1] -180

$grid$ymax
[1] 90

$grid$resx
[1] 0.05

$grid$resy
[1] 0.05

$grid$lon360
[1] FALSE
Code
# jsonlite writes NULL as [] and NA as null; pretty-print for reviewable diffs
wr <- function(obj, path) {
  writeLines(as.character(jsonlite::toJSON(obj, auto_unbox = TRUE, pretty = TRUE, na = "null")), path)
  path
}

f_versions <- wr(list(versions = versions), glue("{dir_reg}/versions.json"))
f_manifest <- wr(mfst,                      glue("{dir_reg}/{ver}/manifest.json"))

# round-trip: parse what we just wrote, exactly as an app would
msens::validate_manifest(jsonlite::fromJSON(f_manifest), ver = ver)
$ver
[1] "v8"

$status
[1] "prerelease"

$grid_id
[1] "global05"

$id_field
[1] "mdl_key"

$capabilities
$capabilities$cell_species_list
[1] TRUE

$capabilities$native_representation
[1] TRUE

$capabilities$programareas
[1] TRUE

$capabilities$planareas
[1] FALSE

$capabilities$zone_taxon
[1] TRUE

$capabilities$score_cogs
[1] TRUE


$tables
$tables$cell
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/cell.parquet"

$tables$taxon
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/taxon.parquet"

$tables$model
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/model.parquet"

$tables$metric
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/metric.parquet"

$tables$cell_metric
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/cell_metric.parquet"

$tables$zone
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone.parquet"

$tables$zone_cell
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone_cell.parquet"

$tables$zone_metric
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone_metric.parquet"

$tables$zone_taxon
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/zone_taxon.parquet"

$tables$dataset
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/dataset.parquet"

$tables$native_asset
[1] "https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/tables/native_asset.parquet"


$metrics
                                                    metric_key
1                                                 extrisk_bird
2                                                 extrisk_bird
3                                                 extrisk_bird
4                                                 extrisk_bird
5                                                 extrisk_bird
6                                                 extrisk_bird
7                              extrisk_bird_ecoregion_rescaled
8                              extrisk_bird_ecoregion_rescaled
9                              extrisk_bird_ecoregion_rescaled
10                             extrisk_bird_ecoregion_rescaled
11                             extrisk_bird_ecoregion_rescaled
12                             extrisk_bird_ecoregion_rescaled
13                                               extrisk_coral
14                                               extrisk_coral
15                                               extrisk_coral
16                                               extrisk_coral
17                                               extrisk_coral
18                                               extrisk_coral
19                            extrisk_coral_ecoregion_rescaled
20                            extrisk_coral_ecoregion_rescaled
21                            extrisk_coral_ecoregion_rescaled
22                            extrisk_coral_ecoregion_rescaled
23                            extrisk_coral_ecoregion_rescaled
24                            extrisk_coral_ecoregion_rescaled
25                                                extrisk_fish
26                                                extrisk_fish
27                                                extrisk_fish
28                                                extrisk_fish
29                                                extrisk_fish
30                                                extrisk_fish
31                             extrisk_fish_ecoregion_rescaled
32                             extrisk_fish_ecoregion_rescaled
33                             extrisk_fish_ecoregion_rescaled
34                             extrisk_fish_ecoregion_rescaled
35                             extrisk_fish_ecoregion_rescaled
36                             extrisk_fish_ecoregion_rescaled
37                                        extrisk_invertebrate
38                                        extrisk_invertebrate
39                                        extrisk_invertebrate
40                                        extrisk_invertebrate
41                                        extrisk_invertebrate
42                                        extrisk_invertebrate
43                     extrisk_invertebrate_ecoregion_rescaled
44                     extrisk_invertebrate_ecoregion_rescaled
45                     extrisk_invertebrate_ecoregion_rescaled
46                     extrisk_invertebrate_ecoregion_rescaled
47                     extrisk_invertebrate_ecoregion_rescaled
48                     extrisk_invertebrate_ecoregion_rescaled
49                                              extrisk_mammal
50                                              extrisk_mammal
51                                              extrisk_mammal
52                                              extrisk_mammal
53                                              extrisk_mammal
54                                              extrisk_mammal
55                           extrisk_mammal_ecoregion_rescaled
56                           extrisk_mammal_ecoregion_rescaled
57                           extrisk_mammal_ecoregion_rescaled
58                           extrisk_mammal_ecoregion_rescaled
59                           extrisk_mammal_ecoregion_rescaled
60                           extrisk_mammal_ecoregion_rescaled
61                                    extrisk_primary_producer
62                                    extrisk_primary_producer
63                                    extrisk_primary_producer
64                                    extrisk_primary_producer
65                                    extrisk_primary_producer
66                                    extrisk_primary_producer
67                 extrisk_primary_producer_ecoregion_rescaled
68                 extrisk_primary_producer_ecoregion_rescaled
69                 extrisk_primary_producer_ecoregion_rescaled
70                 extrisk_primary_producer_ecoregion_rescaled
71                 extrisk_primary_producer_ecoregion_rescaled
72                 extrisk_primary_producer_ecoregion_rescaled
73                                              extrisk_turtle
74                                              extrisk_turtle
75                                              extrisk_turtle
76                                              extrisk_turtle
77                                              extrisk_turtle
78                                              extrisk_turtle
79                           extrisk_turtle_ecoregion_rescaled
80                           extrisk_turtle_ecoregion_rescaled
81                           extrisk_turtle_ecoregion_rescaled
82                           extrisk_turtle_ecoregion_rescaled
83                           extrisk_turtle_ecoregion_rescaled
84                           extrisk_turtle_ecoregion_rescaled
85                                                    primprod
86                                                    primprod
87                                                    primprod
88                                                    primprod
89                                                    primprod
90                                                    primprod
91                                 primprod_ecoregion_rescaled
92                                 primprod_ecoregion_rescaled
93                                 primprod_ecoregion_rescaled
94                                 primprod_ecoregion_rescaled
95                                 primprod_ecoregion_rescaled
96                                 primprod_ecoregion_rescaled
97  score_extriskspcat_primprod_ecoregionrescaled_equalweights
98  score_extriskspcat_primprod_ecoregionrescaled_equalweights
99  score_extriskspcat_primprod_ecoregionrescaled_equalweights
100 score_extriskspcat_primprod_ecoregionrescaled_equalweights
101 score_extriskspcat_primprod_ecoregionrescaled_equalweights
102 score_extriskspcat_primprod_ecoregionrescaled_equalweights
                                               description subregion_key
1               Extinction-risk-weighted suitability, bird            AK
2               Extinction-risk-weighted suitability, bird            AT
3               Extinction-risk-weighted suitability, bird          FULL
4               Extinction-risk-weighted suitability, bird            GA
5               Extinction-risk-weighted suitability, bird            PA
6               Extinction-risk-weighted suitability, bird           USA
7                                                                     AK
8                                                                   FULL
9                                                                     PA
10                                                                    AT
11                                                                    GA
12                                                                   USA
13             Extinction-risk-weighted suitability, coral          FULL
14             Extinction-risk-weighted suitability, coral            GA
15             Extinction-risk-weighted suitability, coral            AK
16             Extinction-risk-weighted suitability, coral            AT
17             Extinction-risk-weighted suitability, coral            PA
18             Extinction-risk-weighted suitability, coral           USA
19                                                                    AK
20                                                                    AT
21                                                                    GA
22                                                                   USA
23                                                                  FULL
24                                                                    PA
25              Extinction-risk-weighted suitability, fish          FULL
26              Extinction-risk-weighted suitability, fish            AK
27              Extinction-risk-weighted suitability, fish            GA
28              Extinction-risk-weighted suitability, fish            PA
29              Extinction-risk-weighted suitability, fish            AT
30              Extinction-risk-weighted suitability, fish           USA
31                                                                    AK
32                                                                    GA
33                                                                   USA
34                                                                    AT
35                                                                  FULL
36                                                                    PA
37      Extinction-risk-weighted suitability, invertebrate            AK
38      Extinction-risk-weighted suitability, invertebrate          FULL
39      Extinction-risk-weighted suitability, invertebrate            GA
40      Extinction-risk-weighted suitability, invertebrate            AT
41      Extinction-risk-weighted suitability, invertebrate            PA
42      Extinction-risk-weighted suitability, invertebrate           USA
43                                                                    AK
44                                                                    AT
45                                                                    PA
46                                                                  FULL
47                                                                    GA
48                                                                   USA
49            Extinction-risk-weighted suitability, mammal            AT
50            Extinction-risk-weighted suitability, mammal            GA
51            Extinction-risk-weighted suitability, mammal            PA
52            Extinction-risk-weighted suitability, mammal            AK
53            Extinction-risk-weighted suitability, mammal          FULL
54            Extinction-risk-weighted suitability, mammal           USA
55                                                                    AK
56                                                                    PA
57                                                                    AT
58                                                                  FULL
59                                                                   USA
60                                                                    GA
61  Extinction-risk-weighted suitability, primary_producer            AT
62  Extinction-risk-weighted suitability, primary_producer            GA
63  Extinction-risk-weighted suitability, primary_producer            AK
64  Extinction-risk-weighted suitability, primary_producer          FULL
65  Extinction-risk-weighted suitability, primary_producer            PA
66  Extinction-risk-weighted suitability, primary_producer           USA
67                                                                    AK
68                                                                    AT
69                                                                    PA
70                                                                   USA
71                                                                  FULL
72                                                                    GA
73            Extinction-risk-weighted suitability, turtle            AK
74            Extinction-risk-weighted suitability, turtle          FULL
75            Extinction-risk-weighted suitability, turtle            PA
76            Extinction-risk-weighted suitability, turtle            AT
77            Extinction-risk-weighted suitability, turtle            GA
78            Extinction-risk-weighted suitability, turtle           USA
79                                                                    AK
80                                                                    AT
81                                                                  FULL
82                                                                    GA
83                                                                    PA
84                                                                   USA
85   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            AK
86   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            AT
87   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)          FULL
88   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            GA
89   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)            PA
90   Primary productivity VGPM/VIIRS npp_avg (mg C/m2/day)           USA
91                                                                    AK
92                                                                    AT
93                                                                  FULL
94                                                                    GA
95                                                                    PA
96                                                                   USA
97                                  Equal-weight composite            AK
98                                  Equal-weight composite            AT
99                                  Equal-weight composite          FULL
100                                 Equal-weight composite            GA
101                                 Equal-weight composite            PA
102                                 Equal-weight composite           USA
                                                                                                         cog
1   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/4d4bf870a8a4a2d7.tif
2   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c1a5efc175b1bd38.tif
3   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a3a8eb5ab4bec53b.tif
4   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/cca079b4bddb0bd1.tif
5   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/37ed3b42fd5c67f9.tif
6   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/2cc160b7fa38cc62.tif
7   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/cc3d4a6ab58d2635.tif
8   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a8a3f43d9bf7fc20.tif
9   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ffe6860977fd8686.tif
10  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/bde88a1b0626b296.tif
11  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/620d7f5e263d46e4.tif
12  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a8a3f43d9bf7fc20.tif
13  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e8162b5c0817f3b3.tif
14  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ba8fe6637bd2c577.tif
15  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9ad7ee7988ddf540.tif
16  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/3635824f0f14a453.tif
17  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/0b2882cfecb5d741.tif
18  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e0b01f54c9e0e1ea.tif
19  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/8e4e4a24ed724beb.tif
20  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/064c706c5b9fb13a.tif
21  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e684154a77f3dbfc.tif
22  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/69111f779e3dd7ee.tif
23  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/69111f779e3dd7ee.tif
24  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e3fa5890051936a4.tif
25  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/20967c84d644610d.tif
26  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7275912aefc29318.tif
27  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c3e940a501e50463.tif
28  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/0307ecbb86bcec85.tif
29  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5d9fa54e3e95a085.tif
30  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7af8ccd332cce776.tif
31  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a40f62a6684d9be0.tif
32  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/af9fac8a2c571e46.tif
33  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f33ef91629bdbf13.tif
34  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c0d3c2793ec9afb1.tif
35  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f33ef91629bdbf13.tif
36  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/fb0d1fe36d63b286.tif
37  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/366c247639026227.tif
38  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ea3d1ea8daf2bb55.tif
39  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/68032bf3923f8c6e.tif
40  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/36ef407e7227867b.tif
41  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/bf2b555fd00c71c6.tif
42  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/4d26c715bb115be5.tif
43  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/36083d6ee0ef663b.tif
44  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/cfbf3e3923ab8f74.tif
45  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7879f7e193dd6e20.tif
46  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9acb1a925dd3e915.tif
47  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/15a5548dcf62b9b9.tif
48  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9acb1a925dd3e915.tif
49  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f1bfc6a1f2dc50ff.tif
50  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/06311f0bfe0cecde.tif
51  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5150cc37aa10d9e0.tif
52  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/329d1137b975cf06.tif
53  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/da7a1d0987e9de35.tif
54  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/065eea11b2333237.tif
55  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/8a10f5e0f01c29b2.tif
56  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9ef98a97b8e95f62.tif
57  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c42c6efc5293371a.tif
58  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/83d308cbf604da07.tif
59  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/83d308cbf604da07.tif
60  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/078d15e4241639e4.tif
61  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/efd75d11c8f81e7d.tif
62  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ec7a79b8761742f0.tif
63  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9ee168a07189ea58.tif
64  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/660719ca45ed8d14.tif
65  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/dbb522c406b7234e.tif
66  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7b52e7173501dbda.tif
67  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/3417aca6848a9dba.tif
68  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/fe193bc6410ca6b5.tif
69  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/aec9811913d71a06.tif
70  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ae57c367b8f3d325.tif
71  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ae57c367b8f3d325.tif
72  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/3aa389d20ed309e1.tif
73  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/949980f51d3f6f10.tif
74  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/abec1e40eb986233.tif
75  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/4e4b341ae1c505ff.tif
76  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/42f3a3d82b05d950.tif
77  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/7e9259e169eb1c7d.tif
78  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/8170f1a22edb638c.tif
79  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/ebded9c04bbe5143.tif
80  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5db8a61ca29f4f10.tif
81  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/62c7ae796f1510cb.tif
82  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/46b58533228d217a.tif
83  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e60ad469f81565a9.tif
84  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/62c7ae796f1510cb.tif
85  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/c86eed46ad518970.tif
86  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/0f1e2e45287eb165.tif
87  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a2bba0b1727fe688.tif
88  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/673abd8dc6c04560.tif
89  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5e3456208d98e8bb.tif
90  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/6a3ee6805a24bec8.tif
91  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f4d28a95925df3f1.tif
92  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/df414198689924ad.tif
93  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a507b19a3bf12a24.tif
94  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/e3e65c6805b8442f.tif
95  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/f5a8234439e8c998.tif
96  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/a507b19a3bf12a24.tif
97  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/18aba8a262c67a32.tif
98  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/5757b5b475d9cafc.tif
99  https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9e7d054cb9905741.tif
100 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/76ceef5858505d69.tif
101 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/db1526abe78a8351.tif
102 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/9e7d054cb9905741.tif
    rescale_min rescale_max   colormap
1         26.00      248.02 spectral_r
2        158.25      568.26 spectral_r
3         26.00      626.86 spectral_r
4         55.00      464.27 spectral_r
5         62.53      626.86 spectral_r
6         26.00      626.86 spectral_r
7          0.00      100.00 spectral_r
8          0.00      100.00 spectral_r
9          0.00      100.00 spectral_r
10         0.00      100.00 spectral_r
11         0.00      100.00 spectral_r
12         0.00      100.00 spectral_r
13         0.01     1844.30 spectral_r
14         1.49      985.75 spectral_r
15         0.01       36.30 spectral_r
16         0.01     1194.38 spectral_r
17         0.03     1844.30 spectral_r
18         0.01     1844.30 spectral_r
19         0.00      100.00 spectral_r
20         0.00      100.00 spectral_r
21         0.00      100.00 spectral_r
22         0.00      100.00 spectral_r
23         0.00      100.00 spectral_r
24         0.00      100.00 spectral_r
25         0.01     2648.03 spectral_r
26         0.01      966.30 spectral_r
27       556.94     1734.28 spectral_r
28       270.12     2648.03 spectral_r
29       368.40     2065.97 spectral_r
30         0.01     2648.03 spectral_r
31         0.00      100.00 spectral_r
32         0.00      100.00 spectral_r
33         0.00      100.00 spectral_r
34         0.00      100.00 spectral_r
35         0.00      100.00 spectral_r
36         0.00      100.00 spectral_r
37         1.63      869.18 spectral_r
38         1.63     3619.93 spectral_r
39        84.16     3120.82 spectral_r
40        36.08     3619.93 spectral_r
41        26.37     3388.46 spectral_r
42         1.63     3619.93 spectral_r
43         0.00      100.00 spectral_r
44         0.00      100.00 spectral_r
45         0.00      100.00 spectral_r
46         0.00      100.00 spectral_r
47         0.00      100.00 spectral_r
48         0.00      100.00 spectral_r
49       778.04     1276.87 spectral_r
50       798.50     1234.61 spectral_r
51       769.33     1435.14 spectral_r
52        54.00     1294.28 spectral_r
53         4.00     1435.14 spectral_r
54        54.00     1435.14 spectral_r
55         0.00      100.00 spectral_r
56         0.00      100.00 spectral_r
57         0.00      100.00 spectral_r
58         0.00      100.00 spectral_r
59         0.00      100.00 spectral_r
60         0.00      100.00 spectral_r
61         0.01      166.45 spectral_r
62         0.01      159.59 spectral_r
63         0.01       19.58 spectral_r
64         0.01      166.54 spectral_r
65         0.01      138.08 spectral_r
66         0.01      166.45 spectral_r
67         0.00      100.00 spectral_r
68         0.00      100.00 spectral_r
69         0.00      100.00 spectral_r
70         0.00      100.00 spectral_r
71         0.00      100.00 spectral_r
72         0.00      100.00 spectral_r
73         1.00       79.00 spectral_r
74         1.00      500.00 spectral_r
75         1.00      434.00 spectral_r
76        11.00      493.00 spectral_r
77        81.00      500.00 spectral_r
78         1.00      500.00 spectral_r
79         0.00      100.00 spectral_r
80         0.00      100.00 spectral_r
81         0.00      100.00 spectral_r
82         0.00      100.00 spectral_r
83         0.00      100.00 spectral_r
84         0.00      100.00 spectral_r
85        32.95     8580.00 spectral_r
86       139.60     4285.17 spectral_r
87        32.95    13743.47 spectral_r
88       261.06     5577.18 spectral_r
89        99.31     3554.19 spectral_r
90        32.95     8580.00 spectral_r
91         0.00      100.00 spectral_r
92         0.00      100.00 spectral_r
93         0.00      100.00 spectral_r
94         0.00      100.00 spectral_r
95         0.00      100.00 spectral_r
96         0.00      100.00 spectral_r
97         0.00       88.00 spectral_r
98         4.00       96.00 spectral_r
99         0.00       96.00 spectral_r
100        4.00       83.00 spectral_r
101        3.00       84.00 spectral_r
102        0.00       96.00 spectral_r

$zones
         zone_set_key                      tbl             fld  n
1   ecoregion_2025-06      ply_ecoregions_2025   ecoregion_key 12
2 programarea_2026-01 ply_programareas_2026_v8 programarea_key 20
3   subregion_2025-06   ply_subregions_2026_v8   subregion_key  5
                                                                                                         pmtiles
1   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/ecoregion_2025-06/zones.pmtiles
2 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/programarea_2026-01/zones.pmtiles
3   https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/zones/subregion_2025-06/zones.pmtiles

$title
[1] "Marine Atlas"

$released
[1] "2026-07-28"

$overlays
   overlay_key subregion_key
1 _outside_pra          FULL
                                                                                                       cog
1 https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/cog/global05/2a2060b601fda740.tif
    colormap
1 spectral_r

$grid
$grid$nc
[1] 7200

$grid$nr
[1] 3600

$grid$xmin
[1] -180

$grid$ymax
[1] 90

$grid$resx
[1] 0.05

$grid$resy
[1] 0.05

$grid$lon360
[1] FALSE
Code
cat(glue("wrote {f_versions}\n     {f_manifest}\n"))
wrote ~/_big/msens/derived/v8/registry-files/versions.json
~/_big/msens/derived/v8/registry-files/v8/manifest.json

6 Promote latest.txt (gated)

latest.txt is the one file that changes what users see by default, so it is written only when PROMOTE_LATEST=1 and only naming a released version. A pre-release is never promoted implicitly — it stays reachable at ?ver={ver} until someone decides otherwise.

Code
latest <- versions |> filter(status == "released") |> slice_head(n = 1) |> pull(ver)

if (promote) {
  f_latest <- glue("{dir_reg}/latest.txt")
  writeLines(latest, f_latest)
  cat(glue("PROMOTED latest.txt -> {latest}\n"))
} else {
  cat(glue("latest.txt would be '{latest}' (set PROMOTE_LATEST=1 to write it)\n"))
}
latest.txt would be 'v7' (set PROMOTE_LATEST=1 to write it)

7 Publish to S3

Code
if (do_s3) {
  # system2() runs the command through a shell, so unquoted glob patterns are
  # expanded by the shell against the CWD before aws ever sees them (an
  # unquoted `--exclude *` becomes the entire repo listing). shQuote them, and
  # expand `~` ourselves since the CLI does not.
  args <- c("s3", "sync", shQuote(path.expand(dir_reg)), shQuote(s3_root),
            "--exclude", shQuote("*"),
            "--include", shQuote("*.json"), "--include", shQuote("latest.txt"),
            "--content-type", shQuote("application/json"),
            # these three are MUTABLE pointers; S3 has no default cache-control but
            # CDNs and browsers will happily hold a stale registry, which shows the
            # wrong version list long after a promotion
            "--cache-control", shQuote("no-cache"),
            "--only-show-errors", "--no-progress")
  out <- system2("aws", args, stdout = TRUE, stderr = TRUE)
  if (!is.null(attr(out, "status")) && attr(out, "status") != 0)
    stop("aws s3 sync failed: ", paste(out, collapse = "\n"))

  # verify by READING BACK through the public URL, not by trusting the exit
  # status — a zero exit has already proved not to mean the objects are there
  # (CalCOFI's index publisher learned this the expensive way)
  got <- msens::atlas_manifest(ver, base = http_root, refresh = TRUE)
  stopifnot("published manifest does not round-trip" = identical(got$ver, ver))
  cat(glue("verified {http_root}/{ver}/manifest.json\n"))
} else {
  cat("MANIFEST_NO_S3 set - staged locally only\n")
}
verified https://s3.us-east-1.amazonaws.com/oceanmetrics.io-public/marine-atlas/v8/manifest.json

8 Target manifest

Code
msens::write_manifest(
  here::here("data/manifests/build_version_manifest.json"),
  target        = "build_version_manifest",
  content_hash  = digest::digest(list(mfst, versions), algo = "xxhash64"),
  stats = list(
    ver          = ver,
    status       = mfst$status,
    grid_id      = mfst$grid_id,
    id_field     = mfst$id_field,
    n_versions   = nrow(versions),
    n_metrics    = nrow(mfst$metrics),
    n_zone_sets  = nrow(mfst$zones),
    latest       = latest,
    promoted     = promote),
  force = msens::force_target("build_version_manifest"))