1<!DOCTYPE html><html lang="en" dir="ltr" class="hanken_grotesk_dd1adb36-module__VxmpCW__variable jetbrains_mono_13b10504-module__696lgG__variable cairo_ed6c548d-module__Gp7JOW__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/051742360c26797e-s.p.1bkzbscqrt8rl.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/9ff27b8a0a8f3dc0-s.p.40_3w74kn95bo.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/c47649aa31f9e140-s.p.3lxpqujs87tck.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/d41831e24743a3c1-s.p.08tn9snzkmifr.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/1g1f6y1hyrd1t.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/3l4q4vlyqibk1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/12sazzchdw007.js"/>
1<script src="/_next/static/chunks/28e0efor_pkuh.js" async=""></script>
1<script src="/_next/static/chunks/1tyu5cgx43mjr.js" async=""></script>
1<script src="/_next/static/chunks/42-vp81pveoaq.js" async=""></script>
1<script src="/_next/static/chunks/turbopack-3hhjxxy0b2avx.js" async=""></script>
1<script src="/_next/static/chunks/2cb22g3ulnaan.js" async=""></script>
1<script src="/_next/static/chunks/3sjrgdyra43oq.js" async=""></script>
1<script src="/_next/static/chunks/0zqc8myqnxx_8.js" async=""></script>
1<script src="/_next/static/chunks/3iqbmyfmb1gs4.js" async=""></script>
1<script src="/_next/static/chunks/18buwwz7p-chb.js" async=""></script>
1<script src="/_next/static/chunks/0fet4sv034ort.js" async=""></script>
1<meta name="next-size-adjust" content=""/><title>Blog · Portolan</title><meta name="description" content="Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it."/><link rel="canonical" href="https://www.portolan-sdi.org/blog"/><link rel="alternate" hrefLang="en" href="https://www.portolan-sdi.org/blog"/><link rel="alternate" hrefLang="es" href="https://www.portolan-sdi.org/es/blog"/><link rel="alternate" hrefLang="ar" href="https://www.portolan-sdi.org/ar/blog"/><link rel="alternate" hrefLang="x-default" href="https://www.portolan-sdi.org/blog"/><link rel="alternate" type="application/rss+xml" href="https://www.portolan-sdi.org/blog/feed.xml"/><meta property="og:title" content="Blog"/><meta property="og:description" content="Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it."/><meta property="og:url" content="https://www.portolan-sdi.org/blog"/><meta property="og:site_name" content="Portolan"/><meta property="og:locale" content="en"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Blog"/><meta name="twitter:description" content="Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it."/><link rel="icon" href="/favicon.ico?favicon.3k5d8ybl05tz5.ico" sizes="48x48" type="image/x-icon"/><link rel="icon" href="/logo-mark.svg"/>
1<script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script>
1</head><body class="min-h-screen antialiased"><div hidden=""><!--$--><!--/$--></div>
1<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://www.portolan-sdi.org/#organization","name":"Portolan","alternateName":"Portolan SDI","url":"https://www.portolan-sdi.org","logo":"https://www.portolan-sdi.org/logo-mark.svg","description":"Portolan is an open specification for publishing geospatial data as plain files in your own storage. No servers, no databases. Browse the catalog registry.","sameAs":["https://github.com/portolan-sdi","https://groups.google.com/g/portolan"]},{"@type":"WebSite","@id":"https://www.portolan-sdi.org/#website","url":"https://www.portolan-sdi.org","name":"Portolan","description":"Portolan is an open specification for publishing geospatial data as plain files in your own storage. No servers, no databases. Browse the catalog registry.","inLanguage":"en","publisher":{"@id":"https://www.portolan-sdi.org/#organization"}}]}</script>
1<div class="min-h-screen bg-p-bg font-sans"><div aria-hidden="true" class="fixed inset-0 z-[39] bg-[rgba(22,23,15,0.32)] transition-opacity md:hidden opacity-0 pointer-events-none"></div><nav id="site-rail" aria-label="Portolan home" inert="" class="site-rail fixed inset-y-0 start-0 z-40 flex flex-col w-[min(86vw,320px)] md:w-[var(--p-rail)] bg-p-bg border-e border-p-line"><a aria-label="Portolan home" class="flex items-center px-[22px] py-5 border-b border-p-line" href="/"><span class="inline-flex items-center gap-2.5 text-p-ink "><svg width="26" height="26" viewBox="0 0 32 32" aria-hidden="true" class="block"><g fill="var(--p-primary)"><path d="M2.83 18.247l26.34-9.124L2.83 0z"></path><path d="M29.17 32V13.753L2.83 22.877z"></path></g></svg><span class="font-semibold font-sans" style="font-size:22.099999999999998px;letter-spacing:-0.015em">Portolan</span></span></a><div class="flex-1 overflow-y-auto py-3.5"><ul class="px-[22px]"><li><div class="flex items-center gap-1.5"><button type="button" aria-expanded="false" aria-controls="rail-group-overview" aria-label="Overview links" class="inline-flex h-6 w-3 shrink-0 items-center justify-center text-p-ink-3 transition-colors hover:text-p-primary"><span aria-hidden="true" class="text-[9px] leading-none transition-transform duration-200 -rotate-90 rtl:rotate-90">â¾</span></button><a class="flex-1 flex items-center justify-between py-[9px] text-body transition-colors text-p-ink hover:text-p-primary" href="/">Overview</a></div><ul id="rail-group-overview" hidden="" class="ms-[6px] border-s border-dashed border-p-line-soft ps-[22px]"><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#demo">Demo</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#why">Why Portolan</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#who">Who it's for</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#how">How it works</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#coverage">Explore catalogs</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#ecosystem">Ecosystem</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/#involved">Get involved</a></li></ul></li><li><div class="flex items-center gap-1.5"><span class="inline-flex h-6 w-3 shrink-0 items-center justify-center text-p-ink-3"><span aria-hidden="true" class="text-[9px] leading-none transition-transform duration-200 ">â¾</span></span><span class="flex-1 flex items-center justify-between py-[9px] text-body transition-colors text-p-ink hover:text-p-primary">Resources</span></div><ul id="rail-group-resources" class="ms-[6px] border-s border-dashed border-p-line-soft ps-[22px]"><li><a aria-current="page" class="flex items-center justify-between py-[7px] text-small transition-colors text-p-primary" href="/blog">Blog</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/talks">Talks & demos</a></li><li><a class="flex items-center justify-between py-[7px] text-small transition-colors text-p-ink hover:text-p-primary" href="/faq">FAQ</a></li></ul></li><li><a class="flex items-center justify-between py-[9px] text-body transition-colors ps-[18px] text-p-ink hover:text-p-primary" href="/registry">Registry</a></li></ul></div><div class="border-t border-p-line px-[22px] py-3.5 flex items-center justify-between gap-2"><div class="relative"><button id="locale-switcher-button" type="button" aria-label="Change language" aria-haspopup="menu" aria-expanded="false" aria-controls="locale-switcher-menu" class="inline-flex items-center gap-1 h-8 px-2 rounded-[var(--p-r-md)] text-small text-p-ink-2 transition-colors hover:bg-p-bg-soft hover:text-p-ink"><span dir="ltr">EN</span><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="transition-transform"><path d="M6 9l6 6 6-6"></path></svg></button></div><button type="button" aria-controls="site-rail" aria-expanded="true" aria-label="Collapse the index" title="Collapse the index" class="hidden md:inline-flex items-center justify-center h-8 px-2 font-mono text-small text-p-ink-3 transition-colors hover:bg-p-bg-soft hover:text-p-ink"><span aria-hidden="true">«</span></button></div></nav><div class="md:hidden sticky top-0 z-30 flex items-center justify-between border-b border-p-line bg-p-bg px-[var(--p-pad-section-x)] py-3"><a aria-label="Portolan home" href="/"><span class="inline-flex items-center gap-2.5 text-p-ink "><svg width="24" height="24" viewBox="0 0 32 32" aria-hidden="true" class="block"><g fill="var(--p-primary)"><path d="M2.83 18.247l26.34-9.124L2.83 0z"></path><path d="M29.17 32V13.753L2.83 22.877z"></path></g></svg><span class="font-semibold font-sans" style="font-size:20.4px;letter-spacing:-0.015em">Portolan</span></span></a><button type="button" aria-controls="site-rail" aria-expanded="false" class="font-mono text-eyebrow uppercase tracking-[0.1em] border border-p-line px-3 py-1.5 text-p-ink hover:bg-p-bg-soft">Index</button></div><div class="site-main"><main><section class="relative isolate overflow-hidden border-b border-p-line"><div class="absolute inset-0 h-full w-full"><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><div class="absolute inset-0"></div><!--/$--></div><div class="absolute inset-0" style="background:var(--hero-scrim)"></div><div class="relative z-10 px-[var(--p-pad-section-x)] pb-[clamp(32px,4vw,56px)] pt-[clamp(40px,5vw,72px)]"><div class="mx-auto max-w-[1240px]"><h1 class="text-section leading-[1.05] tracking-[-0.03em] rtl:tracking-normal text-balance"><span class="block font-extrabold">Blog</span></h1><p class="mt-6 text-lead leading-relaxed text-p-ink-2">Notes from the Portolan project on the specification, the tooling, and what we learn from publishing real catalogs.</p><a href="/blog/feed.xml" type="application/rss+xml" class="mt-4 inline-flex items-center gap-2 font-mono text-eyebrow uppercase tracking-[0.08em] text-p-ink-3 transition-colors hover:text-p-primary rtl:tracking-normal"><svg viewBox="0 0 16 16" class="h-[1em] w-[1em] shrink-0" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="butt"><rect x="1" y="12" width="3" height="3" fill="currentColor" stroke="none"></rect><path d="M2.25 7.25a6.5 6.5 0 0 1 6.5 6.5"></path><path d="M2.25 2.25a11.5 11.5 0 0 1 11.5 11.5"></path></svg><span class="underline underline-offset-4">RSS feed</span></a></div></div></section><section class="px-[var(--p-pad-section-x)] pb-[var(--p-pad-section-y)] pt-[clamp(28px,3.5vw,48px)]"><div class="mx-auto max-w-[1240px]"><div class="border-t border-p-line"><article class="border-b border-p-line py-8 md:grid md:grid-cols-[minmax(0,10rem)_minmax(0,1fr)] md:gap-10"><time dateTime="2026-09-16" class="block font-mono text-eyebrow uppercase tracking-[0.06em] text-p-ink-3">September 16, 2026</time><p class="mt-1 font-mono text-eyebrow uppercase tracking-[0.06em] text-p-ink-3 md:col-start-1">By<!-- --> <span dir="ltr">Chris Holmes</span></p><div class="mt-3 md:mt-0"><h2 class="text-feature leading-[1.2] tracking-[-0.02em] text-pretty"><a class="transition-colors hover:text-p-primary" href="/blog/building-portolan-trimet"><span class="block font-bold">Building Portolan: TriMet Mirror</span><span class="mt-1 block font-normal text-p-ink-2">Three hours from shapefiles to a live catalog</span></a></h2><p class="mt-3 text-body leading-[1.7] text-p-ink-2 text-pretty">TriMet publishes eight geospatial datasets as plain files. Mirroring them into a Portolan catalog, with a custom-themed browser, took about three hours of work on a plane.</p></div></article><article class="border-b border-p-line py-8 md:grid md:grid-cols-[minmax(0,10rem)_minmax(0,1fr)] md:gap-10"><time dateTime="2026-09-02" class="block font-mono text-eyebrow uppercase tracking-[0.06em] text-p-ink-3">September 2, 2026</time><div class="mt-3 md:mt-0"><h2 class="text-feature leading-[1.2] tracking-[-0.02em] text-pretty"><a class="transition-colors hover:text-p-primary" href="/blog/introducing-portolan"><span class="block font-bold">Introducing Portolan</span><span class="mt-1 block font-normal text-p-ink-2">
1A serverless spatial data infrastructure</span></a></h2><p class="mt-3 text-body leading-[1.7] text-p-ink-2 text-pretty">Cloud-optimized formats and STAC metadata make it possible to run a spatial data infrastructure as files in a bucket. Portolan is an open-source spec and toolkit for building one.</p></div></article></div></div></section></main><footer class="border-t border-p-line px-[var(--p-pad-section-x)] pb-6 pt-10"><div class="mx-auto max-w-[1240px]"><div class="flex flex-col items-start gap-8 sm:flex-row sm:gap-12 lg:gap-20"><a aria-label="Portolan home" class="block w-fit shrink-0" href="/"><span class="inline-flex items-center gap-2.5 text-p-ink "><svg width="30" height="30" viewBox="0 0 32 32" aria-hidden="true" class="block"><g fill="var(--p-primary)"><path d="M2.83 18.247l26.34-9.124L2.83 0z"></path><path d="M29.17 32V13.753L2.83 22.877z"></path></g></svg><span class="font-semibold font-sans" style="font-size:25.5px;letter-spacing:-0.015em">Portolan</span></span></a><div class="grid w-full grid-cols-1 gap-8 text-start text-small sm:grid-cols-3 sm:gap-10"><div><p class="mb-2 font-mono text-eyebrow text-p-ink-3">Development</p><ul class="flex flex-col items-start gap-1"><li><a href="https://github.com/portolan-sdi/portolan-ops/blob/main/ROADMAP.md" target="_blank" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary">Roadmap</a></li><li><a href="https://github.com/portolan-sdi" target="_blank" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary"><span dir="ltr">GitHub</span></a></li></ul></div><div><p class="mb-2 font-mono text-eyebrow text-p-ink-3">Community</p><ul class="flex flex-col items-start gap-1"><li><a href="https://groups.google.com/g/portolan" target="_blank" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary">Google Group</a></li><li><a href="https://cloudnativegeo.slack.com/archives/C0A1JBH9529" target="_blank" rel="noopener noreferrer" class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary"><span dir="ltr">Slack</span></a></li></ul></div><div><p class="mb-2 font-mono text-eyebrow text-p-ink-3">Resources</p><ul class="flex flex-col items-start gap-1"><li><a class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary" href="/blog">Blog</a></li><li><a class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary" href="/talks">Talks & demos</a></li><li><a class="inline-flex min-h-6 items-center text-p-ink-2 transition-colors hover:text-p-primary" href="/faq">FAQ</a></li></ul></div></div></div><p class="mt-12 text-center text-small text-p-ink-3">Site content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" class="underline underline-offset-2"><span dir="ltr"><span class="font-mono">CC BY 4.0</span></span></a>.<!-- --> <!-- -->·<!-- --> <!-- -->Website source is licensed under <a href="https://github.com/portolan-sdi/portolan-sdi.org/blob/main/LICENSE" class="underline underline-offset-2"><span dir="ltr"><span class="font-mono">Apache-2.0</span></span></a>.</p></div></footer></div></div><!--$--><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$-->
1<script src="/_next/static/chunks/12sazzchdw007.js" id="_R_" async=""></script>
1<script>(self.__next_f=self.__next_f||[]).push([0])</script>
1<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[51468,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"default\"]\n3:I[72120,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"default\"]\n6:I[1351,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\na:I[1351,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"ViewportBoundary\"]\nc:I[1351,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"MetadataBoundary\"]\ne:I[64388,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/1g1f6y1hyrd1t.css\",\"style\"]\n:HL[\"/_next/static/chunks/3l4q4vlyqibk1.css\",\"style\"]\n:HL[\"/_next/static/media/051742360c26797e-s.p.1bkzbscqrt8rl.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/9ff27b8a0a8f3dc0-s.p.40_3w74kn95bo.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/c47649aa31f9e140-s.p.3lxpqujs87tck.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/d41831e24743a3c1-s.p.08tn9snzkmifr.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script>
1<script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"en\",\"blog\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[[\"locale\",\"en\",\"d\",null],{\"children\":[\"blog\",{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1g1f6y1hyrd1t.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2cb22g3ulnaan.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/3sjrgdyra43oq.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3l4q4vlyqibk1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0zqc8myqnxx_8.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/3iqbmyfmb1gs4.js\",\"async\":true,\"nonce\":\"$undefined\"}]],\"$L4\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L5\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/18buwwz7p-chb.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0fet4sv034ort.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,null]},null,false,\"$@9\"]},null,false,null]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Ld\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1g1f6y1hyrd1t.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"oNmE1J17KjcBRwlyGqwAH\"}\n"])</script>
1<script>self.__next_f.push([1,"f:[]\n9:\"$Wf\"\n"])</script>
1<script>self.__next_f.push([1,"10:I[75936,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\",\"/_next/static/chunks/0zqc8myqnxx_8.js\",\"/_next/static/chunks/3iqbmyfmb1gs4.js\",\"/_next/static/chunks/18buwwz7p-chb.js\",\"/_next/static/chunks/0fet4sv034ort.js\"],\"BlogIndexPage\"]\n5:[\"$\",\"$L10\",null,{}]\n"])</script>
1<script>self.__next_f.push([1,"12:I[69371,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\",\"/_next/static/chunks/0zqc8myqnxx_8.js\",\"/_next/static/chunks/3iqbmyfmb1gs4.js\"],\"Analytics\"]\n13:I[85732,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\",\"/_next/static/chunks/0zqc8myqnxx_8.js\",\"/_next/static/chunks/3iqbmyfmb1gs4.js\"],\"SpeedInsights\"]\n"])</script>
1<script>self.__next_f.push([1,"4:[\"$\",\"html\",null,{\"lang\":\"en\",\"dir\":\"ltr\",\"className\":\"hanken_grotesk_dd1adb36-module__VxmpCW__variable jetbrains_mono_13b10504-module__696lgG__variable cairo_ed6c548d-module__Gp7JOW__variable\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen antialiased\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"Organization\\\",\\\"@id\\\":\\\"https://www.portolan-sdi.org/#organization\\\",\\\"name\\\":\\\"Portolan\\\",\\\"alternateName\\\":\\\"Portolan SDI\\\",\\\"url\\\":\\\"https://www.portolan-sdi.org\\\",\\\"logo\\\":\\\"https://www.portolan-sdi.org/logo-mark.svg\\\",\\\"description\\\":\\\"Portolan is an open specification for publishing geospatial data as plain files in your own storage. No servers, no databases. Browse the catalog registry.\\\",\\\"sameAs\\\":[\\\"https://github.com/portolan-sdi\\\",\\\"https://groups.google.com/g/portolan\\\"]},{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://www.portolan-sdi.org/#website\\\",\\\"url\\\":\\\"https://www.portolan-sdi.org\\\",\\\"name\\\":\\\"Portolan\\\",\\\"description\\\":\\\"Portolan is an open specification for publishing geospatial data as plain files in your own storage. No servers, no databases. Browse the catalog registry.\\\",\\\"inLanguage\\\":\\\"en\\\",\\\"publisher\\\":{\\\"@id\\\":\\\"https://www.portolan-sdi.org/#organization\\\"}}]}\"}}],\"$L11\",[\"$\",\"$L12\",null,{}],[\"$\",\"$L13\",null,{}]]}]}]\n"])</script>
1<script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script>
1<script>self.__next_f.push([1,"14:I[444,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\",\"/_next/static/chunks/0zqc8myqnxx_8.js\",\"/_next/static/chunks/3iqbmyfmb1gs4.js\"],\"default\"]\n"])</script>
1<script>self.__next_f.push([1,"11:[\"$\",\"$L14\",null,{\"formats\":{\"number\":{\"decimal\":{\"numberingSystem\":\"latn\"}},\"dateTime\":{\"short\":{\"numberingSystem\":\"latn\"},\"postDate\":{\"year\":\"numeric\",\"month\":\"long\",\"day\":\"numeric\",\"numberingSystem\":\"latn\"}}},\"locale\":\"en\",\"messages\":{\"meta\":{\"title\":\"Portolan makes geospatial data easy to share and use\",\"description\":\"Portolan is an open specification for publishing geospatial data as plain files in your own storage. No servers, no databases. Browse the catalog registry.\"},\"nav\":{\"registry\":\"Registry\",\"why\":\"Why Portolan\",\"homeAria\":\"Portolan home\",\"languageAria\":\"Change language\",\"index\":\"Index\",\"who\":\"Who it's for\",\"collapse\":\"Collapse the index\",\"expand\":\"Index\",\"faq\":\"FAQ\",\"coverage\":\"Explore catalogs\",\"overview\":\"Overview\",\"resources\":\"Resources\",\"talks\":\"Talks \u0026 demos\",\"toggleGroup\":\"{section} links\",\"blog\":\"Blog\"},\"hero\":{\"title\":\"Portolan makes geospatial data\",\"titleAccent\":\"easy to share and use.\",\"description\":\"Portolan is an open-source \u003cspec\u003especification\u003c/spec\u003e and \u003ceco\u003etoolkit\u003c/eco\u003e that combines cloud-native file formats with clear metadata and documentation so that people and agents can publish and use data at any scale.\",\"howItWorks\":\"How it works\",\"exploreCatalogs\":\"Explore catalogs\"},\"involved\":{\"ariaLabel\":\"Users and supporters\"},\"getInvolved\":{\"title\":\"Get involved\",\"priority\":\"The simplest way to get started right now is to \u003cpublish\u003epublish your data as a Portolan catalog\u003c/publish\u003e and let us know how it goes. Feedback on what works, what doesn't, and how Portolan can be improved is always helpful, especially when your implementation differs from existing catalogs.\",\"contributions\":\"We also welcome contributions to the \u003cgithub\u003ePortolan spec and tooling\u003c/github\u003e in the form of bug reports, feature requests, and PRs (and especially PRs). Check out our \u003cissues\u003eopen issues\u003c/issues\u003e to get started.\",\"community\":\"Portolan is an open-source community project. We welcome new users and contributors. Join the \u003cslack\u003e\u003cm\u003e#portolan\u003c/m\u003e channel on Slack\u003c/slack\u003e and follow the \u003cgroup\u003ePortolan Google Group\u003c/group\u003e for details on our weekly meetings.\"},\"footer\":{\"contentLicense\":\"Site content is licensed under \u003ccc\u003e\u003cm\u003eCC BY 4.0\u003c/m\u003e\u003c/cc\u003e.\",\"sourceLicense\":\"Website source is licensed under \u003capache\u003e\u003cm\u003eApache-2.0\u003c/m\u003e\u003c/apache\u003e.\",\"googleGroup\":\"Google Group\",\"slack\":\"Slack\",\"community\":\"Community\",\"development\":\"Development\",\"resources\":\"Resources\",\"roadmap\":\"Roadmap\",\"github\":\"GitHub\"},\"why\":{\"cards\":{\"open\":{\"title\":\"Open and interoperable\",\"description\":\"Portolan builds on open standards like \u003cgeoparquet\u003e\u003cm\u003eGeoParquet\u003c/m\u003e\u003c/geoparquet\u003e, \u003cpmtiles\u003e\u003cm\u003ePMTiles\u003c/m\u003e\u003c/pmtiles\u003e, \u003ccog\u003e\u003cm\u003eCOG\u003c/m\u003e\u003c/cog\u003e, and \u003cstac\u003e\u003cm\u003eSTAC\u003c/m\u003e\u003c/stac\u003e so that data can be dropped right into tools like QGIS, ArcGIS, Pandas, or BigQuery.\"},\"simple\":{\"title\":\"Simple, cheap, scalable, sovereign\",\"description\":\"With Portolan, your data are just files in a cloud bucket. Store them with any \u003cm\u003eS3\u003c/m\u003e-compatible provider, in any jurisdiction you choose. Your only costs are storage and egress. Scale from megabytes to petabytes with no servers, databases, or custom APIs.\"},\"agents\":{\"title\":\"Built for people and agents\",\"description\":\"Portolan catalogs are well-structured, well-formatted, and well-documented, so people and agents can find, understand, and use them. Browse the registry yourself to discover new data, or point an agent at the registry and see what it can do.\"}}},\"whoFor\":{\"title\":\"Who it's for\",\"stories\":{\"large\":{\"title\":\"Large publishers\",\"today\":\"Large archives, such as satellite imagery or national-scale geoportals, are expensive to store and hard to maintain.\",\"change\":\"Portolan makes it straightforward to publish that data \u003ccost\u003eas cheaply as possible\u003c/cost\u003e, without servers, databases, or APIs, while making it easier to discover and use.\"},\"small\":{\"title\":\"Small publishers\",\"today\":\"Many city governments, NGOs, and other smaller data producers can't afford the cost or complexity of publishing data with tools like GeoServer or Esri.\",\"change\":\"Portolan lowers the barrier to entry by letting you share your data with nothing more than a cloud storage bucket.\"},\"users\":{\"title\":\"Data users\",\"today\":\"Most geospatial data is scattered, poorly documented, and stored in ways that make it hard to use.\",\"change\":\"Portolan requires clear metadata and documentation, uses formats designed for direct access, and provides a \u003creg\u003ecentral registry\u003c/reg\u003e of public catalogs. You spend less time finding, downloading, and wrangling data, and more time putting it to work.\"}}},\"howItWorks\":{\"eyebrow\":\"How it works\",\"title\":\"How it works\",\"intro\":\"Use the \u003ccli\u003ePortolan CLI\u003c/cli\u003e or \u003cskills\u003eagent skills\u003c/skills\u003e to transform your existing data into a Portolan catalog.\",\"steps\":{\"convert\":{\"id\":\"01\",\"t
1itle\":\"Convert\",\"description\":\"Whether you're working with Shapefiles and GeoPackages, a WFS endpoint, or an Esri server, your data end up as \u003cm\u003eGeoParquet\u003c/m\u003e and \u003cm\u003ePMTiles\u003c/m\u003e for vector and \u003cm\u003eCOG\u003c/m\u003e for raster.\"},\"catalog\":{\"id\":\"02\",\"title\":\"Catalog\",\"description\":\"Your cloud-optimized data are organized as a \u003cm\u003eSTAC\u003c/m\u003e catalog with clear metadata and docs, making the catalog easy to find, understand, and use for people and agents.\"},\"publish\":{\"id\":\"03\",\"title\":\"Publish\",\"description\":\"Your catalog is published to any S3-compatible storage, such as AWS, GCS, Hetzner, or MinIO, with no servers or APIs to set up.\"},\"use\":{\"id\":\"04\",\"title\":\"Use\",\"description\":\"Your data can now be dropped directly into tools like QGIS, ArcGIS, or Python, or you can pass the catalog URL to an agent and let it get to work.\"}}},\"demo\":{\"navLabel\":\"Demo\",\"title\":\"A better way to work with geospatial data\",\"blurb\":\"Start with real questions, not a script. Watch an agent find relevant catalogs in the Portolan registry and answer complex, natural-language questions about flood risk in Moldova.\",\"captionPhiladelphia\":\"Making \u003ccatalog\u003ea Portolan catalog\u003c/catalog\u003e start to finish from Philadelphia housing data.\",\"transcriptPhiladelphia\":\"A terminal-only recording shows an agent create and publish a Portolan catalog from ten Open Data Philly datasets. The request names property parcels, land use, zoning base districts and overlays, zoning descriptions, vacant-property indicators, City Council districts, building footprints, and affordable housing production. The agent loads the Portolan bootstrap skill, researches and downloads the sources, enriches metadata, creates thumbnails and map styles, validates the catalog, and publishes it. The terminal reports about 1.78 million features and that all catalog gates pass. It also records unresolved source fields, license details, and upstream tool issues before it syncs the published catalog files and agent guides.\",\"transcriptFloodRisk\":\"A terminal-only recording shows an agent find data about flood risk in Chisinau through the live Portolan registry. It inspects the Moldova geodata catalog and related catalogs for flood extents, flood depth, buildings, population, land cover, hydrography, roads, utilities, and boundaries. It reports Moldova flood scenarios for 1%, 0.5%, and 0.1% annual probabilities, dam-breach extents, JRC GLOFAS depth layers, and GHSL population grids. It then calculates screening estimates for exposed buildings and population, and ranks several planning corridors. The result notes that the estimates lack local depth, velocity, arrival time, and building-vulnerability data.\",\"play\":\"Play the demo\",\"pause\":\"Pause the demo\",\"fullscreen\":\"Show the demo full screen\",\"exitFullscreen\":\"Leave full screen\",\"seek\":\"Seek in the demo\"},\"ecosystem\":{\"eyebrow\":\"Ecosystem\",\"title\":\"Ecosystem\",\"intro\":\"The Portolan specification can be implemented in a number of ways. Here is a list of core, community-contributed, and commercial tools to make publishing and working with Portolan data easy.\",\"submit\":\"Submit a tool\",\"filterLabel\":\"Filter tools by tier\",\"filters\":{\"all\":\"all\",\"core\":\"core\",\"community\":\"community\",\"commercial\":\"commercial\"},\"empty\":\"No tools in this tier yet.\",\"proprietary\":\"Commercial\",\"pagination\":{\"label\":\"Ecosystem pages\",\"previous\":\"Previous page\",\"next\":\"Next page\",\"page\":\"Page {page}\"},\"commercial\":{\"title\":\"Commercial products on the open core\",\"body\":\"Portolan standardizes the published catalog, not the software around it, so companies can sell capabilities the open tools do not cover. \u003ccarto\u003eCARTO SDI\u003c/carto\u003e extends Portolan for organizations with private datasets, governance and audits, dataset commercialization, and writable datasets. If a product goes away, the catalog keeps working and another tool can take over.\"},\"projects\":{\"spec\":\"The specification that defines a Portolan catalog.\",\"rashid\":\"The validator for checking whether a catalog conforms to the Portolan specification.\",\"cli\":\"A command-line tool for creating, checking, and publishing Portolan catalogs.\",\"registry\":\"A central registry of public Portolan catalogs.\",\"browser\":\"A web interface for browsing and exploring Portolan catalogs.\",\"skills\":\"Agent skills for creating and working with Portolan catalogs.\",\"cartosdi\":\"A spatial data infrastru
1cture for organizations, built on Portolan.\",\"scout\":\"A geospatial ingestion platform that publishes Portolan-conformant catalogs and answers spatial questions with AI-generated maps and data.\"}},\"coverage\":{\"title\":\"Explore catalogs\",\"blurb\":\"See independently hosted geospatial catalogs from publishers around the world.\",\"cta\":\"Browse the registry\",\"featuredLabel\":\"Featured catalogs\",\"featured\":{\"global-data\":{\"title\":\"Agricultural field boundaries\",\"publisher\":\"Fields of the World\",\"place\":\"Worldwide\"},\"portolan-nl\":{\"title\":\"Dutch national geodata\",\"publisher\":\"Portolan NL\",\"place\":\"Netherlands\"},\"trimet\":{\"title\":\"Regional transit data\",\"publisher\":\"TriMet\",\"place\":\"Portland, Oregon\"}},\"about\":\"This map shows where data in the Portolan registry is available. Each hexagon is shaded by the number of distinct catalogs with at least one collection covering that area.\",\"cell\":{\"catalogs\":\"{count, plural, one {# catalog} other {# catalogs}}\"},\"caption\":\"Global coverage of Portolan catalogs\",\"legend\":\"catalogs per cell\"},\"registry\":{\"meta\":{\"title\":\"Registry\",\"description\":\"Every Portolan catalog the registry tracks. Explore them on the map, search them, and submit your own.\"},\"title\":\"Portolan registry\",\"intro\":\"The \u003creg\u003ePortolan registry\u003c/reg\u003e is a catalog of independently hosted catalogs and a first step toward a federated network for geospatial data. It makes interoperable catalogs from many publishers searchable in one place while the underlying data remain distributed and are queried directly from the source.\",\"note\":\"Some of these catalogs are unofficial mirrors maintained by volunteers. We expect mirrors to be replaced by official catalogs as publishers adopt the Portolan specification.\",\"search\":{\"placeholder\":\"Search catalogs...\",\"noResults\":\"No catalogs match your search\"},\"validation\":{\"unvalidated\":\"Unvalidated\"},\"card\":{\"viewCatalog\":\"View catalog\",\"moreProducers\":\"+{count} more\",\"dataSourceProducer\":\"Data source producer\",\"processedBy\":\"Processed by\",\"hostedBy\":\"Hosted by\",\"collections\":\"{count} collections\",\"licenses\":\"{count} licenses\",\"collection\":\"1 collection\",\"features\":\"{count} features\",\"items\":\"{count} items\",\"specVersion\":\"portolan {version}\",\"updated\":\"updated {date}\",\"copyUrl\":\"Copy address\",\"copied\":\"Copied\",\"noLocation\":\"No location reported\"},\"cta\":{\"title\":\"Have a catalog to share?\",\"description\":\"Submit your Portolan catalog to the registry.\"},\"submit\":{\"urlError\":\"URL must end with catalog.json\",\"urlLabel\":\"Catalog URL\",\"urlPlaceholder\":\"https://...catalog.json\",\"emailPlaceholder\":\"[email protected]\",\"emailInputLabel\":\"Email address\",\"emailError\":\"Enter an email address\",\"emailLabel\":\"We email you at this address if your catalog stops validating\",\"submit\":\"Submit\",\"submitting\":\"Submitting...\",\"successTitle\":\"Submitted!\",\"viewPr\":\"View submission\",\"submitAnother\":\"Submit another\",\"alreadyExistsError\":\"A catalog with this ID is already registered\",\"failedError\":\"Submission failed\",\"genericError\":\"Something went wrong\"},\"map\":{\"searchPlaceholder\":\"Search for a region...\",\"searchLabel\":\"Search regions\",\"searching\":\"Searching regions\",\"noResults\":\"No regions found\",\"resultsCount\":\"{count} regions found\",\"zoomIn\":\"Zoom in\",\"zoomOut\":\"Zoom out\",\"noLocation\":\"{count} without location\",\"loading\":\"Loading map...\",\"info\":\"Map credits\",\"label\":\"Map of catalog coverage\",\"cluster\":\"{count} catalogs here\",\"reset\":\"Reset view\",\"place\":\"place {index} of {total}\"},\"kind\":{\"official\":\"Official\",\"mirror\":\"Mirror\"},\"status\":{\"stale\":\"Stale\"},\"pagination\":{\"prev\":\"Previous page\",\"next\":\"Next page\",\"status\":\"{page} / {total}\"},\"lastChecked\":\"Last checked: {date}\",\"results\":{\"all\":\"{count} catalogs\",\"inView\":\"{count} catalogs in this view\",\"global\":\"{count} global\"}},\"faq\":{\"meta\":{\"title\":\"Frequently asked questions\",\"description\":\"Answers to common questions about Portolan. How it relates to STAC and cloud-optimized formats, why it does not need a serving layer, what conformance guarantees, and what it cannot do yet.\"},\"title\":\"Frequently asked questions\",\"items\":{\"standards\":{\"q\":\"Isnât Portolan just STAC and cloud-optimized formats?\",\"p1\":\"Portolan builds directly on STAC, GeoParquet, COG, PMTiles, and related standards. The difference is that those standards intentionally leave many implementation choices open, while Portolan defines and validates a quality floor for publishing geospatial data well.\",\"p2\":\"For example, Portolan requires GeoParquet to be spatially ordered and include spatial statistics that let clients skip irrelevant row groups. It requires COGs to include useful overviews and embedded statistics, and requires hosted assets to
1support HTTP range requests and browser access through CORS. The goal is not just to use cloud-native formats in name, but to use them in ways that reliably deliver the performance and ergonomics they are supposed to provide.\",\"p3\":\"See the \u003cspec\u003ePortolan specification\u003c/spec\u003e and \u003crashid\u003erashid\u003c/rashid\u003e, the Portolan validator.\"},\"servers\":{\"q\":\"Why not just use GeoServer, PostGIS, or an OGC API?\",\"p1\":\"For public, read-heavy data, Portolan is based on the idea that a dedicated serving layer is usually unnecessary.\",\"p2\":\"Modern clients can work directly with cloud-optimized files. DuckDB can query remote Parquet and GeoParquet with filtering, joins, and spatial operations. QGIS, BigQuery, Sedona, and other tools can work with the same underlying data. Portolan can also publish PMTiles and styles so interactive web maps do not need an on-demand tile server. You can still put an API, database, or application service on top when a particular use case needs one. Portolan removes the requirement that every dataset depend on one just to be accessible.\"},\"capabilities\":{\"q\":\"What can cloud-native files do that used to require an API?\",\"p1\":\"Quite a lot.\",\"p2\":\"Cloud-optimized formats are designed for efficient partial access over the network. Instead of downloading an entire dataset or sending every request through a server-side subsetting service, clients can fetch only the portions of a file they need and work with them directly.\",\"p3\":\"That means many capabilities traditionally associated with APIs can happen on top of the files themselves. Tools such as DuckDB, BigQuery, and Sedona can filter, join, subset, and analyze Parquet and GeoParquet directly. COG readers can request only the raster tiles and resolutions needed for a particular view, while PMTiles can serve interactive maps without an on-demand tile server.\",\"p4\":\"Portolan is designed around this model: publish data in formats that support efficient direct access, and let users choose the tools that query, analyze, or visualize them. A service can still be added when a workflow genuinely needs server-side behavior, but it no longer has to sit between every user and every dataset.\",\"p5\":\"Access-controlled data is planned for Portolan v1.0. Transactional editing is not yet supported.\"},\"conformance\":{\"q\":\"What does Portolan conformance actually guarantee?\",\"p1\":\"A catalog does not conform simply because it declares the Portolan extension. It conforms only if it passes the Portolan validator, which checks the STAC structure, Portolan metadata requirements, and requirements that can only be verified by inspecting the data itself.\",\"p2\":\"That includes things such as GeoParquet spatial ordering, row-group statistics, and embedded COG statistics. Conformance therefore means more than valid metadata: it gives users and software a stronger guarantee that the data are structured, hosted, documented, and optimized in predictable ways.\"},\"lockIn\":{\"q\":\"Does Portolan replace one proprietary platform with another?\",\"p1\":\"Avoiding that is a core part of the architecture. Portolan standardizes the published catalog, not the cloud provider, publishing workflow, user interface, analytical engine, or commercial vendor around it.\",\"p2\":\"If a commercial product creates and manages a Portolan catalog and you later stop using that product, the published catalog still works and another tool, provider, or vendor can take over. The goal is an ecosystem of competing, interoperable implementations rather than a vertically integrated Portolan platform.\"},\"dataModel\":{\"q\":\"Does Portolan standardize my data model?\",\"p1\":\"No. Portolan standardizes how data are packaged, documented, hosted, and accessed. It does not prescribe one universal schema for roads, buildings, parcels, administrative boundaries, or other domain data.\",\"p2\":\"Semantic standards and shared schemas can sit on top of Portolan where they are useful. Portolan addresses a different layer of interoperability: making differently produced datasets consistently discoverable, queryable, documented, and usable with common tools.\"},\"agents\":{\"q\":\"Why are agents part of a data publishing specification?\",\"p1\":\"Agents are becoming another major class of data user, and that changes some of the assumptions behind public data infrastru
1cture.\",\"p2\":\"Agents can inspect and query many datasets quickly, so Portolan assumes catalogs will be consumed programmatically at scale. Every catalog and collection therefore includes an \u003cm\u003eAGENTS.md\u003c/m\u003e file that can document access patterns, useful queries, data-quality notes, schema conventions, and other guidance that helps software use the data correctly.\",\"p3\":\"Agents are not required to publish or consume Portolan data. The CLI provides a deterministic publishing workflow, and standard tools can use the resulting catalogs directly. Agent-readiness is a design requirement, not a dependency on any particular AI system.\"},\"gaps\":{\"q\":\"What canât Portolan do yet?\",\"p1\":\"Portolan is still early-stage, and the specification and tooling are evolving as we test them against more publishers, datasets, and use cases. Current gaps include access-controlled data, transactional editing workflows, and normative support for formats such as Zarr and COPC.\",\"p2\":\"Our near-term focus is to expand the set of reference catalogs, stabilize the core specification, and reach a stable v1.0 CLI. Breaking changes remain possible until then, so Portolan is currently best suited to early adopters. See the \u003croadmap\u003eproject roadmap\u003c/roadmap\u003e for current work and linked issues.\"},\"name\":{\"q\":\"Why is it called Portolan?\",\"p1\":\"Portolan charts were among the earliest practical navigational maps. Chartmakers built these working tools from sailors' observations and corrected them as new voyages added evidence.\",\"p2\":\"No single authority made them. Workshops in different ports refined them as sailors brought new observations. Their shared visual language let sailors use each chart across ports and nations.\",\"p3\":\"The project takes its name from that tradition. A Portolan catalog is a practical tool, not an academic exercise. It holds open-format files in the publisher's storage for people and agents across organizations, clouds, and borders.\"}}},\"blog\":{\"meta\":{\"title\":\"Blog\",\"description\":\"Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it.\"},\"title\":\"Blog\",\"intro\":\"Notes from the Portolan project on the specification, the tooling, and what we learn from publishing real catalogs.\",\"backToIndex\":\"All posts\",\"englishNotice\":\"This post is available in English only. The rest of the site is translated.\",\"figureLabel\":\"Fig. {n}\",\"figurePending\":\"Asset pending\",\"by\":\"By\",\"feed\":\"RSS feed\"},\"talks\":{\"meta\":{\"title\":\"Talks \u0026 demos\",\"description\":\"Conference talks and live demos that show Portolan in use. Slides from the OGC Metadata Summit, Cloud Native Geospatial Japan, Open Geodag, and OGC Connect Helsinki, plus an agent demo and a storage cost calculator.\"},\"title\":\"Talks \u0026 demos\",\"items\":{\"bolzanoTalk\":{\"title\":\"AI-Ready Metadata in Practice\",\"attribution\":\"Cayetano Benavent · OGC Metadata Summit 2026\",\"description\":\"Lessons from building Portolan, with a demo of an agent that joins hazard zones, hospitals, and population from one catalog.\",\"alt\":\"Opening slide of the talk, with the title above the venue, the dates, and the speaker.\"},\"yharbyTalk\":{\"title\":\"Portolan: An SDI Without Servers\",\"attribution\":\"Youssef Harby · Cloud Native Geospatial Japan 2026\",\"description\":\"Builds the path to Portolan one layer at a time, from range requests on object storage to one \u003cm\u003eSTAC\u003c/m\u003e catalog that software, people, and agents read the same way.\",\"alt\":\"Opening slide of the talk, with the title in English and Japanese above the event and the speaker.\"},\"holmesTalk\":{\"title\":\"A Cloud-Native Upgrade for Spatial Data Infrastructure\",\"attribution\":\"Chris Holmes · Open Geodag 2026\",\"description\":\"How \u003cm\u003eGeoParquet\u003c/m\u003e, \u003cm\u003eCOG\u003c/m\u003e, \u003cm\u003ePMTiles\u003c/m\u003e, \u003cm\u003eSTAC\u003c/m\u003e, and other cloud-native formats can improve how spatial data infrastru
1ctures work.\",\"alt\":\"Opening slide of the talk, with the title and a link to the Dutch portal demo.\"},\"nextSdi\":{\"title\":\"The Next SDI\",\"attribution\":\"Javier de la Torre · OGC Connect Helsinki\",\"description\":\"How an SDI can work as trusted infrastructure for people and agents while keeping data under its publisher's control.\",\"alt\":\"Opening slide of the talk, over a map of street density.\"},\"finlandDemo\":{\"title\":\"Finland.SDI agent demo\",\"attribution\":\"CARTO\",\"description\":\"Watch an agent answer questions using Finland's national SDI, reading directly from the catalog without an API.\",\"alt\":\"The demo home screen, inviting a question about Finland's data.\"},\"costCalc\":{\"title\":\"Cost calculator\",\"attribution\":\"Open Geodag\",\"description\":\"Estimate the cost of publishing your data as a Portolan catalog.\",\"alt\":\"The calculator, comparing monthly storage and egress costs across three providers.\"}}}},\"now\":\"$undefined\",\"timeZone\":\"UTC\",\"children\":\"$L15\"}]\n"])</script>
1<script>self.__next_f.push([1,"15:[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]\n"])</script>
1<script>self.__next_f.push([1,"16:I[10508,[\"/_next/static/chunks/2cb22g3ulnaan.js\",\"/_next/static/chunks/3sjrgdyra43oq.js\"],\"IconMark\"]\n8:null\n"])</script>
1<script>self.__next_f.push([1,"d:[[\"$\",\"title\",\"0\",{\"children\":\"Blog · Portolan\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"canonical\",\"href\":\"https://www.portolan-sdi.org/blog\"}],[\"$\",\"link\",\"3\",{\"rel\":\"alternate\",\"hrefLang\":\"en\",\"href\":\"https://www.portolan-sdi.org/blog\"}],[\"$\",\"link\",\"4\",{\"rel\":\"alternate\",\"hrefLang\":\"es\",\"href\":\"https://www.portolan-sdi.org/es/blog\"}],[\"$\",\"link\",\"5\",{\"rel\":\"alternate\",\"hrefLang\":\"ar\",\"href\":\"https://www.portolan-sdi.org/ar/blog\"}],[\"$\",\"link\",\"6\",{\"rel\":\"alternate\",\"hrefLang\":\"x-default\",\"href\":\"https://www.portolan-sdi.org/blog\"}],[\"$\",\"link\",\"7\",{\"rel\":\"alternate\",\"type\":\"application/rss+xml\",\"href\":\"https://www.portolan-sdi.org/blog/feed.xml\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"Blog\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it.\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://www.portolan-sdi.org/blog\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"Portolan\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:locale\",\"content\":\"en\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:title\",\"content\":\"Blog\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:description\",\"content\":\"Writing from the Portolan project on serverless spatial data infrastructure, the specification, and the tools that build on it.\"}],[\"$\",\"link\",\"17\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.3k5d8ybl05tz5.ico\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"18\",{\"rel\":\"icon\",\"href\":\"/logo-mark.svg\"}],[\"$\",\"$L16\",\"19\",{}]]\n"])</script>
1</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.