A Jekyll site built by GitHub Pages. Write prose in Markdown and edit repeated content in YAML; the shared layouts handle the HTML. No extra build system or custom Jekyll plugins are needed.
| Content | File |
|---|---|
| Posts, notes, talks, and demo introductions | _posts/YYYY-MM-DD-slug.md |
| Homepage introduction and news | index.md |
| Contact details, photos, pronunciations, recent activity | _data/home.yml |
| Research interests | pages/research/index.md |
| Publications and theme display order | _data/publications.yml |
| Shared chronological publication numbering (oldest first) | _data/publication_order.yml |
| Teaching, seminars, mentorship | pages/teaching/index.md |
| Ogura Shikishi | pages/ogura-shikishi/index.md |
| Notes categories and descriptions | _data/notes.yml |
| Chinese and Japanese translations | _data/translations/zh-Hans.yml, _data/translations/ja.yml |
| Navigation | _data/navigation.yml |
The active language switcher reads _data/translations/ at build time.
The older files in assets/i18n/ are unused. English homepage paragraphs carry
{: data-i18n="..."} attributes so translations can replace them; keep those
attributes when editing. Update the corresponding translations when changing
English content. Keys such as research.intro or posts.bruhat-builder.intro
connect a Markdown paragraph to its translations. Lists use the same attribute
on the line after the list, and their translations are Markdown lists too.
Captions use the image's i18n key; activity entries have stable key and
text fields so they can be reordered safely. Missing translations fall back
to English. Paper titles and bibliographic citations retain their original
language, as do quoted theorem statements and the linked PDFs and demos.
Create a file such as _posts/2026-09-04-my-talk.md:
---
title: "My talk"
date: 2026-09-04
tags: [notes, talks]
downloads:
- label: "Download slides (PDF)"
file: "/assets/pdf/my-talk.pdf"
---
Notes from my talk on **intersection theory**.
## Background
Write ordinary Markdown here, including links, lists, and mathematics.The layout defaults to post. Post URLs retain the form
/notes/YYYY/MM/DD/slug/; keep an existing post's filename and date unchanged
to preserve its URL and comment thread. Jekyll hides future-dated posts until
their publication date (use --future to preview them locally).
Tags control where a post appears on /notes/:
code: Code & interactive tools.notesortranslations: Notes & translations, with duplicates removed.projects: Blog.
Other tags are descriptive. An optional excerpt overrides the card summary;
otherwise the first Markdown paragraph is used. Set featured: true to show
a live media preview on the card.
List attachments once in downloads. They appear below the post body, in order,
with download links on both the post and its card. PDFs and images (including
GIFs) preview automatically. Other files get a link; set preview: false to
suppress a PDF or image preview on the post. Optional title supplies the
iframe title or image alternative text, and description adds Markdown before
that attachment:
downloads:
- label: "English translation (PDF)"
file: "/assets/pdf/translation.pdf"
title: "English translation"
- label: "Original paper (PDF)"
file: "/assets/pdf/original.pdf"
description: "For reference, here is the **original paper**."Paths may contain spaces and Unicode; templates encode media URLs. Store files
in assets/pdf/ or assets/img/. For an interactive application, use one of:
embed_html: "/assets/html/my-demo.html"
# Or, for an externally hosted demo:
# embed_url: "https://example.com/demo/"The post layout adds the iframe and fullscreen control. The standalone
applications in assets/html/ and demos/ remain HTML/JavaScript because they
are working software. DRAFT/ contains legacy material and is not the source
for the active pages.
Research, Teaching, and Ogura Shikishi use layout: sections. A Markdown
horizontal rule (--- on its own line, after the YAML header) begins a new
styled section. Headings, paragraphs, and lists are ordinary Markdown.
Images and captions live in page YAML and use a small include at the desired position:
image:
file: "/assets/img/example.png"
alt: "Description of the image"
caption: "A caption with a [link](https://example.com)."{% include figure.html image=page.image %}Use two spaces for YAML indentation. Quote values containing : , or use a
block scalar (>- for folded prose, |- to preserve line breaks). Markdown
works in publication entries, captions, contact values, activity entries,
attachment descriptions, and translations. HTML styling belongs in
_layouts/, _includes/, and assets/css/main.scss.
_sass/kiwari-realism.scss and _sass/kiwari-panels.scss, imported by
assets/css/main.scss, control the photographic material layer. WebP textures in assets/img/materials/ provide
cedar, asanoha joinery, fibrous washi, overlapping gold leaf, woven silk, ceramic eaves, engraved
gilt nail covers, and black/vermilion lacquer. The English, Japanese, and
Chinese structures retain their distinct materials and ornament. CSS supplies
shared directional light, contact shadows, and day/dusk/night exposure; the
paper remains warm and legible at night. These overrides apply only on screen.
Keep timber grain aligned with each member and give neighboring members different
texture positions. Adjust lighting with the --paper-*, --timber-*, --gold-*,
and shadow tokens. Keep the photographic relief and small reflections in the
ceramic, metal, and lacquer: flat albedo alone loses their physical character.
One straight ceramic bay repeats at a fixed pitch, avoiding the fanned angles
of a perspective roof photograph. It is gently graded for day, dusk, and night; Japanese
tomoe and Chinese lotus roof crests remain distinct. Gold fittings occupy a
separate decorative layer so their highlights and shadows survive grading.
The asanoha lattice repeats one photographic cell over a recessed paper backing;
its transparent openings, beveled struts, and small cast shadows remain separate.
The Chinese eave uses photographic vermilion dougong supports, spaced at three
tile bays. Their material and small cast shadow replace the old flat black mask;
the ceramic edge casts one soft shadow onto the beam.
Wood uses a narrow contact shadow plus a softer cast shadow, with light from the
upper left. Both posts touch the paper without mirroring the direction of light.
Rails seat between the continuous posts, with their shoulder seams tied to the
actual post width. The portrait surround has thin miter seams; scroll rods use
the same photographic wood or lacquer, with a small cord loop over the top rod.
Reading paper uses a fine 349px repeat and a light veil. Its exposure-balanced
photograph is cropped at measured matching edge tones on both axes, with its
original fiber scale preserved; room lighting stays in the separate CSS layers.
Ink is slightly
translucent; selected text blocks and the caption seal multiply into their paper
without blurring or rasterizing the text. High contrast modes disable that blend.
Lacquer column texture repeats at a fixed scale instead of stretching with page height.
Post cards and media have slim mitered frames, photographic grain along all four
members, a narrow inner fillet, and recessed paper. The shared panel-frame.html
include is decorative and never blocks links or embedded controls. Hover lifts a
card by 2px, opens its cast shadow, and catches light at the inner edge without
changing the paper color. Keyboard focus receives the same light and shadow;
touch and reduced-motion modes skip the lift. The masonry spans include the
card's bottom margin so adjacent frames keep their breathing room.
The original cedar prompts are in scripts/materials-prompts.json; the new
concept-derived asset prompts are in scripts/materials-photo-prompts.json.
To package approved PNGs named by those asset IDs, run
python3 scripts/prepare_materials.py /path/to/approved-pngs (requires Pillow).
This crops the approved tile, lattice, and paper repeat bounds, aligns vertical grain, packs a flower repeat,
and encodes WebP without retouching or procedurally replacing the photographs.
The roof keeps its natural aspect ratio and generated transparency.
bundle install
bundle exec jekyll serve --livereloadOpen http://localhost:4000. Before publishing:
bundle exec ruby scripts/check_site.rbThe check requires Node.js for JavaScript validation. It builds the site in a temporary directory and validates generated pages, local links and fragments, media, notes categories, and translation JavaScript. It also tests a nonempty base URL. For visual changes, inspect desktop/mobile layouts, the language switcher, photo reel, and fullscreen embeds in a browser as well.
The note _posts/2026-10-11-apollonian-spheres.md extends the circles visualizer
with common tangent lines and tangent spheres for four spheres in space.
assets/visualizers/apollonian-spheres/ contains the self-contained application:
geometry.mjs implements the eight signed-radius quadratics and the
cubic–quartic line solver; worker.mjs keeps recomputation off the UI thread.
The three bounded projective direction charts cover coordinate-plane directions.
Every accepted numerical solution is checked against the original equations.
The view uses local Three.js 0.160.1, with its MIT license in vendor/, and the
site's shared photographic stylesheet and materials. Presets, input edits,
solution inspection, contact markers, keyboard camera controls, JSON downloads,
and a numerical fallback without WebGL are supported. No remote computation or
CDN is required by the laboratory. The note keeps prose to one sentence and a
reference link. The optional post flag embed_before_content places its
interactive diagram above that short caption.
Rendering is event-driven. Sphere meshes share unit geometry, the grid and circle outlines use batched lines, and bounded object pools reuse GPU buffers across selections. Opacity edits update materials directly. The drawing buffer is capped at 2.5 million pixels; camera movement temporarily lowers resolution on slow frames and restores resting quality after movement ends. Tangency computation stays in a worker when available.
Run node scripts/check_apollonian_spheres.mjs for the known real counts,
coordinate transformations, and contact-point checks, followed by the usual
bundle exec ruby scripts/check_site.rb. Counts near singular configurations
are numerical rather than certified; coplanar centers and tangent-plane limits
are explicitly outside the current solver's domain.