This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
The official website for Jabberwocky Studios, served by GitHub Pages at the custom domain jabberwockystudios.co (bound via the root CNAME file). The site is hand-written static HTML with a small shared frontend in assets/: style.css (single stylesheet), lattice.js (self-playing ambient backdrop adapted from jb1), and tabberwocky.png (temporary brand logo). There are no markdown sources, no layouts, no theme.
A minimal _config.yml is kept solely so Jekyll’s exclude: list keeps repo-only files out of the published output — most importantly AGENTS.md, which must never be served at /AGENTS.md. Jekyll still runs on GitHub Pages, but it just passes the HTML through unchanged.
Pages-side, builds happen automatically on push to main via GitHub’s Pages build pipeline — there is no separate CI/build workflow checked in. Local builds exist only to preview changes before pushing.
/ (root) — Jabberwocky Studios company landing. index.html./jblock/ — Product subsite for the Jabberblocky game. jblock/index.html is the landing./jblock/privacy — App Store / Play Store-facing privacy policy, implemented as jblock/privacy/index.html so the extension-less URL is preserved. That URL is referenced from app store submissions — do not rename, move, or add a .html to it casually./jabberblocky/ and /jabberblocky/privacy — legacy URLs (from before the /jblock/ rename). These are kept as HTML redirect stubs (meta http-equiv="refresh" + <script>location.replace(...)</script>) so any previously-submitted store metadata or cached link still resolves. The stubs carry <meta name="robots" content="noindex">. They can be deleted once all external references have been updated and you’re confident nothing in the wild still points at /jabberblocky/*./assets/style.css — single shared stylesheet used by every page./<product>/ subpath pattern. Privacy / legal pages within a product should use the same <product>/<page>/index.html shape to keep URLs extension-less.The Jabberblocky game itself lives in a separate repo (~/Coding/jb1) and is not built into this site. This repo is marketing / legal pages only. If the user later asks to host the game here under /jblock/play/ or similar, that’s a deliberate new decision — confirm before wiring it up.
Every shipped page (index.html, jblock/index.html, jblock/privacy/index.html) carries two shared visual elements beyond the page content:
header.site — <a class="brand"> wraps <img class="brand-mark" src="/assets/tabberwocky.png" alt="" width="56" height="56" decoding="async"> plus <span class="brand-word">Jabberwocky Studios</span>. The tabberwocky.png is a temporary placeholder logo (the user owns it; no provenance tracking needed).<div id="lattice" aria-hidden="true"> placed immediately after <body>, plus <script src="/assets/lattice.js" defer></script> immediately before </body>. lattice.js injects N stacked 9×9 boards based on viewport size and animates them per jb1’s home-ambient mechanic.When adding a new HTML page: copy the shared header + lattice div + script tag from an existing page. The site uses no templating (per “Plain HTML, no templating” below), so this duplication is intentional and expected.
Colors:
--navy: #003262 and --gold: #fdb515 are sampled from the Tabberwocky dragon logo. They define brand chrome (links, headings, h2 accent tile, focus state).assets/lattice.js and parts of assets/style.css are ported from the canonical implementation in ~/Coding/jb1. The port is one-way: jb1 is the source of truth. KEEP IN SYNC pointers in the source files mark each cross-repo coupling:
| jwockstudios surface | jb1 source of truth |
|---|---|
PALETTE constant in lattice.js |
~/Coding/jb1/js/palettes.js (bauhaus, light endpoints) and ~/Coding/jb1/DESIGN.md |
.lattice-board geometry (28px cells / 6px gap / 300×300 default; 24px / 5px / 256×256 at <360px) |
~/Coding/jb1/css/home.css .home-ambient-lattice |
.lattice-cell empty-cell tint (rgba(29,36,51,0.05) bg, rgba(29,36,51,0.10) border) |
~/Coding/jb1/css/home.css [data-family="light"] .home-ambient-lattice .lattice-cell |
Timing constants (TICK_MS=1500, FADE_IN_MS=1200, CLEAR_PULSE_MS=1600, DECAY_AGE=8, DECAY_CHANCE=0.15, CLEAR_EVERY_NTH=5, CELL_PEAK_OPACITY=0.35, GLOW_ALPHA=0.18) |
~/Coding/jb1/js/home-ambient.js |
@keyframes lattice-clear (0.35 → 0.65 @ brightness(1.25) → 0) |
~/Coding/jb1/css/home.css @keyframes home-lattice-clear |
When jb1 retunes any of these: mirror the change here. The KEEP IN SYNC comments in lattice.js and style.css are the per-file pointers; this table is the index.
Intentional deviations from jb1’s home-ambient (do NOT “fix” these):
getActivePalette() has no equivalent here.#lattice is position: absolute directly off body — jb1 uses absolute inside .home-view with isolation: isolate; no analog exists in jwockstudios.start() / stop()) — jwockstudios pages don’t navigate within an SPA, so the script just runs at DOM-ready. visibilitychange pauses when the tab is backgrounded.There is no build step. To preview locally, any static-file server works:
python3 -m http.server 4000
then visit http://127.0.0.1:4000. Or use Bundler + Jekyll for a Pages-faithful preview (the Gemfile is kept for this reason):
bundle install
bundle exec jekyll serve --livereload
There are no tests, linters, or formatters configured. Don’t invent ones unless asked.
<!doctype html> through </html>. Shared chrome (header / footer / nav) is duplicated by hand across pages. The site is small enough that this is cheaper than re-introducing a templating layer. If the page count grows past ~10, reconsider./jblock/, /assets/style.css). baseurl is empty on Pages; do not introduce theme-relative or relative-up (../) paths.<path>/index.html rather than <path>.html so the URL stays clean._config.yml excludes must list any repo-only file that should not be published. Currently: AGENTS.md, README.md, Gemfile, Gemfile.lock, vendor, *.code-workspace. Always add new dev-only / repo-only files to this list — the .gitignore is for git, not for Pages output.jekyll-sitemap only (auto-generates sitemap.xml). It is on GitHub Pages’ allow-list. Adding a plugin outside that list will break the Pages build silently.AGENTS.md contains instructions for AI coding agents and may reference internal repo paths, product plans, or rationale that should not be exposed publicly. The protection is the exclude: [AGENTS.md, ...] entry in _config.yml. If you ever switch this site to .nojekyll, you MUST replace that protection with another mechanism (move the file to a .-prefixed directory, or out of the repo) — .nojekyll causes Pages to serve every non-dotfile in the repo verbatim.
jblock/privacy/index.html is referenced from App Store / Play Store submission metadata. Changes to its URL, headings, or substantive claims (data collection, third-party SDKs, children’s privacy) must be reviewed with the user before merge — these are legal commitments, not copy edits. The “Last updated” date should be bumped whenever substantive content changes.
Jabberblocky has not publicly launched. Marketing copy is intentionally minimal. When the user asks to “fill out the Jabberblocky page” or similar, expect a real content pass against the game’s actual featureset — cross-reference ~/Coding/jb1/docs/ai/jb1-user-features.generated.json if available, and confirm copy with the user before publishing.