Every resource URL in Hashboard — a board, a card, a standalone document — is a single canonical address that serves three different renditions depending on who is asking. A browser gets a rendered page. An agent orDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/cryguy/hashboard/llms.txt
Use this file to discover all available pages before exploring further.
curl command gets markdown with structured frontmatter. A script gets JSON. The rendition is selected by the Accept header or by a .md suffix on the URL, and the choice is intercepted centrally in hooks.server.ts before any route handler runs.
The Three Renditions
| Accept header | Rendition | Typical consumer |
|---|---|---|
text/html | SSR’d SvelteKit page | Browser |
text/markdown | Markdown + YAML frontmatter | Agent, curl, LLM tool |
application/json | Same composite JSON as the REST API | Script, programmatic client |
GET /api/v1/boards/{id} and GET /boards/{id} with Accept: application/json are identical responses. There is no separate “view model.”
The .md Suffix
Appending .md to any resource URL forces the markdown rendition, regardless of the Accept header:
text/html in their Accept headers, so the suffix is the only reliable way to get markdown in a browser tab or from a link. The suffix wins over any Accept value — it is checked first in the negotiation logic.
YAML Frontmatter
Markdown renditions open with YAML frontmatter that carries the structured metadata an agent needs for round-trip operations:id, doc, board, column) are bare UUID strings in the frontmatter — suitable for API round-trips. Links in linked_cards and linked_docs carry the .md suffix so an agent following them stays in markdown.
The version field is load-bearing. When an agent edits a document — whether a standalone doc or a card’s description — it must pass the version it read back as baseVersion in PUT /api/v1/docs/{id}. This is what enables the optimistic concurrency check. An agent that discards version may silently overwrite concurrent edits.
curl Examples
Unauthenticated Rendition Requests
Rendition consumers are treated as machines: an unauthenticated request for a rendition that requires authentication returns a plain401 response, never a login redirect. This prevents an agent from silently receiving an HTML login page when it expected markdown, which would cause it to parse HTML as a document and produce nonsense edits.
link-read, link-write) or public resources work without credentials — they run as the Guest principal.
Implementation: Central Negotiation
Content negotiation is not handled per-route. It is intercepted inhooks.server.ts before SvelteKit’s router runs, backed by lib/server/renditions/:
renditions/negotiate.ts—wantedRendition()parses theAcceptheader and.mdsuffix;matchResource()matches the path to a resource type and ID.renditions/markdown.ts— pure renderer functions; no I/O, no side effects.
CLAUDE.md flags this as a load-bearing invariant: every resource URL must be multimodal.
The MCP server’s read tools (
get_board, get_card, get_doc) return the same markdown renditions as the .md URLs — they call renderRendition from the same renditions layer. The REST API, MCP tools, and URL renditions are three surfaces over a single implementation.