Skip to content

chipi/oceancanvas

Repository files navigation

OceanCanvas

CI Latest release License: MIT Phase 1

Generative ocean art that the data performs daily.

OceanCanvas gallery β€” accumulated daily renders across multiple recipes

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.


Three ways in

πŸ‘€ 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 up

Open 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.)


What this is

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.

Pipeline architecture β€” six tasks, Docker Compose stack

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 four surfaces

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.

Dashboard β€” source rail with region stats and CTA Recipe Editor β€” creative mode with mood presets and energy Γ— presence quadrant
Dashboard. Read the data. Source rail (SST Β· Argo Β· biologging), live region stats, "create a recipe from this region" CTA. Recipe Editor. Author a piece. Mood presets, energy Γ— presence quadrant, colour character, audio mapping β€” flip to the YAML pill for the durable form.
Gallery detail β€” timeline scrubber across decades of renders Video Editor β€” timelapse assembly with mixer, EQ, and tension-arc editor
Gallery. Watch it accumulate. Per-recipe detail page with timeline scrubber across years (or decades) of accumulated renders. Video Editor. Assemble a year into a film. Multi-channel mixer, EQ, tension-arc editor that shapes audio dynamics + visual filters in unison.

Status

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.


How to read this repository

OceanCanvas's documentation has two layers β€” a concept package at the project root, and a living definition tree under docs/.

The concept package β€” read end-to-end, once

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.

The definition tree β€” read selectively, when working on something

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.


Working on the project

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.

License

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.