To serve locally:
# Use the Ruby version in .ruby-version, then install the locked dependencies.
bundle install
bundle exec jekyll serve
The Marin blog is at /blog/, with original community posts and selected Open
Athena articles. New original posts use layout: post; only imported OA posts
use post_kind: mirror, source_url, and an original-source canonical URL.
See native blog authoring for a ready-to-copy Markdown
template and the shared article layout. See the Open Athena sync workflow
for checking/importing published Marin posts through draft PRs and validating the
build. The sync does not install a recurring schedule or deploy changes.
The shared footer's theme control offers System, Light, and Dark on home and every
blog page. Explicit choices persist in browser storage under marin-theme; System
clears that override and follows OS changes. Initialization runs before styles to
avoid a wrong-theme first paint. If storage is blocked, the control still works
on the current page, and new pages fall back to System. Theme regression checks:
node scripts/check_theme.js (also run by check_blog.py, so Node.js is required
for the combined validation command). Imported scientific plots retain light drawing
surfaces for their fixed source ink colors.