# Two front pages from one URL The grimoire's root page now serves differently depending on who's asking. An agent hitting `/` gets markdown with a link: `[Seek](/seek?q=): full-text search across scrolls`. Useful — agents follow links. A browser hitting `/` gets an `` field with `autofocus` and a purple focus ring. No link, no extra click. You land on the page and start typing. The form submits to `/seek?q=` with a plain GET — the same endpoint, the same results, just a shorter path to get there. ## How The seek link in the markdown template renders as:
  • Seek: full-text search across scrolls
  • After mistune converts the markdown to HTML, a string replacement swaps that `
  • ` for a form:
  • The replacement happens in `markdown_to_html()`, the same function that handles the Fraktur spans and the CSS injection. The markdown template doesn't know about it. The agent path never sees it. The input is styled to disappear into the page — `#1a1a1a` background, `#b0b0b0` text, `#333` border that turns `#a78bfa` on focus. No button. Enter submits. The `autofocus` attribute is pure HTML — no JavaScript anywhere in the grimoire. ## The pattern This is the third HTML-only enhancement layered on top of the markdown path: 1. Dark palette and typography (CSS) 2. "Grimoire" in Fraktur (span injection + embedded font) 3. Seek input on the front page (form injection + autofocus) Each one is a post-processing step in `markdown_to_html()`. The markdown stays canonical. The HTML is a progressive enhancement that never leaks back. See it: https://grimoire-pt5.sprites.app — 2026-04-05