Generative ocean art that the data performs daily.
A pipeline runs at 06:00 UTC, fetches today's ocean data from open scientific sources, and renders it through authored recipes. Every day adds a frame. A recipe running for a year is a year of art β the same authored character, the ocean changing underneath it. The gallery walks itself forward without curation.
This is not a dashboard. It is not a research tool. It is a project where the ocean's data is treated with editorial dignity, and where authorship and accumulation matter more than dashboards and metrics.
π Just want to see it. Run it locally and the gallery fills with renders.
git clone https://github.com/chipi/oceancanvas.git
cd oceancanvas
docker compose -f compose/docker-compose.yml upOpen http://localhost:8080. Need help? β docs/quickstart.md for a 5-minute walkthrough; docs/get-started.md for full setup including local dev and troubleshooting.
π¨ Want to author a piece. Recipes are the authored unit β a YAML file describing region, source, render character, audio. The Recipe Editor at /recipes/new is the visual front door; the YAML schema is the durable form. β recipes/README.md is the field-by-field author guide with the render-type taxonomy and audio-block reference.
π οΈ Want to contribute or hack. The project's conventions live in two documents at the root: AGENTS.md (firm orientation β stack, constraints, code style; portable across AI agents) and IMPLEMENTATION.md (the Phase 1 build guide). The doc system itself is what most of the value lives in β see "How to read this repository" below. (CLAUDE.md is a thin Claude-specific overlay that defers to AGENTS.md.)
Three concepts hold the project together.
The recipe. A YAML file authored by a person β region, source, render type, creative parameters. Once authored, it runs forever. Tomorrow at 06:00 UTC the pipeline reads it, fetches that region's data for that source, and renders it. The recipe is the authored work; each render is the data sitting for the work that day.
The pipeline. Six tasks in a Prefect flow, running daily. Discover the latest available date per source. Fetch raw data. Process it into a browser-friendly intermediate format. Build a render payload per recipe. Render via Puppeteer + p5.js. Rebuild the manifest. The output is one PNG per recipe per day, on disk.
The gallery. A static React app that reads the manifest. Today's renders fill the front page. The fourteen-day strip below shows recent history. The grid below that shows every active recipe. No editor curated it. No engagement metrics measure it. The pipeline ran at 06:00 UTC and the gallery reflects what it produced.
The customer-facing surfaces β Dashboard, Recipe Editor, Gallery, Video Editor β close the creative loop: read the data, author a piece, watch it accumulate, assemble a year into a film.
Phase 1 β v0.5.0 shipped May 2026. Daily pipeline + four customer-facing surfaces + generative audio + audio-video coupling are all live. See CHANGELOG.md for the full history; GitHub releases for prose-formatted release notes.
Phase 1 ships:
- The pipeline running daily, self-hosted via Docker Compose
- Sources live: NOAA OISST sea surface temperature, Argo float density, OBIS biologging (whale shark)
- 11 authored recipes accumulating monthly renders back to 1981
- All four customer-facing surfaces β Dashboard, Recipe Editor, Gallery, Video Editor
- Generative audio (RFC-010 β ADR-027) and tension-arc audio-video coupling (RFC-011 β ADR-028)
Phase 2 β data source expansion (in progress). OC-03 specs 15 sources; Phase 1 lit up four (OISST, Argo, OBIS, GEBCO). Phase 2 brings the rest in three tiers: tier 1 β Sea Level, Salinity, Chlorophyll (the editorial heavyweights); tier 2 β Sea Ice, OSCAR currents, Coral Reef Watch (visual variety); tier 3 β NDBC buoys, WOA23, HadSST4 (point + climatology). Tracked across milestones v0.6.0 / v0.7.0 / v0.8.0.
Phase 3 β public hosting. Cloudflare R2 for renders, custom domain, social share cards. Deferred until Phase 2 has more for visitors to look at.
The whole thing stays open-by-default, file-based, and self-hostable across all three phases.
OceanCanvas's documentation has two layers β a concept package at the project root, and a living definition tree under docs/.
| Document | What it holds |
|---|---|
OC-00 Package Introduction |
Overview of the package and its parts |
OC-01 Vision |
Why the project exists |
OC-02 Project Concept |
What the surfaces are and how the creative loop works |
OC-03 Data Catalog |
Which sources are integrated and which are deferred |
OC-04 Pipeline Architecture |
How the pipeline is built, conceptually |
OC-05 Design System & Creative Direction |
The visual character |
Read these once or twice for the why. They are updated rarely.
docs/
βββ prd/ Product β user-value arguments per surface
β βββ OC_PA.md Reference: audiences Β· promises Β· principles
β βββ PRD-001..NNN.md Per-surface arguments, blog-post format
β
βββ uxs/ UX β visual contracts per surface
β βββ OC_IA.md Reference: surfaces Β· navigation Β· shared tokens
β βββ UXS-001..NNN.md Per-surface design tokens, layout, states
β
βββ rfc/ Tech, moving tier β open technical questions
β βββ RFC-001..NNN.md Open questions with alternatives and trade-offs
β
βββ adr/ Tech, settled tier β locked decisions
βββ OC_TA.md Reference: components Β· contracts Β· constraints Β· stack Β· state map
βββ ADR-001..NNN.md Per-decision records, append-only
Read what you need when you need it. Reference docs (PA / IA / TA) are linked into, not read end-to-end. Per-artifact docs are read when working on the thing they describe.
| Document | When to read |
|---|---|
AGENTS.md |
Always, before working on the codebase. Stack, constraints, code style, doc rules, voice. Portable across AI agents; reads cleanly for humans. |
CLAUDE.md |
Auto-loaded by Claude Code at session start. Slim overlay that defers to AGENTS.md. |
IMPLEMENTATION.md |
Phase 1 build guide β slices, gates, scope. |
CONTRIBUTING.md |
When proposing a change. Values + checklist. |
CHANGELOG.md |
Release history at a glance. |
| Per-package READMEs | When working in gallery/, pipeline/, sketches/, or recipes/. Each holds a focused entry-point doc. |
MIT. The data this project performs is open by default; the code that performs it is too.
Acknowledgement of dependencies: open scientific data from NOAA, ESA, NASA, NSIDC, and the broader open ocean-data ecosystem. The data is the work; this project is one way of looking at it.





