Created by Mark Lindon
cd frontend/ocean-ui
cp .env.local.example .env.local
# edit NEXT_PUBLIC_API_BASE and add a Mapbox token
npm install
npm run dev
cd tileserver
docker build -t tileserver .
mkdir -p tiles && # put your static tiles here
docker run --rm -p 8080:80 -v $PWD/tiles:/usr/share/nginx/html/tiles tileserver
# Visit http://localhost:8080/tiles/{z}/{x}/{y}.mvt
POSTGRES_DB
, POSTGRES_USER
, POSTGRES_PASSWORD
, POSTGRES_HOST
, POSTGRES_PORT
.docs/ocean_prd.md
β Product Requirementsdocs/architecture.md
β Architecturedocs/VERSIONING.md
β Versioning policydocs/RELEASES.md
β Release workflowdocs/SETUP_GITHUB.md
β GitHub setup stepsCHANGELOG.md
β Version historyCONTRIBUTING.md
β Contribution guideCODE_OF_CONDUCT.md
β Community standardsSECURITY.md
β Security policyLICENSE
β MIT.github/workflows/daily-smart-ingestion.yml
).GET /status
aggregates job_run
+ dataset.cadence
.BlueSphere is more than data: itβs a climate action enabler.
Vision: Use open ocean data to shape a brighter future and help fix the planet.
See assets/pitch/BlueSphere_Pitch.pptx
and assets/pitch/BlueSphere_Pitch.pdf
for a full presentation deck.
See assets/pitch/BlueSphere_Pitch_WithCharts.pptx
for the full deck including charts on SST trends, COβ, heatwaves, sea level rise, and projections.
docs/ocean_prd.md
β Clean developer-focused PRD (Markdown)assets/docs/BlueSphere_PRD_Clean.pdf
β Clean PRD as PDF (ready to share)assets/pitch/BlueSphere_Pitch_WithCharts.pptx
β Stakeholder-ready pitch deck with visualsdocs/ocean_prd.md
β detailed PRD (Markdown)assets/docs/BlueSphere_PRD_Clean.pdf
β clean PRD (PDF)assets/pitch/BlueSphere_Pitch_WithCharts.pptx
β presentation deck with visualsassets/pitch/BlueSphere_Pitch.pdf
β exported PDF version (optional)assets/docs/BlueSphere_Summary.md
β 1-page executive summary (Markdown)assets/docs/BlueSphere_Summary.pdf
β 1-page executive summary (PDF)See docs/INSTRUCTIONS_CLAUDE_CODE.md
for step-by-step GitHub publishing.
Quick start publishing: docs/INSTRUCTIONS_CLAUDE_CODE.md
or run scripts/publish_to_github.sh
after editing USER/REPO.
Release drafting: use docs/RELEASE_NOTES_TEMPLATE.md
as a base for GitHub releases.
docs/BRD.md
β Business requirements & outcomesdocs/VISION.md
β Vision statement / manifestodocs/TESTING.md
β QA strategy with sample test caseswebsite/
β Markdown descriptors for pages (Home, Impact, Marine Life, Education, FAQ, Get Involved, Contact)We ship a separate bluesphere-site that renders Markdown pages from /website
.
cd frontend/bluesphere-site
npm install
npm run dev # opens http://localhost:4000
npm run build && npm start &
npm run test:e2e
CI runs in .github/workflows/ci-node.yml
.
frontend/bluesphere-site/pages/api/chatbot.ts
ready to wire to an LLM provider./faq
) includes search and quick topic filters.frontend/bluesphere-site/components/DesignSystem.tsx
frontend/bluesphere-site/public/logo.svg
(used as favicon too)./stories
) with long-form explainers (El NiΓ±o, Marine Heatwaves, Coral Bleaching).website/faq.md
via /api/faq
.website/faq.md
β the chatbot gets smarter automatically.docs/AGENT_RUNBOOK.md
tasks/agent_plan.yaml
tasks/todo_backlog.md
docs/CLAUDE_ONE_LINER.txt
Bootstrap script: scripts/bootstrap_agents.sh
tasks/issues_import.json
can be uploaded to GitHub via importer.We provide a JSONL seed and a helper script (requires gh
+ jq
):
./scripts/import_issues.sh Twick1234 BlueSphere
This reads tasks/issues_seed.jsonl
and creates labeled issues automatically.
Pre-configured GitHub issue templates are available under .github/ISSUE_TEMPLATE/
:
bug_report.md
)feature_request.md
)documentation.md
)A default PR template is provided under .github/PULL_REQUEST_TEMPLATE/pull_request_template.md
.
Contributors should fill in description, related issues, type, tests, and checklist.
We define ownership in .github/CODEOWNERS
. Adjust usernames/teams so PRs auto-request reviews.
See CONTRIBUTING.md for setup, branching, commit style, and PR process.
Please read CONTRIBUTING.md
for setup, branching, commit style, tests, and PR process.
We use issue/PR templates and CODEOWNERS for smooth collaboration.
CODE_OF_CONDUCT.md
SECURITY.md
for responsible disclosure processCreated by Mark Lindon β Founder & Lead Author of BlueSphere.
We include SPDX headers in source files for clarity and tooling compatibility.
Use the snippet in docs/SPDX_HEADER.txt
:
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2024β2025 Mark Lindon β BlueSphere
We include a LICENSES/THIRD_PARTY.md
scaffold and scripts to generate detailed lists:
scripts/render_js_licenses.py
(requires license-checker
)scripts/render_py_licenses.py
(requires pip-licenses
)Install and enable pre-commit to enforce SPDX headers:
pip install pre-commit
pre-commit install
pre-commit run --all-files
This runs basic hygiene checks and ensures new files include SPDX headers.
On every GitHub Release (published), CI will generate thirdβparty license files and attach them to the release:
.github/workflows/release-attach-licenses.yml
LICENSES/THIRD_PARTY_JS.md
, LICENSES/THIRD_PARTY_PY.md
, and JSON manifests.github/release-drafter.yml
+ workflow)..github/dependabot.yml
).SNYK_TOKEN
secret is set (optional).GitHub Discussions are enabled with categories:
.github/discussions.yml
./scripts/setup_discussions.sh Twick1234 BlueSphere
.github/DISCUSSION_TEMPLATE/
for Q&A, Ideas, and Announcements.See docs/ROADMAP.md
. The Roadmap content is also posted to the pinned discussion automatically by
scripts/create_pinned_discussions.sh
.
A workflow deploys the static export of the site to GitHub Pages on each push to main
:
.github/workflows/deploy-pages.yml
docker compose up
then browse http://localhost:8000/docs/status
, /stations
, /grid/sst
, /currents
(stubs)ingestion/ingest_ndbc.py
and ingestion/ingest_ersst.py
(stubs). Copy .env.example
to .env
.cd frontend/ocean-ui && npm install && npm run dev
(http://localhost:3000). Fetches API /status
for now.PRIVACY.md
and TERMS.md
added../scripts/protect_main.sh Twick1234 BlueSphere
.github/workflows/uptime.yml
(Pages + placeholder API).docs/DATA_DICTIONARY.md
and docs/DATA_LICENSES.md
.docs/MODEL_CARD_TEMPLATE.md
and docs/MODEL_EVAL_PLAN.md
.http://localhost:8000/tiles/sst/{z}/{x}/{y}.png
http://localhost:8000/tiles/currents/{z}/{x}/{y}.png
frontend/ocean-ui/pages/map.tsx
(Leaflet)docker compose up
) then run UI (npm run dev
) and open http://localhost:3000/map
To precompute SST tiles from an ERSST NetCDF:
# Install data libs inside the API image or local env first
pip install -r backend/requirements.txt
# Build SST PNG tiles at zooms 0..2
python ingestion/make_sst_tiles.py /path/to/ersst.v5.YYYYMM.nc 0 2
Generate synthetic currents vector tiles (MVT):
pip install -r backend/requirements.txt
python ingestion/make_currents_mvt.py 0 2
Start API and UI:
docker compose up
cd frontend/ocean-ui && npm install && npm run dev
# Open http://localhost:3000/map
The map loads SST PNG tiles and a VectorGrid overlay that fetches MVT currents.
Use ingestion/erddap_adapter.py
to pull recent slices from ERDDAP (tabledap/griddap).
Set ERDDAP_BASE
and dataset/env vars, then call from ingestion pipelines.
A scheduled workflow (.github/workflows/daily-tiles-refresh.yml
) regenerates vector (synthetic) currents and,
if ERSST_URL
secret is set, builds SST PNG tiles. Optionally commits the refreshed cache to main
.
db
(Postgres 16) and adminer
for quick browsing on http://localhost:8080docker compose up -d db adminer
pip install -r backend/requirements.txt
python backend/create_tables.py
ingestion/ingest_ndbc.py
and ingestion/ingest_ersst.py
now include DB helpers to upsert observations and record JobRun results..env.example
to .env
and set POSTGRES_* as needed.pip install -r backend/requirements.txt
python ingestion/erddap_to_parquet.py
We now parse NDBC realtime2 text files (e.g., data/realtime2/41001.txt
) extracting WTMP (water temperature, Β°C).
Parser: ingestion/ndbc_parser.py
β used by ingestion/ingest_ndbc.py
.
# Start DB + API
docker compose up -d db adminer
pip install -r backend/requirements.txt
python backend/create_tables.py
docker compose up api
# Run NDBC ingestion (example station 41001)
python ingestion/ingest_ndbc.py
# Query observations
curl 'http://localhost:8000/obs?station=41001&limit=5'
GET /obs
β query buoy observations with filters (bbox, time, station, paging).GET /obs/summary
β daily aggregations (count/avg/min/max) with same filters.cd tests/e2e
npm install
npx playwright install --with-deps
# Start API and UI in terminals, then:
npm test
A GitHub Actions workflow (.github/workflows/ci-e2e.yml
) starts the API and UI, waits for readiness, and runs the E2E tests on PRs and main
pushes.
A concise overview of whatβs in sync lives in docs/CONSISTENCY_REPORT.md
.
We also publish it to the site at /consistency
via frontend/bluesphere-site/pages/consistency.mdx
.
frontend/bluesphere-site/components/Layout.tsx
.frontend/bluesphere-site/styles/globals.css
(works immediately).cd frontend/bluesphere-site
npm install
npm run dev
# Tailwind is enabled through postcss + tailwind configs already included.
Logos and brand assets are stored in frontend/bluesphere-site/public/brand/
.
See docs/BRAND_GUIDE.md
for palette, typography, and usage rules.
prefers-color-scheme
(see docs/DARK_MODE.md
).components/HeadMeta.tsx
and public/brand/*
(see docs/SOCIAL_PREVIEW.md
).A Sun/Moon toggle in the site header lets users switch Light / Dark / System themes. See docs/THEME_TOGGLE.md
.
We added an About page with our mission, environmental goals, data sources, and brand story at /about
.
We added a Sources page (/sources
) and docs/DATA_SOURCES.md
describing datasets, cadence, and integration.
/sources
describes datasets, cadence, links, and license notes.docs/DATA_SOURCES.md
for a deeper reference.