> ## Documentation Index
> Fetch the complete documentation index at: https://developers.reflection.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Gallery

> Demos built with Beam

export const Gallery = () => {
  const ITEMS = [{
    "id": "escape-room",
    "category": "Agent workflows",
    "title": "Escape room",
    "authors": "Lorenzo Balderrama Porras, CoreWeave",
    "description": "Beam writes and debugs Python to solve a multi-step escape room in CoreWeave Sandbox. The 3D room visualizes the run.",
    "gif": "/images/gallery/escape-room.gif"
  }, {
    "id": "fine-tuning-in-opencode",
    "category": "Agent workflows",
    "title": "Fine-tuning in OpenCode",
    "description": "Beam works in OpenCode to create a Text2SQL fine-tuning notebook for the smallest Gemma 4 model using Unsloth. It researches the model, training tools and available data, then writes the notebook for the user to run.",
    "gif": "/images/gallery/fine-tuning-in-opencode.gif"
  }, {
    "id": "land-or-water",
    "category": "Data and research",
    "title": "Land or water",
    "description": "Beam classifies 16,200 latitude and longitude points as land or water, without maps, search or geographic reference data during prediction. A separate land mask is used afterward to check the results and visualize classification errors.",
    "gif": "/images/gallery/land-or-water.gif"
  }, {
    "id": "fractal-explorer",
    "category": "Apps and visuals",
    "title": "Fractal explorer",
    "description": "Beam builds an interactive fractal explorer with a guided tour into Seahorse Valley. The GIF shows the tour in the live application. This version was selected after feedback and multiple runs.",
    "gif": "/images/gallery/fractal-explorer.gif"
  }, {
    "id": "mobile-snake-game",
    "category": "Games",
    "title": "Mobile Snake game",
    "authors": "adam roman (@adamisnotroman)",
    "description": "Beam, shown as Catjam, builds a mobile browser Snake game in OpenCode. The recording compares Catjam and Big Pickle using the same prompt. The creator preferred Catjam's aesthetic.",
    "source": ["Original X post", "https://x.com/adamisnotroman/status/2110139408460480525"],
    "gif": "/images/gallery/mobile-snake-game.gif"
  }, {
    "id": "eda-in-pi",
    "category": "Data and research",
    "title": "EDA in Pi",
    "description": "Beam works in Pi to find the latest dataset in the TidyTuesday repository and build an exploratory data analysis notebook. The notebook examines the data and presents the findings through charts.",
    "gif": "/images/gallery/eda-in-pi.gif"
  }, {
    "id": "3d-space-game",
    "category": "Games",
    "title": "3D space game",
    "description": "Beam builds a 3D astronaut game in p5.js. The player steers through falling asteroids and fires a green beam to clear obstacles. The design was refined through follow-up prompts.",
    "gif": "/images/gallery/3d-space-game.gif"
  }, {
    "id": "game-studio",
    "category": "Games",
    "title": "Game studio",
    "description": "Beam builds and revises ten playable browser games through Mirror, including an arena shooter, rhythm game, tower defense and farming simulation.",
    "gif": "/images/gallery/game-studio.gif"
  }, {
    "id": "nyc-metro-live-map",
    "category": "Apps and visuals",
    "title": "NYC Metro live map",
    "description": "Beam builds a live subway map from public MTA data. It researches feed formats and station geometry, then builds the frontend and backend to estimate train positions between stations and show approaching trains.",
    "gif": "/images/gallery/nyc-metro-live-map.gif"
  }, {
    "id": "seven-game-testing",
    "category": "Games",
    "title": "Seven-game testing video",
    "authors": "Wayne Lowry (@wikiwayne)",
    "description": "Beam, shown as Missingno through Hermes, works through seven game-building tasks. Four pass on the first attempt, and all seven pass after retries. The recording shows the results across the different tasks.",
    "source": ["Original X post", "https://x.com/wikiwayne/status/2109090570211656044"],
    "gif": "/images/gallery/seven-game-testing.gif"
  }, {
    "id": "voxel-pagoda-garden",
    "category": "Apps and visuals",
    "title": "Voxel pagoda garden",
    "authors": "Wësche (@WescheNex1q)",
    "description": "Beam, shown as Missingno in the recording, creates a voxel pagoda garden with cherry trees and pines from a prompt for a single HTML page. The video compares four models; this version needed a one-line fix.",
    "source": ["Original X post", "https://x.com/WescheNex1q/status/2110028285237485776"],
    "gif": "/images/gallery/voxel-pagoda-garden.gif"
  }, {
    "id": "korean-translation-and-survey",
    "category": "Data and research",
    "title": "Korean translation and survey",
    "description": "A synthetic-panel app uses Korean demographic personas from NVIDIA's Nemotron dataset. Beam translates English questions into Korean, interviews sampled personas, and translates and summarizes their responses in English.",
    "gif": "/images/gallery/korean-translation-and-survey.gif"
  }, {
    "id": "groovebox",
    "category": "Apps and visuals",
    "title": "Groovebox",
    "description": "Beam builds a browser music sequencer with pattern presets, a moving playhead, spectrum visualization and a filter cutoff control. The GIF shows the interface in use; the live app includes audio.",
    "gif": "/images/gallery/groovebox.gif"
  }, {
    "id": "pixel-platformer-comparison",
    "category": "Games",
    "title": "Pixel platformer comparison",
    "authors": "J A Z I I (@notjazii)",
    "description": "J A Z I I compares pixel platform games made with Missingno and CatJam, both stealth names of Beam. The side-by-side recording shows both games running, with jumping, coin collection and score counters.",
    "source": ["Original X post", "https://x.com/notjazii/status/2110324422183940575"],
    "gif": "/images/gallery/pixel-platformer-comparison.gif"
  }];
  const CATEGORIES = ["All", "Agent workflows", "Apps and visuals", "Data and research", "Games"];
  const [top, setTop] = useState(0);
  const [filter, setFilter] = useState("All");
  const [openId, setOpenId] = useState(null);
  const open = id => {
    setOpenId(id);
    try {
      window.history.replaceState(null, "", "#" + id);
    } catch (e) {}
  };
  const close = () => {
    setOpenId(null);
    try {
      window.history.replaceState(null, "", window.location.pathname + window.location.search);
    } catch (e) {}
  };
  useEffect(() => {
    const id = window.location.hash.slice(1);
    if (ITEMS.some(d => d.id === id)) setOpenId(id);
  }, []);
  useEffect(() => {
    if (!openId) return undefined;
    const onKey = e => {
      if (e.key === "Escape") close();
    };
    const measure = () => {
      const bar = document.getElementById("navbar");
      setTop(bar ? Math.max(0, Math.round(bar.getBoundingClientRect().bottom)) : 0);
    };
    measure();
    window.addEventListener("resize", measure);
    document.addEventListener("keydown", onKey);
    const prev = document.body.style.overflow;
    document.body.style.overflow = "hidden";
    return () => {
      document.removeEventListener("keydown", onKey);
      window.removeEventListener("resize", measure);
      document.body.style.overflow = prev;
    };
  }, [openId]);
  const item = ITEMS.find(d => d.id === openId);
  return <div className="rg not-prose">
      <style>{`
        .rg { --bg: #f8f6f0; --surface: #fffdf8; --ink: #1b1d17; --muted: #5c6255; --line: rgba(27, 29, 23, 0.12); --line2: rgba(27, 29, 23, 0.24); --accent: #1e3207; --media: #e7e3d7; color: var(--ink); }
        .dark .rg { --bg: #1a1b1a; --surface: #222421; --ink: #ecebe4; --muted: #a8ad9f; --line: rgba(236, 235, 228, 0.12); --line2: rgba(236, 235, 228, 0.24); --accent: #bdc8b5; --media: #2d2b25; }
        .rg-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 18px; }
        .rg-chip { display: inline-flex; align-items: center; gap: 6px; padding: 5px 12px; border-radius: 999px; border: 1px solid var(--line2); background: transparent; color: var(--muted); font: inherit; font-size: 13px; cursor: pointer; }
        .rg-chip:hover { color: var(--ink); }
        .rg-chip[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--bg); }
        .rg-count { opacity: 0.7; font-variant-numeric: tabular-nums; }
        .rg-tag { align-self: flex-start; font-size: 11.5px; color: var(--muted); border: 1px solid var(--line); border-radius: 999px; padding: 1px 8px; }
        .rg-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 18px; }
        .rg-card { display: flex; flex-direction: column; text-align: left; padding: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--surface); overflow: hidden; cursor: pointer; color: var(--ink); font: inherit; transition: border-color 0.15s, transform 0.15s; }
        .rg-card:hover { border-color: var(--line2); transform: translateY(-1px); }
        .rg-media { aspect-ratio: 16 / 9; width: 100%; background: var(--media); overflow: hidden; }
        .rg-media img { width: 100%; height: 100%; object-fit: contain; margin: 0; display: block; }
        .rg-big { border-radius: 10px; border: 1px solid var(--line); }
        .rg-body { display: flex; flex-direction: column; gap: 6px; padding: 12px 14px 14px; flex: 1; }
        .rg-ctitle { font-weight: 600; font-size: 15px; line-height: 1.3; }
        .rg-cauthors { font-size: 12.5px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
        .rg-blurb { font-size: 13.5px; line-height: 1.5; color: var(--muted); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
        .rg-scrim { position: fixed; left: 0; right: 0; bottom: 0; top: 0; background: rgba(15, 17, 13, 0.45); z-index: 9999; display: flex; justify-content: flex-end; }
        .rg-drawer { width: min(640px, 100%); height: 100%; overflow-y: auto; background: var(--bg); color: var(--ink); padding: 24px 28px 48px; box-shadow: -8px 0 24px rgba(0, 0, 0, 0.15); }
        .rg-top { display: flex; gap: 12px; align-items: flex-start; margin-bottom: 18px; }
        .rg-x { margin-left: auto; flex: none; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line2); background: var(--surface); color: var(--ink); cursor: pointer; display: flex; align-items: center; justify-content: center; }
        .rg-title { font-size: 24px; font-weight: 600; line-height: 1.2; margin: 0 0 4px; }
        .rg-byline { font-size: 13px; color: var(--muted); }
        .rg-p { margin: 18px 0 0; line-height: 1.6; font-size: 15px; }
        .rg-links { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 20px; }
        .rg-btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 999px; border: 1px solid var(--line2); background: var(--surface); color: var(--ink); font-size: 13px; text-decoration: none; }
        .rg-btn:hover { border-color: var(--accent); }
        @media (max-width: 640px) { .rg-drawer { padding: 20px 16px 32px; } }
        @media (prefers-reduced-motion: reduce) { .rg-card { transition: none; } }
      `}</style>

      <div className="rg-chips" role="group" aria-label="Filter demos">
        {CATEGORIES.map(c => <button key={c} type="button" className="rg-chip" aria-pressed={filter === c} onClick={() => setFilter(c)}>
            {c} <span className="rg-count">{c === "All" ? ITEMS.length : ITEMS.filter(d => d.category === c).length}</span>
          </button>)}
      </div>

      <div className="rg-grid">
        {ITEMS.filter(d => filter === "All" || d.category === filter).map(d => <button key={d.id} type="button" className="rg-card" aria-haspopup="dialog" onClick={() => open(d.id)}>
            <div className="rg-media"><img src={d.gif} alt="" loading="lazy" /></div>
            <div className="rg-body">
              <div className="rg-tag">{d.category}</div>
              <div className="rg-ctitle">{d.title}</div>
              {d.authors ? <div className="rg-cauthors">{d.authors}</div> : null}
              <div className="rg-blurb">{d.description}</div>
            </div>
          </button>)}
      </div>

      {item ? <div className="rg-scrim" style={{
    top: top
  }} onClick={close}>
          <aside className="rg-drawer" role="dialog" aria-modal="true" aria-label={item.title} onClick={e => e.stopPropagation()}>
            <div className="rg-top">
              <div>
                <div className="rg-title">{item.title}</div>
                {item.authors ? <div className="rg-byline">Authors: {item.authors}</div> : null}
              </div>
              <button type="button" className="rg-x" aria-label="Close" onClick={close}>
                <svg width="16" height="16" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round" /></svg>
              </button>
            </div>
            <div className="rg-media rg-big"><img src={item.gif} alt={item.title} /></div>
            <p className="rg-p">{item.description}</p>
            {item.source ? <div className="rg-links">
                <a className="rg-btn" href={item.source[1]} target="_blank" rel="noopener noreferrer">{item.source[0]} ↗</a>
              </div> : null}
          </aside>
        </div> : null}
    </div>;
};

<div className="max-w-6xl mx-auto px-4 sm:px-8 pt-10 pb-20">
  <h1 className="text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-200">Gallery</h1>
  <p className="mt-2 mb-8 text-lg text-gray-600 dark:text-gray-400">Demos built with Beam. Select a demo to see it run.</p>

  <Gallery />
</div>
