{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-06-09-how-an-agent-built-a-3d-paris-gallery-by-chaining-two/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "*An agent built a 3D Paris gallery from two Hugging Face Spaces.*\n\nI asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D reconstruction tool. The agent produced every asset (the images **and** the 3D splats) by calling two Hugging Face Spaces directly, then wired them into a cinematic viewer.\n\nHere's the result, live as a static Space:\n\n👉 **[mishig/monuments-de-paris](https://huggingface.co/spaces/mishig/monuments-de-paris)**\n\nThis post is about *how* that's possible now, and why I think it's a preview of how a lot of multimedia software gets built from here on.\n\n## The building-block economy comes for multimedia\n\nMitchell Hashimoto recently described a shift he calls the [building block economy](https://mitchellh.com/writing/building-block-economy): the most effective path to software is no longer a polished monolith, but small, well-documented components that others (increasingly *agents*) can assemble. His key observation: AI is okay at building everything from scratch, but it is **really good at gluing together** proven pieces.\n\nThat thesis has mostly been told with *code* libraries. But the same forces are hitting **multimedia AI**. The hard part of using a state-of-the-art image model, a video model, a TTS model, or a 3D reconstruction model was never the model. It was the integration: SDKs, weights, GPUs, input formats, polling. If each model were instead a documented, callable block, an agent could glue them together the same way it globs together npm packages.\n\nThat's exactly what Hugging Face Spaces have quietly become.\n\n## Every Space is a building block, via `agents.md`\n\nThe Hub hosts thousands of state-of-the-art models (a huge share of them **open-weights**), and most are deployed as interactive **Spaces**. As of now, every Gradio Space also exposes a plain-text [`agents.md`](https://huggingface.co/docs/hub/en/spaces-agents) that tells an agent *exactly* how to call it:\n\n```bash\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nreturns everything needed in one shot: the schema URL, the call and poll templates, how to upload files, and the auth hint:\n\n```\nAPI schema:   GET  .../gradio_api/info\nCall endpoint: POST .../gradio_api/call/v2/{endpoint} {\"param_name\": value, ...}\nPoll result:  GET  .../gradio_api/call/{endpoint}/{event_id}\nFile inputs:  POST .../gradio_api/upload -F \"files=@file.ext\"\nAuth:         Bearer $HF_TOKEN\n```\n\nNo client library. No hardcoded integration. An agent reads that, and it can drive the Space end to end. Set an [`HF_TOKEN`](https://huggingface.co/settings/tokens) and you're going. You can find these instructions on any Gradio Space via its **Agents** button:\n\n![The Agents button on a Hugging Face Space](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/agents-triposplat.png)\n\nThe real unlock is **chaining**: the output of one Space becomes the input to the next. Prompt → image → 3D. That's the whole pipeline behind this gallery.\n\n## The worked example: Paris monuments → splats\n\nThe agent chained two Spaces:\n\n1. **Image:** an image-generation Space turned each monument into a clean, dark-background \"specimen\" shot (and the Eiffel Tower into a little diorama on a plinth). Prompt in, image out.\n2. **Splat:** [`VAST-AI/TripoSplat`](https://huggingface.co/spaces/VAST-AI/TripoSplat) reconstructed a 3D Gaussian splat (`.ply`) from each single image. Image in, 3D out.\n\nGenerated image\n\n[![Generated Panthéon](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)\n\nReconstructed splat\n\nThe six source images the agent generated, all isolated on black, ready for single-image 3D reconstruction:\n\n[![Generated monument images](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg) [![Generated Arc de Triomphe](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg) [![Generated Sacré-Cœur](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg) [![Generated Eiffel diorama](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)\n\nFrom there the agent did the \"glue\" work too. It noticed TripoSplat outputs are Y-down and flipped them upright, auto-framed each monument, compressed the `.ply` files to `.ksplat` (~3× smaller, so they load fast), built a Three.js viewer with a scroll-to-switch and drag-to-rotate UI, and deployed the whole thing as a static Space. The only human inputs were taste-level: \"make it zoomed out,\" \"replace the obelisk with something better for splatting,\" \"the transition lingers too long.\"\n\nSeveral of those steps were **the agent reacting to reality**. A wide glass pyramid splats poorly. A thin obelisk is dull. A single-view reconstruction infers the back. That is exactly the \"outsourced R&D, fast iteration\" loop the building-block economy predicts, except the R&D was a conversation.\n\n## Two prompts, a whole new gallery\n\nThe real test of a building block is how cheaply you can reuse it. Once this pipeline existed, spinning up entirely new galleries cost about one sentence each. \"Create a similar Space with splats for Japan,\" then the same for Egypt, and the agent did the rest: six monument images, six splats, compression, a viewer, and a deployed Space, per country.\n\n- 🏛️ [Monuments of Egypt](https://huggingface.co/spaces/mishig/monuments-of-egypt): the Great Pyramid, the Sphinx, Abu Simbel, the mask of Tutankhamun, Karnak, the Colossi of Memnon.\n\n\\<video autoplay loop muted playsinline width=\"100%\" src=\"\n\n\">\n\n- ⛩️ [Monuments of Japan](https://huggingface.co/spaces/mishig/monuments-of-japan): Tokyo Tower, Himeji Castle, Kinkaku-ji, Osaka Castle, the Great Buddha of Kamakura, the Itsukushima torii.\n\n\\<video autoplay loop muted playsinline width=\"100%\" src=\"\n\n\">\n\nSame two Spaces, same `agents.md`, only the prompts changed. That is the building-block economy in one line: the marginal cost of a new multimedia app falls toward the cost of describing it.\n\n## Why this matters\n\n- **Models become composable.** A SOTA splat model and a SOTA image model, from different orgs, chained with zero integration code. The Hub's open-weights catalog turns into a library of callable multimedia primitives.\n- **Agents prefer what's documented and reachable.** `agents.md` makes a Space trivially reachable, so an agent will pick it over a model it has to set up by hand. That is the same dynamic Hashimoto flags for open-source libraries.\n- **The barrier was integration, and it's largely gone.** \"Turn a prompt into a rotating 3D monument\" used to be a project. Here it was a step in a pipeline.\n\n## Try it yourself\n\nPoint your own agent at a Space's `agents.md` and let it cook:\n\n```bash\n# image generation\ncurl https://huggingface.co/spaces/ideogram-ai/ideogram4/agents.md\n# single-image to 3D gaussian splat\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nPaste either link into your coding agent (Claude Code, etc.), set your `HF_TOKEN`, and ask it to build something. The full, reproducible pipeline for this gallery, the scripts that hit those two `agents.md` endpoints, lives in the [Space repo](https://huggingface.co/spaces/mishig/monuments-de-paris/tree/main).\n\nThe building blocks are sitting right there on the Hub. The agents already know how to glue.\n\nI asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D reconstruction tool. The agent produced every asset (the images **and** the 3D splats) by calling two Hugging Face Spaces directly, then wired them into a cinematic viewer.\n\nHere's the result, live as a static Space:\n\n👉 **[mishig/monuments-de-paris](https://huggingface.co/spaces/mishig/monuments-de-paris)**\n\nThis post is about *how* that's possible now, and why I think it's a preview of how a lot of multimedia software gets built from here on.\n\n## The building-block economy comes for multimedia\n\nMitchell Hashimoto recently described a shift he calls the [building block economy](https://mitchellh.com/writing/building-block-economy): the most effective path to software is no longer a polished monolith, but small, well-documented components that others (increasingly *agents*) can assemble. His key observation: AI is okay at building everything from scratch, but it is **really good at gluing together** proven pieces.\n\nThat thesis has mostly been told with *code* libraries. But the same forces are hitting **multimedia AI**. The hard part of using a state-of-the-art image model, a video model, a TTS model, or a 3D reconstruction model was never the model. It was the integration: SDKs, weights, GPUs, input formats, polling. If each model were instead a documented, callable block, an agent could glue them together the same way it globs together npm packages.\n\nThat's exactly what Hugging Face Spaces have quietly become.\n\n## Every Space is a building block, via `agents.md`\n\nThe Hub hosts thousands of state-of-the-art models (a huge share of them **open-weights**), and most are deployed as interactive **Spaces**. As of now, every Gradio Space also exposes a plain-text [`agents.md`](https://huggingface.co/docs/hub/en/spaces-agents) that tells an agent *exactly* how to call it:\n\n```bash\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nreturns everything needed in one shot: the schema URL, the call and poll templates, how to upload files, and the auth hint:\n\n```\nAPI schema:   GET  .../gradio_api/info\nCall endpoint: POST .../gradio_api/call/v2/{endpoint} {\"param_name\": value, ...}\nPoll result:  GET  .../gradio_api/call/{endpoint}/{event_id}\nFile inputs:  POST .../gradio_api/upload -F \"files=@file.ext\"\nAuth:         Bearer $HF_TOKEN\n```\n\nNo client library. No hardcoded integration. An agent reads that, and it can drive the Space end to end. Set an [`HF_TOKEN`](https://huggingface.co/settings/tokens) and you're going.\n\nThe real unlock is **chaining**: the output of one Space becomes the input to the next. Prompt → image → 3D. That's the whole pipeline behind this gallery.\n\n## The worked example: Paris monuments → splats\n\nThe agent chained two Spaces:\n\n1. **Image:** [`ideogram-ai/ideogram4`](https://huggingface.co/spaces/ideogram-ai/ideogram4) turned each monument into a clean, dark-background \"specimen\" shot (and the Eiffel Tower into a little diorama on a plinth). Prompt in, image out.\n2. **Splat:** [`VAST-AI/TripoSplat`](https://huggingface.co/spaces/VAST-AI/TripoSplat) reconstructed a 3D Gaussian splat (`.ply`) from each single image. Image in, 3D out.\n\nGenerated image\n\n[![Generated Panthéon](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)\n\nReconstructed splat\n\nThe six source images the agent generated, all isolated on black, ready for single-image 3D reconstruction:\n\n[![Generated monument images](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg) [![Generated Arc de Triomphe](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg) [![Generated Sacré-Cœur](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg) [![Generated Eiffel diorama](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)\n\nFrom there the agent did the \"glue\" work too. It noticed TripoSplat outputs are Y-down and flipped them upright, auto-framed each monument, compressed the `.ply` files to `.ksplat` (~3× smaller, so they load fast), built a Three.js viewer with a scroll-to-switch and drag-to-rotate UI, and deployed the whole thing as a static Space. The only human inputs were taste-level: \"make it zoomed out,\" \"replace the obelisk with something better for splatting,\" \"the transition lingers too long.\"\n\nSeveral of those steps were **the agent reacting to reality**. A wide glass pyramid splats poorly. A thin obelisk is dull. A single-view reconstruction infers the back. That is exactly the \"outsourced R&D, fast iteration\" loop the building-block economy predicts, except the R&D was a conversation.\n\n## Two prompts, a whole new gallery\n\nThe real test of a building block is how cheaply you can reuse it. Once this pipeline existed, spinning up entirely new galleries cost about one sentence each. \"Create a similar Space with splats for Japan,\" then the same for Egypt, and the agent did the rest: six monument images, six splats, compression, a viewer, and a deployed Space, per country.\n\n- 🏛️ [Monuments of Egypt](https://huggingface.co/spaces/mishig/monuments-of-egypt): the Great Pyramid, the Sphinx, Abu Simbel, the mask of Tutankhamun, Karnak, the Colossi of Memnon.\n\n- ⛩️ [Monuments of Japan](https://huggingface.co/spaces/mishig/monuments-of-japan): Tokyo Tower, Himeji Castle, Kinkaku-ji, Osaka Castle, the Great Buddha of Kamakura, the Itsukushima torii.\n\nSame two Spaces, same `agents.md`, only the prompts changed. That is the building-block economy in one line: the marginal cost of a new multimedia app falls toward the cost of describing it.\n\n## Why this matters\n\n- **Models become composable.** A SOTA splat model and a SOTA image model, from different orgs, chained with zero integration code. The Hub's open-weights catalog turns into a library of callable multimedia primitives.\n- **Agents prefer what's documented and reachable.** `agents.md` makes a Space trivially reachable, so an agent will pick it over a model it has to set up by hand. That is the same dynamic Hashimoto flags for open-source libraries.\n- **The barrier was integration, and it's largely gone.** \"Turn a prompt into a rotating 3D monument\" used to be a project. Here it was a step in a pipeline.\n\n## Try it yourself\n\nPoint your own agent at a Space's `agents.md` and let it cook:\n\n```bash\n# image generation\ncurl https://huggingface.co/spaces/ideogram-ai/ideogram4/agents.md\n# single-image to 3D gaussian splat\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nPaste either link into your coding agent (Claude Code, etc.), set your `HF_TOKEN`, and ask it to build something. The full, reproducible pipeline for this gallery, the scripts that hit those two `agents.md` endpoints, lives in the [Space repo](https://huggingface.co/spaces/mishig/monuments-de-paris/tree/main).\n\nThe building blocks are sitting right there on the Hub. The agents already know how to glue.\n",
  "authors": [],
  "captured_at": "2026-10-19T01:26:53.998049939+00:00",
  "category": "ai",
  "content_html": "<p><em>An agent built a 3D Paris gallery from two Hugging Face Spaces.</em></p>\n<p>I asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D reconstruction tool. The agent produced every asset (the images <strong>and</strong> the 3D splats) by calling two Hugging Face Spaces directly, then wired them into a cinematic viewer.</p>\n<p>Here's the result, live as a static Space:</p>\n<p>👉 <strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris\">mishig/monuments-de-paris</a></strong></p>\n<p>This post is about <em>how</em> that's possible now, and why I think it's a preview of how a lot of multimedia software gets built from here on.</p>\n<h2>The building-block economy comes for multimedia</h2>\n<p>Mitchell Hashimoto recently described a shift he calls the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mitchellh.com/writing/building-block-economy\">building block economy</a>: the most effective path to software is no longer a polished monolith, but small, well-documented components that others (increasingly <em>agents</em>) can assemble. His key observation: AI is okay at building everything from scratch, but it is <strong>really good at gluing together</strong> proven pieces.</p>\n<p>That thesis has mostly been told with <em>code</em> libraries. But the same forces are hitting <strong>multimedia AI</strong>. The hard part of using a state-of-the-art image model, a video model, a TTS model, or a 3D reconstruction model was never the model. It was the integration: SDKs, weights, GPUs, input formats, polling. If each model were instead a documented, callable block, an agent could glue them together the same way it globs together npm packages.</p>\n<p>That's exactly what Hugging Face Spaces have quietly become.</p>\n<h2>Every Space is a building block, via <code>agents.md</code></h2>\n<p>The Hub hosts thousands of state-of-the-art models (a huge share of them <strong>open-weights</strong>), and most are deployed as interactive <strong>Spaces</strong>. As of now, every Gradio Space also exposes a plain-text <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/docs/hub/en/spaces-agents\"><code>agents.md</code></a> that tells an agent <em>exactly</em> how to call it:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">curl</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md</span>\n</span></span></code></pre>\n<p>returns everything needed in one shot: the schema URL, the call and poll templates, how to upload files, and the auth hint:</p>\n<pre><code><span class=\"code-snippet\">API schema:   GET  .../gradio_api/info\nCall endpoint: POST .../gradio_api/call/v2/{endpoint} {&quot;param_name&quot;: value, ...}\nPoll result:  GET  .../gradio_api/call/{endpoint}/{event_id}\nFile inputs:  POST .../gradio_api/upload -F &quot;files=@file.ext&quot;\nAuth:         Bearer $HF_TOKEN\n</span></code></pre>\n<p>No client library. No hardcoded integration. An agent reads that, and it can drive the Space end to end. Set an <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/settings/tokens\"><code>HF_TOKEN</code></a> and you're going. You can find these instructions on any Gradio Space via its <strong>Agents</strong> button:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/agents-triposplat.png\" alt=\"The Agents button on a Hugging Face Space\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The real unlock is <strong>chaining</strong>: the output of one Space becomes the input to the next. Prompt → image → 3D. That's the whole pipeline behind this gallery.</p>\n<h2>The worked example: Paris monuments → splats</h2>\n<p>The agent chained two Spaces:</p>\n<ol>\n<li><strong>Image:</strong> an image-generation Space turned each monument into a clean, dark-background &quot;specimen&quot; shot (and the Eiffel Tower into a little diorama on a plinth). Prompt in, image out.</li>\n<li><strong>Splat:</strong> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/VAST-AI/TripoSplat\"><code>VAST-AI/TripoSplat</code></a> reconstructed a 3D Gaussian splat (<code>.ply</code>) from each single image. Image in, 3D out.</li>\n</ol>\n<p>Generated image</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg\" alt=\"Generated Panthéon\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>Reconstructed splat</p>\n<p>The six source images the agent generated, all isolated on black, ready for single-image 3D reconstruction:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg\" alt=\"Generated monument images\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg\" alt=\"Generated Arc de Triomphe\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg\" alt=\"Generated Sacré-Cœur\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg\" alt=\"Generated Eiffel diorama\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>From there the agent did the &quot;glue&quot; work too. It noticed TripoSplat outputs are Y-down and flipped them upright, auto-framed each monument, compressed the <code>.ply</code> files to <code>.ksplat</code> (~3× smaller, so they load fast), built a Three.js viewer with a scroll-to-switch and drag-to-rotate UI, and deployed the whole thing as a static Space. The only human inputs were taste-level: &quot;make it zoomed out,&quot; &quot;replace the obelisk with something better for splatting,&quot; &quot;the transition lingers too long.&quot;</p>\n<p>Several of those steps were <strong>the agent reacting to reality</strong>. A wide glass pyramid splats poorly. A thin obelisk is dull. A single-view reconstruction infers the back. That is exactly the &quot;outsourced R&amp;D, fast iteration&quot; loop the building-block economy predicts, except the R&amp;D was a conversation.</p>\n<h2>Two prompts, a whole new gallery</h2>\n<p>The real test of a building block is how cheaply you can reuse it. Once this pipeline existed, spinning up entirely new galleries cost about one sentence each. &quot;Create a similar Space with splats for Japan,&quot; then the same for Egypt, and the agent did the rest: six monument images, six splats, compression, a viewer, and a deployed Space, per country.</p>\n<ul>\n<li>🏛️ <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-of-egypt\">Monuments of Egypt</a>: the Great Pyramid, the Sphinx, Abu Simbel, the mask of Tutankhamun, Karnak, the Colossi of Memnon.</li>\n</ul>\n<p>&lt;video autoplay loop muted playsinline width=&quot;100%&quot; src=&quot;</p>\n<p>&quot;&gt;</p>\n<ul>\n<li>⛩️ <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-of-japan\">Monuments of Japan</a>: Tokyo Tower, Himeji Castle, Kinkaku-ji, Osaka Castle, the Great Buddha of Kamakura, the Itsukushima torii.</li>\n</ul>\n<p>&lt;video autoplay loop muted playsinline width=&quot;100%&quot; src=&quot;</p>\n<p>&quot;&gt;</p>\n<p>Same two Spaces, same <code>agents.md</code>, only the prompts changed. That is the building-block economy in one line: the marginal cost of a new multimedia app falls toward the cost of describing it.</p>\n<h2>Why this matters</h2>\n<ul>\n<li><strong>Models become composable.</strong> A SOTA splat model and a SOTA image model, from different orgs, chained with zero integration code. The Hub's open-weights catalog turns into a library of callable multimedia primitives.</li>\n<li><strong>Agents prefer what's documented and reachable.</strong> <code>agents.md</code> makes a Space trivially reachable, so an agent will pick it over a model it has to set up by hand. That is the same dynamic Hashimoto flags for open-source libraries.</li>\n<li><strong>The barrier was integration, and it's largely gone.</strong> &quot;Turn a prompt into a rotating 3D monument&quot; used to be a project. Here it was a step in a pipeline.</li>\n</ul>\n<h2>Try it yourself</h2>\n<p>Point your own agent at a Space's <code>agents.md</code> and let it cook:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> image generation</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">curl</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> https://huggingface.co/spaces/ideogram-ai/ideogram4/agents.md</span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> single-image to 3D gaussian splat</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">curl</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md</span>\n</span></span></code></pre>\n<p>Paste either link into your coding agent (Claude Code, etc.), set your <code>HF_TOKEN</code>, and ask it to build something. The full, reproducible pipeline for this gallery, the scripts that hit those two <code>agents.md</code> endpoints, lives in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/tree/main\">Space repo</a>.</p>\n<p>The building blocks are sitting right there on the Hub. The agents already know how to glue.</p>\n<p>I asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D reconstruction tool. The agent produced every asset (the images <strong>and</strong> the 3D splats) by calling two Hugging Face Spaces directly, then wired them into a cinematic viewer.</p>\n<p>Here's the result, live as a static Space:</p>\n<p>👉 <strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris\">mishig/monuments-de-paris</a></strong></p>\n<p>This post is about <em>how</em> that's possible now, and why I think it's a preview of how a lot of multimedia software gets built from here on.</p>\n<h2>The building-block economy comes for multimedia</h2>\n<p>Mitchell Hashimoto recently described a shift he calls the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mitchellh.com/writing/building-block-economy\">building block economy</a>: the most effective path to software is no longer a polished monolith, but small, well-documented components that others (increasingly <em>agents</em>) can assemble. His key observation: AI is okay at building everything from scratch, but it is <strong>really good at gluing together</strong> proven pieces.</p>\n<p>That thesis has mostly been told with <em>code</em> libraries. But the same forces are hitting <strong>multimedia AI</strong>. The hard part of using a state-of-the-art image model, a video model, a TTS model, or a 3D reconstruction model was never the model. It was the integration: SDKs, weights, GPUs, input formats, polling. If each model were instead a documented, callable block, an agent could glue them together the same way it globs together npm packages.</p>\n<p>That's exactly what Hugging Face Spaces have quietly become.</p>\n<h2>Every Space is a building block, via <code>agents.md</code></h2>\n<p>The Hub hosts thousands of state-of-the-art models (a huge share of them <strong>open-weights</strong>), and most are deployed as interactive <strong>Spaces</strong>. As of now, every Gradio Space also exposes a plain-text <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/docs/hub/en/spaces-agents\"><code>agents.md</code></a> that tells an agent <em>exactly</em> how to call it:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">curl</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md</span>\n</span></span></code></pre>\n<p>returns everything needed in one shot: the schema URL, the call and poll templates, how to upload files, and the auth hint:</p>\n<pre><code><span class=\"code-snippet\">API schema:   GET  .../gradio_api/info\nCall endpoint: POST .../gradio_api/call/v2/{endpoint} {&quot;param_name&quot;: value, ...}\nPoll result:  GET  .../gradio_api/call/{endpoint}/{event_id}\nFile inputs:  POST .../gradio_api/upload -F &quot;files=@file.ext&quot;\nAuth:         Bearer $HF_TOKEN\n</span></code></pre>\n<p>No client library. No hardcoded integration. An agent reads that, and it can drive the Space end to end. Set an <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/settings/tokens\"><code>HF_TOKEN</code></a> and you're going.</p>\n<p>The real unlock is <strong>chaining</strong>: the output of one Space becomes the input to the next. Prompt → image → 3D. That's the whole pipeline behind this gallery.</p>\n<h2>The worked example: Paris monuments → splats</h2>\n<p>The agent chained two Spaces:</p>\n<ol>\n<li><strong>Image:</strong> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/ideogram-ai/ideogram4\"><code>ideogram-ai/ideogram4</code></a> turned each monument into a clean, dark-background &quot;specimen&quot; shot (and the Eiffel Tower into a little diorama on a plinth). Prompt in, image out.</li>\n<li><strong>Splat:</strong> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/VAST-AI/TripoSplat\"><code>VAST-AI/TripoSplat</code></a> reconstructed a 3D Gaussian splat (<code>.ply</code>) from each single image. Image in, 3D out.</li>\n</ol>\n<p>Generated image</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg\" alt=\"Generated Panthéon\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>Reconstructed splat</p>\n<p>The six source images the agent generated, all isolated on black, ready for single-image 3D reconstruction:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg\" alt=\"Generated monument images\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg\" alt=\"Generated Arc de Triomphe\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg\" alt=\"Generated Sacré-Cœur\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg\" alt=\"Generated Eiffel diorama\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>From there the agent did the &quot;glue&quot; work too. It noticed TripoSplat outputs are Y-down and flipped them upright, auto-framed each monument, compressed the <code>.ply</code> files to <code>.ksplat</code> (~3× smaller, so they load fast), built a Three.js viewer with a scroll-to-switch and drag-to-rotate UI, and deployed the whole thing as a static Space. The only human inputs were taste-level: &quot;make it zoomed out,&quot; &quot;replace the obelisk with something better for splatting,&quot; &quot;the transition lingers too long.&quot;</p>\n<p>Several of those steps were <strong>the agent reacting to reality</strong>. A wide glass pyramid splats poorly. A thin obelisk is dull. A single-view reconstruction infers the back. That is exactly the &quot;outsourced R&amp;D, fast iteration&quot; loop the building-block economy predicts, except the R&amp;D was a conversation.</p>\n<h2>Two prompts, a whole new gallery</h2>\n<p>The real test of a building block is how cheaply you can reuse it. Once this pipeline existed, spinning up entirely new galleries cost about one sentence each. &quot;Create a similar Space with splats for Japan,&quot; then the same for Egypt, and the agent did the rest: six monument images, six splats, compression, a viewer, and a deployed Space, per country.</p>\n<ul>\n<li>\n<p>🏛️ <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-of-egypt\">Monuments of Egypt</a>: the Great Pyramid, the Sphinx, Abu Simbel, the mask of Tutankhamun, Karnak, the Colossi of Memnon.</p>\n</li>\n<li>\n<p>⛩️ <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-of-japan\">Monuments of Japan</a>: Tokyo Tower, Himeji Castle, Kinkaku-ji, Osaka Castle, the Great Buddha of Kamakura, the Itsukushima torii.</p>\n</li>\n</ul>\n<p>Same two Spaces, same <code>agents.md</code>, only the prompts changed. That is the building-block economy in one line: the marginal cost of a new multimedia app falls toward the cost of describing it.</p>\n<h2>Why this matters</h2>\n<ul>\n<li><strong>Models become composable.</strong> A SOTA splat model and a SOTA image model, from different orgs, chained with zero integration code. The Hub's open-weights catalog turns into a library of callable multimedia primitives.</li>\n<li><strong>Agents prefer what's documented and reachable.</strong> <code>agents.md</code> makes a Space trivially reachable, so an agent will pick it over a model it has to set up by hand. That is the same dynamic Hashimoto flags for open-source libraries.</li>\n<li><strong>The barrier was integration, and it's largely gone.</strong> &quot;Turn a prompt into a rotating 3D monument&quot; used to be a project. Here it was a step in a pipeline.</li>\n</ul>\n<h2>Try it yourself</h2>\n<p>Point your own agent at a Space's <code>agents.md</code> and let it cook:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> image generation</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">curl</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> https://huggingface.co/spaces/ideogram-ai/ideogram4/agents.md</span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> single-image to 3D gaussian splat</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">curl</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md</span>\n</span></span></code></pre>\n<p>Paste either link into your coding agent (Claude Code, etc.), set your <code>HF_TOKEN</code>, and ask it to build something. The full, reproducible pipeline for this gallery, the scripts that hit those two <code>agents.md</code> endpoints, lives in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/mishig/monuments-de-paris/tree/main\">Space repo</a>.</p>\n<p>The building blocks are sitting right there on the Hub. The agents already know how to glue.</p>\n",
  "content_markdown": "*An agent built a 3D Paris gallery from two Hugging Face Spaces.*\n\nI asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D reconstruction tool. The agent produced every asset (the images **and** the 3D splats) by calling two Hugging Face Spaces directly, then wired them into a cinematic viewer.\n\nHere's the result, live as a static Space:\n\n👉 **[mishig/monuments-de-paris](https://huggingface.co/spaces/mishig/monuments-de-paris)**\n\nThis post is about *how* that's possible now, and why I think it's a preview of how a lot of multimedia software gets built from here on.\n\n## The building-block economy comes for multimedia\n\nMitchell Hashimoto recently described a shift he calls the [building block economy](https://mitchellh.com/writing/building-block-economy): the most effective path to software is no longer a polished monolith, but small, well-documented components that others (increasingly *agents*) can assemble. His key observation: AI is okay at building everything from scratch, but it is **really good at gluing together** proven pieces.\n\nThat thesis has mostly been told with *code* libraries. But the same forces are hitting **multimedia AI**. The hard part of using a state-of-the-art image model, a video model, a TTS model, or a 3D reconstruction model was never the model. It was the integration: SDKs, weights, GPUs, input formats, polling. If each model were instead a documented, callable block, an agent could glue them together the same way it globs together npm packages.\n\nThat's exactly what Hugging Face Spaces have quietly become.\n\n## Every Space is a building block, via `agents.md`\n\nThe Hub hosts thousands of state-of-the-art models (a huge share of them **open-weights**), and most are deployed as interactive **Spaces**. As of now, every Gradio Space also exposes a plain-text [`agents.md`](https://huggingface.co/docs/hub/en/spaces-agents) that tells an agent *exactly* how to call it:\n\n```bash\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nreturns everything needed in one shot: the schema URL, the call and poll templates, how to upload files, and the auth hint:\n\n```\nAPI schema:   GET  .../gradio_api/info\nCall endpoint: POST .../gradio_api/call/v2/{endpoint} {\"param_name\": value, ...}\nPoll result:  GET  .../gradio_api/call/{endpoint}/{event_id}\nFile inputs:  POST .../gradio_api/upload -F \"files=@file.ext\"\nAuth:         Bearer $HF_TOKEN\n```\n\nNo client library. No hardcoded integration. An agent reads that, and it can drive the Space end to end. Set an [`HF_TOKEN`](https://huggingface.co/settings/tokens) and you're going. You can find these instructions on any Gradio Space via its **Agents** button:\n\n![The Agents button on a Hugging Face Space](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/agents-triposplat.png)\n\nThe real unlock is **chaining**: the output of one Space becomes the input to the next. Prompt → image → 3D. That's the whole pipeline behind this gallery.\n\n## The worked example: Paris monuments → splats\n\nThe agent chained two Spaces:\n\n1. **Image:** an image-generation Space turned each monument into a clean, dark-background \"specimen\" shot (and the Eiffel Tower into a little diorama on a plinth). Prompt in, image out.\n2. **Splat:** [`VAST-AI/TripoSplat`](https://huggingface.co/spaces/VAST-AI/TripoSplat) reconstructed a 3D Gaussian splat (`.ply`) from each single image. Image in, 3D out.\n\nGenerated image\n\n[![Generated Panthéon](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)\n\nReconstructed splat\n\nThe six source images the agent generated, all isolated on black, ready for single-image 3D reconstruction:\n\n[![Generated monument images](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg) [![Generated Arc de Triomphe](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg) [![Generated Sacré-Cœur](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg) [![Generated Eiffel diorama](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)\n\nFrom there the agent did the \"glue\" work too. It noticed TripoSplat outputs are Y-down and flipped them upright, auto-framed each monument, compressed the `.ply` files to `.ksplat` (~3× smaller, so they load fast), built a Three.js viewer with a scroll-to-switch and drag-to-rotate UI, and deployed the whole thing as a static Space. The only human inputs were taste-level: \"make it zoomed out,\" \"replace the obelisk with something better for splatting,\" \"the transition lingers too long.\"\n\nSeveral of those steps were **the agent reacting to reality**. A wide glass pyramid splats poorly. A thin obelisk is dull. A single-view reconstruction infers the back. That is exactly the \"outsourced R&D, fast iteration\" loop the building-block economy predicts, except the R&D was a conversation.\n\n## Two prompts, a whole new gallery\n\nThe real test of a building block is how cheaply you can reuse it. Once this pipeline existed, spinning up entirely new galleries cost about one sentence each. \"Create a similar Space with splats for Japan,\" then the same for Egypt, and the agent did the rest: six monument images, six splats, compression, a viewer, and a deployed Space, per country.\n\n- 🏛️ [Monuments of Egypt](https://huggingface.co/spaces/mishig/monuments-of-egypt): the Great Pyramid, the Sphinx, Abu Simbel, the mask of Tutankhamun, Karnak, the Colossi of Memnon.\n\n\\<video autoplay loop muted playsinline width=\"100%\" src=\"\n\n\">\n\n- ⛩️ [Monuments of Japan](https://huggingface.co/spaces/mishig/monuments-of-japan): Tokyo Tower, Himeji Castle, Kinkaku-ji, Osaka Castle, the Great Buddha of Kamakura, the Itsukushima torii.\n\n\\<video autoplay loop muted playsinline width=\"100%\" src=\"\n\n\">\n\nSame two Spaces, same `agents.md`, only the prompts changed. That is the building-block economy in one line: the marginal cost of a new multimedia app falls toward the cost of describing it.\n\n## Why this matters\n\n- **Models become composable.** A SOTA splat model and a SOTA image model, from different orgs, chained with zero integration code. The Hub's open-weights catalog turns into a library of callable multimedia primitives.\n- **Agents prefer what's documented and reachable.** `agents.md` makes a Space trivially reachable, so an agent will pick it over a model it has to set up by hand. That is the same dynamic Hashimoto flags for open-source libraries.\n- **The barrier was integration, and it's largely gone.** \"Turn a prompt into a rotating 3D monument\" used to be a project. Here it was a step in a pipeline.\n\n## Try it yourself\n\nPoint your own agent at a Space's `agents.md` and let it cook:\n\n```bash\n# image generation\ncurl https://huggingface.co/spaces/ideogram-ai/ideogram4/agents.md\n# single-image to 3D gaussian splat\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nPaste either link into your coding agent (Claude Code, etc.), set your `HF_TOKEN`, and ask it to build something. The full, reproducible pipeline for this gallery, the scripts that hit those two `agents.md` endpoints, lives in the [Space repo](https://huggingface.co/spaces/mishig/monuments-de-paris/tree/main).\n\nThe building blocks are sitting right there on the Hub. The agents already know how to glue.\n\nI asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D reconstruction tool. The agent produced every asset (the images **and** the 3D splats) by calling two Hugging Face Spaces directly, then wired them into a cinematic viewer.\n\nHere's the result, live as a static Space:\n\n👉 **[mishig/monuments-de-paris](https://huggingface.co/spaces/mishig/monuments-de-paris)**\n\nThis post is about *how* that's possible now, and why I think it's a preview of how a lot of multimedia software gets built from here on.\n\n## The building-block economy comes for multimedia\n\nMitchell Hashimoto recently described a shift he calls the [building block economy](https://mitchellh.com/writing/building-block-economy): the most effective path to software is no longer a polished monolith, but small, well-documented components that others (increasingly *agents*) can assemble. His key observation: AI is okay at building everything from scratch, but it is **really good at gluing together** proven pieces.\n\nThat thesis has mostly been told with *code* libraries. But the same forces are hitting **multimedia AI**. The hard part of using a state-of-the-art image model, a video model, a TTS model, or a 3D reconstruction model was never the model. It was the integration: SDKs, weights, GPUs, input formats, polling. If each model were instead a documented, callable block, an agent could glue them together the same way it globs together npm packages.\n\nThat's exactly what Hugging Face Spaces have quietly become.\n\n## Every Space is a building block, via `agents.md`\n\nThe Hub hosts thousands of state-of-the-art models (a huge share of them **open-weights**), and most are deployed as interactive **Spaces**. As of now, every Gradio Space also exposes a plain-text [`agents.md`](https://huggingface.co/docs/hub/en/spaces-agents) that tells an agent *exactly* how to call it:\n\n```bash\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nreturns everything needed in one shot: the schema URL, the call and poll templates, how to upload files, and the auth hint:\n\n```\nAPI schema:   GET  .../gradio_api/info\nCall endpoint: POST .../gradio_api/call/v2/{endpoint} {\"param_name\": value, ...}\nPoll result:  GET  .../gradio_api/call/{endpoint}/{event_id}\nFile inputs:  POST .../gradio_api/upload -F \"files=@file.ext\"\nAuth:         Bearer $HF_TOKEN\n```\n\nNo client library. No hardcoded integration. An agent reads that, and it can drive the Space end to end. Set an [`HF_TOKEN`](https://huggingface.co/settings/tokens) and you're going.\n\nThe real unlock is **chaining**: the output of one Space becomes the input to the next. Prompt → image → 3D. That's the whole pipeline behind this gallery.\n\n## The worked example: Paris monuments → splats\n\nThe agent chained two Spaces:\n\n1. **Image:** [`ideogram-ai/ideogram4`](https://huggingface.co/spaces/ideogram-ai/ideogram4) turned each monument into a clean, dark-background \"specimen\" shot (and the Eiffel Tower into a little diorama on a plinth). Prompt in, image out.\n2. **Splat:** [`VAST-AI/TripoSplat`](https://huggingface.co/spaces/VAST-AI/TripoSplat) reconstructed a 3D Gaussian splat (`.ply`) from each single image. Image in, 3D out.\n\nGenerated image\n\n[![Generated Panthéon](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-pantheon.jpg)\n\nReconstructed splat\n\nThe six source images the agent generated, all isolated on black, ready for single-image 3D reconstruction:\n\n[![Generated monument images](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-opera.jpg) [![Generated Arc de Triomphe](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-arc.jpg) [![Generated Sacré-Cœur](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-sacre-coeur.jpg) [![Generated Eiffel diorama](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)](https://huggingface.co/spaces/mishig/monuments-de-paris/resolve/main/blog/assets/gen-eiffel-diorama.jpg)\n\nFrom there the agent did the \"glue\" work too. It noticed TripoSplat outputs are Y-down and flipped them upright, auto-framed each monument, compressed the `.ply` files to `.ksplat` (~3× smaller, so they load fast), built a Three.js viewer with a scroll-to-switch and drag-to-rotate UI, and deployed the whole thing as a static Space. The only human inputs were taste-level: \"make it zoomed out,\" \"replace the obelisk with something better for splatting,\" \"the transition lingers too long.\"\n\nSeveral of those steps were **the agent reacting to reality**. A wide glass pyramid splats poorly. A thin obelisk is dull. A single-view reconstruction infers the back. That is exactly the \"outsourced R&D, fast iteration\" loop the building-block economy predicts, except the R&D was a conversation.\n\n## Two prompts, a whole new gallery\n\nThe real test of a building block is how cheaply you can reuse it. Once this pipeline existed, spinning up entirely new galleries cost about one sentence each. \"Create a similar Space with splats for Japan,\" then the same for Egypt, and the agent did the rest: six monument images, six splats, compression, a viewer, and a deployed Space, per country.\n\n- 🏛️ [Monuments of Egypt](https://huggingface.co/spaces/mishig/monuments-of-egypt): the Great Pyramid, the Sphinx, Abu Simbel, the mask of Tutankhamun, Karnak, the Colossi of Memnon.\n\n- ⛩️ [Monuments of Japan](https://huggingface.co/spaces/mishig/monuments-of-japan): Tokyo Tower, Himeji Castle, Kinkaku-ji, Osaka Castle, the Great Buddha of Kamakura, the Itsukushima torii.\n\nSame two Spaces, same `agents.md`, only the prompts changed. That is the building-block economy in one line: the marginal cost of a new multimedia app falls toward the cost of describing it.\n\n## Why this matters\n\n- **Models become composable.** A SOTA splat model and a SOTA image model, from different orgs, chained with zero integration code. The Hub's open-weights catalog turns into a library of callable multimedia primitives.\n- **Agents prefer what's documented and reachable.** `agents.md` makes a Space trivially reachable, so an agent will pick it over a model it has to set up by hand. That is the same dynamic Hashimoto flags for open-source libraries.\n- **The barrier was integration, and it's largely gone.** \"Turn a prompt into a rotating 3D monument\" used to be a project. Here it was a step in a pipeline.\n\n## Try it yourself\n\nPoint your own agent at a Space's `agents.md` and let it cook:\n\n```bash\n# image generation\ncurl https://huggingface.co/spaces/ideogram-ai/ideogram4/agents.md\n# single-image to 3D gaussian splat\ncurl https://huggingface.co/spaces/VAST-AI/TripoSplat/agents.md\n```\n\nPaste either link into your coding agent (Claude Code, etc.), set your `HF_TOKEN`, and ask it to build something. The full, reproducible pipeline for this gallery, the scripts that hit those two `agents.md` endpoints, lives in the [Space repo](https://huggingface.co/spaces/mishig/monuments-de-paris/tree/main).\n\nThe building blocks are sitting right there on the Hub. The agents already know how to glue.\n",
  "dateCreated": "2026-10-19T01:26:53.998049939+00:00",
  "date_created": "2026-06-09T10:46:19+00:00",
  "date_modified": "2026-06-09T10:46:19+00:00",
  "date_published": "2026-06-09T10:46:19+00:00",
  "description": "An agent built a 3D Paris gallery from two Hugging Face Spaces. I asked a coding agent to build a beautiful website showcasing the monuments of Paris as 3D Gaussian splats. I never opened an image generator. I never touched a 3D…",
  "external_url": "https://huggingface.co/blog/mishig/spaces-agents-md",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/huggingface-co/2026/06/2026-06-09-how-an-agent-built-a-3d-paris-gallery-by-chaining-two.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/huggingface-co/2026/06/2026-06-09-how-an-agent-built-a-3d-paris-gallery-by-chaining-two.md"
  },
  "id": "urn:aggr:item:0c80c8e82b09f3bfee10cdaea53fe70664fedf97",
  "isBasedOn": {
    "@id": "https://huggingface.co/blog/mishig/spaces-agents-md"
  },
  "mainEntity": {
    "@id": "https://huggingface.co/blog/mishig/spaces-agents-md",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-06-09-how-an-agent-built-a-3d-paris-gallery-by-chaining-two/#webpage"
    },
    "dateModified": "2026-06-09T10:46:19+00:00",
    "datePublished": "2026-06-09T10:46:19+00:00",
    "headline": "How an Agent Built a 3D Paris Gallery by Chaining Two Hugging Face Spaces",
    "image": {
      "@type": "ImageObject",
      "caption": null,
      "height": 90,
      "url": "https://cdn-uploads.huggingface.co/production/uploads/60a551a34ecc5d054c8ad93e/0tamlKpAvO3lZEklNmwHT.png",
      "width": 160
    },
    "timeRequired": "PT9M",
    "url": "https://huggingface.co/blog/mishig/spaces-agents-md",
    "wordCount": 1962
  },
  "name": "Archived snapshot: How an Agent Built a 3D Paris Gallery by Chaining Two Hugging Face Spaces",
  "preview": {
    "alt": null,
    "color": null,
    "height": 90,
    "placeholder": {
      "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=",
      "hash": ""
    },
    "url": "https://cdn-uploads.huggingface.co/production/uploads/60a551a34ecc5d054c8ad93e/0tamlKpAvO3lZEklNmwHT.png",
    "width": 160
  },
  "reading_minutes": 9,
  "replicated_at": null,
  "source": "huggingface-co",
  "source_name": "Hugging Face - Blog",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-19T01:26:53.998049939+00:00",
  "title": "How an Agent Built a 3D Paris Gallery by Chaining Two Hugging Face Spaces",
  "url": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-06-09-how-an-agent-built-a-3d-paris-gallery-by-chaining-two/",
  "word_count": 1962
}