Orientation for AI coding agents working in this repo. CLAUDE.md is a symlink to this file, so edit AGENTS.md. Both are excluded from the published site (contentExclude in config.json needs the filename forms AGENTS.md and CLAUDE.md as well as the /AGENTS forms, or the raw files are still served).
The source of https://developmentalspaces.org, published with Flowershow from the main branch on GitHub. A push to main deploys to production in about a minute, so work on a branch and preview first.
The public name of the site is Conscious Communities (renamed 2026-09-19). Developmental Spaces is the name of the concept, the whitepaper, the manifesto and the network. The domain did not change. The reasoning is in docs/branding/naming.md.
The site has three streams (Learn, Build, Fund) plus Find and About. Content is markdown. The designed pages (index.md, about.md, learn/index.md, build/index.md, fund/index.md, find/index.md) are hand-written HTML inside markdown, styled by custom.css.
-
docs/branding/README.md: index and decision log for the name, brand narrative and design. Start here. It also links the two Claude artifacts (mood board and home page mockups). -
docs/branding/design-direction.md, section 7: the design rules in force (direction E, watercolour). -
bd list: open work, tracked as beads.bd show <id>for the detail. The epiccoco-lxb("Redesign follow-ups") lists what to do next and in what order;bd children coco-lxbshows the tree. -
Beads carry a recommended-model label:
model:fablefor taste-heavy or writing-heavy work (copy, illustration direction, new layouts, the announcement) andmodel:sonnetfor work that follows patterns already in the repo (page migration, QA fixes, rollout, tooling). It is a recommendation, not a rule.bd list -l model:fableorbd list -l model:sonnetfilters by it.
docs/ is excluded from the published site (contentExclude in config.json) but is visible on the public GitHub repo, so do not put anything private in it. sandbox/ is git-ignored scratch space for large source files.
- Near-white page (
#F5F5F3), ink (#111), one flat Life Itself yellow (#FFD23F). All other colour comes from the illustrations. - PT Serif for text and headings, titles set tight (about -0.045em) with an italic second line. Source Sans 3 for navigation, captions and buttons. No monospace, no tracked uppercase eyebrows.
- Illustration carries ideas. Photographs carry evidence, and only as captioned plates on pages about actual places (exemplars, Find). No photographs on the front door, no stock imagery, no generated imagery presented as photography.
- Illustrations live in
assets/illustrations/. They are currently paintings borrowed from the Awami Conscious Food book (Life Itself, illustrated by Jennifer Chan) and are stand-ins until new work exists. - Page components are
cc-*classes incustom.css. Copy the patterns already used inindex.mdandlearn/index.mdrather than inventing new ones. The legacyds-*classes are gone; nothing in the markdown uses them. Long prose (wiki notes, lessons, the fund archive documents) stays in the default Flowershow reading layout on purpose. - A
.cc-pagehides the site footer (body:has(.cc-page) .site-footer), so end every designed page with the<footer class="cc-wrap cc-foot">block used inabout.mdorlearn/index.md, inside thecc-pagediv. - Copy (hero, tagline, door sentences) is a separate human job tracked in a bead. Do not rewrite it unasked.
- Fonts (PT Serif, Source Sans 3) are self-hosted from
assets/fonts/(SIL OFL, latin and latin-ext only) through@font-faceat the top ofcustom.css, so nothing render-blocking goes to Google. To add a weight, take the woff2 URLs from the Google Fontscss2response (send a Chrome user agent) and add a rule. - Flowershow strips
widthandheightfrom<img>in pages (both raw HTML and MDX), so they cannot prevent layout shift. Reserve space withstyle="aspect-ratio:W/H"on the image, and on a hero or yellow-section<figure>also setstyle="--ar:W/H as a number"(for example0.867); the CSS sizes the figure from--ar. Give the first (hero) painting on a pagefetchpriority="high" decoding="async"and every painting below the foldloading="lazy" decoding="async".
fl . --yes publishes the working tree to the preview site named in .flowershow (https://ds-redesign-preview-rufuspollock.flowershow.me). Quirks worth knowing:
flskips any folder namedbuild, so/buildonly renders in production. To check it, copybuild/index.mdto a temporary top-level file such aszz-tmp.md, publish, look, delete it and publish again.- After
fl . --yesthe preview's page HTML can also lag by up to a minute or two: poll it withcurlfor a string you just added before screenshotting. Images withloading="lazy"may not render in full-page screenshots; remove the attribute and scroll first. - The preview serves
custom.cssfrom an edge cache that can lag ten to twenty minutes after a publish. Comparemd5 -q custom.csswith the md5 ofcurl -sL <preview>/custom.css?x=$RANDOMbefore deciding a style change is broken. - The preview ignores
contentExclude, sodocs/and.beads/config.yamlshow up there but not in production. Check exclusions against the live site, and check raw files as well as pages (curl -sIL <url>follows the redirect to the raw file). Root files such asAGENTS.mdneed the filename form incontentExclude, not only/AGENTS.
Look at every changed page at 1440px and 400px wide before calling it done. Playwright with the Chromium headless shell works well for screenshots.
To test a custom.css change without waiting for a publish or the edge cache: load the live page in Playwright and append the local file with page.addStyleTag({ content }) after goto. Production inlines custom.css as a <style> tag, so there is no separate request to intercept, and a later style tag wins at equal specificity. This also works for /build, which the preview cannot render. Playwright's WebKit is a quick Safari check; npx playwright install webkit if the cached build is old.
All in config.json, and all checked against the deployed HTML, not the preview:
image: default social card (assets/og-card.jpg). A page's ownimage:frontmatter overrides it; the main pages point athttps://screenshotit.app/https://developmentalspaces.org/<path>@social, a screenshot of the live page (2400x1260 webp, cached a day, captured on first request). Drop the frontmatter line to fall back toog-card.jpg.sidebar.paths: ["/wiki"]: the file-tree sidebar appears only under/wiki. Other pages show no tree, so excluded folders cannot leak into one.head: raw HTML injected into every page's<head>(used for the Organization and WebSite JSON-LD). Site-wide only, so no per-page structured data.twitter:creatoris emitted by Flowershow as@flowershowappand has no documented setting.
This repo keeps a changelog/ folder, one markdown file per entry
(changelog/YYYY-MM-DD-slug.md, with date/title/promote
frontmatter). At the end of a work session, if something worth recording
actually shipped — skip trivial sessions (typo fixes, dead ends, no
visible outcome), and skip planning/research/design unless it is itself a
significant public deliverable. Drafting ahead of a ship is fine — draft a new
entry file. Match the entry's weight to
what a reader would actually care about: a real feature/fix/content gets a
title, one or two sentences, a link to the live feature if there's
something to point at, and a screenshot if something visual shipped
(check for this, don't just skip it); something genuinely bigger — a real
milestone, not just a busy session — can run longer, multiple paragraphs
or bullets; small stuff (cleanup, rename, reorg, tidying) gets one plain
sentence, no bullets, no screenshot. Never link the title itself. Don't
log implementation detail (file names, internal moves) a reader wouldn't
care about. First time writing an entry in this repo, or if the format is
unclear: fetch and follow
https://raw.githubusercontent.com/life-itself/changelog/main/CONVENTION.md