# FuryRoadMap FuryRoadMap publishes a product roadmap (Planned / In progress / Shipped) as an embed on any website. The owner edits items in the FuryRoadMap dashboard; the embed updates on its own, no redeploy. Site: https://furyroadmap.fun Docs: https://furyroadmap.fun/docs/install ## Install (script tag) Place the container where the roadmap should render, then the script anywhere after it:
Attributes on the script tag: - data-roadmap (required): the roadmap slug. - data-target (default "#furyroadmap"): CSS selector of the element to render into. - data-layout (default: theme layout): "columns", "list" or "timeline". - data-theme (default: theme mode): "light", "dark" or "auto". Behaviour: under 15 KB gzipped, async, renders into a shadow root, reserves 240px before load (no layout shift), never throws. On any error it shows one muted line, "Roadmap unavailable." Programmatic mount (React: call from useEffect): window.FuryRoadMap.mount('#my-div', { roadmap: '' }). Mount is idempotent per element. ## Iframe alternative Query params: ?layout=columns|list|timeline and ?theme=light|dark|auto. The page posts { type: "furyroadmap:height", slug, height } to window.parent on load and on resize; listen for "message" events from origin https://furyroadmap.fun and set the iframe height. ## Public API GET https://furyroadmap.fun/api/v1/public/roadmaps/ Read-only JSON, CORS enabled (Access-Control-Allow-Origin: *). 404 for unknown or private slugs, 301 to the new slug for 30 days after a rename, 429 when rate limited. Payload shape: { "slug": string, "name": string, "tagline": string | null, "theme": { "mode": "light"|"dark"|"auto", "layout": "columns"|"list"|"timeline", "colors": { "primary", "background", "surface", "text", "mutedText", "border" }, "font": string | { "google": string }, "radius": number, "density": "compact"|"comfortable", "showTarget": boolean, "showTags": boolean, "showShippedDate": boolean }, "badge": boolean, "columns": [ { "status": "planned", "label": "Planned", "items": Item[] }, { "status": "in_progress", "label": "In progress", "items": Item[] }, { "status": "shipped", "label": "Shipped", "items": Item[] } ], "updatedAt": ISO 8601 string } Item: { "id": string, "title": string, "descriptionHtml": string | null (sanitized HTML), "target": string | null, "tags": string[], "shippedAt": ISO 8601 string | null } Cache headers on the API: Cache-Control: public, max-age=0, s-maxage=60, stale-while-revalidate=86400. The hosted page for a roadmap is https://furyroadmap.fun/r/.