This repository contains the website for the Museum of Shrimp-Folk Art at https://mosfa.art.
MoSFA is also a surrealist worldbuilding and experimental art project. The site presents the museum as if it exists inside a coherent shrimp-folk civilization, with its own civic geography, collection history, curatorial standards, and institutional voice. This README can break that frame, but the project itself takes the premise seriously: the humor works best when the museum feels real.
The public site is driven mostly by YAML metadata, with artwork images stored in the repository and processed by Astro during the build.
- Astro static site, built as static HTML
- Metadata-driven artwork and exhibition content in YAML
- Astro image handling for local collection assets
- Auto-generated sitemap via
@astrojs/sitemap - GitHub Actions deployment to GitHub Pages
/homepage with featured works/about/museum setting and identity/gallery/full gallery/gallery/newest/gallery sorted by newest artwork image timestamp/artworks/[slug]/per-piece detail pages/eras/and/eras/[era]/era listings/categories/and/categories/[category]/category listings/exhibitions/and/exhibitions/[slug]/exhibition view pages
Artwork detail, gallery, era, and category pages are generated from artwork
metadata. Exhibition pages are generated from src/data/exhibition-views.yaml.
npm ci
npm run devThis project targets Node 22. The package manager is pinned in package.json,
and .node-version is provided for local version managers.
Project npm scripts set ASTRO_TELEMETRY_DISABLED=1 explicitly. Keep that
environment variable on any new Astro script so Codex worktrees do not fail when
Astro tries to write telemetry state under a user Library path.
Codex task isolation is enforced in two places:
.codex/environments/environment.tomlrunsscripts/codex-setup.sh, which creates acodex/...branch automatically when setup begins from a shared branch or detachedHEAD.AGENTS.mdtells every newly dispatched agent to verify that setup already placed the checkout on an isolated task branch before doing deliverable work.
For mobile or remote dispatch, treat task isolation as mandatory startup work, not a handoff step. A new task should begin by checking the current branch:
git status --short --branchIf setup already placed the checkout on a non-shared codex/... branch, continue
there. Do not run --new-task again, because that creates an unnecessary second
task branch.
If a session is still on main, master, trunk, develop, dev, or detached
HEAD, create the task branch manually before doing deliverable work:
./scripts/codex-task-start.sh --new-taskIf that command reports a dirty worktree, stop and resolve the existing changes instead of layering a new task on top of them.
Fresh task branches are based on main by default. Set CODEX_TASK_BASE_REF in
the environment only when a task should intentionally start from another ref.
These helper scripts are tailored to this repository’s branch layout and workflows.
Do not run simultaneous Codex tasks in the same checkout. Branches separate git history, but parallel agents need separate worktrees or sessions to avoid file-level interference.
For any task with a deliverable, assume the normal handoff is user review through
a pull request unless the user explicitly asks for a different workflow. Commit
the deliverable on the task branch, push the branch, and open a PR against
main. The PR should summarize the change, call out validation performed, and
note any known follow-up or unverified behavior.
Use the repo-local Codex environment at .codex/environments/environment.toml
for deterministic setup.
For parallel development, run the normal dev server unless another worktree is already using the default Astro port:
npm run dev -- --port 4322MoSFA keeps project-specific Codex guidance in two places:
AGENTS.mddefines repository workflow rules, including mandatory task branch isolation, PR labeling, image generation expectations, and the rule that new artwork accessions should be added as separate files insrc/data/artworks/..agents/skills/mosfa-art-curator/is the local curator skill package. It carries the museum canon, worldbuilding references, artwork rubric, wing and category guidance, generation prompt structure, metadata style, and staff-role workflow.
Use the curator skill for artwork concepts, image generation briefs, accession review, artwork metadata, exhibition copy, institutional copy, and canon-sensitive worldbuilding. The skill treats MoSFA as a serious museum inside New Atlantis, while still allowing repository docs and implementation work to describe how the fiction is constructed.
The intended accession workflow is:
- Chief Curator sets the brief and collection intent.
- Acquisition Team develops candidate artwork and production notes.
- Critic / Accession Reviewer evaluates the result against the rubric.
- Registrar writes compatible YAML metadata after acceptance.
- Copy Editor polishes public-facing prose.
- Historian reviews any new civic, institutional, or canon facts.
Small tasks can compress those roles, but keep the responsibilities distinct when quality judgment, metadata compatibility, or world continuity matter.
- Add the image file in
src/assets/images/artworks/. - Add a new YAML record in
src/data/artworks/, named after the artwork slug (for examplesrc/data/artworks/my-piece.yaml). - Fill all metadata fields:
titleslugartistReferencesourceWorkyearOrPerioderacategories(array)image(asset path, e.g.artworks/my-piece.png)imageAltsummarydescription(used on detail pages)featured(true/false)featuredRank(number, optional)published(true/false)
The homepage, gallery, era pages, category pages, and detail page are created automatically.
src/data/artworks.yaml remains supported for existing records. Do not insert
new accessions into that shared file unless a task explicitly asks for a data
migration; separate drop-in files keep parallel artwork branches easy to merge.
The workflow lives at .github/workflows/deploy.yml and runs on pushes to main.
It installs dependencies with npm ci, builds with npm run build, and deploys
the generated dist directory through GitHub Pages.
Default repository variables:
SITE_URLdefaults tohttps://mosfa.artBASE_PATHdefaults to/
If you move to another custom domain or back to a repo subpath deployment:
- Set
SITE_URLto the canonical domain (for examplehttps://mosfa.art). - Set
BASE_PATHto the repo path (for example/mosfa). - Add or update
public/CNAMEwhen GitHub Pages should publish a custom domain from the built site.