<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: amananandrai</title>
    <description>The latest articles on DEV Community by amananandrai (@amananandrai).</description>
    <link>https://dev.to/amananandrai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F355422%2Fd9bae3e1-e185-4e93-a850-58be1b042695.png</url>
      <title>DEV Community: amananandrai</title>
      <link>https://dev.to/amananandrai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amananandrai"/>
    <language>en</language>
    <item>
      <title>Avengers: Doomsday is 5 weeks away, so I built hexagon README badges. What are you building?</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Sat, 14 Nov 2026 17:14:52 +0000</pubDate>
      <link>https://dev.to/amananandrai/avengers-doomsday-is-5-weeks-away-so-i-built-hexagon-readme-badges-what-are-you-building-32d6</link>
      <guid>https://dev.to/amananandrai/avengers-doomsday-is-5-weeks-away-so-i-built-hexagon-readme-badges-what-are-you-building-32d6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Avengers: Doomsday hits theaters on December 18, 2026.&lt;/strong&gt; That's about five weeks from now, and I figured the best use of the wait was to build something Marvel-flavored instead of just rewatching trailers.&lt;/p&gt;

&lt;p&gt;So I made &lt;strong&gt;hex-badges&lt;/strong&gt;: hexagon README badges with 10 Avengers-inspired color themes, a glow effect, and live GitHub stats. Yes, one of the themes is a green-and-silver Latveria badge. Doom deserves a README badge.&lt;/p&gt;

&lt;p&gt;Before the technical stuff, I have a question for the Marvel fans on DEV: &lt;strong&gt;what are you building (or have you built) with the Doomsday hype?&lt;/strong&gt; A themed portfolio, a countdown widget, a Discord bot, a game, a dumb little CLI? Drop it in the comments. I would love to see them. More on that at the end.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live demo and badge builder: &lt;a href="https://hex-badges.vercel.app" rel="noopener noreferrer"&gt;https://hex-badges.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/amananandrai/hex-badges" rel="noopener noreferrer"&gt;https://github.com/amananandrai/hex-badges&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2j6p9yjxj2jedso1el8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2j6p9yjxj2jedso1el8c.png" alt="All the themes as single hexagons" width="800" height="1943"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Two badge styles, 10 themes, and every badge is a plain SVG served from a URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;![stars](https://hex-badges.vercel.app/github/stars/facebook/react?theme=stark-forge)
![license](https://hex-badges.vercel.app/github/license/facebook/react?theme=asgard&amp;amp;style=wide)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single hexagon:&lt;/strong&gt; label over value, with a glow and a themed pattern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elongated:&lt;/strong&gt; a two-part badge with a pointed hexagon outline, closer to a classic badge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zjq4rbkuqgyny32blyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zjq4rbkuqgyny32blyf.png" alt="The elongated style in all 10 themes" width="799" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub metrics: stars, forks, watchers, open issues, open PRs, latest release, latest tag, last commit, license, contributors, language and repo size. There is also a custom endpoint, &lt;code&gt;/api/badge?label=build&amp;amp;message=passing&lt;/code&gt;, for anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The whole thing is three small pieces, and none of them needs a dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. An SVG renderer.&lt;/strong&gt; A badge is just a string. For the single hexagon, the six corner points come from a bit of trigonometry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sb"&gt;`${cx + rad * Math.cos(a)},${cy + rad * Math.sin(a)}`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;polygon points="${ring(r)}" .../&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tricky part of any badge generator is text width. Real services measure font metrics. I estimate it from character count, which is good enough for a short label:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;textWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.62&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For long values the hexagon is capped at a maximum size and the font shrinks to fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Serverless functions on Vercel.&lt;/strong&gt; Each endpoint reads query params and returns SVG with caching headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'image/svg+xml; charset=utf-8'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Cache-Control'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'public, max-age=300, s-maxage=300'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;vercel.json&lt;/code&gt; rewrite turns &lt;code&gt;/github/stars/owner/repo&lt;/code&gt; into a function call, so the URLs stay short.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. GitHub data.&lt;/strong&gt; Each metric is a small function that calls the GitHub REST API and returns a message. Counts are shortened (12,437 becomes &lt;code&gt;12.4k&lt;/code&gt;), and errors become badges too, such as "not found" or "rate limited", instead of a broken image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the themes feel right
&lt;/h2&gt;

&lt;p&gt;Each theme is a handful of values: two gradient pairs, text colors, an outline color and a glow color. Gradients give the badges a metallic look, so "silver" and "gold" actually read as metal.&lt;/p&gt;

&lt;p&gt;The glow is the fun part. SVG has no simple glow property, so it is a filter that floods the shape's outline with a color, blurs it, and merges it under the original:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;filter&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"glow"&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-40%"&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-40%"&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"180%"&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"180%"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;feFlood&lt;/span&gt; &lt;span class="na"&gt;flood-color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#37ff86"&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"f"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;feComposite&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"f"&lt;/span&gt; &lt;span class="na"&gt;in2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"SourceAlpha"&lt;/span&gt; &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"in"&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;feGaussianBlur&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"c"&lt;/span&gt; &lt;span class="na"&gt;stdDeviation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;feMerge&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;feMergeNode&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;feMergeNode&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;feMergeNode&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"SourceGraphic"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/feMerge&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On top of that, each single hexagon gets a pattern clipped to its shape with a &lt;code&gt;clipPath&lt;/code&gt;: arc-reactor rings, armor plates and rivets, lightning, a woven lattice, stars and stripes, cracks, a targeting reticle, a spider web, a sling-ring mandala, and cosmic dust with six colored stones. I kept patterns away from the text area so values stay readable.&lt;/p&gt;

&lt;p&gt;One deliberate choice: I used generic motifs and my own theme names, not logos or official symbols. These badges are inspired by the colors, and they are not affiliated with Marvel or Disney.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escape everything.&lt;/strong&gt; Labels come from the URL and go into an SVG, so any user-supplied text is escaped before it is inserted. Otherwise a crafted URL can inject markup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate the repo param.&lt;/strong&gt; My first regex accepted &lt;code&gt;../evil&lt;/code&gt; as an &lt;code&gt;owner/repo&lt;/code&gt;, which would have sent a path-traversal-style request to the GitHub API. A test caught it. Now &lt;code&gt;.&lt;/code&gt; and &lt;code&gt;..&lt;/code&gt; segments are rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache hard.&lt;/strong&gt; Badges get requested constantly. CDN cache headers keep latency low and API usage small.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan for rate limits.&lt;/strong&gt; GitHub allows only 60 unauthenticated requests per hour per IP, and serverless platforms share IPs. A read-only token with no scopes raises that to 5,000 per hour. Issue and PR counts use the search API, which has its own tighter limit, so caching matters even more there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glow needs a dark background.&lt;/strong&gt; On GitHub's dark theme the glow looks great. On white it fades to a soft halo, which still looks fine but is more subtle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploy your own
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fork the repo and import it into Vercel. There is no build step.&lt;/li&gt;
&lt;li&gt;Create a fine-grained GitHub token with &lt;strong&gt;public repositories, read-only&lt;/strong&gt; access and no permissions.&lt;/li&gt;
&lt;li&gt;Add it in Vercel as the &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; environment variable and redeploy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The landing page at &lt;code&gt;/&lt;/code&gt; has a builder where you pick a theme and copy the Markdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;More metrics (npm versions and downloads are next on my list), more themes, and a light-background glow variant. Theme requests are open, and that's where I need you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn: let's make this a Doomsday watercooler
&lt;/h2&gt;

&lt;p&gt;Pick any of these and answer in the comments. One line is plenty.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Show me your Marvel (or Doomsday) project.&lt;/strong&gt; Link the repo, the site, or just describe it, however rough or silly. Hype projects count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which theme is your favorite?&lt;/strong&gt; Stark Forge, Latveria, Asgard, Wakanda, Star Shield, Gamma Smash, Red Room, Web Slinger, Mystic Arts or Infinity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which theme should I add next?&lt;/strong&gt; X-Men, Fantastic Four, Loki, Scarlet Witch, something from the DC side? Give me a color combo and a pattern idea and I'll try to build it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are you Team Avengers or Team Doom?&lt;/strong&gt; Defend your answer. Bonus points if you argue it using only README badges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post your README.&lt;/strong&gt; Add a badge to one of your repos and share a screenshot. I'll reply to as many as I can.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And if you are not a Marvel person, tell me about the side project you are most excited about right now. This is a watercooler post, so all fun projects are welcome.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: this is a fan project and is not affiliated with or endorsed by Marvel or Disney. Theme names are my own, and the patterns are generic motifs, not official logos.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How Open-Source LLMs Differ: Comparing 130+ Model Architectures</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Fri, 13 Nov 2026 10:38:47 +0000</pubDate>
      <link>https://dev.to/amananandrai/how-open-source-llms-differ-comparing-130-model-architectures-3b9d</link>
      <guid>https://dev.to/amananandrai/how-open-source-llms-differ-comparing-130-model-architectures-3b9d</guid>
      <description>&lt;p&gt;A few weeks ago I wrote about &lt;a href="https://dev.to/amananandrai/i-built-llm-explained-43-interactive-pages-that-take-you-from-tokens-to-ai-agents-2n37"&gt;LLM Explained&lt;/a&gt;, a free, open-source course of &lt;strong&gt;43 interactive pages&lt;/strong&gt; that takes you from tokens to AI agents. Each page has a scroll-driven animation, an Intuition / Mechanics / Maths depth switch, runnable Python and a short quiz.&lt;/p&gt;

&lt;p&gt;The most common question I got afterwards was some version of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"OK, I understand attention. But what is actually &lt;em&gt;different&lt;/em&gt; between Llama, DeepSeek, Qwen and Gemma?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I built the answer into the site: an &lt;strong&gt;Architecture Atlas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://llm-explained-lovat.vercel.app/#arch" rel="noopener noreferrer"&gt;https://llm-explained-lovat.vercel.app/#arch&lt;/a&gt;&lt;br&gt;
⭐ &lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/llm-explained" rel="noopener noreferrer"&gt;https://github.com/amananandrai/llm-explained&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The one idea behind the atlas
&lt;/h2&gt;

&lt;p&gt;Every large language model you can download today is &lt;strong&gt;the same machine&lt;/strong&gt;: a stack of identical blocks, each with an attention layer and a feed-forward layer, joined by a residual stream.&lt;/p&gt;

&lt;p&gt;The models differ in a &lt;strong&gt;short list of part choices&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which normalisation (LayerNorm, RMSNorm, pre- or post-norm)?&lt;/li&gt;
&lt;li&gt;How is position encoded (sinusoids, learned, RoPE, none)?&lt;/li&gt;
&lt;li&gt;How many key/value heads (MHA, GQA, MLA)?&lt;/li&gt;
&lt;li&gt;Is attention full, windowed, sparse or linear?&lt;/li&gt;
&lt;li&gt;Is the MLP dense, gated (SwiGLU / GeGLU) or a mixture of experts?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you see the machine, every new model release becomes a diff instead of a mystery. The atlas is built around that idea, in four sections.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. The transformer, drawn in three eras
&lt;/h2&gt;

&lt;p&gt;The first widget redraws the classic transformer three times, so you can watch the design evolve:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2017: the original encoder–decoder&lt;/strong&gt; from &lt;em&gt;Attention Is All You Need&lt;/em&gt;. Two towers, post-norm, sinusoidal positions, and cross-attention as the bridge between them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuxrekkmrrwteirx87a22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuxrekkmrrwteirx87a22.png" alt="The 2017 encoder-decoder transformer, with the cross-attention block selected and explained" width="800" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2019: the GPT-style decoder.&lt;/strong&gt; The encoder and cross-attention disappear. The prompt and the answer become one sequence, and the norm moves before each sub-layer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2nvo38h0b41ua42t2vod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2nvo38h0b41ua42t2vod.png" alt="The GPT-2 style decoder-only transformer" width="800" height="694"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2023 onwards: the modern open-model block.&lt;/strong&gt; It's the same skeleton with four part swaps: RMSNorm, rotary positions inside attention, grouped-query attention with a KV cache, and a SwiGLU MLP (or a mixture of experts).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7okpb4ltr268tqmr0vfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7okpb4ltr268tqmr0vfo.png" alt="The modern open-model block, with grouped-query attention and RoPE selected" width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;click any block&lt;/strong&gt; to see what it does, its tensor shapes in the &lt;em&gt;Mechanics&lt;/em&gt; view, and links to the modules that teach it. The diagram is a doorway into the course, not a dead end.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Open-weight models, generated from their configs
&lt;/h2&gt;

&lt;p&gt;The second widget is my favourite. Pick a family (&lt;strong&gt;Llama, Mistral, Qwen, DeepSeek, Kimi, Gemma, Phi, gpt-oss&lt;/strong&gt;) and the whole diagram is &lt;strong&gt;generated from that model's configuration&lt;/strong&gt;. The block labels, the expert grid, the KV-cache inset, the layer strip and every number are computed, not drawn by hand.&lt;/p&gt;

&lt;p&gt;Here's DeepSeek-V3. You can see multi-head latent attention caching one 576-number latent per token instead of 128 heads of K and V (57× smaller), and 256 routed experts with 8 active per token plus one shared expert:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepe20ct71hrlp4llecxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepe20ct71hrlp4llecxg.png" alt="DeepSeek-V3 architecture diagram generated from its config, showing MLA and MoE insets" width="800" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Switch to Gemma 3 and the picture changes: interleaved local/global attention, norms before &lt;em&gt;and&lt;/em&gt; after each sub-layer, tied embeddings and image input:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv537wiwpc9kobnymn2zy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv537wiwpc9kobnymn2zy.png" alt="Gemma 3 architecture diagram with sliding-window layers" width="800" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you trust the numbers?&lt;/strong&gt; Each model is marked either as checked against the vendor's config or model card, or as confirmed by reproducing the published parameter count. All 14 configs reproduce their published size to within 0.3% (except Kimi K2, which is published as a rounded "1T"). Adding a new model takes one config entry, and the diagram, spec card, diff and matrix all pick it up.&lt;/p&gt;

&lt;p&gt;Under every diagram, a row of &lt;strong&gt;concept chips&lt;/strong&gt; (RoPE · M5, MLA · M10, KV cache · M11, MoE · M12…) links each idea inside the model to the module that teaches it.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. The comparison: concept by model
&lt;/h2&gt;

&lt;p&gt;Diagrams are great for one model at a time. For comparisons you want a table, so the third section is a &lt;strong&gt;concept-by-model matrix&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa36hr0hjhcezdxvrvaek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa36hr0hjhcezdxvrvaek.png" alt="Concept-by-model comparison matrix and computed sizes table" width="800" height="1019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read &lt;strong&gt;down a column&lt;/strong&gt; for one model's recipe, or &lt;strong&gt;across a row&lt;/strong&gt; to see how far an idea has spread. A few things jump out straight away:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;What the matrix shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Everyone agrees on the basics&lt;/td&gt;
&lt;td&gt;Decoder-only, pre-norm RMSNorm, RoPE and a gated MLP appear in every column&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GQA is the default for KV heads&lt;/td&gt;
&lt;td&gt;32:8 for Llama/Mistral/Qwen, 64:4 for Qwen3-235B, 40:10 for Phi-4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLA is the alternative&lt;/td&gt;
&lt;td&gt;DeepSeek-V3 and Kimi K2 use a 512-dim latent instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE is how models scale cheaply&lt;/td&gt;
&lt;td&gt;Mixtral 2/8, Qwen3 8/128, DeepSeek 8/256, Kimi K2 8/384, gpt-oss 4/32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV cache size varies 8×&lt;/td&gt;
&lt;td&gt;From 48 KB/token (gpt-oss-20b) to 384 KB/token (Gemma 3 12B)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sizes table underneath (total params, active per token, layers × width, KV cache per token) is computed from the same configs. It shows why "671B parameters" (DeepSeek-V3) can still mean only ~37B active per token.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. The gallery: 120 more architectures
&lt;/h2&gt;

&lt;p&gt;Fourteen hand-checked models are not enough to keep up with how fast new models are released. So the atlas ends with a &lt;strong&gt;searchable gallery of 120 open-weight architectures&lt;/strong&gt;, from GPT-2 to this month's releases:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc1ov53rsk0zqx718446x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc1ov53rsk0zqx718446x.png" alt="Architecture gallery grid with search, filters and per-model layer strips" width="800" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each card has a &lt;strong&gt;layer strip&lt;/strong&gt;: one cell per layer, coloured by what that layer is (full attention, sliding-window, latent/sparse, linear attention, state-space/convolution…). You can tell a hybrid model from a pure-attention one at a glance, without reading a paper.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔎 &lt;strong&gt;Search&lt;/strong&gt; by model, company or attention type&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Filter&lt;/strong&gt; by Dense / MoE / Hybrid or by sequence mixer&lt;/li&gt;
&lt;li&gt;↕️ &lt;strong&gt;Sort&lt;/strong&gt; newest or oldest first&lt;/li&gt;
&lt;li&gt;📂 &lt;strong&gt;Open a card&lt;/strong&gt; for a block schematic, the full layer-by-layer strip, a facts table (size, context, vocab, KV cache, licence) and "ideas used" chips that link back to the course&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjmcd7rs2voa8dq9x1cpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjmcd7rs2voa8dq9x1cpg.png" alt="Gallery detail for a hybrid model: schematic, layer strip, facts table and concept chips" width="800" height="1173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some numbers from the snapshot: &lt;strong&gt;57 sparse MoE&lt;/strong&gt;, &lt;strong&gt;29 dense&lt;/strong&gt; and &lt;strong&gt;29 hybrid&lt;/strong&gt; models (plus a few omnimodal, encoder–decoder and recurrent ones). RoPE appears in 104 of them, GQA in 73 and MLA in 30. Sliding-window attention, gated attention and Gated DeltaNet are the ideas spreading fastest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credit where it's due:&lt;/strong&gt; the gallery data comes from the public snapshot of Sebastian Raschka's excellent &lt;a href="https://sebastianraschka.com/llm-architecture-gallery/" rel="noopener noreferrer"&gt;LLM Architecture Gallery&lt;/a&gt; (&lt;a href="https://github.com/rasbt/llm-architecture-gallery" rel="noopener noreferrer"&gt;repo&lt;/a&gt;, Apache 2.0). A script (&lt;code&gt;scripts/build_gallery.py&lt;/code&gt;) turns it into a small data file. Only descriptive fields are kept (no images or benchmark scores), and the strips and schematics are drawn by the site.&lt;/p&gt;


&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;No frameworks and no build step, just like the rest of the course:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assets/arch.js      model configs (MODELS), parameter + KV-cache counters,
                    SVG stack renderer, transformerDiagram / modelDiagram /
                    conceptMatrix, and the atlas page
assets/gallery.js   generated by scripts/build_gallery.py, lazy-loaded
                    only when you open the atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One source of truth per model.&lt;/strong&gt; A config object (layers, d_model, heads, KV heads, experts, window pattern, vocab…) drives the diagram, the counters, the matrix row and the spec card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Counters as validation.&lt;/strong&gt; Parameter and KV-cache counts are computed from the config and compared with the published number. If they don't match, the config is wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy loading.&lt;/strong&gt; The 86 KB gallery file only downloads when you open the atlas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same widgets are reused&lt;/strong&gt; inside Module 6 (encoder vs decoder) and Module 16 (spec cards, parameter counter, architecture diff).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why this helps you actually &lt;em&gt;understand&lt;/em&gt; LLMs
&lt;/h2&gt;

&lt;p&gt;I've read a lot of architecture explainers. The ones that stuck had three things in common, and I tried to build all three in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One mental model, many instances.&lt;/strong&gt; Seeing Llama, DeepSeek and Gemma drawn on the &lt;em&gt;same&lt;/em&gt; skeleton turns ten "new" architectures into a handful of choices. You stop memorising models and start recognising patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every part links to its explanation.&lt;/strong&gt; If you don't know what MLA is, it's one click away, in a module with an animation, a widget and runnable Python:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9z4wb3c99l6r8euod1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9z4wb3c99l6r8euod1z.png" alt="A scroll-driven animation in Module 5, computing attention scores step by step" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Numbers you can trace.&lt;/strong&gt; "57× smaller KV cache" or "3.5% of MLP weights active per token" aren't marketing claims here. They're computed from the config in front of you, so you can check them yourself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It also works as a &lt;strong&gt;quick reference&lt;/strong&gt;. When a new model drops, open the gallery, look at its layer strip, and you'll know within ten seconds whether it's a standard GQA + MoE stack or something new.&lt;/p&gt;

&lt;p&gt;And if you're starting from zero, the &lt;a href="https://llm-explained-lovat.vercel.app/#map" rel="noopener noreferrer"&gt;curriculum&lt;/a&gt; takes you there in order:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3xjesebez2u0jxzdhha9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3xjesebez2u0jxzdhha9.png" alt="The LLM Explained curriculum map: 42 modules in seven parts" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⭐ If this helped, please star the repo
&lt;/h2&gt;

&lt;p&gt;LLM Explained is free, open source and has no sign-up. Stars are how other learners find it, so if the atlas helped you understand even one architecture, a star would mean a lot:&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 &lt;a href="https://github.com/amananandrai/llm-explained" rel="noopener noreferrer"&gt;github.com/amananandrai/llm-explained&lt;/a&gt; ⭐
&lt;/h3&gt;

&lt;h2&gt;
  
  
  💬 I'd love your suggestions
&lt;/h2&gt;

&lt;p&gt;I'm planning the next round of updates and would like to hear from you in the comments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Which model should get a full config-generated diagram next?&lt;/strong&gt; (Currently Llama, Mistral, Mixtral, Qwen3, DeepSeek-V3, Kimi K2, Gemma 3, Phi-4 and gpt-oss.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which architecture idea is still confusing&lt;/strong&gt; after reading the atlas? MLA, sliding windows, linear attention, hybrids?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What would make the comparison more useful?&lt;/strong&gt; A side-by-side diff of any two models? Memory estimates for your GPU?&lt;/li&gt;
&lt;li&gt;Found a wrong number? Please &lt;a href="https://github.com/amananandrai/llm-explained/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;. Every config is meant to be checkable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pull requests are welcome too: adding a model is a single config entry.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and happy learning! 🚀&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Explore the atlas → &lt;a href="https://llm-explained-lovat.vercel.app/#arch" rel="noopener noreferrer"&gt;https://llm-explained-lovat.vercel.app/#arch&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>deeplearning</category>
      <category>deepseek</category>
    </item>
    <item>
      <title>I turned my GitHub profile into a Doctor Doom vs Avengers fight</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Thu, 12 Nov 2026 19:12:11 +0000</pubDate>
      <link>https://dev.to/amananandrai/i-turned-my-github-profile-into-a-doctor-doom-vs-avengers-fight-2b10</link>
      <guid>https://dev.to/amananandrai/i-turned-my-github-profile-into-a-doctor-doom-vs-avengers-fight-2b10</guid>
      <description>&lt;p&gt;My GitHub profile used to look like every other profile on the internet. My name in giant bold letters, a one-line bio, a row of generic shields, and an emoji slapped onto every section header like a kindergarten gold star. Functional. Polite. Completely invisible.&lt;/p&gt;

&lt;p&gt;Now it opens with a lethal green energy beam and five GitHub cats in full Marvel cosplay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr1f1b8ffd32m00n64vm8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr1f1b8ffd32m00n64vm8.gif" alt=" " width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see the crime scene live at &lt;a href="https://github.com/amananandrai" rel="noopener noreferrer"&gt;github.com/amananandrai&lt;/a&gt;. Since &lt;code&gt;#watercooler&lt;/code&gt; is for the fun stuff we do instead of actual work, here is the story of how a "quick five-minute profile update" turned into two pull requests merged in the same evening: &lt;a href="https://github.com/amananandrai/amananandrai/pull/13" rel="noopener noreferrer"&gt;the hero GIF&lt;/a&gt; and &lt;a href="https://github.com/amananandrai/amananandrai/pull/14" rel="noopener noreferrer"&gt;the rest of the theme&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The still (or: Marvel's lawyers, please don't read this)
&lt;/h2&gt;

&lt;p&gt;I didn’t want a clean, minimalist developer logo. I wanted a movie poster.&lt;/p&gt;

&lt;p&gt;On the left: Doctor Doom in a green hood, firing a massive beam of cosmic energy. On the right: Captain America, Iron Man, Black Panther, and Thor ready to throw down. The twist? Every single one of them is an Octocat. Cap has his shield, Iron Man has a palm repulsor, Black Panther is crouched in the rubble, and Thor is summoning lightning. The GitHub mark sits right inside the moon behind them, because if anthropomorphic feline superheroes are going to have a turf war, the moon should at least be in on the joke.&lt;/p&gt;

&lt;p&gt;That single image dictated everything else. The GIF is the poster moving. The banner steals its color palette. The section dividers are just Doom's energy beam stretched thin enough to act as polite interior decorating.&lt;/p&gt;

&lt;p&gt;I did set one ground rule: this stays strictly on my personal profile. The Octocat belongs to GitHub, the costumes belong to Disney's legal team, and I would prefer to keep my organs. It lives on a README with my name on it—not on a SaaS landing page, not on a sticker sheet, and definitely not on a client repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  A GIF, because a static image lacks drama
&lt;/h2&gt;

&lt;p&gt;GitHub READMEs are allergic to JavaScript. Everything is rendered through a strict sanitizer, which means your big, flashy centerpiece has to be an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag that the browser already knows how to loop without throwing a security tantrum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/amananandrai/amananandrai/pull/13" rel="noopener noreferrer"&gt;Pull request 13&lt;/a&gt; drops &lt;code&gt;assets/hero.gif&lt;/code&gt; right under the banner. The beam pulses, the lightning flickers, embers drift, and the camera pushes in slowly. It weighs in at 3.7 MB and renders at 720 pixels wide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"assets/hero.gif"&lt;/span&gt;
  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"GitHub cats as Doctor Doom, Captain America, Iron Man, Black Panther and Thor in a battle"&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"720"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.7 MB sits comfortably under the wall people usually slam into with README animations—though I would still happily chop a few frames before letting this file get any heavier. Nobody wants to wait on a loading spinner just to read my bio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funh8hltwrqattb11br94.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funh8hltwrqattb11br94.gif" alt=" " width="560" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SVG, because if the cats move, the dividers have to move too
&lt;/h2&gt;

&lt;p&gt;Making a GIF for every single horizontal divider would have been a crime against bandwidth. Instead, I built the header typography, the section rules, and the footer as SVGs, sneaking the animation inside the files using SMIL.&lt;/p&gt;

&lt;p&gt;GitHub strips &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tags out of Markdown like contraband, and an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag can't load a Google Font or run a script. You have to play inside a very tight sandbox: no JS, no external stylesheets, and no web fonts. I decided to ignore light-mode users entirely and designed strictly for the dark side. The page background is still GitHub's; the theme lives inside the images.&lt;/p&gt;

&lt;p&gt;The banner (&lt;code&gt;assets/banner.svg&lt;/code&gt;) sets my name in Orbitron and the tagline in JetBrains Mono. To stop GitHub from falling back to Arial and ruining the whole aesthetic, I base64-encoded both fonts and stuffed them directly into the SVG as woff2 data URIs. That is why a text banner weighs 49 KB. Around the text, there’s a scanline, a green and purple wash, a pulsing beam, a lightning bolt, and rising embers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fbanner.svg%26output%3Dpng%26w%3D1600" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fbanner.svg%26output%3Dpng%26w%3D1600" alt="Header banner: Aman Anand Rai, ML / Gen AI / Agentic Systems" width="1600" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The beam itself is just a tiny rectangle doing cardio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;rect&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-3"&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"6"&lt;/span&gt; &lt;span class="na"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt; &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"url(#bm)"&lt;/span&gt; &lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"url(#glow)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;animate&lt;/span&gt; &lt;span class="na"&gt;attributeName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"height"&lt;/span&gt; &lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"5;9;5"&lt;/span&gt; &lt;span class="na"&gt;dur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"1.2s"&lt;/span&gt; &lt;span class="na"&gt;repeatCount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"indefinite"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;animate&lt;/span&gt; &lt;span class="na"&gt;attributeName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"y"&lt;/span&gt; &lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-2.5;-4.5;-2.5"&lt;/span&gt; &lt;span class="na"&gt;dur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"1.2s"&lt;/span&gt; &lt;span class="na"&gt;repeatCount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"indefinite"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/rect&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the horizontal rules, I built &lt;code&gt;assets/pulse.svg&lt;/code&gt;—a featherweight 1.1 KB file that transitions from Doom green to Cap blue to Iron Man red, complete with a little white spark that sprints across the screen every three seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fpulse.svg%26output%3Dpng%26w%3D1600" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fpulse.svg%26output%3Dpng%26w%3D1600" alt="Pulse divider, green to blue to red" width="1600" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The footer wraps things up in the same night gradient with a polite sign-off: &lt;code&gt;THANKS FOR VISITING / LET'S BUILD SOMETHING&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ffooter.svg%26output%3Dpng%26w%3D1600" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ffooter.svg%26output%3Dpng%26w%3D1600" alt="Footer: Thanks for visiting. Let's build something." width="1600" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honestly, I half-expected GitHub's image proxy (&lt;code&gt;camo.githubusercontent.com&lt;/code&gt;) to flatten the SVGs and kill the &lt;code&gt;&amp;lt;animate&amp;gt;&lt;/code&gt; tags. Watching the live scroll proved it actually worked—every time a divider came back into view, the little white spark was somewhere else on the track. It wasn't just working on &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logos, badges, and the stubborn cards that refused to cooperate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/amananandrai/amananandrai/pull/14" rel="noopener noreferrer"&gt;Pull request 14&lt;/a&gt; was the full wardrobe change. I kept the palette tight:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Hex&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Doom green&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#4cff2a&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cap blue&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#5aa0ff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Night text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#cfe3ff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Iron Man red&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#d3202f&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gold&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#f2b632&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ember&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#ff9a3c&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Night&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#0b1020&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Purple edge&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#2a1250&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Shields.io happily took the new hex codes as URL parameters—followers in Doom green, DEV in Cap blue, LeetCode in Iron Man red, and email in gold. Same links, fresh paint.&lt;/p&gt;

&lt;p&gt;The standard section emojis got retired and replaced with eight custom neon SVG tiles (&lt;code&gt;about&lt;/code&gt;, &lt;code&gt;tech&lt;/code&gt;, &lt;code&gt;projects&lt;/code&gt;, &lt;code&gt;writing&lt;/code&gt;, &lt;code&gt;stats&lt;/code&gt;, &lt;code&gt;coding&lt;/code&gt;, &lt;code&gt;community&lt;/code&gt;, &lt;code&gt;badges&lt;/code&gt;) sitting inline next to the headings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;## &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"assets/sections/about.svg"&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"32"&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"32"&lt;/span&gt; &lt;span class="na"&gt;align&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absmiddle"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; About me

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fabout.svg%26output%3Dpng%26w%3D80" alt="About" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Ftech.svg%26output%3Dpng%26w%3D80" alt="Tech" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fprojects.svg%26output%3Dpng%26w%3D80" alt="Projects" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fwriting.svg%26output%3Dpng%26w%3D80" alt="Writing" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fstats.svg%26output%3Dpng%26w%3D80" alt="Stats" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fcoding.svg%26output%3Dpng%26w%3D80" alt="Coding" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fcommunity.svg%26output%3Dpng%26w%3D80" alt="Community" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Fsections%2Fbadges.svg%26output%3Dpng%26w%3D80" alt="Badges" width="80" height="80"&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the tech stack, I took fifteen familiar logos, recolored them to match the theme, and hosted them locally in &lt;code&gt;assets/tech/&lt;/code&gt; so an external badge CDN couldn't revert them back to their factory defaults. Each category (languages, ML, web, databases, tools) gets its own border color, and Python's tile gently breathes on a 2.4-second opacity loop because why not.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fpython.svg%26output%3Dpng%26w%3D80" alt="Python" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Ftypescript.svg%26output%3Dpng%26w%3D80" alt="TypeScript" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fjavascript.svg%26output%3Dpng%26w%3D80" alt="JavaScript" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fpytorch.svg%26output%3Dpng%26w%3D80" alt="PyTorch" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Ftensorflow.svg%26output%3Dpng%26w%3D80" alt="TensorFlow" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fnodedotjs.svg%26output%3Dpng%26w%3D80" alt="Node.js" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Ftailwindcss.svg%26output%3Dpng%26w%3D80" alt="Tailwind CSS" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fmongodb.svg%26output%3Dpng%26w%3D80" alt="MongoDB" width="80" height="80"&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fmysql.svg%26output%3Dpng%26w%3D80" alt="MySQL" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fpostgresql.svg%26output%3Dpng%26w%3D80" alt="PostgreSQL" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fgit.svg%26output%3Dpng%26w%3D80" alt="Git" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fdocker.svg%26output%3Dpng%26w%3D80" alt="Docker" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fgooglecloud.svg%26output%3Dpng%26w%3D80" alt="Google Cloud" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Flinux.svg%26output%3Dpng%26w%3D80" alt="Linux" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwsrv.nl%2F%3Furl%3Draw.githubusercontent.com%2Famananandrai%2Famananandrai%2Fmain%2Fassets%2Ftech%2Fvisualstudiocode.svg%26output%3Dpng%26w%3D80" alt="VS Code" width="80" height="80"&gt;&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The GitHub stats cards accepted the exact same hex values via query parameters. Green titles, gold icons, dark night panel, purple border. I left a note in the PR to fall back to the built-in &lt;code&gt;radical&lt;/code&gt; theme if the stats service ever choked on the custom colors, though so far it has behaved.&lt;/p&gt;

&lt;p&gt;Then there were the two holdouts. The LeetCode card is still wearing its &lt;code&gt;nord&lt;/code&gt; theme, and the HackerRank card doesn't accept color parameters at all. A broken image link looks way worse than a slightly off-brand color scheme, so I let them keep their clothes. At least Stack Exchange let me swap in the ember orange.&lt;/p&gt;




&lt;p&gt;It is the classic developer trap: a plain profile, a "quick fifteen-minute tweak," and suddenly you are three hours deep into hand-coding SVG filters. None of it is actually necessary. The code and the articles were already on the page—the superhero cats are just there to get people through the front door.&lt;/p&gt;

&lt;p&gt;If you've looked at your own GitHub profile lately, what's the weirdest thing on it that isn't a stats card?&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>github</category>
      <category>showdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Monuments of India, Part 2: Domes, Arches, Realistic Stone and Finer Details in three.js</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Thu, 12 Nov 2026 04:12:29 +0000</pubDate>
      <link>https://dev.to/amananandrai/what-got-more-real-in-101-indian-monuments-built-from-code-3edn</link>
      <guid>https://dev.to/amananandrai/what-got-more-real-in-101-indian-monuments-built-from-code-3edn</guid>
      <description>&lt;p&gt;Last time, I proudly showed you 101 Indian monuments built entirely from code. This time I have to confess something: some of them were, let's say, enthusiastic approximations. That story is in &lt;a href="https://dev.to/amananandrai/i-built-101-indian-monuments-in-the-browser-using-only-code-no-3d-models-3000"&gt;I Built 101 Indian Monuments in the Browser Using Only Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Qutub Minar was wearing a cupola it never owned. The Taj Mahal had a lovely tomb but no actual garden. Dilwara had one temple where there should have been five. And a few of my buildings had a gorgeous front and, behind it, a back that looked like I'd lost interest halfway.&lt;/p&gt;

&lt;p&gt;So I went on a fixing spree. Real doorways and guard niches on the forts. A proper charbagh for the Taj. Backs, sides and windows for the palaces. Towns that crowd around the temples like they've been there for centuries. Stone that catches the light, with veining, weathering and pietra dura. And yes, trees: the right trees. No more mango trees in the Thar Desert. Khejri and babul have been called in.&lt;/p&gt;

&lt;p&gt;It is still 101 monuments in &lt;a href="https://threejs.org/" rel="noopener noreferrer"&gt;three.js&lt;/a&gt;, still pure code, and still not a single 3D model file downloaded. Come see what got more real, and help me spot what still looks like it's fibbing about its age.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://monuments-of-india-nu.vercel.app" rel="noopener noreferrer"&gt;monuments-of-india-nu.vercel.app&lt;/a&gt; ·&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/monuments-of-india" rel="noopener noreferrer"&gt;github.com/amananandrai/monuments-of-india&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the models or the code are useful to you, or you just like them, &lt;strong&gt;please give a star to the GitHub repo&lt;/strong&gt; and help other people find the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqyz45o3v9m2f5dyklev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqyz45o3v9m2f5dyklev.png" alt="Procedural Taj Mahal in three.js, seen from the garden: white marble tomb, four minarets and the reflecting pool" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The masses were already right. The joinery was not.&lt;/strong&gt; Domes, screens, doors, backs of buildings and the ground around them got a second pass, monument by monument.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared parts for the family, detail files for the building.&lt;/strong&gt; One dome, one jali, one gopuram for everyone, plus a file per monument for what only that monument has.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything is still code.&lt;/strong&gt; Plain files and three.js, no build step, no model files, 650,000 triangles at most on a desktop and 300,000 on a phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;In this post&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What changed since part 1&lt;/li&gt;
&lt;li&gt;How a part gets into a building&lt;/li&gt;
&lt;li&gt;
Domes · Kiosks and turrets · Pillars and columns
&lt;/li&gt;
&lt;li&gt;
Arches, doors and windows · Eaves, battlements and bands
&lt;/li&gt;
&lt;li&gt;
Temple towers · Forts and monasteries
&lt;/li&gt;
&lt;li&gt;When the shared kit is not the building&lt;/li&gt;
&lt;li&gt;What stands around the building&lt;/li&gt;
&lt;li&gt;Stone that catches the light&lt;/li&gt;
&lt;li&gt;How I checked the work, and what went wrong&lt;/li&gt;
&lt;li&gt;
What I would still not claim · Add your own monument
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What changed since part 1
&lt;/h2&gt;

&lt;p&gt;This is the second pass, with the pictures from the component guides. The masses were already right. Up close, a dome was still a bare bulb, a screen was still a square grid, and the ground around a building was often the wrong trees or the wrong water. The work since then fills in the joinery, gives a few monuments pieces that only they have, and plants each site with what actually stands there.&lt;/p&gt;

&lt;p&gt;Here is the short version, in the order I did it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real entrances.&lt;/strong&gt; Forts got passages, guard niches and doors spiked against elephants. Temples got stepped doorways and porches. Mughal tombs got iwans and arcades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A detail file for every monument,&lt;/strong&gt; so a building has its own finer architecture and its own setting, not just a generic kit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photograph reviews.&lt;/strong&gt; I compared the models with photographs in batches and fixed what disagreed: the Taj, Charminar, the Lotus Temple, the Hawa Mahal and many more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corrections.&lt;/strong&gt; Qutub Minar lost the cupola it never had and gained Smith's Folly. The Taj Mahal got its full four-quarter charbagh. Dilwara got its other four temples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backs, sides and windows&lt;/strong&gt; for palaces, mosques and tombs, so you can orbit them without finding a blank wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Towns and water&lt;/strong&gt; around the temples at Kedarnath, Tirumala, Trimbak, Varanasi and Ujjain, plus the Old City round Charminar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The right trees and the right water,&lt;/strong&gt; per site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surfaces:&lt;/strong&gt; photo textures with normal and roughness maps, calligraphy, pietra dura, carved reliefs and banded masonry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; monuments load when you open them, shadows follow the view, and phones get a lighter build.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Before and after
&lt;/h3&gt;

&lt;p&gt;Same monument, same site, rendered by the same code: the left side is the repository before the second pass began, the right side is today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qutub Minar.&lt;/strong&gt; The old tower wore a cupola it never owned. Now it tapers to its real top, and Smith's Folly, the Alai Darwaza, the cloister and Iltutmish's tomb stand around it, on grass with a path and trees.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo3gqot0ihc5j56pi5gkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo3gqot0ihc5j56pi5gkz.png" alt="Qutub Minar before and after: the invented cupola is gone, the tower is corrected and the Qutub complex stands around it" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taj Mahal.&lt;/strong&gt; The old tomb stood alone on a red plinth. Now it has its pishtaqs, calligraphy, chhatris and a charbagh garden to walk down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq51mtx47v7te3u6kn4nr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq51mtx47v7te3u6kn4nr.png" alt="Taj Mahal before and after: the bare tomb versus the tomb with its charbagh garden, cypresses and gateway pavilions" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dilwara.&lt;/strong&gt; One temple became the whole group of five, each in its own walled court, among trees.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F44qvhwou2gxv4nd93ltj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F44qvhwou2gxv4nd93ltj.png" alt="Dilwara Jain temples before and after: one temple versus the group of five" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jaisalmer.&lt;/strong&gt; A smooth sandstone mound with a ring wall became a fort at its real size on its Trikuta hill, with bastions, the road up to the gate and a town inside the walls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7o1jv7npy9f0mf6u3qk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7o1jv7npy9f0mf6u3qk4.png" alt="Jaisalmer Fort before and after: a plain mound with a ring wall versus the fort on its hill with bastions and gates" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hawa Mahal.&lt;/strong&gt; A flat stepped front with no depth became a screen of carved jharokhas, with the court and ranges behind it, the street in front and the building's sides finished.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpmhmbjydkqjjicid74f0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpmhmbjydkqjjicid74f0.png" alt="Hawa Mahal before and after: a plain stepped front versus the screen of jharokhas with its court and wings" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pictures below are the ones in &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/components.md" rel="noopener noreferrer"&gt;components.md&lt;/a&gt;. &lt;code&gt;node tools/shoot-components.mjs&lt;/code&gt; draws each shared part alone, in plain light. On the site the same part carries shadows, a photo texture and weathering. What each function takes, and which file it lives in, is in &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/architecture.md" rel="noopener noreferrer"&gt;architecture.md&lt;/a&gt; and &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/realism.md" rel="noopener noreferrer"&gt;realism.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The site is still plain files and three.js, with no build step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftuhuveye6l7litdqpygb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftuhuveye6l7litdqpygb.png" alt="Finished Indian monuments in the browser: Meenakshi Temple gopurams" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How a part gets into a building
&lt;/h2&gt;

&lt;p&gt;Each monument has two files.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;js/monuments/&amp;lt;name&amp;gt;.js&lt;/code&gt; builds the masses: plinth, walls, towers, roofs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;js/details/&amp;lt;name&amp;gt;.js&lt;/code&gt; adds the finer architecture and the setting, from &lt;code&gt;addDetails(f, g)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;f&lt;/code&gt; is the group the home view frames. &lt;code&gt;g&lt;/code&gt; is the whole site, so a river or a town can sit outside the frame and not pull the camera back.&lt;/p&gt;

&lt;p&gt;A few rules hold for every part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metres, y up.&lt;/strong&gt; A part stands on y = 0 and faces +z unless its comment says otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The stone is passed in.&lt;/strong&gt; &lt;code&gt;M.marble&lt;/code&gt;, &lt;code&gt;M.red&lt;/code&gt;, &lt;code&gt;M.granite&lt;/code&gt; and the rest live in &lt;code&gt;js/helpers.js&lt;/code&gt;. A one-off stone is &lt;code&gt;mat('#hex', roughness)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge when the part is done.&lt;/strong&gt; &lt;code&gt;mergeByMaterial(group)&lt;/code&gt; leaves one mesh per material, so a facade of hundreds of small pieces is a handful of draw calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two faces never share a plane.&lt;/strong&gt; An overlay sits 2 to 5 cm off its wall. &lt;code&gt;node check-flicker.mjs &amp;lt;id&amp;gt;&lt;/code&gt; from &lt;code&gt;tools/&lt;/code&gt; finds the ones that do not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Placing a row of windows is a loop around the four faces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A window on each face, 11 m out from the centre, the sill 13.6 m up.&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="no"&gt;FACES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;onFace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;windowFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'flat'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;13.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;11.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;at&lt;/code&gt; moves a part. &lt;code&gt;onFace&lt;/code&gt; turns that move onto a wall: angle 0 is the +z face, the next number is how far out, and a third number walks along the face. &lt;code&gt;aroundCircle&lt;/code&gt; and &lt;code&gt;alongFace&lt;/code&gt; do the same for a ring of brackets or a cornice. Hundreds of identical merlons or columns go through &lt;code&gt;inst()&lt;/code&gt;, one geometry drawn many times.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnmxqnjrizhr64osve90d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnmxqnjrizhr64osve90d.png" alt="Pipeline: monument file, detail file and shared parts are merged by material, drawn by the surface shader and shown in the browser" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Domes
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;A dome is rarely just a dome. The bulb springs from a drum through a moulded neck, and the finial that crowns it tells you the tradition: a Mughal spike, a temple pot, a crescent.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3r53bvvkg8xy2p0kywd4.jpg" alt="Onion dome with a moulded neck, an inverted lotus crown and a finial" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F96dbzcsp2qhit7gmrrh1.jpg" alt="Lotus dome: shallow ribs, a cup of petals, and a crescent finial" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Onion dome: neck, lotus crown, finial&lt;/td&gt;
&lt;td&gt;Lotus dome: ribs, a cup of petals, a crescent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;onionDome(r, m)&lt;/code&gt; is a lathe of the shared onion profile. From 1.5 m radius upward (4 m on a phone) it adds two more lathes that ride on the same group, so moving, scaling or ribbing the dome carries them along:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onionDome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;crown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;neck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lathe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ONION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;neck&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lathe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DOME_NECK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;crown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ribbed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lathe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DOME_CROWN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The neck is the moulding where the bulb springs from the drum. The crown is the inverted lotus, sixteen ribs pressed in by &lt;code&gt;ribbed()&lt;/code&gt;, which is the mahapadma the finial rises from. &lt;code&gt;{ crown: false }&lt;/code&gt; or &lt;code&gt;{ neck: false }&lt;/code&gt; leaves one off where a monument models its own. The Taj does.&lt;/p&gt;

&lt;p&gt;Around that sit the other turned shapes: &lt;code&gt;hemi&lt;/code&gt; for a plain hemisphere, &lt;code&gt;persianDome&lt;/code&gt; for a pointed double curve, &lt;code&gt;lotusDome&lt;/code&gt; for an onion with shallow ribs sitting in a cup of petals, &lt;code&gt;petalRing&lt;/code&gt; for the petals themselves, and &lt;code&gt;finial&lt;/code&gt;, &lt;code&gt;kalash&lt;/code&gt; and &lt;code&gt;crescentFinial&lt;/code&gt; for whatever crowns it. A temple pot, a Mughal spike and a crescent are three different functions, because they are three different objects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kiosks and turrets
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The chhatri, a small domed kiosk on columns, is the silhouette of Rajput and Mughal skylines. Take them off a roofline and it stops looking like India.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F987ua77x1azl0tmazmi6.jpg" alt="Chhatri: eight columns, a drip-edge eave and a dome on a low drum" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9g49x6qmxvkacbkw3yi.jpg" alt="Mughal chhatri with arches between the columns and a ribbed lotus dome" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxxo4w50dtviz2dnd30hb.jpg" alt="Guldastas: slender Lucknow roof turrets with a tiny onion and a spike" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chhatri&lt;/td&gt;
&lt;td&gt;Mughal chhatri&lt;/td&gt;
&lt;td&gt;Guldastas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlk3or70ndi9m4ted9hu.jpg" alt="Minaret with balconies and a chhatri cap" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsriu8vu96drjl43m5duf.jpg" alt="Jharokha: an oriel on brackets, screened on three sides" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minaret&lt;/td&gt;
&lt;td&gt;Jharokha&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;chhatri(r, h, m, domeM)&lt;/code&gt; is the domed kiosk on eight columns that stands on Mughal and Rajput roofs. At full detail each column gets a moulded base and a spreading capital, the eave gets a drip edge, and the dome sits on a low drum. &lt;code&gt;mughalChhatri&lt;/code&gt; is the richer one: arches between the columns, a sloping eave, a ribbed lotus dome, and an optional crescent.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;guldasta&lt;/code&gt; is the Lucknow roof turret, a thin shaft under a tiny onion and a spike. &lt;code&gt;minaret&lt;/code&gt; tapers, takes a list of balconies, and is capped by a chhatri. &lt;code&gt;jharokha&lt;/code&gt; is the oriel on brackets, screened on three sides, under a roof that can be curved Bengal (&lt;code&gt;'bangla'&lt;/code&gt;), domed, or flat. &lt;code&gt;banglaRoof&lt;/code&gt; is that curve on its own, for pavilions as well as windows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillars and columns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw9eodb5b0x9h5n4nqyld.jpg" alt="Classical columns, one plain and one Corinthian with flutes and acanthus" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg04gk36cqbuaxblcj0oe.jpg" alt="Carved temple pillar: square base, octagonal shaft, two carved bands" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foc4v2kjhnqy3zj70v7xi.jpg" alt="Cluster pillar: a shaft ringed by slender colonnettes" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classical, plain and Corinthian&lt;/td&gt;
&lt;td&gt;Carved temple pillar&lt;/td&gt;
&lt;td&gt;Cluster pillar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqexm6hn7ykvcherezyz6.jpg" alt="Yali pillar with a rearing beast and its rider" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdg1dbxspqysjskb9qzqs.jpg" alt="Column trim: plinth, moulding, necking ring and abacus on bare shafts" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yali pillar&lt;/td&gt;
&lt;td&gt;Column trim on bare shafts&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are different orders, so they are different functions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;column(r, h, m, { order })&lt;/code&gt; in &lt;code&gt;js/details/colonial.js&lt;/code&gt; is a classical column: plinth, base, tapering shaft, capital. &lt;code&gt;order: 'corinthian'&lt;/code&gt; adds flutes and acanthus. &lt;code&gt;entablature&lt;/code&gt; and &lt;code&gt;corinthianCapital&lt;/code&gt; are what a colonnade carries above it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;carvedPillar&lt;/code&gt; is a temple pillar: square base, octagonal shaft with two carved bands, a cushion and a capital.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clusterPillar&lt;/code&gt; is the Vijayanagara pillar, a shaft ringed by slender colonnettes. &lt;code&gt;yaliPillar&lt;/code&gt; carries a rearing yali and its rider. Both are sculpted rather than stacked from boxes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;columnTrim(list, m, { capM })&lt;/code&gt; dresses a colonnade that was built as bare instanced shafts: a plinth and moulding under each, a necking ring and an abacus at the head. It is on Agra Fort's Diwan-i-Am, the Padmanabhaswamy corridor, Mahakaleshwar's colonnade and the Secretariat loggias at Rashtrapati Bhavan.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pilasters&lt;/code&gt; are the flat ones, proud of a wall by a few centimetres.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trim matters because the cheap way to draw forty columns is one instanced cylinder. That reads as a row of poles. Bases and capitals are a second instanced pass, so the shafts stay cheap and the order comes back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl4dqfb6hs5ls989180xy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl4dqfb6hs5ls989180xy.png" alt="Forty columns as forty meshes versus one instanced geometry" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Arches, doors and windows
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlpa4oogx43uorf9zm63.jpg" alt="A wall with an arch cut through it and a moulded ring" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyomnrt9b5buq3jh7a7mv.jpg" alt="Iwan: a great recessed arch with its door" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd65p7jbbb0895jsqt26k.jpg" alt="An arched niche with a half-dome hood" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arch and its ring&lt;/td&gt;
&lt;td&gt;Iwan&lt;/td&gt;
&lt;td&gt;Niche&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0czxt346fj1ri7d7ptf.jpg" alt="Window in a stone surround, filled with a jali screen" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5nh0x50jrmc6o1gdbe1x.jpg" alt="Classical door in a pedimented surround" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe410el934zl468lk8wta.jpg" alt="Gothic two-light window" width="640" height="420"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Window with a jali&lt;/td&gt;
&lt;td&gt;Classical door&lt;/td&gt;
&lt;td&gt;Gothic window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgzfeo5ocamk80q55ddn.jpg" alt="Temple doorway: stepped frame, open leaves, a lamp in the sanctum" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temple doorway&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;archWall&lt;/code&gt; cuts an opening through a wall. &lt;code&gt;archRing&lt;/code&gt; is the moulded band around it. &lt;code&gt;niche&lt;/code&gt; is a blind arch with a half-dome hood, deep enough to read as a recess. &lt;code&gt;iwan&lt;/code&gt;, in &lt;code&gt;js/details/mughal.js&lt;/code&gt;, is the great recessed arch of a gate or a tomb front, with its door. &lt;code&gt;arcadeSkin&lt;/code&gt; cuts a wall into a row of arched cells, each a door, a screen or a room. &lt;code&gt;mughalDoorway&lt;/code&gt; is the smaller pointed door onto a dim interior.&lt;/p&gt;

&lt;p&gt;The traditions that are not Mughal have their own doors, because a fanlight is not a torana.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;templeDoorway&lt;/code&gt; is a stepped frame, a hood, timber leaves standing open, a lamp in the sanctum, and guardians. &lt;code&gt;doorLeaves&lt;/code&gt; can take &lt;code&gt;spikes&lt;/code&gt;, the iron points set against war elephants. &lt;code&gt;doorFrame&lt;/code&gt; is the nested carved bands of a post-and-lintel door. &lt;code&gt;interior&lt;/code&gt; is the dim room seen through it. &lt;code&gt;templePorch&lt;/code&gt; is the small open porch in front.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;classicalDoor&lt;/code&gt;, &lt;code&gt;porch&lt;/code&gt; and &lt;code&gt;pediment&lt;/code&gt; are the colonial and Indo-Saracenic set. &lt;code&gt;gothicDoor&lt;/code&gt;, &lt;code&gt;gothicWindow&lt;/code&gt; and &lt;code&gt;oculus&lt;/code&gt; are the pointed portal, the two-light window and the round window.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;windowFrame(w, h, m, { shape, screen })&lt;/code&gt; is a window in a stone surround. &lt;code&gt;screen: jali(m)&lt;/code&gt; fills it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The jali, from a grid to a lattice
&lt;/h3&gt;

&lt;p&gt;A jali is a pierced stone screen. It lets air and light through while keeping a room private, and it is one of the most recognisable things in Mughal and Rajput architecture. It is also the part that used to be a square grid. It is now the octagon-and-diamond lattice of Mughal and Rajput screens, one function for the cut and the shading so they cannot drift apart. A 22 cm grid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;sJaliHole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;oct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.34&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.47&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;dia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Up close, when the holes are large enough on screen not to shimmer, the shader discards the opening. The stone around it still casts the shadow. Far away the lattice stays a shading pattern. Modelling every hole on 101 buildings was never going to fit the triangle budget: 650,000 on a desktop, 300,000 on a phone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qqggrkg51zmqkkkb1ty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qqggrkg51zmqkkkb1ty.png" alt="The jali: a plain square grid, the octagon-and-diamond lattice, and the lattice cut into a stone window" width="799" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same trick covers the ornament that should stay cheap: &lt;code&gt;frieze&lt;/code&gt; for a band of rosettes, &lt;code&gt;carved(m, kind)&lt;/code&gt; for &lt;code&gt;'script'&lt;/code&gt;, &lt;code&gt;'calligraphy'&lt;/code&gt;, &lt;code&gt;'pietra'&lt;/code&gt;, &lt;code&gt;'reliefs'&lt;/code&gt; and &lt;code&gt;'tiles'&lt;/code&gt;, plus &lt;code&gt;rosette&lt;/code&gt;, &lt;code&gt;medallion&lt;/code&gt;, &lt;code&gt;sunburst&lt;/code&gt; and &lt;code&gt;lettering&lt;/code&gt; for the roundels and the raised names. The pattern lives in the shader. The mesh stays a wall.&lt;/p&gt;




&lt;h2&gt;
  
  
  Eaves, battlements and bands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff6vm0x94lpfguzshpxgl.jpg" alt="Chhajja: a deep sloping eave carried on brackets" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9msbx2mnx6uyxagwqiud.jpg" alt="A row of pointed merlons" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8915tgem7jul3mcbma5p.jpg" alt="A railing of posts with pierced screens between them" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chhajja on brackets&lt;/td&gt;
&lt;td&gt;Merlons&lt;/td&gt;
&lt;td&gt;Railing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;chhajja&lt;/code&gt; is the deep sloping eave. &lt;code&gt;chhajjaRing&lt;/code&gt; is the round version. &lt;code&gt;bracketGeo&lt;/code&gt; is the corbel that carries an eave or a balcony, and &lt;code&gt;placeAll&lt;/code&gt; drops one copy at every point in a list. &lt;code&gt;merlons&lt;/code&gt; is a row of pointed battlements. On a fort, &lt;code&gt;rampart&lt;/code&gt; and &lt;code&gt;bastionCrowns&lt;/code&gt; add the parapet, a string course and arrow slits, for a long curtain wall and for round bastions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;railing&lt;/code&gt; and &lt;code&gt;railingRing&lt;/code&gt; are posts with pierced screens between them. &lt;code&gt;balustrade&lt;/code&gt; is the classical version. &lt;code&gt;beltCourse&lt;/code&gt; runs a band around a rectangular building, &lt;code&gt;mouldings&lt;/code&gt; stacks courses into a plinth or a cornice, &lt;code&gt;dentils&lt;/code&gt; is the row of small blocks under that cornice, and &lt;code&gt;panel&lt;/code&gt; is a sunk field that can be carved or inlaid. &lt;code&gt;wallWithGaps&lt;/code&gt; is a compound wall with openings left for its gates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Temple towers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3wmpm0uq6bptlngyfot.jpg" alt="A curved Nagara shikhara" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fls4culeiqc9wo4f8xqs0.jpg" alt="A whole Nagara temple: sanctum, spire and halls stepping forward" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdkcci9o78bmwpqnbrkmr.jpg" alt="A Dravida vimana: stepped storeys with miniature shrines along each edge" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shikhara&lt;/td&gt;
&lt;td&gt;Nagara temple&lt;/td&gt;
&lt;td&gt;Dravida vimana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff7jrfjk99jcsesf6zmmp.jpg" alt="A South Indian gopuram, tier on tier of painted figures" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fglkp8pavon86mkn5grrh.jpg" alt="A mandap: a pillared hall under a stepped roof" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4yamqb70bibxwczjohoc.jpg" alt="A temple niche holding an image" width="640" height="420"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gopuram&lt;/td&gt;
&lt;td&gt;Mandap&lt;/td&gt;
&lt;td&gt;Temple niche&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;nagaraTemple({ w, h, m, halls, … })&lt;/code&gt; builds a North Indian temple in one call: sanctum, curved spire, and halls stepping out in front. That is why Somnath, in the first article, fits under 1 KB. &lt;code&gt;shikhara&lt;/code&gt; is the spire alone, with &lt;code&gt;nagaraProfile&lt;/code&gt; and &lt;code&gt;kalingaProfile&lt;/code&gt; as two tapers. &lt;code&gt;bhumijaRows&lt;/code&gt; sets miniature spires between the bands of a Bhumija tower.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dravidaVimana&lt;/code&gt; is the stepped tower over a South Indian sanctum. Each storey's edge carries miniature shrines: &lt;code&gt;kuta&lt;/code&gt; at the corners, &lt;code&gt;shala&lt;/code&gt; along the sides, laid out by &lt;code&gt;haraRow&lt;/code&gt;. &lt;code&gt;gopuram(w, d, h, tiers, seed)&lt;/code&gt; is the gate tower, tier on tier of painted stucco figures. The seed is why Meenakshi's towers are not copies of each other. &lt;code&gt;mandap&lt;/code&gt; is a pillared hall under a stepped roof. &lt;code&gt;storeyedHall&lt;/code&gt; stacks galleries. &lt;code&gt;pidaRoof&lt;/code&gt; is the stepped pyramid of slabs on its own.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;templeNiche(w, h, m, { figure })&lt;/code&gt; puts an image in a niche. For a long row, &lt;code&gt;idol&lt;/code&gt; is the cheap standing figure in relief. &lt;code&gt;trabeateGate&lt;/code&gt; is a post-and-lintel gatehouse, with guardians or carved beasts. &lt;code&gt;dwajasthambha&lt;/code&gt; is the gold flagstaff in front of the sanctum. &lt;code&gt;grandStair&lt;/code&gt; is the broad flight between side walls, with a landing and guardians.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwpprg8s6202xvkx6wy1w.jpg" alt="A broad stair between side walls, with a landing" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8cztdlpg3r5yzqmtizgc.jpg" alt="A frieze of figures, elephants and horses in relief" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqlybcsgkt2gbux25yz1.jpg" alt="A statue on a pedestal, with an urn and a pinnacle" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grand stair&lt;/td&gt;
&lt;td&gt;Figure frieze&lt;/td&gt;
&lt;td&gt;Statue, urn, pinnacle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;figure&lt;/code&gt;, &lt;code&gt;guardian&lt;/code&gt;, &lt;code&gt;statue&lt;/code&gt; and &lt;code&gt;figureFrieze&lt;/code&gt; are the sculpted ones. The great statues, Patel, Bahubali, Thiruvalluvar and the Nageshwar Shiva, are each one continuous skin, grown from a signed distance field in &lt;code&gt;js/sdf.js&lt;/code&gt; and meshed in the browser, so a limb grows out of a body the way it does in a carving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftuxkod7pog6f8i75bncw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftuxkod7pog6f8i75bncw.png" alt="Statue of Unity modelled from a signed distance field in three.js" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The temples got the biggest structural rethink in this pass. Ram Mandir now has three storeys with cusped arches and a 32-step stair. Somnath's spire rises in seven storeys over a three-tier plinth and a broad stair. Mahakaleshwar has three storeys of shrines under its spire. The shared parts that made this cheap, &lt;code&gt;grandStair&lt;/code&gt;, &lt;code&gt;storeyedHall&lt;/code&gt; and the cusped arch, are now available to every temple.&lt;/p&gt;




&lt;h2&gt;
  
  
  Forts and monasteries
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faudchr89nbb11k414u5o.jpg" alt="A fort gate: a passage through a gatehouse, with towers" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff2yqif5gvkroe31qnuo4.jpg" alt="A rampart and a round bastion with its crown of merlons" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc5k6m89vlsqv9vwc7mbf.jpg" alt="Tibetan monks' houses: white walls, dark windows, earth roofs" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fort gate&lt;/td&gt;
&lt;td&gt;Rampart and bastion&lt;/td&gt;
&lt;td&gt;Monks' houses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fem4rcv309o106g05u7on.jpg" alt="A gilded dharma wheel and a victory banner" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dharma wheel and victory banner&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;fortGate&lt;/code&gt; is a gatehouse with a real passage, guard niches, and leaves spiked against elephants. &lt;code&gt;towerDetail&lt;/code&gt; adds string courses and arrow slits to a round tower. &lt;code&gt;slitRow&lt;/code&gt; is a row of slits along a wall.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A gate that is only an arch painted on a wall reads as scenery. A passage you could walk reads as a fort.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the Himalayan monasteries, &lt;code&gt;tibetanBlock&lt;/code&gt; is the whitewashed mass with dark windows under a maroon band. &lt;code&gt;quarters&lt;/code&gt; dresses a list of those blocks as monks' houses: windows in black surrounds, doors, beam ends, earth roofs, prayer-flag poles. &lt;code&gt;dharmaWheel&lt;/code&gt; is the gilded wheel between two deer over an assembly hall. &lt;code&gt;gyaltsen&lt;/code&gt; is the victory banner at a roof corner, &lt;code&gt;shabkhep&lt;/code&gt; the pleated awning over a window, &lt;code&gt;parapetDiscs&lt;/code&gt; the gilded discs along a parapet. &lt;code&gt;tibetanDoor&lt;/code&gt; and &lt;code&gt;tibetanPortico&lt;/code&gt; are the painted door and the pillared porch.&lt;/p&gt;

&lt;p&gt;The ground under a hill monastery comes from &lt;code&gt;js/details/terrain.js&lt;/code&gt;: &lt;code&gt;heightField&lt;/code&gt; shapes a surface from a height function, rock where it is steep, scrub or grass where it is not, and &lt;code&gt;mountainRing&lt;/code&gt; sets a ring of mountains around a valley. That is how Tawang sits on its spur, Kailasa is cut out of a basalt escarpment, Ajanta sits in its horseshoe gorge, and Amber stands on its ridge with Jaigarh's wall above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fywd9pkoafxqjau56cmsr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fywd9pkoafxqjau56cmsr.png" alt="Kailasa Temple cut out of a basalt escarpment, procedural terrain in three.js" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  When the shared kit is not the building
&lt;/h2&gt;

&lt;p&gt;Shared parts get a monument into the right family. They do not make the Taj the Taj. The detail file is where a photograph would disagree with a generic kit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Taj Mahal.&lt;/strong&gt; Each face is a pishtaq: a deep pointed arch in a rectangular frame, roofed by a half-dome, with calligraphy in black marble and inlaid flowers in the spandrels. Smaller arched alcoves with pierced screens sit either side. The parapet carries leaf-shaped merlons, the drum a blind arcade, and the four roof chhatris have arches, an eave and a lotus cap. The minarets take three bracketed balconies. The dome's own lotus is modelled here, so the shared crown stays off. And around it all lies the charbagh, the four-quarter garden that the first version forgot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Konark.&lt;/strong&gt; The Sun Temple is a stone chariot, so the plinth is wrapped in friezes of elephants and daily life, above and below the wheels. The Jagamohana stands on carved mouldings, with an image in a niche either side of each doorway. At the steps of the Natamandira, lions rear over elephants. The horses are sculpted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8z0nkdzav22bc44yh6oi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8z0nkdzav22bc44yh6oi.png" alt="Konark Sun Temple: the chariot plinth and the Jagamohana" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hawa Mahal.&lt;/strong&gt; Each jharokha of the screen projects on a pair of small carved brackets under the sill. The white lime bands along the storeys are carved. A lotus crowns each domed kiosk. Flowering bougainvillea sits at either end of the pavement. The lattice holes stay in the shader, so the stone is still solid and the screens still cast shadows. Behind the screen there is now a court, with ranges and ramps, so the building is no longer a facade with nothing behind it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88fhhyxwbceqc4xc49dt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88fhhyxwbceqc4xc49dt.png" alt="Hawa Mahal's street front, a screen of stacked jharokhas" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;India Gate, Charminar, the Taj, the Gateway of India and the Old Parliament House carry the most of this layer: roundels, lettering, nested arches, bracketed balconies, jalis, eaves, merlons, lotus domes. The others take the carving of their own tradition. Base mouldings and image niches on the temples. Banded bastions and jharokhas on the forts. Stacked iwans and inlaid stars on the Mughal tombs. Capitals, balustrades and eaves on the colonial buildings.&lt;/p&gt;




&lt;h2&gt;
  
  
  What stands around the building
&lt;/h2&gt;

&lt;p&gt;Everything that is not the monument comes from &lt;code&gt;js/details/realism.js&lt;/code&gt;, with the animals in &lt;code&gt;js/details/animals.js&lt;/code&gt;. A part takes a list of spots, &lt;code&gt;[x, z]&lt;/code&gt; in metres. Variation comes from a seed, so a visit looks the same as the last one. &lt;code&gt;copies()&lt;/code&gt; instances the shape and marks it as dressing, which the home view ignores when it frames the building. Fifty trees are a few draw calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Twenty-one kinds of tree, one planter
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6fsoz9f5016lxn61gonk.jpg" alt="Broadleaf trees: neem, mango, jamun, tamarind, teak and sal" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhe0rcnljz5joc3xwad4.jpg" alt="Wide trees: banyan, peepal, chinar and willow" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ekmt9m50svs0zq7ixb5.jpg" alt="Dry trees: ber, babul, khejri and dhok, low and wide" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Broadleaf&lt;/td&gt;
&lt;td&gt;Wide&lt;/td&gt;
&lt;td&gt;Dry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft67ydufi575ur40uhk60.jpg" alt="Column and conifer trees: ashoka, poplar, cypress, casuarina, fir and deodar" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd3gas00u9frxwio26ewg.jpg" alt="Coconut palms" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcb7k27jl1pqvobihd36d.jpg" alt="Clipped, flowering and dry shrubs" width="640" height="420"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Columns and conifers&lt;/td&gt;
&lt;td&gt;Palms&lt;/td&gt;
&lt;td&gt;Shrubs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;trees(spots, { kind, seed, y, h })&lt;/code&gt; plants every kind. One table, &lt;code&gt;KINDS&lt;/code&gt;, holds the default height, the plain crown, the full crown, the leaf and the bark. An unknown kind throws, naming itself. Only the banyan drops aerial roots. Six silhouettes cover the twenty-one: a broadleaf, a wide broadleaf, a dry umbrella, a column, a tiered conifer, and the palm.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;What stands there&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Delhi's avenues&lt;/td&gt;
&lt;td&gt;Jamun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bodh Gaya and Sarnath&lt;/td&gt;
&lt;td&gt;Peepal, the bodhi tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kashmir&lt;/td&gt;
&lt;td&gt;Chinar, pale, on a thick trunk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ladakh, by the Indus&lt;/td&gt;
&lt;td&gt;Poplar and willow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tawang and Rumtek&lt;/td&gt;
&lt;td&gt;Fir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ajanta, and the forests&lt;/td&gt;
&lt;td&gt;Teak and sal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The south&lt;/td&gt;
&lt;td&gt;Tamarind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Konark and the Shore Temple&lt;/td&gt;
&lt;td&gt;Casuarina behind the palms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jaisalmer, Chittorgarh, the dry ridges&lt;/td&gt;
&lt;td&gt;Khejri, dhok, babul, ber&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Twelve jamun down each side of a path. The seed keeps this avenue the same on every visit.&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;trees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;along&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;185&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;along&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;185&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'jamun'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;along&lt;/code&gt; is an avenue. &lt;code&gt;scatter&lt;/code&gt; fills a rectangle and stays out of the building. &lt;code&gt;around&lt;/code&gt; is a ring.&lt;/p&gt;

&lt;p&gt;Every tree starts as a trunk and one crown. That is all a phone keeps. On a desktop, &lt;code&gt;upgradeTrees()&lt;/code&gt; replants that monument's trees with a leaning trunk, limbs, and separate leaf clumps, smallest planting first, for as long as the model stays inside its triangle budget. Palms grow fronds with leaflets. Deodars grow drooping tiers. Six specimen trees become full trees. A forest of 160 usually stays plain. Each tree also takes one of three forms of its kind, so a row is not a row of clones.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;shrubs&lt;/code&gt; has three readings. Plain is a clipped green bush. &lt;code&gt;dry: true&lt;/code&gt; is the grey-green scrub of a dry hill. &lt;code&gt;flowers: '#d0306f'&lt;/code&gt; is a dark bush with a smaller muted cap, bougainvillea or marigold, deliberately not a bush made entirely of bloom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyfb802ddzrvfsrsrzipv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyfb802ddzrvfsrsrzipv.png" alt="Jaisalmer Fort in three.js, with the small dry trees of the Thar in place of a mango orchard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lamps, flags, boats, towns
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6agucuskabjqkycdjau.jpg" alt="Heritage lamp posts, a bench, and bollards with a chain" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frd65mmrndp1j5dies9zn.jpg" alt="The blue Archaeological Survey of India board on two posts" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipjsxhf503bi6naebzha.jpg" alt="Fountain jets rising and falling into a ring of foam" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lamps, bench, bollards&lt;/td&gt;
&lt;td&gt;ASI board&lt;/td&gt;
&lt;td&gt;Fountains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2v2u0iwvchy9pegwfkbu.jpg" alt="Tibetan prayer flags in five colours" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuoor90qxdzdysdq908kw.jpg" alt="The tricolour and a saffron temple pennant" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F02rw05b7ijlfv8hrtinm.jpg" alt="Marigold garlands hung between two points" width="640" height="420"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prayer flags&lt;/td&gt;
&lt;td&gt;Tricolour and pennant&lt;/td&gt;
&lt;td&gt;Marigold garlands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;lampPosts&lt;/code&gt; are fluted iron posts with a scrolled arm and a glass lantern, lit at night. &lt;code&gt;asiBoard&lt;/code&gt; is the blue board on two posts. &lt;code&gt;fountains&lt;/code&gt; rise and fall into a ring of foam. &lt;code&gt;umbrellas&lt;/code&gt; are the cane and cloth shades on bamboo poles. &lt;code&gt;prayerFlags&lt;/code&gt; run from point to point in the five colours. &lt;code&gt;garland&lt;/code&gt; hangs marigold strands, orange and yellow. &lt;code&gt;flag&lt;/code&gt; is a rippling pennant, saffron or the Nishan Sahib. &lt;code&gt;tricolour&lt;/code&gt; is the national flag with the Ashoka Chakra.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flf1g8xa6zg0zau7vgje1.jpg" alt="Country boats, one with a curved hood" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcoino8kw5zij128wp0mm.jpg" alt="Ferry launches" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhusfwosf4w0vbn5kvrp.jpg" alt="A cargo ship with crane posts and a funnel" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Country boats&lt;/td&gt;
&lt;td&gt;Ferry launches&lt;/td&gt;
&lt;td&gt;Cargo ship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0fxxw6v55bn07s8zq2u.jpg" alt="Houseboats" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jhmvqezshsk6zw2ep63.jpg" alt="Market stalls under coloured awnings" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5028yeie0g8dodu7xha1.jpg" alt="Town houses of two to five storeys" width="640" height="420"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Houseboats&lt;/td&gt;
&lt;td&gt;Stalls&lt;/td&gt;
&lt;td&gt;Town houses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;boats&lt;/code&gt;, &lt;code&gt;launches&lt;/code&gt;, &lt;code&gt;ships&lt;/code&gt; and &lt;code&gt;houseboats&lt;/code&gt; take a water height, so a boat floats on its lake. &lt;code&gt;stalls&lt;/code&gt; stand outside temple gates and in Laad Bazaar at Charminar. &lt;code&gt;townHouses&lt;/code&gt; builds two to five storeys with windows, doors and shop signs. &lt;code&gt;tanks&lt;/code&gt; is the share of flat roofs that carry a black water tank, 0.7 by default and 0.15 in the fort town at Jaisalmer. &lt;code&gt;cityAround&lt;/code&gt; lines streets on every side of a rectangle and leaves the roads in &lt;code&gt;keep&lt;/code&gt; open. At Puri, two rows of houses stand outside Jagannath's outer wall, and the Grand Road stays clear.&lt;/p&gt;

&lt;p&gt;Towns are the change I like most. Kedarnath has its pilgrim town along the stone path. Tirumala has the temple town round its Mada streets. Varanasi's old city wraps the Kashi Vishwanath corridor, and Ujjain's old town sits beyond Mahakaleshwar. The Gateway of India has Elephanta ferry launches and ships at anchor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9gs9bwt4l0dguxofzdf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9gs9bwt4l0dguxofzdf.png" alt="Gateway of India with ferry launches and ships on the water, in the browser" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyc1l7fbdynodrmuthsx5.jpg" alt="Cars, taxis and buses on a bridge roadway" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Traffic on the two bridges that have it&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;traffic&lt;/code&gt; runs only on the Howrah Bridge and the Bandra–Worli Sea Link. There are no motor vehicles anywhere else, and no people at all, so the monument stays the subject.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animals
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0n2w3t9zje37vet88xzj.jpg" alt="Nandi, the seated bull" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjhanweqx6rfyg0bv689.jpg" alt="Elephants, one plain and one with cloth and a howdah" width="640" height="420"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32gp5hyjx9zabo2b3pdl.jpg" alt="A horse and a seated lion" width="640" height="420"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nandi&lt;/td&gt;
&lt;td&gt;Elephants&lt;/td&gt;
&lt;td&gt;Horse and lion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1e2i84vqp6j98ldcipx.jpg" alt="Deer" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd18vk7gpf8ui3wi0cssj.jpg" alt="Yaks and camels in saddle cloths" width="640" height="420"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deer&lt;/td&gt;
&lt;td&gt;Yaks and camels&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;nandi&lt;/code&gt; sits before a Shiva temple. &lt;code&gt;elephant&lt;/code&gt; can be stone or bronze. &lt;code&gt;rideElephant&lt;/code&gt; adds cloth and a howdah. &lt;code&gt;lion&lt;/code&gt; is a gate guardian, and the Lion Capital. &lt;code&gt;deer&lt;/code&gt; stand at Sarnath and Sikandra. &lt;code&gt;yaks&lt;/code&gt; are in the mountains. &lt;code&gt;camels&lt;/code&gt; wear saddle cloths in the Thar. &lt;code&gt;horse&lt;/code&gt;, scaled down, is the ponies at Kedarnath. The larger animals are one continuous skin, heavier than the rest of the kit, and the slowest of them are meshed while the map sits idle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ground, water, and the shade at a wall's foot
&lt;/h3&gt;

&lt;p&gt;The first scenery was generous, and often invented. Mango and coconut stood in the desert. Pools sat where the ground is grass. A lawn ended like a tile.&lt;/p&gt;

&lt;p&gt;Water was put back where the site has it, and taken out where it had been added. The Tungabhadra runs north of Hampi's Vittala compound, palms on its bank. A stone-rimmed lotus pond lies south of the Mahabodhi railing. The Shahi Baoli stands east of the Bara Imambara, a walled stepwell through an arched gate. Ramappa's lake lies beyond the temple garden. India Gate lost the canals at its piers. Jallianwala Bagh's flame stands on the grass. Rameswaram's sea sits east of the temple, in the town. Maota Lake at Amber mirrors the fort.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bnuy2bqkrriyxsa9kge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bnuy2bqkrriyxsa9kge.png" alt="Amber Fort reflected in Maota Lake, rendered in three.js" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paths are flagstones. Courses are 70 cm deep, stones are 1.1 m long, every third course is half-length, and the courses shift so no joint runs straight through. Each stone has its own tone. Far off, the joints drop away and the floor stays slightly mottled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;wdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;0.55&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;xo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.37&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A wall meets the grass in shade, not in a hard line. When a monument is shown, it is drawn once from straight above into a 512×512 height map (&lt;code&gt;groundShade&lt;/code&gt; in &lt;code&gt;js/surface.js&lt;/code&gt;). Upward faces darken where that blur stands well above them. Trees are left out of the pass, because they already cast shadows. It runs on phones too.&lt;/p&gt;

&lt;p&gt;Ceremonial lawns stay mown: India Gate, the Taj, Victoria, the National War Memorial, both Parliaments. Elsewhere, desktops get grass tufts under about 0.35 m, kept 4 m clear of the monument and off any path.&lt;/p&gt;

&lt;p&gt;Close to a building, the camera casts a ray toward its target. If it has entered a solid it steps back out, and it keeps about 1.5 m off a wall in front of it. The home view frames the monument, not the lawns around it, and fifteen monuments open on the view of their best-known photograph: the Taj down its garden, the Red Fort's Lahori Gate, Meenakshi's south gopuram, Hawa Mahal's street front.&lt;/p&gt;

&lt;p&gt;At night, floodlights and festival lights come on and stars fill the sky. Press the Night button on any monument to see it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4c6e9qauki9fr9uxjdpd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4c6e9qauki9fr9uxjdpd.gif" alt="The Taj Mahal switching between day and night" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Stone that catches the light
&lt;/h2&gt;

&lt;p&gt;The shader still paints joints, veins, brick courses, weathering and a slight tint per piece, from world position, so nothing has to be unwrapped. A one-metre block is the same size on the Qutub Minar as on the walls of Agra Fort. Over that, most stones carry a CC0 photograph from Poly Haven: marble, red and cream sandstone, granite, laterite, dark coursed blocks, fort rubble, plaster, lime, khondalite, concrete and weathered planks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqyz45o3v9m2f5dyklev.png" alt="Taj Mahal marble in three.js" width="800" height="450"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fldjubgfiwugdbmw48ehe.png" alt="Agra Fort red sandstone in three.js" width="800" height="450"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakymrmfg2fl8v760f8xg.png" alt="Brihadeeswara Temple granite in three.js" width="800" height="450"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Marble&lt;/td&gt;
&lt;td&gt;Red sandstone&lt;/td&gt;
&lt;td&gt;Granite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each set has a normal map and a roughness map beside the colour, packed by &lt;code&gt;tools/pack-textures.py&lt;/code&gt;. On a desktop the shader projects them the same way as the colour, so the stone catches the light as a rough surface. Phones keep the colour map. A set is fetched the first time a monument that uses it is opened, not all of them at startup.&lt;/p&gt;

&lt;p&gt;On top of the stone comes the ornament. The Taj gets black calligraphy bands round its pishtaqs. Itmad-ud-Daulah gets pietra dura over its walls, towers and pavilion. CSMT gets buff stone coursed with blue-grey basalt. Rani ki Vav gets sculpted panels on its side walls. All of it lives in the shader, so the mesh stays a wall.&lt;/p&gt;

&lt;p&gt;Shadows follow the view. The shadow map used to cover a fixed box around the whole monument, so on a large site one texel was most of a metre. It now stays about three-quarters of the camera's distance from its target, changes in steps so the shadows do not crawl, and is redrawn only when a step is crossed. Desktops start at full sharpness and step down for that visit if the frame rate cannot hold.&lt;/p&gt;

&lt;p&gt;On a phone, below 760 px wide, ambient occlusion and reflections are skipped. Trees stay plain, the ground has no tufts, towns and traffic are thinned, and the heavier carving waits. &lt;code&gt;?detail=high&lt;/code&gt; or &lt;code&gt;?detail=low&lt;/code&gt; on the address chooses.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I checked the work, and what went wrong
&lt;/h2&gt;

&lt;p&gt;Procedural models fail in a particular way: they look fine from the home view and wrong from two metres away. So most of the second pass was checking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Photograph reviews.&lt;/strong&gt; I went through the monuments in batches and compared each model with photographs of the real building. That is how the Taj, Charminar, the Lotus Temple, Mahabodhi and the Hawa Mahal got their fixes, and how a handful of near-misses were found and closed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full audits.&lt;/strong&gt; After the photo reviews I went round the whole set again, in groups: views and land forms, mountains and towns, then framing, missing pieces and flicker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Headless checks.&lt;/strong&gt; The scripts in &lt;code&gt;tools/&lt;/code&gt; run in Node and Playwright and check triangle budgets, heights, filters, flicker and detail counts. They stop a regression from hiding in monument number 87.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Things that went wrong along the way, as I found them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flicker.&lt;/strong&gt; Two faces on the same plane fight over the pixel. Windows, glazing and sea were all guilty. &lt;code&gt;check-flicker.mjs&lt;/code&gt; finds them, and the rule is now that an overlay sits 2 to 5 cm off its wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dark seam&lt;/strong&gt; at the foot of sculpted hills, where the land met the ground.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A black reflection pixel&lt;/strong&gt; on the Bandra–Worli Sea Link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eleven models that were too tall&lt;/strong&gt; for their real heights, brought back within them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Water and trees that were simply invented.&lt;/strong&gt; The first scenery was generous. The mango orchard in the desert was the most photogenic of the lot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also made some deliberate cuts. The jali holes are not modelled, because 101 buildings of them would never fit the triangle budget. People are not in the scenes, and motor vehicles appear only on the two bridges that have traffic, so the monument stays the subject.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I would still not claim
&lt;/h2&gt;

&lt;p&gt;These are interpretations, not survey records. The goal is that someone who knows the building can see its plan, its material and its setting, and that someone who does not can tell a gopuram from a shikhara, and Konark from a generic temple.&lt;/p&gt;

&lt;p&gt;The rule from the second pass is small. Repeated joinery lives in one shared part, which is why the pictures above are a catalogue and not 101 separate models. The thing that makes a monument itself lives in that monument's file. The tree and the water are the ones the site's own notes name. A new dome profile does not need a new texture unwrap. A new tree is one row in &lt;code&gt;KINDS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you know a building well and see something wrong, I would like to hear it. &lt;a href="https://github.com/amananandrai/monuments-of-india/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt; with a photograph or a source, and it becomes the next fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Add your own monument
&lt;/h2&gt;

&lt;p&gt;Adding another monument is still one module and one card in &lt;code&gt;js/data.js&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;js/monuments/&amp;lt;name&amp;gt;.js&lt;/code&gt; with the masses: plinth, walls, towers, roofs.&lt;/li&gt;
&lt;li&gt;Add its card to &lt;code&gt;js/data.js&lt;/code&gt;: name, place, dates, style, material and a few facts.&lt;/li&gt;
&lt;li&gt;Optionally add &lt;code&gt;js/details/&amp;lt;name&amp;gt;.js&lt;/code&gt; with &lt;code&gt;addDetails(f, g)&lt;/code&gt; for the finer architecture and the setting. Reuse the shared parts first.&lt;/li&gt;
&lt;li&gt;Run the checks in &lt;code&gt;tools/&lt;/code&gt; (budgets, heights, flicker). See &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/tools/README.md" rel="noopener noreferrer"&gt;&lt;code&gt;tools/README.md&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The code is MIT licensed, so you are free to use it, learn from it and build on it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Explore: &lt;a href="https://monuments-of-india-nu.vercel.app" rel="noopener noreferrer"&gt;monuments-of-india-nu.vercel.app&lt;/a&gt;. Open &lt;a href="https://monuments-of-india-nu.vercel.app/#taj-mahal" rel="noopener noreferrer"&gt;&lt;code&gt;#taj-mahal&lt;/code&gt;&lt;/a&gt;, then &lt;a href="https://monuments-of-india-nu.vercel.app/#konark-sun-temple" rel="noopener noreferrer"&gt;&lt;code&gt;#konark-sun-temple&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://monuments-of-india-nu.vercel.app/#hawa-mahal" rel="noopener noreferrer"&gt;&lt;code&gt;#hawa-mahal&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://monuments-of-india-nu.vercel.app/#jaisalmer-fort" rel="noopener noreferrer"&gt;&lt;code&gt;#jaisalmer-fort&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The guides, with every part: &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/components.md" rel="noopener noreferrer"&gt;components&lt;/a&gt;, &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/architecture.md" rel="noopener noreferrer"&gt;architecture&lt;/a&gt;, &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/realism.md" rel="noopener noreferrer"&gt;the setting&lt;/a&gt;, &lt;a href="https://github.com/amananandrai/monuments-of-india/blob/main/how-it-is-drawn.md" rel="noopener noreferrer"&gt;how it is drawn&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you found this helpful, or you like the project, &lt;a href="https://github.com/amananandrai/monuments-of-india" rel="noopener noreferrer"&gt;star the repo on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which building still looks least like itself? Tell me in the comments. That is the next detail file.&lt;/p&gt;




&lt;p&gt;The component pictures are rendered from the repo by &lt;code&gt;tools/shoot-components.mjs&lt;/code&gt;. The project's code is MIT licensed, and so is three.js. Photo textures are CC0 from &lt;a href="https://polyhaven.com" rel="noopener noreferrer"&gt;Poly Haven&lt;/a&gt;. Map data is public domain from &lt;a href="https://www.naturalearthdata.com" rel="noopener noreferrer"&gt;Natural Earth&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>threejs</category>
      <category>showdev</category>
      <category>webgl</category>
    </item>
    <item>
      <title>LLMs Aren’t the Only Game in Town: A Beginner’s Guide to JEPA, Concept Models and Decision Models</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Tue, 10 Nov 2026 18:52:51 +0000</pubDate>
      <link>https://dev.to/amananandrai/llms-arent-the-only-game-in-town-a-beginners-guide-to-jepa-concept-models-and-decision-models-48dp</link>
      <guid>https://dev.to/amananandrai/llms-arent-the-only-game-in-town-a-beginners-guide-to-jepa-concept-models-and-decision-models-48dp</guid>
      <description>&lt;p&gt;Last week I asked a teammate, "Is the build green?"&lt;/p&gt;

&lt;p&gt;He replied with four paragraphs. There was context. There was a history of the CI pipeline. There was a philosophical aside about flaky tests. Somewhere in paragraph three was the word "yes".&lt;/p&gt;

&lt;p&gt;That, in one office anecdote, is how we use large language models today. We have a machine that is wonderful at writing, and we keep asking it questions whose answer is one word.&lt;/p&gt;

&lt;p&gt;This post is a tour of the models that do something other than write one token after another: &lt;strong&gt;concept models&lt;/strong&gt;, &lt;strong&gt;JEPA&lt;/strong&gt;, &lt;strong&gt;diffusion language models&lt;/strong&gt; and &lt;strong&gt;decision models&lt;/strong&gt;. No maths degree required. Bring chai.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjfgox7kpzazbq7wlxqzf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjfgox7kpzazbq7wlxqzf.gif" alt="Animated: an LLM types word by word, a concept model drops in whole sentences, and a decision model flips one switch and is finished" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First, what is "next-token prediction"?
&lt;/h2&gt;

&lt;p&gt;Your phone keyboard suggests the next word as you type. An LLM is that idea with a gym membership and a few billion parameters.&lt;/p&gt;

&lt;p&gt;It reads everything so far, guesses the most likely next &lt;em&gt;token&lt;/em&gt; (a word or a piece of one), adds it to the text, and then does the whole thing again. And again. A 500-word answer is roughly 700 tiny guesses in a row.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpcto8mzykwf6ij1mypt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpcto8mzykwf6ij1mypt.gif" alt="Animated: an LLM picks the next token from a list of candidates, appends it, and repeats" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
This works absurdly well. It gave us chatbots, coding assistants and an entire genre of LinkedIn posts. But it has three built-in quirks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It is slow by design.&lt;/strong&gt; One token per trip through the network. A long answer is a long queue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It thinks at the smallest unit.&lt;/strong&gt; Imagine planning a holiday letter by letter. "G... o... a..." You would never get to the beach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It always writes.&lt;/strong&gt; Even when your code only wanted &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, you get prose, and then you write a parser to dig the answer back out.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each alternative below attacks one of these quirks.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Large Concept Models: think in sentences
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The story.&lt;/strong&gt; My grandmother does not cook letter by letter. Her recipe in her head is "make the tadka, add the dal, simmer". Each step is a whole idea. The exact words come later, and she can say them in three languages depending on who is in the kitchen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea.&lt;/strong&gt; In December 2024, Meta published &lt;a href="https://arxiv.org/abs/2412.08821" rel="noopener noreferrer"&gt;Large Concept Models&lt;/a&gt;. Instead of predicting the next token, the model predicts the next &lt;em&gt;concept&lt;/em&gt;, where a concept is roughly one sentence squeezed into a single vector.&lt;/p&gt;

&lt;p&gt;It works in three steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An encoder called SONAR turns each sentence into a vector.&lt;/li&gt;
&lt;li&gt;The concept model looks at the vectors so far and predicts the &lt;em&gt;next vector&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;A decoder turns that vector back into words.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvx3buw6r4z7ha9e91uvo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvx3buw6r4z7ha9e91uvo.png" alt="Diagram: sentences go through a frozen SONAR encoder, the Large Concept Model predicts the next concept vector, and a frozen decoder turns it into English, Spanish or Japanese" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The neat part is that the vector does not belong to any language. SONAR covers about 200 languages for text, so the same predicted idea can be decoded into English, Spanish or Japanese without running the model again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plans at the level of ideas, which is closer to how people outline before they write.&lt;/li&gt;
&lt;li&gt;Language-agnostic by construction. Low-resource languages get a ride for free.&lt;/li&gt;
&lt;li&gt;Long documents become short sequences, since one sentence is one step.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The catch.&lt;/strong&gt; This is research, not a product you can call from your app. The paper itself notes that sentence vectors can be fragile (a tiny nudge can decode into a different sentence), and for very short sentences an ordinary LLM is actually cheaper.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. JEPA: predict the meaning, not the pixels
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The story.&lt;/strong&gt; You are crossing a busy road. An auto-rickshaw is approaching. Your brain predicts "that thing will be &lt;em&gt;here&lt;/em&gt; in two seconds". It does not predict the exact pattern of dust on its windshield or which way each leaf on the roadside tree will flutter. If it tried, you would still be standing on the kerb next Tuesday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea.&lt;/strong&gt; JEPA stands for Joint-Embedding Predictive Architecture, a line of work Yann LeCun proposed in 2022. The pitch is simple: do not make a model reconstruct raw data. Make it predict the &lt;em&gt;representation&lt;/em&gt; of the missing part.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fya9jclwu1hnrp4g3q1ca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fya9jclwu1hnrp4g3q1ca.png" alt="Diagram: a generative model repaints every hidden pixel, while JEPA predicts an embedding of the hidden patch and compares it with the real embedding" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hide a patch of an image. A generative model is graded on repainting every pixel. A JEPA model is graded on whether its &lt;em&gt;summary&lt;/em&gt; of the hidden patch matches the real summary. Unpredictable details simply stop mattering.&lt;/p&gt;

&lt;p&gt;The family so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I-JEPA&lt;/strong&gt; (2023): images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V-JEPA&lt;/strong&gt; (2024): video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ai.meta.com/vjepa/" rel="noopener noreferrer"&gt;V-JEPA 2&lt;/a&gt;&lt;/strong&gt; (June 2025): a 1.2-billion-parameter model trained on more than a million hours of video. After just 62 hours of robot footage, it could plan pick-and-place moves for a robot arm on objects it had never seen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://arxiv.org/abs/2509.14252" rel="noopener noreferrer"&gt;LLM-JEPA&lt;/a&gt;&lt;/strong&gt; (September 2025): brings the trick to language. It keeps normal next-token training and &lt;em&gt;adds&lt;/em&gt; a JEPA term. For example, a bug description and the code that fixes it are two views of the same thing, so their representations should be predictable from each other. The extra work happens only during training; the finished model runs at the usual speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The "world model" argument.&lt;/strong&gt; LeCun's long-running claim is that a system which only predicts the next word never has to learn how the world behaves. A toddler knows a dropped spoon falls long before she can say "gravity". A world model learns that kind of physics by watching, then uses it to imagine "if I do this, that happens" before acting. That is planning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learns the gist and ignores noise, so it needs less hand-labelled data.&lt;/li&gt;
&lt;li&gt;A natural fit for robots and anything that must predict consequences.&lt;/li&gt;
&lt;li&gt;LLM-JEPA shows the idea can improve ordinary LLMs without slowing them down at run time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The catch.&lt;/strong&gt; You cannot chat with V-JEPA. It does not produce text. Today it is a research direction for long-horizon planning, not a drop-in API.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Diffusion language models: develop the whole photo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The story.&lt;/strong&gt; Remember Polaroid photos? The picture does not print from left to right. The whole thing appears as a grey blur and sharpens everywhere at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea.&lt;/strong&gt; A diffusion language model starts with a full-length answer made of noise and cleans up the &lt;em&gt;entire&lt;/em&gt; sequence over a handful of passes. Many tokens are fixed in parallel rather than one after another.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzhw7oswk734ror3akac5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzhw7oswk734ror3akac5.gif" alt="Animated: the same sentence typed left to right by a classic LLM, and resolved all at once from noise by a diffusion model" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the same family of technique behind image generators, pointed at text. Inception Labs shipped the first commercial one, Mercury, in early 2025, and Google showed an experimental Gemini Diffusion that May. In February 2026 Inception released &lt;a href="https://the-decoder.com/inception-launches-mercury-2-the-first-diffusion-based-language-reasoning-model/" rel="noopener noreferrer"&gt;Mercury 2&lt;/a&gt;, claiming about 1,000 tokens per second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speed. Parallel refinement is the whole point.&lt;/li&gt;
&lt;li&gt;It can revise the middle of a text, not only append to the end. Handy for editing and code infill.&lt;/li&gt;
&lt;li&gt;Still a real language model: you get normal text out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The catch.&lt;/strong&gt; Speed numbers come from the vendors, and a "tokens per second" figure means little without the test conditions. One independent test &lt;a href="https://runtimewire.com/article/inception-mercury-2-5-diffusion-language-model-launch" rel="noopener noreferrer"&gt;measured Mercury 2 at a median of 324 tokens per second&lt;/a&gt;, well under the headline. Tooling around diffusion models is also younger.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Decision models: just give me the verdict
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The story.&lt;/strong&gt; In cricket, when a run-out goes upstairs, the third umpire watches the replay and the big screen shows two words: OUT or NOT OUT. Nobody in the stadium wants an essay. Forty thousand people want a decision, quickly, and ideally a correct one.&lt;/p&gt;

&lt;p&gt;Psychologist Daniel Kahneman called this fast, intuitive mode of thought &lt;strong&gt;System 1&lt;/strong&gt;, as opposed to slow, deliberate &lt;strong&gt;System 2&lt;/strong&gt;. Catching a ball is System 1. Filing taxes is System 2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea.&lt;/strong&gt; On 15 September 2026, &lt;a href="https://typesafe.ai/" rel="noopener noreferrer"&gt;TypeSafe AI&lt;/a&gt; released &lt;strong&gt;Jev&lt;/strong&gt; and described it as a "System One" model. It does not generate text at all. You send it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;state&lt;/strong&gt; (some text or JSON), and&lt;/li&gt;
&lt;li&gt;one or more &lt;strong&gt;typed questions&lt;/strong&gt; defined in code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It returns typed answers with probabilities, in a single pass. All the questions are answered in parallel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fspc1c7ljusejwfzybvcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fspc1c7ljusejwfzybvcj.png" alt="Diagram: a support ticket and three typed questions go into Jev, and typed answers with probabilities come out: team billing 0.93, urgency 4 of 5, angry 0.97" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The &lt;a href="https://docs.typesafe.ai/introduction" rel="noopener noreferrer"&gt;docs&lt;/a&gt; list a few question types: &lt;code&gt;Choice&lt;/code&gt; (pick one option from a set), &lt;code&gt;Score&lt;/code&gt; (a number on a scale) and &lt;code&gt;Noul&lt;/code&gt; (their name for a yes/no answer expressed as a probability between 0 and 1). In spirit, your code ends up looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Sketch of the idea, not the real SDK. See TypeSafe's quick start for actual syntax.&lt;/span&gt;
&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"ticket"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"I was charged twice and nobody is replying!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;questions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"bugs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"other"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"urgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"angry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Noul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"billing"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;angry&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;page_a_human&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No prompt engineering, no "respond ONLY in JSON, I am begging you", no regex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where people use it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routing between LLMs.&lt;/strong&gt; Is this request easy enough for the cheap model, or does it need the expensive one?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checking an agent's next action.&lt;/strong&gt; Before the agent runs &lt;code&gt;DROP TABLE users&lt;/code&gt;, ask a fast model: is this safe?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classification inside software.&lt;/strong&gt; Spam or not, which queue, how severe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A fun detail.&lt;/strong&gt; The name comes from the economist William Stanley Jevons. His paradox: when steam engines got more efficient, Britain burned &lt;em&gt;more&lt;/em&gt; coal, not less, because coal power became worth using everywhere. TypeSafe's bet is the same for decisions. Make one cheap enough and software will make a lot more of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast: TypeSafe reports 70 to 500 milliseconds per call.&lt;/li&gt;
&lt;li&gt;Output your code can branch on directly, with a probability attached so you can set thresholds.&lt;/li&gt;
&lt;li&gt;Cheap at high volume.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The catch.&lt;/strong&gt; It only works when you can list the possible answers in advance. It cannot explain itself, write, or reason through a brand-new problem. The headline comparisons are also TypeSafe's own, and the company itself flags limits in its benchmark, such as building the test workflows in-house. Treat it as early access, because it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The timeline: how we got here
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F020ovethkvu3y4yhc6q2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F020ovethkvu3y4yhc6q2.png" alt="Timeline from the 2017 Transformer through GPT-3, the JEPA proposal, ChatGPT, I-JEPA, V-JEPA, Large Concept Models, Mercury, V-JEPA 2, LLM-JEPA, Mercury 2 and Jev in September 2026" width="800" height="1070"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read it as a story in three acts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;2017 to 2022: one unit to rule them all.&lt;/strong&gt; The Transformer arrives, and predicting the next token turns out to scale further than anyone expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2022 to 2025: "should we predict something else?"&lt;/strong&gt; LeCun argues for predicting representations. JEPA moves from images to video to robots. Meta tries sentences as the unit. Inception tries the whole sequence at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2025 to 2026: mix and match.&lt;/strong&gt; LLM-JEPA blends two training goals in one model. Decision models drop text entirely for the jobs that never needed it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice that nobody on this timeline killed the Transformer. Most of these models still use it inside. What changed is the question we ask it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheat sheet: what each approach buys you
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Predicts&lt;/th&gt;
&lt;th&gt;Main benefit&lt;/th&gt;
&lt;th&gt;Main catch&lt;/th&gt;
&lt;th&gt;Status in 2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Next-token LLM&lt;/td&gt;
&lt;td&gt;The next token&lt;/td&gt;
&lt;td&gt;Writes and reasons about almost anything&lt;/td&gt;
&lt;td&gt;Slow, wordy, costly for tiny jobs&lt;/td&gt;
&lt;td&gt;Everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large Concept Model&lt;/td&gt;
&lt;td&gt;The next sentence-sized idea&lt;/td&gt;
&lt;td&gt;Plans in ideas, works across languages&lt;/td&gt;
&lt;td&gt;Fragile vectors, research code&lt;/td&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JEPA / world model&lt;/td&gt;
&lt;td&gt;The representation of what is missing or next&lt;/td&gt;
&lt;td&gt;Learns the gist, enables planning&lt;/td&gt;
&lt;td&gt;No text output&lt;/td&gt;
&lt;td&gt;Research, early robotics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM-JEPA&lt;/td&gt;
&lt;td&gt;Tokens, plus a representation term in training&lt;/td&gt;
&lt;td&gt;Better representations at no run-time cost&lt;/td&gt;
&lt;td&gt;Extra training cost&lt;/td&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diffusion LM&lt;/td&gt;
&lt;td&gt;The whole sequence, refined in passes&lt;/td&gt;
&lt;td&gt;Very fast generation, easy mid-text edits&lt;/td&gt;
&lt;td&gt;Younger tooling, vendor-reported speeds&lt;/td&gt;
&lt;td&gt;Commercial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision model&lt;/td&gt;
&lt;td&gt;A typed answer with probabilities&lt;/td&gt;
&lt;td&gt;Milliseconds, cheap, no parsing&lt;/td&gt;
&lt;td&gt;Only for answers you can enumerate&lt;/td&gt;
&lt;td&gt;Early access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pick the right model for the job
&lt;/h2&gt;

&lt;p&gt;Twelve everyday tasks. Before the animation sorts them, try guessing where each one goes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft06fdm8ikcojoffh3c35.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft06fdm8ikcojoffh3c35.gif" alt="Animated: twelve tasks are sorted one by one into four bins: LLM, decision model, diffusion LM, and concept or world model" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Answer key (static version)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frt8ubtpbnlvrskd5oy3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frt8ubtpbnlvrskd5oy3b.png" alt="The twelve tasks sorted into their four bins" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rule of thumb that falls out of this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Can you list every possible answer in advance?&lt;/strong&gt; Use a decision model or a small classifier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you need real text, right now?&lt;/strong&gt; Look at a diffusion LM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the answer open-ended or does it need actual thinking?&lt;/strong&gt; That is still an LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it need planning many steps ahead in the physical world?&lt;/strong&gt; That is where concept and world models are heading, and it is still research.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuihwg4f3ftogssgixtsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuihwg4f3ftogssgixtsc.png" alt="Map with two axes, how open-ended the answer is and how fast it must be: decision models and small classifiers bottom left, diffusion LMs bottom right, LLMs upper right, concept and world models in the research corner" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In practice these team up. A decision model at the front door routes each request, an LLM writes the hard answers, and another quick decision checks the result before it ships. System 1 and System 2, sharing a desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers: latency and cost
&lt;/h2&gt;

&lt;p&gt;Two charts, both built only from figures the vendors or their cited benchmarks have published. Dates are on the charts because these numbers age like milk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8n2j6ec2fse4mlueezcu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8n2j6ec2fse4mlueezcu.png" alt="Bar chart on a log scale: Jev 70 to 500 milliseconds, Mercury 2 at 1.7 seconds, Gemini 3 Flash at 14.4 seconds, Claude Haiku 4.5 with reasoning at 23.4 seconds, frontier LLMs on agent workflows 3 to 329 seconds" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fksgi658pv6bit917mrvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fksgi658pv6bit917mrvq.png" alt="Bar chart of price per million tokens: Jev 0.042 dollars input with free output, Mercury 2 at 0.25 and 0.75, Gemini 3 Flash at 0.50 and 3.00, Claude Haiku 4.5 at 1.00 and 5.00" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please read these with one eyebrow raised:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They are &lt;strong&gt;not the same test&lt;/strong&gt;. Jev's figure is for returning a decision. The LLM figures are for generating a full answer. Comparing them is like timing a nod against a speech, which is rather the point, but it is not a benchmark.&lt;/li&gt;
&lt;li&gt;They are &lt;strong&gt;vendor-reported&lt;/strong&gt;. Mercury 2's comparison numbers come from Inception. The 3-to-329-second range comes from a benchmark TypeSafe cites.&lt;/li&gt;
&lt;li&gt;Prices change. Check the pricing pages before you put anything in a spreadsheet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest takeaway is about orders of magnitude: a bounded decision can come back in a fraction of a second, fast generation in a second or two, and a reasoning answer in many seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, is the LLM dead?
&lt;/h2&gt;

&lt;p&gt;No. Put the pitchfork down.&lt;/p&gt;

&lt;p&gt;LLMs remain the best tool we have for open-ended writing and reasoning. What is ending is the habit of using them for &lt;em&gt;everything&lt;/em&gt;. We do not hire a novelist to operate a light switch.&lt;/p&gt;

&lt;p&gt;The mental model I would keep:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Words needed?&lt;/strong&gt; LLM, or a diffusion LM if speed matters most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A verdict needed?&lt;/strong&gt; Decision model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A plan needed?&lt;/strong&gt; Watch the concept and world model research. It is not ready for your sprint, but it is where the interesting papers are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the next time someone asks whether the build is green, consider answering like a decision model: "Yes. 0.97."&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2412.08821" rel="noopener noreferrer"&gt;Large Concept Models: Language Modeling in a Sentence Representation Space&lt;/a&gt; (Meta, December 2024)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.infoq.com/news/2025/01/meta-large-concept-model" rel="noopener noreferrer"&gt;InfoQ on Large Concept Models&lt;/a&gt; (January 2025)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai.meta.com/vjepa/" rel="noopener noreferrer"&gt;V-JEPA 2&lt;/a&gt; (Meta, June 2025)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2509.14252" rel="noopener noreferrer"&gt;LLM-JEPA: Large Language Models Meet Joint Embedding Predictive Architectures&lt;/a&gt; (Huang, LeCun, Balestriero, September 2025)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://the-decoder.com/inception-launches-mercury-2-the-first-diffusion-based-language-reasoning-model/" rel="noopener noreferrer"&gt;Mercury 2 launch coverage&lt;/a&gt; (The Decoder, February 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://runtimewire.com/article/inception-mercury-2-5-diffusion-language-model-launch" rel="noopener noreferrer"&gt;Mercury 2.5 and the caveats on speed claims&lt;/a&gt; (Runtime Wire, 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://typesafe.ai/" rel="noopener noreferrer"&gt;TypeSafe AI&lt;/a&gt; and the &lt;a href="https://docs.typesafe.ai/introduction" rel="noopener noreferrer"&gt;Jev documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.digitalocean.com/resources/articles/what-is-jev" rel="noopener noreferrer"&gt;What is Jev?&lt;/a&gt; (DigitalOcean, 2026) and &lt;a href="https://www.truefoundry.com/blog/typesafe-ai-jev" rel="noopener noreferrer"&gt;TrueFoundry's analysis&lt;/a&gt; for latency, pricing and benchmark caveats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Which of these would you actually put in production first? Tell me in the comments. One-word answers are welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>From Attention to 3-Bit Caches: How LLMs Learned to Remember Less (MHA, GQA, MLA, MoE, Quantisation Explained)</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Tue, 10 Nov 2026 18:42:22 +0000</pubDate>
      <link>https://dev.to/amananandrai/from-attention-to-3-bit-caches-how-llms-learned-to-remember-less-mha-gqa-mla-moe-quantisation-3obj</link>
      <guid>https://dev.to/amananandrai/from-attention-to-3-bit-caches-how-llms-learned-to-remember-less-mha-gqa-mla-moe-quantisation-3obj</guid>
      <description>&lt;p&gt;In 2017, eight researchers published a paper with the cockiest title in computer science: &lt;em&gt;Attention Is All You Need&lt;/em&gt;. They were right, with one small footnote that took the rest of the industry nine years to work through:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Attention is all you need. Also 16 GB of memory per conversation, a warehouse of GPUs, and a power plant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This post is the story of that footnote. We'll start from zero (what attention even is), then follow the trail of clever hacks that turned a research toy into the chatbots you use every day: KV caches, grouped and latent attention, FlashAttention, mixture of experts, ZeRO, distillation and quantisation.&lt;/p&gt;

&lt;p&gt;No PhD needed. If you can follow a restaurant analogy, you can follow this. There is a little maths, clearly marked, and you can skip every formula without losing the plot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's inside&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Attention in five minutes&lt;/li&gt;
&lt;li&gt;The KV cache: a waiter's notepad that ate the restaurant&lt;/li&gt;
&lt;li&gt;The evolution of attention: MHA → MQA → GQA → MLA → LRKV&lt;/li&gt;
&lt;li&gt;Taming the KV cache: three families of tricks&lt;/li&gt;
&lt;li&gt;Mixture of experts: stop asking the dentist about your taxes&lt;/li&gt;
&lt;li&gt;Scaling training: parallelism, ZeRO and FSDP&lt;/li&gt;
&lt;li&gt;Distillation: a small model that copied the topper's notes&lt;/li&gt;
&lt;li&gt;Quantisation: FP8, FP4 and TurboQuant&lt;/li&gt;
&lt;li&gt;So how did all this make GPT-style models better?&lt;/li&gt;
&lt;li&gt;The timeline&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Attention in five minutes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The cocktail party
&lt;/h3&gt;

&lt;p&gt;You're at a noisy party. Twenty conversations are happening at once, and yet when someone across the room says your name, your brain snaps to it. You didn't listen to everyone equally. You gave most of your attention to the few voices that mattered.&lt;/p&gt;

&lt;p&gt;That is the whole idea. When a language model reads a sentence, every word looks at every other word and decides how much each one matters &lt;em&gt;to it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Take the sentence: &lt;em&gt;"The cat sat on the mat because it was tired."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What does "it" mean? You know it's the cat (mats rarely get tired). A model works this out by letting "it" pay most of its attention to "cat".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F840n0xl706wyknzh7je0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F840n0xl706wyknzh7je0.png" alt="Attention weights for the word &amp;quot;it&amp;quot;: most of the attention goes to &amp;quot;cat&amp;quot;" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Query, Key, Value: attention as a search engine
&lt;/h3&gt;

&lt;p&gt;How does a word decide who matters? Each word carries three little vectors (lists of numbers):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Query&lt;/strong&gt;: "here's what I'm looking for"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key&lt;/strong&gt;: "here's what I am"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value&lt;/strong&gt;: "here's what I'll tell you if you pick me"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of a library. Your query is the question in your head. Every book has a key (the label on the spine) and a value (the contents). You compare your question with every spine, then read mostly from the books that match best.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbh1gvrj3qc6adjbsixbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbh1gvrj3qc6adjbsixbt.png" alt="Query, key and value illustrated with the word &amp;quot;it&amp;quot; searching for its noun" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember &lt;strong&gt;keys&lt;/strong&gt; and &lt;strong&gt;values&lt;/strong&gt;. They are the main characters of the next three sections, and also the reason your GPU is sweating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-head attention: a panel of specialists
&lt;/h3&gt;

&lt;p&gt;One round of attention only catches one kind of relationship. So transformers run many in parallel, called &lt;strong&gt;heads&lt;/strong&gt;. One head might track grammar, another tracks who "it" refers to, another notices that we're inside a quotation. Each head has its own queries, keys and values. That's &lt;strong&gt;multi-head attention (MHA)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's a panel interview: one interviewer checks your coding, one checks your communication, one just stares at you to see if you blink.&lt;/p&gt;

&lt;h3&gt;
  
  
  The transformer in one picture
&lt;/h3&gt;

&lt;p&gt;Stack attention with a small "thinking" network (the feed-forward layer), repeat the pair dozens of times, and you have a transformer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fes7u6l56amp5g5u4jzi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fes7u6l56amp5g5u4jzi0.png" alt="One layer of a GPT-style transformer: attention, add and norm, feed-forward, repeated N times" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GPT-style models do one job: &lt;strong&gt;guess the next token&lt;/strong&gt;. Then they add that token to the text and guess again. And again. "The" → "The cat" → "The cat sat". Everything a chatbot writes is produced one token at a time by this loop.&lt;/p&gt;

&lt;p&gt;That loop is where the trouble starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The KV cache: a waiter's notepad that ate the restaurant
&lt;/h2&gt;

&lt;p&gt;Imagine a waiter with no notepad. Every time your table adds a dish, he walks back and asks everyone to repeat the entire order from the beginning. By dessert he has heard "one butter chicken" eleven times.&lt;/p&gt;

&lt;p&gt;A transformer without a cache behaves exactly like that. To generate token 1,000, it would recompute the keys and values for the previous 999 tokens, even though they haven't changed.&lt;/p&gt;

&lt;p&gt;The fix is obvious: write it down. The &lt;strong&gt;KV cache&lt;/strong&gt; stores the keys and values of every token already processed, in every layer. A new token only computes its own K and V, then looks up everyone else's.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4g9xwnx046rdv6xafgs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4g9xwnx046rdv6xafgs.gif" alt="Animation: without a cache every token is recomputed each step; with a KV cache only the new token is computed" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wonderful. Except the notepad keeps growing:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;KV&amp;nbsp;bytes&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;layers&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;KV&amp;nbsp;heads&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;h&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;e&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;tokens&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;batch&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;bytes&amp;nbsp;per&amp;nbsp;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Plug in a medium-sized example: 32 layers, 32 heads, 128 numbers per head, 16-bit values and a 32,000-token chat. You get &lt;strong&gt;16 GB for a single conversation&lt;/strong&gt;. Now serve a thousand users.&lt;/p&gt;

&lt;p&gt;This is the plot twist of modern LLMs: for long contexts, the limit is not how fast the GPU can multiply (FLOPs). It's how much the GPU can &lt;em&gt;remember&lt;/em&gt;. Almost every trick in the rest of this post is a way to shrink, share or sidestep that notepad.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The evolution of attention: MHA → MQA → GQA → MLA → LRKV
&lt;/h2&gt;

&lt;p&gt;Here is the whole family in one animation. Watch the memory meter on the right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fftkcaypxikqtobcxkdn4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fftkcaypxikqtobcxkdn4.gif" alt="Animation: MHA with one K/V per head, GQA sharing in groups, MQA sharing one, MLA caching a small latent, LRKV with a shared base plus per-head slivers" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's meet them using one running analogy: a class of 32 students (heads) taking notes (keys and values) in a lecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  MHA: everyone writes their own notes
&lt;/h3&gt;

&lt;p&gt;Every student writes complete notes. Great diversity of thought, 32 notebooks to store. This is the original 2017 design, used by GPT-2 and GPT-3.&lt;/p&gt;

&lt;h3&gt;
  
  
  MQA (2019): one notebook, photocopied
&lt;/h3&gt;

&lt;p&gt;Noam Shazeer (one of the original eight) asked: what if all heads shared a single set of keys and values, and only the queries stayed separate? The cache shrinks by 32×. The catch: with one notebook, the students start thinking alike, and quality dips.&lt;/p&gt;

&lt;h3&gt;
  
  
  GQA (2023): study groups
&lt;/h3&gt;

&lt;p&gt;The compromise that won. Split the heads into a few groups; each group shares one notebook. With 8 groups instead of 32 notebooks you save 4× memory and lose almost nothing. Llama 2 (70B), Llama 3 and Mistral all use it. If you've run an open model on your laptop, you've used GQA.&lt;/p&gt;

&lt;h3&gt;
  
  
  MLA (2024): flat-pack furniture
&lt;/h3&gt;

&lt;p&gt;DeepSeek-V2 took a different road. Instead of sharing notebooks, &lt;strong&gt;compress&lt;/strong&gt; them. Store one small "latent" vector per token, and rebuild the full keys and values only when needed. It's IKEA logic: ship the wardrobe flat, assemble at home.&lt;/p&gt;

&lt;p&gt;In the DeepSeek-V2 setup, that's 576 numbers per token per layer. The paper notes this is as small as GQA with only about 2.25 groups, while keeping quality on par with full MHA.&lt;/p&gt;

&lt;h4&gt;
  
  
  The RoPE headache (and the fix)
&lt;/h4&gt;

&lt;p&gt;There's a neat trick hiding in MLA. At inference time you don't even have to rebuild the keys: the "expand" matrix can be folded into the query side once, like pre-multiplying a recipe. Keys stay compressed forever.&lt;/p&gt;

&lt;p&gt;Then RoPE walks in. &lt;strong&gt;RoPE&lt;/strong&gt; (rotary position embedding) is how most modern models know word order: it &lt;em&gt;rotates&lt;/em&gt; each key by an angle that depends on the token's position. Token 5 gets one rotation, token 500 another.&lt;/p&gt;

&lt;p&gt;And a position-dependent rotation can't be folded into one fixed matrix. It's like trying to pre-print a single shipping label for parcels going to different cities.&lt;/p&gt;

&lt;p&gt;DeepSeek's fix is &lt;strong&gt;decoupled RoPE&lt;/strong&gt;: split the key into two parts. A big content part with no position in it (still foldable), and a small separate part that carries the rotation and is cached next to the latent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ox1138dmm39gqqgcvra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ox1138dmm39gqqgcvra.png" alt="Diagram of MLA with decoupled RoPE: the latent and a small position key are cached; content key and value are expanded from the latent" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the formula fans:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;K&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;DK&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;h&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;U&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;K&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;v&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;U&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;K&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;RoPE&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;K&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;h&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;In words: squeeze, cache, expand; and keep position in its own small pocket.&lt;/p&gt;

&lt;h3&gt;
  
  
  LRKV (2026): one textbook, personal sticky notes
&lt;/h3&gt;

&lt;p&gt;The newest idea, &lt;a href="https://arxiv.org/abs/2601.11471" rel="noopener noreferrer"&gt;Low-Rank Key-Value attention&lt;/a&gt;, comes from a team at Intercom. Their observation: heads are mostly redundant, but not entirely. So give the whole class &lt;strong&gt;one shared full-quality textbook&lt;/strong&gt;, and let each student add a thin stack of personal sticky notes (a low-rank residual).&lt;/p&gt;

&lt;p&gt;Turn the sticky-note thickness (the rank, &lt;em&gt;r&lt;/em&gt;) down to zero and you get MQA. Turn it all the way up and you're back at MHA. The authors report that a 2.5-billion-parameter model beat standard attention while using roughly half the KV cache.&lt;/p&gt;

&lt;h3&gt;
  
  
  The scoreboard
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Cached per token, per layer&lt;/th&gt;
&lt;th&gt;Trade-off&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MHA&lt;/td&gt;
&lt;td&gt;2 × H × d_head&lt;/td&gt;
&lt;td&gt;Full head diversity, largest cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MQA&lt;/td&gt;
&lt;td&gt;2 × d_head&lt;/td&gt;
&lt;td&gt;Smallest simple cache, heads lose diversity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GQA&lt;/td&gt;
&lt;td&gt;2 × G × d_head (G groups)&lt;/td&gt;
&lt;td&gt;The common middle ground&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLA&lt;/td&gt;
&lt;td&gt;d_latent + d_rope&lt;/td&gt;
&lt;td&gt;Very small cache, extra up-projection maths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LRKV&lt;/td&gt;
&lt;td&gt;about 2 × (d_head + H × r)&lt;/td&gt;
&lt;td&gt;Shared base plus per-head low-rank detail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And with real numbers for our example model:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mif45gvl8kxymwmqirt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mif45gvl8kxymwmqirt.png" alt="Bar chart of KV cache size at 32k tokens: MHA 16 GB, GQA 4 GB, LRKV 2.5 GB, MLA 1.1 GB, MQA 0.5 GB" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the meter doesn't only go down. MQA is the smallest, yet nobody stopped there, because the goal was never "smallest cache". It was "smallest cache &lt;em&gt;that still thinks well&lt;/em&gt;". Everything after MQA is about buying quality back cheaply.&lt;/p&gt;

&lt;h3&gt;
  
  
  Meanwhile, three side quests
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;FlashAttention (2022): eat the pizza slice by slice.&lt;/strong&gt; Attention compares every token with every token, giving an N × N grid of scores. For 32,000 tokens, that's a billion numbers the GPU has to shuffle in and out of its slow main memory. FlashAttention computes the grid in small tiles that fit in the GPU's tiny, fast on-chip memory, keeps a running total (the "online softmax") and throws each tile away. During training it recomputes tiles when needed instead of storing them. Same exact answer, far less memory traffic, much faster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bawpd9it4qre47mfp83.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bawpd9it4qre47mfp83.gif" alt="Animation: FlashAttention processes the attention matrix tile by tile in fast memory and never stores the full matrix" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sliding-window attention and attention sinks.&lt;/strong&gt; Do you remember every word of this article so far? No, you remember the last few paragraphs and the gist. Sliding-window attention lets each token look only at the last few thousand tokens (early Mistral 7B did this). Researchers then found a quirk: models dump a surprising amount of attention on the very first tokens, using them as a sort of "parking spot". Evict those and the model falls apart. Keep a handful of these &lt;strong&gt;attention sinks&lt;/strong&gt; forever and you can stream text endlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context extension (RoPE scaling, YaRN).&lt;/strong&gt; A model trained on 4k tokens panics at token 4,001, a bit like a ruler that only goes to 30 cm. Because RoPE encodes position as rotation, you can re-scale the rotation speeds, effectively stretching the ruler. YaRN does this carefully, frequency by frequency, and lets a model handle much longer text with only a little fine-tuning.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Taming the KV cache: three families of tricks
&lt;/h2&gt;

&lt;p&gt;Shrinking the notepad through architecture is one option. There are two more, and real systems stack all three.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxlh0mjwd6n7piubwuw5a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxlh0mjwd6n7piubwuw5a.gif" alt="Animation: a GPU memory bar where architecture, quantisation, then paging and prefix sharing fit 4, 16, 32, then 49 users" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Spell 1: architectural magic (make less cache)
&lt;/h3&gt;

&lt;p&gt;Everything from section 3: GQA, MLA, LRKV. You choose this when the model is designed; you can't bolt it on later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spell 2: shrinking spells (fewer bits per number)
&lt;/h3&gt;

&lt;p&gt;Each cached number is normally stored in 16 bits. Do we need all 16?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FP8 and FP4 caches&lt;/strong&gt;: store each value in 8 or 4 bits. Half or a quarter of the memory, for a small accuracy cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KIVI (2024)&lt;/strong&gt;: noticed that keys and values have different personalities. Keys have a few loud channels, so quantise keys per channel and values per token. Works down to about 2 bits with no retraining.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TurboQuant (Google Research, ICLR 2026)&lt;/strong&gt;: about 3 bits per value, no retraining, no calibration data. It first rotates vectors so they become predictable (PolarQuant), then adds a tiny 1-bit correction for whatever error is left (QJL). Think of it as packing a suitcase really well, then sitting on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More on how quantisation works in section 8.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spell 3: system tricks (waste less)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PagedAttention (vLLM, 2023).&lt;/strong&gt; Early servers reserved one huge continuous slab of memory per chat, sized for the longest possible reply. Most chats are short, so most of that memory sat empty, like booking a 12-seat table for two. PagedAttention borrows an idea from 1960s operating systems: cut the cache into small fixed-size blocks, park them anywhere, and keep a lookup table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhxgliu6tdkev7sdoe4ba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhxgliu6tdkev7sdoe4ba.png" alt="Diagram: two chats map through a block table to scattered GPU memory slots, sharing one prompt block" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefix caching.&lt;/strong&gt; Every user of a chatbot gets the same long system prompt. Why compute and store its keys and values a million times? Compute once, share the blocks. This is what's behind the "cached input tokens" discount on API pricing pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous batching.&lt;/strong&gt; Old approach: a bus that waits until it's full, then leaves, and nobody new boards until the last passenger gets off. Continuous batching is a shared auto-rickshaw: the moment one passenger hops out, another hops in. GPUs stay full.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chunked prefill.&lt;/strong&gt; One user pastes a 100-page PDF, and everybody else's chat freezes while the model reads it. Chunked prefill breaks the reading into pieces and interleaves other users' tokens between them. It's the "I'll just let you go ahead, you only have two items" of GPU scheduling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speculative decoding.&lt;/strong&gt; A small, fast model drafts the next few tokens; the big model checks them all in one pass and keeps the ones it agrees with. The intern drafts the email, the boss skims and approves. The output is exactly what the big model would have written anyway, just faster, as long as the intern is usually right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdjt2fko2wm6ow7rttzfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdjt2fko2wm6ow7rttzfa.png" alt="Line chart: speculative decoding speed-up rises with acceptance rate; around 2.8x at 80 percent acceptance when guessing 4 tokens ahead" width="800" height="416"&gt;&lt;/a&gt;&lt;br&gt;
If the big model accepts each guessed token with probability α, guesses γ tokens ahead, and the draft model costs a fraction c of the big one:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;speed-up&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;α&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;γ&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;α&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;γ&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Cache offloading and eviction.&lt;/strong&gt; When a user wanders off to make chai, move their cache to cheaper memory (CPU RAM or disk), or delete it and rebuild later. Hot conversations stay on the GPU; cold ones go to the attic.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Mixture of experts: stop asking the dentist about your taxes
&lt;/h2&gt;

&lt;p&gt;So far we've optimised attention. The other half of every layer is the feed-forward network, and it's where most of the parameters live.&lt;/p&gt;

&lt;p&gt;In a normal ("dense") model, every token passes through &lt;em&gt;all&lt;/em&gt; of those parameters. That's a hospital where every patient, including the one with a paper cut, must see every specialist in the building.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;mixture of experts (MoE)&lt;/strong&gt; adds a receptionist. A tiny &lt;strong&gt;router&lt;/strong&gt; looks at each token and sends it to just a few specialists, say the top 2 out of 8.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiqnpghyttdtz95e48t3a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiqnpghyttdtz95e48t3a.gif" alt="Animation: a router sends each token to 2 of 8 experts; in the collapsed case one expert overflows and drops tokens" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The maths is short. The router scores every expert, keeps the top &lt;em&gt;k&lt;/em&gt;, and blends their answers:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;∈&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathrm mtight"&gt;TopK&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;g&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mspace mtight"&gt;&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;softmax&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Total vs active parameters
&lt;/h3&gt;

&lt;p&gt;This gives MoE models two sizes. Mixtral 8x7B has about 47 billion parameters in total but uses only about 13 billion for any given token. DeepSeek-V3 has 671 billion in total and roughly 37 billion active. You get the knowledge of a giant model at the per-token cost of a mid-sized one.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lazy-router problem
&lt;/h3&gt;

&lt;p&gt;Left alone, routers play favourites. One expert gets picked a bit more, so it learns a bit more, so it gets picked even more. Soon you have one exhausted expert and seven on a tea break (the second half of the animation above).&lt;/p&gt;

&lt;p&gt;Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Load-balancing loss&lt;/strong&gt;: a small penalty, &lt;code&gt;α · N · Σ fᵢ · Pᵢ&lt;/code&gt;, that is lowest when work is spread evenly (&lt;em&gt;fᵢ&lt;/em&gt; is the share of tokens expert &lt;em&gt;i&lt;/em&gt; received, &lt;em&gt;Pᵢ&lt;/em&gt; the share of router probability).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auxiliary-loss-free balancing&lt;/strong&gt; (DeepSeek-V3): instead of a penalty, quietly nudge each expert's score up or down depending on how busy it has been. Like a restaurant host steering guests to the empty section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacity factor&lt;/strong&gt;: each expert has a fixed number of seats per batch. Overflow tokens get &lt;strong&gt;dropped&lt;/strong&gt;: they skip the expert layer entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared and fine-grained experts&lt;/strong&gt;: a couple of always-on generalists handle common knowledge, plus many small specialists instead of a few big ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The fine print
&lt;/h3&gt;

&lt;p&gt;Experts usually live on different GPUs (&lt;strong&gt;expert parallelism&lt;/strong&gt;), so tokens must be shipped to their expert and back. Every GPU talks to every other GPU, a traffic pattern called &lt;strong&gt;all-to-all&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And the big caveat: &lt;strong&gt;MoE saves compute, not memory.&lt;/strong&gt; All the experts must sit loaded in memory, because you can't know which ones the next token will need. All the doctors are on salary even if you only see two.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Scaling training: parallelism, ZeRO and FSDP
&lt;/h2&gt;

&lt;p&gt;Running a model is hard. Training one is harder, because training hoards memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the memory goes
&lt;/h3&gt;

&lt;p&gt;For every parameter, training keeps roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 bytes for the weight itself (16-bit)&lt;/li&gt;
&lt;li&gt;2 bytes for its gradient (which way to nudge it)&lt;/li&gt;
&lt;li&gt;12 bytes for the Adam optimiser's bookkeeping (a full-precision copy, plus momentum, plus variance)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's about &lt;strong&gt;16 bytes per parameter&lt;/strong&gt; before counting activations. A 7.5-billion-parameter model needs 120 GB. No single GPU has that. So we split the work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three ways to slice a model
&lt;/h3&gt;

&lt;p&gt;It's a group project, and there are three ways to divide it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqdqum5dypsze2egiv5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqdqum5dypsze2egiv5o.png" alt="Diagram: data parallelism copies the model per GPU, tensor parallelism splits each matrix into columns, pipeline parallelism splits layers" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data parallelism&lt;/strong&gt;: everyone gets a full copy of the assignment and a different chapter to work on, then you average the results. Simple, but every GPU needs the whole model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tensor parallelism&lt;/strong&gt;: split each big matrix across GPUs. Everyone works on the same sentence at the same time, so it needs very fast connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline parallelism&lt;/strong&gt;: GPU 1 holds layers 1 to 8, GPU 2 holds 9 to 16, and so on. A relay race.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GPUs coordinate with a small vocabulary of group chats, called &lt;strong&gt;collective operations&lt;/strong&gt;: &lt;em&gt;all-reduce&lt;/em&gt; (everyone sums up and gets the total), &lt;em&gt;all-gather&lt;/em&gt; (everyone gets everyone's piece), &lt;em&gt;reduce-scatter&lt;/em&gt; (sum, then each keeps a slice), and &lt;em&gt;all-to-all&lt;/em&gt; (the MoE one from earlier).&lt;/p&gt;

&lt;h3&gt;
  
  
  ZeRO: stop making everyone carry everything
&lt;/h3&gt;

&lt;p&gt;Plain data parallelism is wasteful. All 64 GPUs hold identical copies of the optimiser states, like 64 flatmates each buying their own washing machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZeRO&lt;/strong&gt; (Zero Redundancy Optimizer) shards things so each GPU keeps only its slice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stage 1&lt;/strong&gt;: shard the optimiser states&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 2&lt;/strong&gt;: also shard the gradients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 3&lt;/strong&gt;: also shard the weights themselves, fetching them when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FSDP&lt;/strong&gt; is PyTorch's implementation of the stage 3 idea. &lt;strong&gt;ZeRO-Offload&lt;/strong&gt; goes further and pushes the optimiser's work to CPU memory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feh5bigofh65c4wi2tmnj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feh5bigofh65c4wi2tmnj.png" alt="Bar chart: memory per GPU for a 7.5B model on 64 GPUs falls from 120 GB to 31.4, 16.6 and 1.9 GB across ZeRO stages" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Ψ parameters and N GPUs:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;M&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;ZeRO-1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4Ψ&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;12Ψ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;M&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;ZeRO-2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2Ψ&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;14Ψ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;M&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;ZeRO-3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;16Ψ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;bytes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;From 120 GB to under 2 GB per GPU. The price is more chatter between GPUs, which is why the fast interconnect matters as much as the GPUs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The pipeline bubble
&lt;/h3&gt;

&lt;p&gt;The relay race has a flaw. While runner 1 is running, runners 2, 3 and 4 stand around. That idle time is the &lt;strong&gt;pipeline bubble&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsj6uas6gg5rc0gbuyf34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsj6uas6gg5rc0gbuyf34.png" alt="Schedule diagram showing idle GPU time in pipeline parallelism, and a curve of idle time falling as micro-batches increase" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The fix is to cut each batch into many &lt;strong&gt;micro-batches&lt;/strong&gt;, so GPU 1 can hand off the first one and start the next immediately:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;bubble&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;With 4 stages and 4 micro-batches, GPUs idle 43% of the time. With 32 micro-batches, under 9%. A smarter ordering called &lt;strong&gt;1F1B&lt;/strong&gt; (one forward, one backward) keeps the same bubble but stops activations piling up in memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  The rest of the toolbox, quickly
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sequence / context parallelism&lt;/strong&gt;: split one very long sequence across GPUs; &lt;em&gt;ring attention&lt;/em&gt; passes keys and values around in a circle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expert parallelism&lt;/strong&gt;: different MoE experts on different GPUs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-D / 4-D parallelism&lt;/strong&gt;: real training runs combine data + tensor + pipeline (+ sequence or expert) at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activation checkpointing&lt;/strong&gt;: don't store every intermediate result for the backward pass; save a few and recompute the rest. Trades time for memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FP8 training&lt;/strong&gt;: do much of the arithmetic in 8-bit floats (DeepSeek-V3 trained this way).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FlashAttention&lt;/strong&gt; helps here too: its recomputation trick is what keeps training memory linear in sequence length.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overlapping communication with compute&lt;/strong&gt;: send data while the GPU is busy calculating, so nobody waits on the network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFU (model FLOPs utilisation)&lt;/strong&gt;: the fraction of the hardware's theoretical peak that actually goes into your model's maths. It's the fuel-efficiency number of training; around half is considered good.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Distillation: a small model that copied the topper's notes
&lt;/h2&gt;

&lt;p&gt;You've trained a brilliant, enormous model. It's also slow and expensive. Can a small model learn to behave like it?&lt;/p&gt;

&lt;h3&gt;
  
  
  Dark knowledge
&lt;/h3&gt;

&lt;p&gt;Show a great teacher model a photo of a husky. A plain label says: "husky". End of lesson.&lt;/p&gt;

&lt;p&gt;But the teacher's full answer is richer: "88% husky, 7% wolf, 4% malamute, basically 0% pizza." That tells the student something a textbook label never could: huskies look like wolves and not like pizza. Geoffrey Hinton called this &lt;strong&gt;dark knowledge&lt;/strong&gt;. It lives in the wrong answers.&lt;/p&gt;

&lt;p&gt;At normal settings those small percentages are too faint to learn from. So we raise the &lt;strong&gt;temperature&lt;/strong&gt;, which softens the teacher's confidence and makes the "nearly right" answers visible:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jtxv90g9bsin70qogdu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jtxv90g9bsin70qogdu.gif" alt="Animation: as temperature rises from 1 to 8, the teacher's probabilities spread from husky to wolf, malamute and others" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The student is trained on a blend of the true labels and the teacher's softened opinion:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathcal"&gt;L&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;α&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;CE&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;y&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;α&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;KL&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;T&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;T&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;T&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;softmax&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;z&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;It's the difference between an answer key and a teacher who explains &lt;em&gt;why&lt;/em&gt; option B was tempting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flavours of distillation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logit distillation&lt;/strong&gt;: copy the teacher's output probabilities (above).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hidden-state (feature) distillation&lt;/strong&gt;: also copy what the teacher is "thinking" in its middle layers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequence-level distillation&lt;/strong&gt;: just train the student on text the teacher wrote. Simple, and it works even when you can only see the teacher's outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-policy distillation&lt;/strong&gt;: the &lt;em&gt;student&lt;/em&gt; writes, the &lt;em&gt;teacher&lt;/em&gt; marks. This matters more than it sounds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mean-seeking vs mode-seeking
&lt;/h3&gt;

&lt;p&gt;Suppose a question has two good answers, and the student is too small to hold both. It has two ways to fail:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fytami2iqisiel9sc6cad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fytami2iqisiel9sc6cad.png" alt="Two charts: forward KL makes the student spread across both teacher peaks; reverse KL makes it commit to one peak" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Classic distillation minimises &lt;strong&gt;forward KL&lt;/strong&gt;: the student tries to cover everything the teacher might say, and ends up blurring between the two answers, sometimes producing a mushy mix the teacher would never say. Ask two friends for directions, average "turn left" and "turn right", and drive into a wall.&lt;/p&gt;

&lt;p&gt;On-policy distillation minimises &lt;strong&gt;reverse KL&lt;/strong&gt;: the student is only judged on what &lt;em&gt;it&lt;/em&gt; actually says, so it learns to pick one good answer and commit. For generating text, committing is usually what you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it shows up
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DistilBERT&lt;/strong&gt; (2019): 40% smaller than BERT, nearly as good. The proof that this works for language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning-trace distillation&lt;/strong&gt; (2025): DeepSeek-R1's step-by-step reasoning was distilled into small open models, giving laptop-sized models that "think out loud".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distillation + pruning&lt;/strong&gt;: cut parts out of the big model, then use distillation to help what's left recover.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Quantisation: FP8, FP4 and TurboQuant
&lt;/h2&gt;

&lt;p&gt;Last stop. Distillation makes the model smaller by having fewer numbers. Quantisation keeps the same count of numbers and makes each one cheaper.&lt;/p&gt;

&lt;p&gt;Think of prices. ₹499.99 and ₹500 are the same to your wallet. A model's weights are stored with far more decimal places than they need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the bits go
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgkhbmckhaqkweouqhg6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgkhbmckhaqkweouqhg6h.png" alt="Bit layouts of FP32, FP16, BF16, FP8 E4M3, FP8 E5M2, INT8, FP4 E2M1 and INT4" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FP32 / FP16 / BF16&lt;/strong&gt;: the standard floating-point formats. BF16 keeps FP32's huge range but with fewer digits, which training likes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FP8&lt;/strong&gt;: comes in two flavours. E4M3 (more precision) and E5M2 (more range).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INT8 / INT4&lt;/strong&gt;: plain evenly spaced steps: 256 or 16 of them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NF4&lt;/strong&gt;: 4 bits, but the 16 levels are placed where weights actually cluster (a bell curve), not evenly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FP4 (MXFP4, NVFP4)&lt;/strong&gt;: tiny 4-bit floats where a block of values shares one scale factor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How rounding works
&lt;/h3&gt;

&lt;p&gt;To quantise, pick a ruler: a step size &lt;em&gt;s&lt;/em&gt; and an offset &lt;em&gt;z&lt;/em&gt;. Then snap every value to the nearest mark.&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;q&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;clamp&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;round&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;z&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;s&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;q&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;z&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;s&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;m&lt;/span&gt;&lt;span class="mtight"&gt;a&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;m&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Absmax&lt;/strong&gt; quantisation centres the ruler on zero. &lt;strong&gt;Zero-point (affine)&lt;/strong&gt; quantisation slides the ruler to wherever the data sits.&lt;/li&gt;
&lt;li&gt;The rounding error is never more than half a step (s/2).&lt;/li&gt;
&lt;li&gt;Weight memory ≈ parameters × bits ÷ 8. A 70-billion-parameter model is 140 GB at 16 bits and 35 GB at 4 bits. That's the difference between "data centre" and "one very nice workstation".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv68f5d2xigjaoxh297g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv68f5d2xigjaoxh297g.gif" alt="Animation: a weight matrix quantised at 16, 8, 4, 3 and 2 bits with a growing error map, then a 4-bit case ruined by one outlier" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The outlier problem
&lt;/h3&gt;

&lt;p&gt;Ten people are in a bar. Bill Gates walks in. On average, everyone is now a billionaire.&lt;/p&gt;

&lt;p&gt;The same thing wrecks naive quantisation. The step size depends on the largest value, so one giant outlier stretches the ruler until all the normal weights are crushed onto two or three marks (the last frame above: one outlier makes 4-bit error about five times worse). LLMs are full of such outliers, which is why "just round everything" doesn't work.&lt;/p&gt;

&lt;p&gt;You can soften this with &lt;strong&gt;granularity&lt;/strong&gt;: one ruler for the whole tensor (crude), one per channel (better), or one per small group of values (best, slightly more overhead).&lt;/p&gt;

&lt;h3&gt;
  
  
  The methods you'll see on model cards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Post-training quantisation (PTQ)&lt;/strong&gt; vs &lt;strong&gt;quantisation-aware training (QAT)&lt;/strong&gt;: round after training (cheap) or teach the model to live with rounding during training (better, costly).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM.int8()&lt;/strong&gt;: keep the few outlier dimensions in 16-bit, squash everything else to 8-bit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SmoothQuant&lt;/strong&gt;: move the "spikiness" from activations into weights, where it's easier to handle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPTQ&lt;/strong&gt;: quantise one weight at a time and adjust the remaining ones to cancel out the error. Like fixing a wobbly table by trimming the other legs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWQ&lt;/strong&gt;: look at real activations to find the small fraction of weights that matter most, and protect them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GGUF k-quants&lt;/strong&gt;: those &lt;code&gt;Q4_K_M&lt;/code&gt; files you download for llama.cpp. Different layers get different bit-widths depending on how sensitive they are.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QLoRA&lt;/strong&gt;: freeze a 4-bit (NF4) model and train small adapter layers on top. This made fine-tuning big models possible on a single consumer GPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Back to the KV cache
&lt;/h3&gt;

&lt;p&gt;And so we return to our villain. Weights are quantised once, offline. The KV cache is created live, per user, per token, so its quantiser must be fast and must work without seeing data in advance.&lt;/p&gt;

&lt;p&gt;That's the significance of &lt;strong&gt;TurboQuant&lt;/strong&gt;: about 3 bits per cached value, with no retraining and no calibration. Compared with 16 bits, that's a cut of more than 5× applied to the largest moving part of long-context inference. The rotation step (PolarQuant) deals with the Bill Gates problem by spreading every vector's energy evenly, and the 1-bit correction (QJL) fixes the small bias that's left in attention scores.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. So how did all this make GPT-style models better?
&lt;/h2&gt;

&lt;p&gt;None of these ideas made models smarter directly. They made &lt;em&gt;bigger, longer, cheaper&lt;/em&gt; possible, and that's what made models smarter. (OpenAI doesn't publish GPT-4-era internals, so the examples below come from open models and papers.)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The wall we hit&lt;/th&gt;
&lt;th&gt;The idea that broke it&lt;/th&gt;
&lt;th&gt;Where you can see it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recomputing everything per token&lt;/td&gt;
&lt;td&gt;KV cache&lt;/td&gt;
&lt;td&gt;Every LLM in production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache too big for long chats&lt;/td&gt;
&lt;td&gt;GQA, MLA, LRKV&lt;/td&gt;
&lt;td&gt;Llama 2/3, Mistral (GQA); DeepSeek-V2/V3 (MLA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attention too slow and memory-hungry&lt;/td&gt;
&lt;td&gt;FlashAttention&lt;/td&gt;
&lt;td&gt;Built into PyTorch and most training stacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context windows stuck at a few thousand tokens&lt;/td&gt;
&lt;td&gt;RoPE, YaRN, sliding windows, attention sinks&lt;/td&gt;
&lt;td&gt;4k contexts became 100k+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPUs sitting half-empty when serving&lt;/td&gt;
&lt;td&gt;PagedAttention, continuous batching, prefix caching&lt;/td&gt;
&lt;td&gt;vLLM and friends; "cached token" pricing on APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replies too slow&lt;/td&gt;
&lt;td&gt;Speculative decoding&lt;/td&gt;
&lt;td&gt;Faster responses, same output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bigger models cost more per token&lt;/td&gt;
&lt;td&gt;Mixture of experts&lt;/td&gt;
&lt;td&gt;Mixtral, DeepSeek-V3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model doesn't fit on any GPU for training&lt;/td&gt;
&lt;td&gt;ZeRO/FSDP, tensor and pipeline parallelism&lt;/td&gt;
&lt;td&gt;Every 100B+ training run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Great model, too expensive to deploy&lt;/td&gt;
&lt;td&gt;Distillation&lt;/td&gt;
&lt;td&gt;DistilBERT, small "distilled" reasoning models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model doesn't fit on &lt;em&gt;your&lt;/em&gt; GPU&lt;/td&gt;
&lt;td&gt;Quantisation&lt;/td&gt;
&lt;td&gt;GGUF files, QLoRA fine-tunes, FP8 serving&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Put together: GPT-2 in 2019 handled 1,024 tokens. Today's models read entire codebases in one go and answer in seconds, on hardware that isn't a thousand times bigger. The gap was closed by the tricks in this post.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. The timeline
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwoi1v7urenam1vhjjgfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwoi1v7urenam1vhjjgfj.png" alt="Timeline from 1991 to 2026 of attention, serving, mixture of experts, training, distillation and quantisation milestones" width="800" height="1088"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;th&gt;Why it mattered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1991&lt;/td&gt;
&lt;td&gt;Mixture of experts proposed&lt;/td&gt;
&lt;td&gt;The "router + specialists" idea, decades early&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;Attention for translation (Bahdanau et al.)&lt;/td&gt;
&lt;td&gt;Models learn to focus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;Knowledge distillation (Hinton et al.)&lt;/td&gt;
&lt;td&gt;Small models learn from big ones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Transformer; sparsely-gated MoE&lt;/td&gt;
&lt;td&gt;Attention becomes the whole architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018–2020&lt;/td&gt;
&lt;td&gt;GPT-1, GPT-2, GPT-3&lt;/td&gt;
&lt;td&gt;Scale works; costs explode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;MQA, DistilBERT, ZeRO, Megatron&lt;/td&gt;
&lt;td&gt;First serious efficiency push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;RoPE, Switch Transformer&lt;/td&gt;
&lt;td&gt;Better positions; MoE meets transformers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;FlashAttention, GPTQ, LLM.int8(), SmoothQuant, speculative decoding&lt;/td&gt;
&lt;td&gt;Speed and compression go mainstream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;GQA, PagedAttention (vLLM), QLoRA, AWQ, YaRN, attention sinks, Mixtral&lt;/td&gt;
&lt;td&gt;Open models become practical to run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;MLA (DeepSeek-V2), KIVI, DeepSeek-V3&lt;/td&gt;
&lt;td&gt;The KV cache becomes the main target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;Reasoning distilled into small open models&lt;/td&gt;
&lt;td&gt;"Thinking" models on laptops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;LRKV, TurboQuant&lt;/td&gt;
&lt;td&gt;Smaller caches without losing head diversity; ~3-bit caches&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The 30-second version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attention&lt;/strong&gt; = every token decides which other tokens matter, using queries, keys and values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KV cache&lt;/strong&gt; = remember keys and values so you never recompute them. It's fast, and it eats memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MHA → MQA → GQA → MLA → LRKV&lt;/strong&gt; = five answers to "how little can each token remember and still think well?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three spells&lt;/strong&gt; for the cache: better architecture, fewer bits, smarter memory management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MoE&lt;/strong&gt; = use a few specialists per token. Saves compute, not memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZeRO and parallelism&lt;/strong&gt; = split training across GPUs without everyone carrying everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distillation&lt;/strong&gt; = a small model learns from a big one's full opinions, not just its final answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quantisation&lt;/strong&gt; = store each number with fewer bits; watch out for outliers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original paper said attention is all you need. Nine years of engineering later, the fuller version is: attention, plus a very good memory for what not to remember.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If this helped, tell me which section you'd like expanded into its own post. And if you spot a mistake, call it out in the comments; I'd rather be corrected than confidently wrong.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Further reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/1706.03762" rel="noopener noreferrer"&gt;Attention Is All You Need&lt;/a&gt; (2017)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/1911.02150" rel="noopener noreferrer"&gt;Fast Transformer Decoding: One Write-Head Is All You Need&lt;/a&gt; (MQA, 2019)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2305.13245" rel="noopener noreferrer"&gt;GQA: Training Generalized Multi-Query Transformer Models&lt;/a&gt; (2023)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2405.04434" rel="noopener noreferrer"&gt;DeepSeek-V2&lt;/a&gt; (MLA, 2024) and &lt;a href="https://arxiv.org/abs/2412.19437" rel="noopener noreferrer"&gt;DeepSeek-V3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2601.11471" rel="noopener noreferrer"&gt;Low-Rank Key Value Attention&lt;/a&gt; (LRKV, 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2205.14135" rel="noopener noreferrer"&gt;FlashAttention&lt;/a&gt; (2022)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2309.06180" rel="noopener noreferrer"&gt;Efficient Memory Management for LLM Serving with PagedAttention&lt;/a&gt; (vLLM, 2023)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2211.17192" rel="noopener noreferrer"&gt;Fast Inference from Transformers via Speculative Decoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/1910.02054" rel="noopener noreferrer"&gt;ZeRO: Memory Optimizations Toward Training Trillion Parameter Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/1503.02531" rel="noopener noreferrer"&gt;Distilling the Knowledge in a Neural Network&lt;/a&gt; (2015)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2210.17323" rel="noopener noreferrer"&gt;GPTQ&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2306.00978" rel="noopener noreferrer"&gt;AWQ&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2305.14314" rel="noopener noreferrer"&gt;QLoRA&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2402.02750" rel="noopener noreferrer"&gt;KIVI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TurboQuant, PolarQuant and QJL: see the Google Research blog (ICLR 2026)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>I Built LLM Explained: 43 Interactive Pages That Take You From Tokens to AI Agents</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:03:27 +0000</pubDate>
      <link>https://dev.to/amananandrai/i-built-llm-explained-43-interactive-pages-that-take-you-from-tokens-to-ai-agents-2n37</link>
      <guid>https://dev.to/amananandrai/i-built-llm-explained-43-interactive-pages-that-take-you-from-tokens-to-ai-agents-2n37</guid>
      <description>&lt;p&gt;I kept running into the same problem while learning about large language models.&lt;/p&gt;

&lt;p&gt;I'd read a blog post about attention, nod along, and two days later I couldn't tell you why we divide by √d_k. I'd see "GQA", "MLA", "MoE", "LoRA", "HNSW" or "context rot" in a paper or a tweet, open five tabs, and close them all with the uneasy feeling that I sort of got it. And the field keeps moving, so there's always a new term on top of the ones I hadn't really nailed down.&lt;/p&gt;

&lt;p&gt;So I built the resource I wished I had: &lt;strong&gt;&lt;a href="https://llm-explained-lovat.vercel.app/" rel="noopener noreferrer"&gt;LLM Explained&lt;/a&gt;&lt;/strong&gt;. It's a free, interactive course that goes from "why did RNNs hit a wall?" all the way to "how does a production agent retrieve, reason, act and get evaluated?"&lt;/p&gt;

&lt;p&gt;I built it to learn, and writing each page forced me to understand things properly. I'm sharing it because I think it can help other people too.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://llm-explained-lovat.vercel.app/" rel="noopener noreferrer"&gt;https://llm-explained-lovat.vercel.app/&lt;/a&gt;&lt;br&gt;
💻 &lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/llm-explained" rel="noopener noreferrer"&gt;https://github.com/amananandrai/llm-explained&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💌 &lt;strong&gt;This is a work in progress and I'd love your help.&lt;/strong&gt; Suggestions are always welcome. If you find it useful, please ⭐ &lt;strong&gt;star the repo on GitHub&lt;/strong&gt;. Spotted a mistake or have an idea? &lt;strong&gt;&lt;a href="https://github.com/amananandrai/llm-explained/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt;&lt;/strong&gt;. Want to fix or add something yourself? &lt;strong&gt;&lt;a href="https://github.com/amananandrai/llm-explained/pulls" rel="noopener noreferrer"&gt;Pull requests&lt;/a&gt; are very welcome!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmfv345zqwcbdjjdn2rcg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmfv345zqwcbdjjdn2rcg.png" alt="The LLM Explained home page: an attention matrix for &amp;quot;The cat sat on the mat&amp;quot;" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What is LLM Explained?
&lt;/h2&gt;

&lt;p&gt;It's &lt;strong&gt;42 modules in seven parts plus a capstone (43 interactive pages if you count the KL divergence sub-page)&lt;/strong&gt;. Every concept appears as a picture you can play with before you see its equation.&lt;/p&gt;

&lt;p&gt;A few principles shaped every page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Picture first, symbol second.&lt;/strong&gt; Each equation sits next to the animation that computes it, and they use the same colours. If the query is blue in the diagram, it's blue in the formula.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One idea per scroll step.&lt;/strong&gt; Animations move forward as you scroll and never run on without you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real numbers at toy scale.&lt;/strong&gt; 4-dimensional embeddings and 3–5 token sentences, so every value fits on screen and you can check it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch the knob.&lt;/strong&gt; Every module has at least one widget you control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run it yourself.&lt;/strong&gt; Optional in-browser Python (NumPy) cells reproduce the figures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest limits.&lt;/strong&gt; Every module ends with a &lt;em&gt;"what this picture leaves out"&lt;/em&gt; box, because simplified diagrams can mislead you if you don't know what they skip.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, &lt;strong&gt;every number on screen is computed in your browser&lt;/strong&gt;. When something is a simulation or an illustrative figure, the page says so.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to use the site
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Start with the curriculum map
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Curriculum&lt;/strong&gt; link in the top navigation shows the whole course. Parts 1 and 2 are meant to be read in order, and everything after them builds on the attention module. Beyond that you can jump around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parts 3, 4 and 7 can be read in any order within each part.&lt;/li&gt;
&lt;li&gt;Part 5 (RAG) follows the order of a retrieval pipeline.&lt;/li&gt;
&lt;li&gt;Part 6 (Agents) starts from the agents and ReAct module.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you already know the transformer well, skip to whatever you're curious about. If you're new, start at Module 1 (or the optional maths primer, Module 0).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi9yjcjywaxman8yzg4r5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi9yjcjywaxman8yzg4r5.gif" alt="Going from the home page to the curriculum map and into a module" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Pick your depth: Intuition, Mechanics or Maths
&lt;/h3&gt;

&lt;p&gt;This is my favourite feature. Every page has a &lt;strong&gt;depth switch&lt;/strong&gt; with three levels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Depth&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intuition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pictures and plain language, no symbols&lt;/td&gt;
&lt;td&gt;A first read, or a quick refresher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mechanics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tensor shapes and step-by-step operations&lt;/td&gt;
&lt;td&gt;Engineers who want to implement it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maths&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full derivations, colour-linked KaTeX equations&lt;/td&gt;
&lt;td&gt;Going deep, or interview prep&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fonef2iw127y79q611yzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fonef2iw127y79q611yzw.png" alt="Three buddies: Intuition with a crayon drawing, Mechanics in a hard hat, Maths with glasses and a chalkboard" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can read a page at Intuition level, come back a week later and flip to Mechanics. The page grows with you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnrg1sc8pnpepqop6v030.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnrg1sc8pnpepqop6v030.gif" alt="Flipping the depth switch between Intuition, Mechanics and Maths" width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's what the Maths depth looks like. Notice that Q, K and V keep the same blue, orange and green as in the animations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ws8kxsar56xpngjhyy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ws8kxsar56xpngjhyy4.png" alt="Maths depth: the attention formula and the √d_k variance argument in colour-linked KaTeX" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Scroll, step and scrub the animations
&lt;/h3&gt;

&lt;p&gt;Each page has a &lt;strong&gt;hero animation&lt;/strong&gt; driven by your scroll position. There are also play, pause, step back, step forward and a scrubber, so you can pause on exactly the frame that confuses you.&lt;/p&gt;

&lt;p&gt;For example, in the attention module a 5-token attention matrix fills in cell by cell, the heads split into colours, and you see each output vector built up as a weighted sum of value vectors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93cvxtomnzc6zq4q1zex.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93cvxtomnzc6zq4q1zex.gif" alt="Scrolling through the 8-step attention animation in Module 5" width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flk6i64zevcxapn0u8bns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flk6i64zevcxapn0u8bns.png" alt="Kawaii tokens: &amp;quot;mat&amp;quot; gives 34% of its attention to &amp;quot;cat&amp;quot;" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every animation also has a &lt;strong&gt;text transcript&lt;/strong&gt;, and if your system has reduced motion turned on, animations turn into numbered static frames.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Play with the widgets
&lt;/h3&gt;

&lt;p&gt;This is where things click. Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;"remove √d_k" toggle&lt;/strong&gt; that shows softmax saturating when you drop the scaling factor. You can see &lt;em&gt;why&lt;/em&gt; the scale is there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxw33e3dc515yd77hb4l2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxw33e3dc515yd77hb4l2.gif" alt="Toggling √d_k on and off, then exploring attention-head patterns" width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxyg4crjxxg8fwvv3q6s1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxyg4crjxxg8fwvv3q6s1.png" alt="With √d_k everyone gets a share; without it, key 5 eats 99.8% of the attention" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;parameter counter&lt;/strong&gt; that checks the 12·d² rule against GPT-2 and GPT-3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkk1phlm2h1hpf196y8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkk1phlm2h1hpf196y8p.png" alt="The parameter counter widget" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;real byte-level BPE tokeniser&lt;/strong&gt; running in the browser. Try the Hindi example and watch the token bill go up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7tb2yo9b431e9g0m1cji.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7tb2yo9b431e9g0m1cji.gif" alt="The tokenizer playground switching between examples" width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyzk7lp1y9dj82j4po6ss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyzk7lp1y9dj82j4po6ss.png" alt="A bread loaf labelled &amp;quot;unbelievable&amp;quot; gets sliced into &amp;quot;un&amp;quot;, &amp;quot;believ&amp;quot; and &amp;quot;able&amp;quot;" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A numerical &lt;strong&gt;KL divergence&lt;/strong&gt; explorer and the closed-form &lt;strong&gt;RLHF optimum&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5. Run the Python yourself
&lt;/h3&gt;

&lt;p&gt;Most modules include a &lt;strong&gt;"Run it yourself" cell&lt;/strong&gt;: editable Python running in your browser through &lt;a href="https://pyodide.org/" rel="noopener noreferrer"&gt;Pyodide&lt;/a&gt; with NumPy. Change a number, hit Run, and watch the result update. You don't need to install anything. (Pyodide downloads on your first run, so give it a moment.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqbpwb8569i47k9teayn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqbpwb8569i47k9teayn.png" alt="An editable Python cell: scaled dot-product attention by hand" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Check yourself with the quiz
&lt;/h3&gt;

&lt;p&gt;Each page ends with a &lt;strong&gt;"what this picture leaves out"&lt;/strong&gt; box, a &lt;strong&gt;3-question quiz&lt;/strong&gt; and a &lt;strong&gt;further reading&lt;/strong&gt; list linking the primary papers. Every module cites its sources, from &lt;em&gt;Attention Is All You Need&lt;/em&gt; to LoRA, DPO and PagedAttention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtd7u4wgiebs33z1m4jm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtd7u4wgiebs33z1m4jm.gif" alt="Answering the end-of-module quiz" width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What's covered
&lt;/h2&gt;

&lt;p&gt;Here's the full curriculum. I tried to cover both the &lt;strong&gt;core fundamentals&lt;/strong&gt; and the &lt;strong&gt;newer ideas&lt;/strong&gt; that keep showing up in papers and on Twitter/X.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dkv0pbizn8ibiyirc1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dkv0pbizn8ibiyirc1v.png" alt="The curriculum map" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Part 1 · Foundations: how text becomes numbers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M0&lt;/strong&gt; Maths primer (optional), plus a dedicated KL divergence page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M1&lt;/strong&gt; How models learn: training terms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M2&lt;/strong&gt; Why transformers were needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M3&lt;/strong&gt; Tokenisation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M4&lt;/strong&gt; Embeddings&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Part 2 · The Transformer and GPTs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M5&lt;/strong&gt; Attention and the transformer block&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M6&lt;/strong&gt; Encoder, decoder and encoder–decoder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M7&lt;/strong&gt; GPTs: from pretraining to generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M8&lt;/strong&gt; Post-training: SFT, RLHF, DPO and reasoning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M9&lt;/strong&gt; Prompt engineering: zero-shot, few-shot and beyond&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Part 3 · Faster, bigger, smaller
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M10&lt;/strong&gt; Evolution of attention: MHA vs GQA vs MLA (and LRKV)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M11&lt;/strong&gt; Taming the KV cache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M12&lt;/strong&gt; Mixture of experts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M13&lt;/strong&gt; Scaling training: parallelism, ZeRO and FSDP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M14&lt;/strong&gt; Distillation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M15&lt;/strong&gt; Quantisation: FP8, FP4 and TurboQuant&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Part 4 · Real models, new ideas and adapting them
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M16&lt;/strong&gt; Open-source LLM architectures compared&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M17&lt;/strong&gt; New block designs: Attention Residuals and beyond&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M18&lt;/strong&gt; Beyond next-token LLMs: concept models, JEPA and decision models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M19&lt;/strong&gt; Multimodality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M20&lt;/strong&gt; Fine-tuning: full, LoRA and QLoRA&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Part 5 · Retrieval and RAG
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M21&lt;/strong&gt; Embedding models in depth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M22&lt;/strong&gt; Vector search and HNSW&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M23&lt;/strong&gt; Chunking strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M24&lt;/strong&gt; Re-ranking with cross-encoders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M25&lt;/strong&gt; The seven types of RAG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M26&lt;/strong&gt; Graph RAG, open knowledge graphs and vectorless RAG&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Part 6 · Agents and harnesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M27&lt;/strong&gt; Agents, tool use and the ReAct framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M28&lt;/strong&gt; Context engineering and context rot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M29&lt;/strong&gt; Types of memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M30&lt;/strong&gt; Harness engineering: building the harness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M31&lt;/strong&gt; Loop engineering and the Ralph Wiggum loop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M32&lt;/strong&gt; MCP: the Model Context Protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M33&lt;/strong&gt; Skills and plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M34&lt;/strong&gt; Agent orchestration and subagents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M35&lt;/strong&gt; Agent-to-agent communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M36&lt;/strong&gt; Agentic engineering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32td584n282d0sdhtwrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32td584n282d0sdhtwrd.png" alt="An agent buddy running in a Think → Act → Observe hamster wheel" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlawhcpdnfghcecku22b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlawhcpdnfghcecku22b.png" alt="The ReAct agent trace in Module 27" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Part 7 · Production and safety
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M37&lt;/strong&gt; Benchmarking and evaluation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M38&lt;/strong&gt; LLMOps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M39&lt;/strong&gt; Safety, alignment and interpretability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M40&lt;/strong&gt; Model governance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Capstone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;M41&lt;/strong&gt; &lt;strong&gt;Follow one request end to end.&lt;/strong&gt; One prompt's whole journey: text → tokens → embeddings with RoPE → transformer blocks (GQA attention with a KV cache, MoE feed-forward) → logits → sampling → text. Then the same request inside an agent harness that chunks, retrieves and re-ranks context, calls a tool, writes to memory, and is traced and evaluated. A &lt;strong&gt;tiny real transformer block runs in your browser&lt;/strong&gt;, and you can inspect every intermediate tensor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp2fnfk5yqnxkgb5n5t0.gif" alt="Scrolling through the capstone: one request, end to end" width="600" height="375"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  One visual language across every page
&lt;/h2&gt;

&lt;p&gt;Something I cared about a lot: &lt;strong&gt;colours mean the same thing everywhere.&lt;/strong&gt; The blue you learn as "query" in Module 5 is still "query" in the capstone.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Colour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Query (Q)&lt;/td&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key (K)&lt;/td&gt;
&lt;td&gt;Orange&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value (V)&lt;/td&gt;
&lt;td&gt;Green&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residual stream&lt;/td&gt;
&lt;td&gt;Neutral grey&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router and experts (MoE)&lt;/td&gt;
&lt;td&gt;Purple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frozen weights vs trainable adapters (LoRA)&lt;/td&gt;
&lt;td&gt;Grey vs bright pink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retrieved passages (RAG)&lt;/td&gt;
&lt;td&gt;Filled teal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass / fail / needs review (evals)&lt;/td&gt;
&lt;td&gt;Green / red / amber, always with an icon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Untrusted or injected content&lt;/td&gt;
&lt;td&gt;Red hatching&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once you learn the colours, later diagrams are much easier to read, because half the explanation is already done for you.&lt;/p&gt;

&lt;p&gt;Colour never carries meaning on its own, though. There are icons, labels and transcripts too, and both light and dark themes aim for WCAG AA contrast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvxtvcl80xwykmzinvrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvxtvcl80xwykmzinvrk.png" alt="The attention module in dark mode" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Software engineers and students&lt;/strong&gt; who know some Python and school-level maths and want to really understand what's going on inside an LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ML practitioners&lt;/strong&gt; who want the maths and architecture details collected in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone building with LLMs&lt;/strong&gt; (RAG apps, agents, MCP servers) who wants a mental model of the stack underneath.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two goals I used to test the site:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After &lt;strong&gt;Module 7&lt;/strong&gt;, you should be able to sketch a decoder block and estimate its parameter count to within 10%.&lt;/p&gt;

&lt;p&gt;After &lt;strong&gt;Module 36&lt;/strong&gt;, you should be able to sketch a RAG agent's harness and name where it can fail.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Under the hood (for the curious)
&lt;/h2&gt;

&lt;p&gt;I deliberately kept the tech simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plain JavaScript and static files, no build step.&lt;/strong&gt; &lt;code&gt;index.html&lt;/code&gt; is the shell, and each module is its own file (&lt;code&gt;assets/m/m&amp;lt;id&amp;gt;.js&lt;/code&gt;) that loads lazily when you navigate to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A small reusable component library&lt;/strong&gt; (&lt;code&gt;core.js&lt;/code&gt;, &lt;code&gt;kit.js&lt;/code&gt;): router, depth switch, &lt;code&gt;ScrollyStage&lt;/code&gt; (sticky visual next to scrolling text), sliders, probability bars, matrix grids, line charts, quizzes, colour-linked math blocks, pipeline diagrams and agent traces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KaTeX&lt;/strong&gt; for the maths and &lt;strong&gt;Pyodide + NumPy&lt;/strong&gt; for the runnable Python cells.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan-driven content.&lt;/strong&gt; The whole course is written as a single build plan in Markdown. A Python script (&lt;code&gt;scripts/build_data.py&lt;/code&gt;) parses it into the curriculum, tables and reading lists. If a module script fails to load, the page falls back to an outline generated from the plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployed on Vercel&lt;/strong&gt; as a static site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To run it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/amananandrai/llm-explained
&lt;span class="nb"&gt;cd &lt;/span&gt;llm-explained
./scripts/dev.sh                    &lt;span class="c"&gt;# wraps index.html into dev.html&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8765         &lt;span class="c"&gt;# open http://localhost:8765/dev.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;p&gt;In the same spirit as the "what this picture leaves out" boxes, here's what the site &lt;em&gt;doesn't&lt;/em&gt; do yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It doesn't use real production tokenisers, recorded agent traces or live LLM calls. Widgets that would need those use in-browser computation (byte-level BPE, a real HNSW, numerical KL, a tiny real transformer block) or written examples with illustrative numbers, and the page labels them.&lt;/li&gt;
&lt;li&gt;The model spec cards in Module 16 are transcribed from published configs. If you spot an error, please tell me!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why I built it, and why I'm sharing it
&lt;/h2&gt;

&lt;p&gt;Building this was the best way I've found to learn. You can't animate attention cell by cell, or write a widget that shows a KV cache growing, without understanding exactly what's happening. Every page exposed a gap in my own understanding that I then had to fill.&lt;/p&gt;

&lt;p&gt;I'm sharing it because if it helped me, it may help you too. And sharing it means people will find my mistakes, which is how I keep learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Help make it better
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kt96grrm7brlgcwn93f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kt96grrm7brlgcwn93f.png" alt="Three buddies: one holding a star, one catching a bug, one sending a love-letter PR" width="800" height="416"&gt;&lt;/a&gt;&lt;br&gt;
This project gets better with every pair of eyes on it. &lt;strong&gt;Suggestions are always welcome&lt;/strong&gt;, big or small. Here's how you can help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;Star the repo&lt;/strong&gt; on &lt;a href="https://github.com/amananandrai/llm-explained" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. It helps more learners find it, and it makes my day.&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Raise an issue&lt;/strong&gt; for anything wrong, confusing or broken: &lt;a href="https://github.com/amananandrai/llm-explained/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Raise a PR&lt;/strong&gt; to fix a typo, improve an explanation, add a widget or even a whole module: &lt;a href="https://github.com/amananandrai/llm-explained/pulls" rel="noopener noreferrer"&gt;pull requests&lt;/a&gt; are welcome.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Suggest a topic&lt;/strong&gt; you want explained, right here in the comments.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Share it&lt;/strong&gt; with a friend, classmate or teammate who's learning about LLMs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick a module, flip the depth switch, play with a knob, and tell me which concept finally clicked for you. 👇&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://llm-explained-lovat.vercel.app/" rel="noopener noreferrer"&gt;llm-explained-lovat.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>I Built a Visual System Design Reference — Switch Any Architecture Between AWS, Azure, GCP &amp; Open Source</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Mon, 02 Nov 2026 20:40:43 +0000</pubDate>
      <link>https://dev.to/amananandrai/i-built-a-visual-system-design-reference-switch-any-architecture-between-aws-azure-gcp-open-55og</link>
      <guid>https://dev.to/amananandrai/i-built-a-visual-system-design-reference-switch-any-architecture-between-aws-azure-gcp-open-55og</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Visual System Design Reference — Switch Any Architecture Between AWS, Azure, GCP &amp;amp; Open Source
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 &lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://system-design-explainer.vercel.app/" rel="noopener noreferrer"&gt;system-design-explainer.vercel.app&lt;/a&gt;&lt;br&gt;
⭐ &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/system-design-explainer" rel="noopener noreferrer"&gt;amananandrai/system-design-explainer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8abbov144wacgsv7xly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8abbov144wacgsv7xly.png" alt="System Design Explainer home page" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Why I Built This
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepyc7fjdjnrokr5lf1tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fepyc7fjdjnrokr5lf1tn.png" alt="Before: 47 tabs of scattered diagrams. After: one map for every system" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like a lot of developers, I've spent hours reading system design articles, watching interview prep videos, and staring at static diagrams trying to understand &lt;em&gt;how YouTube actually handles an upload&lt;/em&gt; or &lt;em&gt;how Uber matches a rider to a driver in real time&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The problem I kept running into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagrams were &lt;strong&gt;static&lt;/strong&gt; — you could see the boxes, but not how a request actually flows through them.&lt;/li&gt;
&lt;li&gt;Every diagram was tied to &lt;strong&gt;one vendor's vocabulary&lt;/strong&gt;. An AWS diagram says "S3, SQS, DynamoDB", a GCP one says "Cloud Storage, Pub/Sub, Bigtable" — and translating between them in your head is tiring.&lt;/li&gt;
&lt;li&gt;My notes were scattered across bookmarks, Notion pages, and screenshots.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build the reference I wished I had.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This started as a personal project to learn and grow.&lt;/strong&gt; Building it forced me to actually understand each architecture well enough to draw it, break it into steps, and map every component across clouds. Somewhere along the way, I realised it could be just as useful for others preparing for interviews, designing real systems, or simply curious about how the apps they use every day work under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What Is System Design Explainer?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;System Design Explainer&lt;/strong&gt; is an interactive system design reference site where you can &lt;strong&gt;visualise architectures of real-world systems&lt;/strong&gt; and &lt;strong&gt;view the same architecture through different tool lenses&lt;/strong&gt; — a generic view, AWS, Google Cloud, Azure, or open-source tooling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4sdjvk5uu1r63vx2dl1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4sdjvk5uu1r63vx2dl1.png" alt="YouTube architecture page with the diagram on the left and requirements on the right" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every system page covers the requirements, APIs, capacity estimates, data model, request-flow walkthroughs, bottlenecks, scaling and extensions — all next to an auto-laid-out architecture diagram.&lt;/p&gt;

&lt;p&gt;At the time of writing it has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;36 systems&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;36 components&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;27 concepts&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ☁️ 1. Switch Clouds in One Click
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftu64ethi3xtwjcojsady.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftu64ethi3xtwjcojsady.png" alt="Same architecture, new outfit: the same service mascot dressed up for Generic, AWS, GCP, Azure and Open source" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the feature I'm most excited about. Every architecture can be relabelled for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generic&lt;/strong&gt; (vendor-neutral building blocks)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the same "object storage → queue → worker → CDN" flow instantly becomes the matching services for whichever stack you work with. Here's the YouTube design switching between all five:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgnsni6nb2xxfrugve1ny.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgnsni6nb2xxfrugve1ny.gif" alt="YouTube architecture switching between Generic, AWS, GCP, Azure and Open source" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Object storage becomes &lt;strong&gt;Amazon S3&lt;/strong&gt;, &lt;strong&gt;Cloud Storage&lt;/strong&gt;, &lt;strong&gt;Azure Blob Storage&lt;/strong&gt; or &lt;strong&gt;MinIO&lt;/strong&gt;; the event stream becomes &lt;strong&gt;Amazon MSK&lt;/strong&gt;, &lt;strong&gt;Pub/Sub&lt;/strong&gt;, &lt;strong&gt;Azure Event Hubs&lt;/strong&gt; or &lt;strong&gt;Apache Kafka&lt;/strong&gt; — same boxes, same arrows, different names. Great for interviews (where you're often asked to stay generic) &lt;em&gt;and&lt;/em&gt; for real-world work (where you're usually tied to a specific cloud).&lt;/p&gt;

&lt;h3&gt;
  
  
  ▶️ 2. Play Hop-by-Hop Walkthroughs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4w77lx2h9864mcb45spq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4w77lx2h9864mcb45spq.png" alt="A little envelope request hopping from Client to Load balancer to API gateway to Upload service to Object storage" width="800" height="320"&gt;&lt;/a&gt;&lt;br&gt;
Instead of just looking at a diagram, you can &lt;strong&gt;follow a request step by step&lt;/strong&gt; — upload a video, book a seat, pay a merchant, create a short link. Each step highlights what's happening and which component is responsible, so you build intuition for the &lt;em&gt;flow&lt;/em&gt;, not just the &lt;em&gt;layout&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here's what uploading a video to YouTube looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp4r79cc0zfkfe9p2tni3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp4r79cc0zfkfe9p2tni3.gif" alt="Walkthrough: uploading a video on YouTube, step by step" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And booking movie seats on BookMyShow (watch the seat hold and the idempotency key do their thing):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3sc7pi6cuhiqqt579za.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3sc7pi6cuhiqqt579za.gif" alt="Walkthrough: booking seats on BookMyShow" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Walkthroughs work on every cloud too, so you can follow the exact same request through AWS, GCP or Azure services.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  🎬 More walkthroughs (click to expand)
  &lt;p&gt;&lt;strong&gt;Create a short link (URL shortener):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe48p2wovctmpq8bajzkr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe48p2wovctmpq8bajzkr.gif" alt="Walkthrough: creating a short link" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Charge a card (payment gateway):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewgzx8lmbylg9j8unpz8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewgzx8lmbylg9j8unpz8.gif" alt="Walkthrough: charging a card through a payment gateway" width="800" height="836"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Request a ride (Uber, on AWS):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffzkxdqwfmvkrd0qea1p4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffzkxdqwfmvkrd0qea1p4.gif" alt="Walkthrough: requesting an Uber ride on AWS" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Message an online friend (WhatsApp, on GCP):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3n2gjzd51lfdns36ire.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3n2gjzd51lfdns36ire.gif" alt="Walkthrough: sending a WhatsApp message on GCP" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment declined → saga compensation (Amazon, on Azure):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Furyzj58kkzb6w325gdhc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Furyzj58kkzb6w325gdhc.gif" alt="Walkthrough: Amazon checkout with a declined payment and compensation on Azure" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 3. Inspect Components
&lt;/h3&gt;

&lt;p&gt;Every building block (load balancers, caches, queues, databases, CDNs, etc.) has its own page covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The options available per provider&lt;/li&gt;
&lt;li&gt;Common pitfalls&lt;/li&gt;
&lt;li&gt;Which systems on the site use it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2asfrk8fyyik6tl2umok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2asfrk8fyyik6tl2umok.png" alt="Components page: each building block mapped across AWS, GCP, Azure and open source" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhh6ydwi7cqg6flo68iu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhh6ydwi7cqg6flo68iu3.png" alt="In-memory cache component: when to use it, pitfalls and options by provider" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  📖 4. Learn the Patterns
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbx81gr83t4ferah8gzw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbx81gr83t4ferah8gzw3.png" alt="Cute mascots explaining caching, sharding, idempotency and fan-out" width="800" height="448"&gt;&lt;/a&gt;&lt;br&gt;
Core concepts like &lt;strong&gt;caching, sharding, fan-out, sagas, idempotency, consistent hashing, rate limiting, geospatial indexing, WebSockets, change data capture&lt;/strong&gt; and more are explained on their own — and linked back to the real designs where they're applied. Many concept pages even come with a small diagram you can step through.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqk1uc1kucp0atbkqkvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqk1uc1kucp0atbkqkvj.png" alt="Idempotency concept page with a step-through example" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🔎 Bonus: Search &amp;amp; Dark Mode
&lt;/h3&gt;

&lt;p&gt;Hit &lt;code&gt;Ctrl K&lt;/code&gt; to jump to any system, component or concept, and switch to dark mode for late-night interview prep.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7opofytba7w4ppo1nqdr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7opofytba7w4ppo1nqdr.png" alt="Search palette showing results for &amp;quot;pay&amp;quot;" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8lbb3ntnoc0kabak0ox9.png" alt="Uber architecture in dark mode" width="800" height="500"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🗺️ Learning Paths
&lt;/h2&gt;

&lt;p&gt;If you're not sure where to start, there are guided learning paths where each one builds on the patterns from the previous one. Your progress is saved in your browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0t9g1q93x0rv2vdql6at.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0t9g1q93x0rv2vdql6at.png" alt="Learning paths: Foundations, Real-time systems, Media at scale, Money &amp;amp; bookings" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Systems&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 Start here&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Foundations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;URL shortener → Pastebin → API rate limiter → Search autocomplete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡 Intermediate&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Real-time systems&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WhatsApp → WebSockets at scale → Live sports scores → Uber&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 Advanced&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Media at scale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Instagram → Twitter / X → YouTube → Netflix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 Advanced&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Money &amp;amp; bookings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BookMyShow → Amazon → Payment gateway → Buy now, pay later&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🏗️ Systems Covered
&lt;/h2&gt;

&lt;p&gt;The catalogue is filterable by category, difficulty, and concept. Here's a snapshot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwpt3dw3toeczwe8k67l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwpt3dw3toeczwe8k67l.png" alt="All systems catalogue with category, level and concept filters" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Media &amp;amp; Social:&lt;/strong&gt; YouTube, Netflix, Instagram, Twitter / X, WhatsApp, Quora, LinkedIn, Live sports scores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobility &amp;amp; Logistics:&lt;/strong&gt; Uber, Google Maps, Zomato / food delivery, Porter, Car rental, Driver booking &amp;amp; fleet management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commerce &amp;amp; Fintech:&lt;/strong&gt; Amazon, Payment gateway, Buy now pay later, Stock brokerage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bookings &amp;amp; Marketplaces:&lt;/strong&gt; BookMyShow, MakeMyTrip, Airbnb, Airline reservations, NoBroker, Urban Company, Practo, AstroTalk, Meeting scheduler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building Blocks:&lt;/strong&gt; URL shortener, Pastebin, API rate limiter, Search autocomplete, Web crawler, Dropbox, WebSockets at scale, Video calling (WebRTC), Redis Cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I deliberately included a mix of global giants &lt;em&gt;and&lt;/em&gt; systems that are popular in India (BookMyShow, Zomato, NoBroker, Practo, Urban Company…) because those come up a lot in interviews here and are rarely covered elsewhere.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 Who Is This For?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;👩‍💻 &lt;strong&gt;Interview preppers&lt;/strong&gt; — practise explaining designs end-to-end and see how patterns repeat across systems.&lt;/li&gt;
&lt;li&gt;🏢 &lt;strong&gt;Working engineers&lt;/strong&gt; — map a design you know in one cloud to another cloud's services.&lt;/li&gt;
&lt;li&gt;🎓 &lt;strong&gt;Students &amp;amp; beginners&lt;/strong&gt; — start with the Foundations path and build up gradually.&lt;/li&gt;
&lt;li&gt;🤔 &lt;strong&gt;The curious&lt;/strong&gt; — ever wondered what happens when you hit "Book" on a movie seat? Now you can watch it happen.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🛠️ How It's Built
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; (static export) — the whole site is plain static files, deployed on Vercel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Flow + ELK&lt;/strong&gt; — auto-laid-out, zoomable architecture diagrams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — styling, including dark mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zod&lt;/strong&gt; — every system is a typed content file validated against a schema, so adding a new design is mostly writing data, not UI code&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📈 What I Learned Building It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsij8to9l9ok0fitloxuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsij8to9l9ok0fitloxuu.png" alt="Built to learn, shared to help: a mascot in a graduation cap watering a growing diagram plant" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building this taught me far more than reading ever did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You only really understand a system when you have to draw every hop.&lt;/strong&gt; Gaps in my knowledge showed up immediately when I tried to write a walkthrough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clouds are more similar than they look.&lt;/strong&gt; Once you map components across AWS, GCP, Azure and open source, the underlying patterns become obvious — the names are just different.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patterns repeat everywhere.&lt;/strong&gt; Idempotency shows up in payments, bookings, and ride matching. Fan-out shows up in Twitter, Instagram, and LinkedIn. Seeing this visually made it click.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project is very much still growing — and so am I.&lt;/p&gt;


&lt;h2&gt;
  
  
  🤝 Get Involved
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsvgu43qztu7ie04v7xpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsvgu43qztu7ie04v7xpf.png" alt="Come build it with me: star the repo, raise issues, send PRs, share ideas" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a learning project, and I'd love for it to become a community resource. If you found it useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;Star the repo on GitHub&lt;/strong&gt; — it really helps more people discover it: &lt;a href="https://github.com/amananandrai/system-design-explainer" rel="noopener noreferrer"&gt;github.com/amananandrai/system-design-explainer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Share suggestions&lt;/strong&gt; — which system should I add next? Drop it in the comments!&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Raise issues&lt;/strong&gt; — spotted an inaccurate diagram, a wrong cloud mapping, or a bug? Please &lt;a href="https://github.com/amananandrai/system-design-explainer/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Raise PRs&lt;/strong&gt; — contributions are very welcome, whether it's a new system, a better walkthrough, a component fix, or a UI improvement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to add a system? Create a file in &lt;code&gt;src/content/systems/&lt;/code&gt;, register it in &lt;code&gt;systems/index.ts&lt;/code&gt;, follow the schema in &lt;code&gt;src/types/schema.ts&lt;/code&gt;, and run &lt;code&gt;npm run validate&lt;/code&gt; to check it. To run it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/amananandrai/system-design-explainer.git
&lt;span class="nb"&gt;cd &lt;/span&gt;system-design-explainer
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev   &lt;span class="c"&gt;# http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🙌 Wrapping Up
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;Try it here:&lt;/strong&gt; &lt;a href="https://system-design-explainer.vercel.app/" rel="noopener noreferrer"&gt;system-design-explainer.vercel.app&lt;/a&gt;&lt;br&gt;
⭐ &lt;strong&gt;Star it here:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/system-design-explainer" rel="noopener noreferrer"&gt;github.com/amananandrai/system-design-explainer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd genuinely love to hear your feedback. Tell me in the comments which architecture you explored first — and which one you want to see next!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu1lzal8is4gakv8tfsqu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu1lzal8is4gakv8tfsqu.gif" alt="Thanks for reading! The mascots bouncing with party hats" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy designing! 🚀&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built 101 Indian Monuments in the Browser Using Only Code (No 3D Models)</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Fri, 30 Oct 2026 18:48:22 +0000</pubDate>
      <link>https://dev.to/amananandrai/i-built-101-indian-monuments-in-the-browser-using-only-code-no-3d-models-3000</link>
      <guid>https://dev.to/amananandrai/i-built-101-indian-monuments-in-the-browser-using-only-code-no-3d-models-3000</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3uurw9rao4jwt7m8o67g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3uurw9rao4jwt7m8o67g.gif" alt=" " width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There isn't a single 3D model file on this site.&lt;/strong&gt; Every one of these 101 monuments, from the Taj Mahal to a Himalayan monastery, is a small JavaScript function that builds the building out of boxes, cylinders and domes.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://monuments-of-india-nu.vercel.app" rel="noopener noreferrer"&gt;monuments-of-india-nu.vercel.app&lt;/a&gt; · &lt;br&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/monuments-of-india" rel="noopener noreferrer"&gt;github.com/amananandrai/monuments-of-india&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The project in numbers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏛️ &lt;strong&gt;101&lt;/strong&gt; monuments across &lt;strong&gt;26&lt;/strong&gt; states and union territories&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;0&lt;/strong&gt; downloaded 3D models, &lt;strong&gt;0&lt;/strong&gt; build steps, &lt;strong&gt;0&lt;/strong&gt; npm dependencies for the site&lt;/li&gt;
&lt;li&gt;🪶 &lt;strong&gt;~2 KB&lt;/strong&gt; of code per monument on average (the smallest is under 1 KB)&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;1&lt;/strong&gt; shader that paints stone, brick, marble and water on all of them&lt;/li&gt;
&lt;li&gt;🌙 Day and night modes, with floodlights, festival lights and stars&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Most people can find the Taj Mahal on a map. Far fewer could place Rani ki Vav, Ramappa or Key Monastery. I wanted a way to &lt;em&gt;see&lt;/em&gt; how widely India's architecture is spread, and to explore each building from every angle instead of scrolling through photos.&lt;/p&gt;

&lt;p&gt;So the site opens on a map of India, not a list. Every monument is a pin, coloured by kind: 51 temples and shrines, 25 tombs and memorials, 17 forts and palaces, and 8 civic and engineering works. Click one, and the map gives way to a 3D model you can spin, zoom and step through with the arrow keys.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4j0xiz8hkrdy0xpb6fkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4j0xiz8hkrdy0xpb6fkm.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every monument also has its own link, so &lt;a href="https://monuments-of-india-nu.vercel.app/#taj-mahal" rel="noopener noreferrer"&gt;&lt;code&gt;#taj-mahal&lt;/code&gt;&lt;/a&gt; opens the Taj directly.&lt;/p&gt;


&lt;h2&gt;
  
  
  How a monument is born, in five steps
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgl412q1o2ajiux9n7cw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgl412q1o2ajiux9n7cw.png" alt=" " width="799" height="378"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Snap together simple shapes 🧱
&lt;/h3&gt;

&lt;p&gt;Think of LEGO. Instead of downloading a ready-made Qutub Minar, the code stacks simple pieces: a flat box for the base, five tapering cylinders for the storeys, a ring of balconies, and a small domed pavilion on top.&lt;/p&gt;

&lt;p&gt;Two tricks make the shapes richer than plain LEGO:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lathe&lt;/strong&gt; works like a potter's wheel. Draw half the outline of a dome, spin it, and you get the whole dome. Every onion dome on the site comes from one shared outline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extrude&lt;/strong&gt; works like a cookie cutter pushed through dough. Draw a flat shape, such as an arch or a star-shaped platform, and the code pushes it into a thick 3D slab.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 2: Crimp the edges ✨
&lt;/h3&gt;

&lt;p&gt;The Qutub Minar's storeys aren't smooth tubes; they have ridges (flutes). To make them, the code walks around each cylinder and pushes the wall in and out in a wave, like crimping the edge of a pie crust. Change the wave and you get a different storey: rounded flutes at the bottom, star-shaped ones higher up.&lt;/p&gt;

&lt;p&gt;Here's the heart of it, trimmed down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// For every point on the tier's surface...&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atan2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                      &lt;span class="c1"&gt;// how far around the tower are we?&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.07&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// push out in 12 waves&lt;/span&gt;
&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setZ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Reuse the small pieces 🔁
&lt;/h3&gt;

&lt;p&gt;Indian architecture repeats its vocabulary: chhatris (small domed pavilions), minarets, kalash finials, shikhara spires and gopuram gateways appear again and again. These all live in one shared file, &lt;code&gt;js/helpers.js&lt;/code&gt;, so a new monument mostly combines pieces that already exist.&lt;/p&gt;

&lt;p&gt;This is why some monuments are tiny. The whole Somnath Temple, including the sea behind it and the arrow pillar on its sea wall, is under 1 KB, because a single helper call builds the entire temple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;nagaraTemple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;STONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;SHADE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plinth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;halls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Paint it with a "magic stone" shader 🎨
&lt;/h3&gt;

&lt;p&gt;Plain shapes still look like plain shapes. What makes them read as stone is the surface shader in &lt;code&gt;js/surface.js&lt;/code&gt;, and it's the single most important idea in the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; normally, to put a pattern on a 3D shape you "unwrap" it, like cutting gift-wrap to fit each box by hand. Doing that for every piece of 101 buildings was never going to happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; the pattern lives &lt;em&gt;in space itself&lt;/em&gt;. Imagine carving each building out of one giant block of marble whose veins already run through it. Wherever you cut, the pattern is there and fits perfectly. So a one-metre block is exactly the same size on the Qutub Minar as on the walls of Agra Fort, no matter how either was built.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpoq7dazvlhxibsdjqyty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpoq7dazvlhxibsdjqyty.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From that one idea, the shader draws:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block joints, brick courses and marble veins.&lt;/strong&gt; Each material is tagged with a kind (masonry, marble, brick, rock, jali screen, glazed tiles, carved frieze and more).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake bumps.&lt;/strong&gt; It shades the joints and veins with light-and-shadow hints, the way an artist shades a pencil drawing, so flat walls &lt;em&gt;look&lt;/em&gt; grooved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weathering.&lt;/strong&gt; Darker grime near the ground and faint rain streaks down the walls, like a film crew aging a set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A tiny random tint per piece&lt;/strong&gt;, so a row of twenty identical columns doesn't look photocopied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moving water.&lt;/strong&gt; Four layers of gentle, drifting ripples break up the sky's reflection, the way it looks on a real pond.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the ten best-known monuments, the shader adds grain from &lt;strong&gt;real photographs&lt;/strong&gt; (free CC0 textures from Poly Haven). Picture three projectors shining a photo of real marble onto the model from the front, the side and the top. The photo's own colour is removed and only its grain is kept, then tinted to the model's colour. The Taj stays white, the Red Fort stays red, and any other monument using the same stone gets the detail for free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Light it like a photograph ☀️
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A sun with soft shadows&lt;/strong&gt; and a sky light that gently fills the shaded side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A reflection of the sky&lt;/strong&gt; for gold, bronze and polished marble to shine with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambient occlusion&lt;/strong&gt; darkens corners and the undersides of roofs, where light struggles to reach, like dust settling in corners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tone mapping&lt;/strong&gt; is the camera's exposure setting, so a bright sky doesn't turn pure white.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Night mode&lt;/strong&gt; switches on floodlights and festival lights, adds a soft glow (bloom) around them, and fills the sky with stars.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdokmveq3tbvu8iovjhq8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdokmveq3tbvu8iovjhq8.png" alt=" " width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of these effects is special on its own. Stacked together, they stop your eye from reading the models as boxes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why code instead of 3D scans?
&lt;/h2&gt;

&lt;p&gt;A 3D scan is like a photo of a cake: very detailed, but megabytes per monument, with licensing questions attached. A coded model is like the recipe: a couple of kilobytes, readable by anyone, and easy to change.&lt;/p&gt;

&lt;p&gt;Each monument also gets a "library card" in &lt;code&gt;js/data.js&lt;/code&gt; with its name, local-script name, coordinates, dates, style, material and the recipe that builds it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'taj-mahal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Uttar Pradesh'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;27.1751&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;78.0421&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'memorial'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Taj Mahal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ताज महल'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;built&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'1632–1653'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Mughal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'White Makrana marble'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;buildTaj&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding the 102nd monument means writing one module and one card. That's it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problems I didn't expect 🐛
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Flickering walls.&lt;/strong&gt; When two surfaces sit in exactly the same spot (a marble band flush with a wall, the stacked slices of a temple spire), the graphics card can't decide which one is in front, so they flicker as the camera moves, like two stickers fighting over the same place. &lt;code&gt;js/coplanar.js&lt;/code&gt; finds every clash and nudges one surface a hair forward in depth. The shapes themselves don't change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Buildings on square islands.&lt;/strong&gt; Lawns and pavements are flat boxes, so every monument looked like it was sitting on a tile with hard edges. &lt;code&gt;js/landscape.js&lt;/code&gt; fades their open edges into the land around them, and lets seas and long rivers run on to the horizon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Hills that bent temples.&lt;/strong&gt; Rocks, hills and trees start as rough low-poly blobs. &lt;code&gt;js/naturalize.js&lt;/code&gt; rebuilds them in more detail and roughens them with noise, like squishing clay. The first catch: a temple sitting on a hilltop got warped along with the hill. The fix was to let hills only bulge &lt;em&gt;outward&lt;/em&gt;, so their flat tops stay flat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The ocean that shimmered.&lt;/strong&gt; A sea made of a few giant triangles loses precision far from the camera and starts to shimmer. The water is now split into tiles, at most 60 a side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Phones.&lt;/strong&gt; Ambient occlusion and water reflections are skipped on phones to keep the frame rate smooth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Small tools, no tooling
&lt;/h2&gt;

&lt;p&gt;The whole site is &lt;code&gt;index.html&lt;/code&gt;, one stylesheet and plain ES modules, with three.js loaded from a CDN through an import map. There's no build step, no bundler and no framework, so deploying is just pushing to &lt;code&gt;main&lt;/code&gt; on Vercel.&lt;/p&gt;

&lt;p&gt;Looking back, this is what kept the project moving. With no dependencies to update and no build to break, every hour went into the monuments themselves.&lt;/p&gt;

&lt;p&gt;The map isn't a tile service either. India's outline and state borders come from Natural Earth's public-domain data, simplified into SVG paths. When you pick a monument, the camera behaves like a photographer stepping back until the whole building fits in the frame, then glides there in about a second.&lt;/p&gt;




&lt;h2&gt;
  
  
  10 favourites, and how they were built
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Konark Sun Temple, Odisha.&lt;/strong&gt; The temple is a stone chariot for the Sun god, and its 24 carved wheels work as sundials. The model rebuilds the chariot plinth on all 24 wheels from one shared &lt;code&gt;wheel()&lt;/code&gt; helper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hawa Mahal, Jaipur.&lt;/strong&gt; 953 small windows let the women of the court watch the street unseen. The latticed jali holes are cut by the shader rather than modelled, so the stone stays solid and the screens still cast the right shadows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rani ki Vav, Gujarat.&lt;/strong&gt; A stepwell that descends seven levels. The ground is built as raised blocks so the trench can step down, landing by landing, to the well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lotus Temple, Delhi.&lt;/strong&gt; Its 27 marble petals are built from a single curved &lt;code&gt;petal()&lt;/code&gt; shape, repeated in three rings and rotated into place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meenakshi Temple, Madurai.&lt;/strong&gt; Its gateway towers are covered in painted figures. Each gopuram uses a random seed, so every tower gets its own pattern of colours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qutub Minar, Delhi.&lt;/strong&gt; Five storeys, four different kinds of flutes, all from the "pie-crust" trick above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statue of Unity, Gujarat.&lt;/strong&gt; The world's tallest statue, built from smooth, rounded forms: the dhoti's folds, the shawl over the shoulders and half-closed hands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taj Mahal, Agra.&lt;/strong&gt; Onion domes from the shared lathe outline, plus the charbagh garden and its reflecting pool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Somnath Temple, Gujarat.&lt;/strong&gt; The whole model is under 1 KB, thanks to the shared temple helper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ramappa Temple, Telangana.&lt;/strong&gt; One of the few Indian temples named after its sculptor, with a tower built of bricks light enough to float.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;See all 101 on the &lt;a href="https://monuments-of-india-nu.vercel.app" rel="noopener noreferrer"&gt;live map&lt;/a&gt;.&lt;/strong&gt; There's also an 8½-minute film of every monument, five seconds each, rendered from the site's own models; the project is in the repo's &lt;code&gt;video/&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F730vkagzgbyyqa3wj1rf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F730vkagzgbyyqa3wj1rf.jpg" alt=" " width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it, break it, add to it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🗺️ &lt;strong&gt;Explore:&lt;/strong&gt; &lt;a href="https://monuments-of-india-nu.vercel.app" rel="noopener noreferrer"&gt;monuments-of-india-nu.vercel.app&lt;/a&gt;. Try finding Key Monastery on the map without searching.&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;Read the code:&lt;/strong&gt; &lt;a href="https://github.com/amananandrai/monuments-of-india" rel="noopener noreferrer"&gt;github.com/amananandrai/monuments-of-india&lt;/a&gt;. Run it locally with &lt;code&gt;npx serve .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Tell me in the comments: which monument should be #102?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These models are interpretations, not survey records. Anyone who has stood in front of the Kailasa Temple will see what they simplify. The goal is a sense of form, scale and place, and for that, code plus a good shader goes a long way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7b1vbo87xk34k9osarh5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7b1vbo87xk34k9osarh5.jpg" alt=" " width="799" height="527"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Credits:&lt;/strong&gt; three.js (MIT licence). Photo textures: CC0 from &lt;a href="https://polyhaven.com" rel="noopener noreferrer"&gt;Poly Haven&lt;/a&gt;. Map data: &lt;a href="https://www.naturalearthdata.com" rel="noopener noreferrer"&gt;Natural Earth&lt;/a&gt;, public domain. This article was drafted with AI assistance from the project's source.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>showdev</category>
    </item>
    <item>
      <title>From Code to Culture: Building 101 Indian Monuments in 3D</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Wed, 28 Oct 2026 00:39:09 +0000</pubDate>
      <link>https://dev.to/amananandrai/101-indian-monuments-modelled-in-the-browser-g4f</link>
      <guid>https://dev.to/amananandrai/101-indian-monuments-modelled-in-the-browser-g4f</guid>
      <description>&lt;h1&gt;
  
  
  101 Indian Monuments, Modelled in the Browser
&lt;/h1&gt;

&lt;p&gt;India's heritage has always fascinated me. From intricately carved temple walls and majestic forts to elegant palaces, ancient stepwells and modern architectural landmarks, every monument has a story to tell. These structures are more than stone, brick and marble — they reflect the creativity, engineering skills, beliefs and cultural diversity of the people who built them. Together, they tell the story of a civilisation that has evolved over thousands of years while preserving its unique identity.&lt;/p&gt;

&lt;p&gt;As a developer, I wanted to find a way to bring this heritage a little closer to people through something I love building: technology. That idea became &lt;strong&gt;Monuments of India&lt;/strong&gt;, a website where I modelled 101 Indian monuments directly in the browser. My goal was not simply to create another collection of historical photographs, but to build an interactive experience that allows people to explore these architectural landmarks, appreciate their forms and discover places they might not have encountered before.&lt;/p&gt;

&lt;p&gt;One of the things I wanted to capture was the sheer diversity of Indian architecture. A temple in Tamil Nadu, a Mughal monument in Agra, a stepwell in Gujarat and a Buddhist monastery in the Himalayas can look worlds apart, yet each represents an important part of India's cultural story. I wanted visitors to experience this diversity visually — to explore monuments across different states, understand where they are located and get a sense of their distinctive architectural character.&lt;/p&gt;

&lt;p&gt;That vision shaped the experience itself. Instead of presenting 101 monuments as a long, static list, I built an interactive map of India as the starting point. Visitors can explore landmarks geographically, select a monument and move into a 3D view where they can rotate, zoom in and examine its structure from different angles. Each model is paired with historical context, helping connect the visual experience with the story behind the architecture.&lt;/p&gt;

&lt;p&gt;The interesting part for me was figuring out how to build all of this as a developer. Rather than relying on pre-made 3D models or downloaded architectural assets, I chose to construct the monuments programmatically using code. This turned the project into both a creative exercise and a technical challenge: translating real-world architecture into 3D geometry, reproducing distinctive shapes and materials, and making the experience interactive without making the website unnecessarily heavy.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk through how I built the project, the technologies and rendering techniques behind it, and some of the engineering decisions that made it possible to model 101 different monuments in the browser. From generating architectural structures with Three.js primitives to creating procedural surface details, lighting, textures and an interactive map, I'll explore how ordinary web technologies can be used to create something that brings history, design and programming together.&lt;/p&gt;

&lt;p&gt;For me, this project is a small contribution to celebrating India's rich cultural and architectural heritage through technology. It's also a reminder that code can be more than a way to build applications — it can be a medium for exploring history, communicating ideas and making our shared heritage accessible in new ways. &lt;strong&gt;So, let's look at how these 101 monuments came to life in the browser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Monuments of India&lt;/em&gt; opens on a map of the country, not a list of files. Its 101 landmarks are pins on India's outline, coloured by kind: temples and shrines, forts and palaces, tombs and memorials, and civic and engineering works. Where several places would land on the same spot, they fold into a numbered cluster, and choosing it zooms in until the pins separate. Beside the map is a list grouped by state that narrows as you type. Pick a place and the map gives way to a 3D model you can orbit, zoom and step through with the arrow keys. Each monument also has its own address, such as &lt;a href="https://monuments-of-india-nu.vercel.app/#taj-mahal" rel="noopener noreferrer"&gt;&lt;code&gt;#taj-mahal&lt;/code&gt;&lt;/a&gt;, so a link can open a model directly. Opening on the map was the most important design choice. Most people know the Taj Mahal is in Agra, but fewer could place Rani ki Vav, Ramappa or Key Monastery. Seeing them on the map shows how widely India's architecture is spread before you open a single model. The site is at &lt;a href="https://monuments-of-india-nu.vercel.app" rel="noopener noreferrer"&gt;monuments-of-india-nu.vercel.app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nothing in the viewer is a downloaded mesh, and the site has no build step. Each landmark is a module in &lt;code&gt;js/monuments/&lt;/code&gt; that builds the structure in code from &lt;a href="https://threejs.org/" rel="noopener noreferrer"&gt;three.js&lt;/a&gt; primitives (boxes, cylinders, spheres, lathed profiles and extruded shapes) at roughly real-world proportions. The Qutub Minar's fluting, for example, comes from pushing each tier's vertices outward with a cosine of the angle around the tower. &lt;code&gt;js/helpers.js&lt;/code&gt; holds the shared materials (marble, red sandstone, granite, gold and several kinds of water) and the small pieces the monuments reuse, such as chhatris and rings. &lt;code&gt;js/data.js&lt;/code&gt; is the catalogue: name, place, coordinates, dates, style, material and the function that builds each model. three.js 0.160 loads from a CDN through an import map. Apart from that there is just &lt;code&gt;index.html&lt;/code&gt;, one stylesheet and the modules, served as static files on Vercel. The trade-off is deliberate. A photogrammetry scan would be more exact, but it would weigh megabytes per monument and come with licensing questions. A model written in code is a few kilobytes, can be read and changed like any other code, and makes adding the hundred-and-second monument as easy as adding the second. The pictures below are frames from this viewer. They are models, not photographs.&lt;/p&gt;

&lt;p&gt;Plain boxes would still look like boxes without the surface shader in &lt;code&gt;js/surface.js&lt;/code&gt;. Each material is tagged as masonry, marble, brick, rock, ground, lattice, glazed tile, foliage or water. The fragment shader draws the pattern from the surface's position in the world, not from UVs painted onto each mesh, so a one-metre block is the same size on the Qutub Minar as on a wall of Agra Fort, however that mesh was built. I think this is the most important rendering decision in the project. With 101 models built by hand from primitives, nobody is going to unwrap UVs for each one, and world-space patterns make the problem disappear. Joints, veins, brick courses and lattice holes all come from that pattern, and the same pattern tilts the surface normal to create a bump. Grime collects near the ground, faint streaks run down the walls like rain, and a small tint that changes from piece to piece stops a row of identical columns from looking like copies. Water is handled separately: four layers of drifting noise raise and tilt the normal, so the sky reflects in a broken, moving band instead of a flat sheen.&lt;/p&gt;

&lt;p&gt;Ten of the best-known monuments also get grain from real photographs. CC0 textures from &lt;a href="https://polyhaven.com" rel="noopener noreferrer"&gt;Poly Haven&lt;/a&gt; (marble, red sandstone, sandstone blocks, two plasters, granite and rock) are projected from three directions (triplanar mapping) in the same shader. Each is divided by its average colour and then tinted back to the model's own colour. The Taj stays Makrana white and the Red Fort stays red, and the photograph only adds grain. Any other monument that uses those materials gets the detail for free. Rocks, hills, mountains and trees start as flat, low-poly placeholders. &lt;code&gt;js/naturalize.js&lt;/code&gt; rebuilds them at higher resolution, smooths their shading, and displaces them with noise suited to each object: lumpy boulders, leafy canopies, tiered conifers, ridged mountains with snow on the high peaks, and hills that only bulge outward so a temple on a flat summit isn't warped. Statues are built from smooth rounded forms rather than blocks. For lighting, the frame uses ACES filmic tone mapping, a sun with soft shadows and a hemisphere fill. An environment map rendered from the same sky and ground gives gold, bronze and polished marble something to reflect. In a desktop-width window, an ambient occlusion pass (GTAO) darkens corners and the undersides of eaves. Its radius scales with the model, because a small kiosk and a bridge of about 700 metres need different reaches. Switching to dark mode changes the sky and ground and turns on a bloom pass for the lamps. None of these effects is unusual on its own. What makes them work is that they are layered, so the eye stops reading the models as primitives.&lt;/p&gt;

&lt;p&gt;The map isn't a tile service either. State boundaries and the national outline come from Natural Earth's public-domain data, using its India point of view, simplified into SVG paths in &lt;code&gt;js/india-map.js&lt;/code&gt;. One canvas fills the stage. When you change monuments, the camera fits itself to the model's bounding box along a fixed view direction and eases there in about a second. Faces that share a plane, which would otherwise flicker, get a slight depth offset. Deploying is just pushing to &lt;code&gt;main&lt;/code&gt;. Looking back, the absence of tooling is what kept the project moving. There are no dependencies to update, no build to break and no framework to outgrow, so every change was about the monuments themselves. The models are still interpretations, and anyone who has stood in front of the Kailasa Temple will see what they simplify. The goal is a sense of form, scale and place, not a survey record, and for that, code plus a good shader goes a long way. Below the two views of the site, each of the 101 models is shown as the page draws it, with the short history that appears on its plaque.&lt;/p&gt;

&lt;p&gt;A few other posts on DEV are in the same neighborhood. Alicia Lu wrote &lt;a href="https://dev.to/alicia_lu/how-i-built-a-webgpu-3d-garden-with-houdini-and-threejs-1f69"&gt;How I Built a WebGPU 3D Garden with Houdini and Three.js&lt;/a&gt;. Jonas Javier wrote &lt;a href="https://dev.to/jonasjavier/how-i-drew-a-4d-tesseract-in-threejs-1npc"&gt;How I drew a 4D tesseract in Three.js&lt;/a&gt;. lavitra wrote &lt;a href="https://dev.to/lavitra/threejs-explained-what-youre-actually-building-with-scene-camera-and-mesh-2elp"&gt;Three.js Explained: What You're Actually Building With Scene, Camera, and Mesh&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmwgxycnpdv4whkz6wiv3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmwgxycnpdv4whkz6wiv3.jpg" alt="The Monuments of India home view: a searchable list of 101 landmarks and a map of India with a pin for each one." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The home view. Numbered pins are clusters; the list on the left is grouped by state.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foyf35u3uecgr009zg55f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foyf35u3uecgr009zg55f.jpg" alt="The Taj Mahal open in the site, with the index, the orbit controls and the history plaque." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Opening a monument replaces the map with the model. The plaque carries the place, the date, the material and the history.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The 101 monuments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Qutub Minar
&lt;/h3&gt;

&lt;p&gt;Mehrauli, Delhi · 1199–1220 · Indo-Islamic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsf3vb4ubtg1h7w9v22y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmsf3vb4ubtg1h7w9v22y.jpg" alt="3D model of Qutub Minar, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Begun by Qutb ud-Din Aibak and completed by his successor Iltutmish; Firoz Shah Tughlaq later rebuilt the top storeys. Its five storeys taper from a 14.3 m base to 2.7 m at the top, each ringed by a projecting balcony. The Qutb complex has been a UNESCO World Heritage Site since 1993.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gateway of India
&lt;/h3&gt;

&lt;p&gt;Apollo Bunder, Mumbai · 1913–1924 · Indo-Saracenic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjnf46pkdpsmnkodv5njm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjnf46pkdpsmnkodv5njm.jpg" alt="3D model of Gateway of India, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built to commemorate the 1911 landing of King George V and Queen Mary in Bombay. Designed by the Scottish architect George Wittet, facing the Arabian Sea. The last British troops left India through its arch in February 1948.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Taj Mahal
&lt;/h3&gt;

&lt;p&gt;Agra, Uttar Pradesh · 1632–1653 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjdkygq009b4st812g8a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjdkygq009b4st812g8a.jpg" alt="3D model of Taj Mahal, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Commissioned by Shah Jahan as a tomb for his wife Mumtaz Mahal. The four minarets lean slightly outward, so in an earthquake they would fall away from the tomb. A UNESCO World Heritage Site since 1983.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Charminar
&lt;/h3&gt;

&lt;p&gt;Hyderabad, Telangana · 1591 · Qutb Shahi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvp242asm802f56e7d3at.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvp242asm802f56e7d3at.jpg" alt="3D model of Charminar, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Muhammad Quli Qutb Shah, the founder of Hyderabad. Each of its four sides opens in a grand arch onto a street of the old city. A small mosque occupies the western side of the top floor.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Ram Mandir
&lt;/h3&gt;

&lt;p&gt;Ayodhya, Uttar Pradesh · 2020–2024 · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fat3lnh1kdkceofd6am74.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fat3lnh1kdkceofd6am74.jpg" alt="3D model of Ram Mandir, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consecrated on 22 January 2024. Designed by the Sompura family, temple architects for generations. The main structure was built without iron or steel.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Brihadeeswara Temple
&lt;/h3&gt;

&lt;p&gt;Thanjavur, Tamil Nadu · 1003–1010 CE · Dravidian (Chola)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe05etskr2024co9yvgda.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe05etskr2024co9yvgda.jpg" alt="3D model of Brihadeeswara Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by the Chola emperor Rajaraja I. The vimana rises in 13 tiers and is crowned by a capstone estimated at 80 tonnes. Part of the Great Living Chola Temples, a UNESCO site since 1987.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. India Gate
&lt;/h3&gt;

&lt;p&gt;Kartavya Path, New Delhi · 1921–1931 · Memorial arch&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8blfi9dodjs5jzghy67l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8blfi9dodjs5jzghy67l.jpg" alt="3D model of India Gate, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designed by Edwin Lutyens as the All India War Memorial. It honours soldiers of the British Indian Army who died between 1914 and 1921. More than 13,000 names are inscribed on its surfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Statue of Unity
&lt;/h3&gt;

&lt;p&gt;Ekta Nagar, Gujarat · 2013–2018 · Monumental statue&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9zsz7o65do9s6dm8ksh9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9zsz7o65do9s6dm8ksh9.jpg" alt="3D model of Statue of Unity, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depicts Sardar Vallabhbhai Patel, India’s first Deputy Prime Minister. The world’s tallest statue, unveiled on 31 October 2018. Designed by the sculptor Ram V. Sutar, it faces the Sardar Sarovar Dam on the Narmada.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Howrah Bridge
&lt;/h3&gt;

&lt;p&gt;Kolkata, West Bengal · 1936–1943 · Cantilever truss&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5flxzd6nhglgqdidjqu2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5flxzd6nhglgqdidjqu2.jpg" alt="3D model of Howrah Bridge, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Its 457 m main span crosses the Hooghly with no pier in the river between the two towers. Built with 26,500 tonnes of steel, 23,500 of them high-tensile steel from Tata Steel. Renamed Rabindra Setu in 1965 after Rabindranath Tagore.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Jagannath Puri Temple
&lt;/h3&gt;

&lt;p&gt;Puri, Odisha · 12th century · Kalinga&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F277i1srkvjcso6j0illi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F277i1srkvjcso6j0illi.jpg" alt="3D model of Jagannath Puri Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by King Anantavarman Chodaganga Deva of the Eastern Ganga dynasty. The flag on its summit is changed every day by a priest who climbs the tower. Each year the Rath Yatra carries the deities through Puri on giant wooden chariots.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Golden Temple
&lt;/h3&gt;

&lt;p&gt;Amritsar, Punjab · 1581–1604 · Sikh&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F54nwfl4091usazln6uv1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F54nwfl4091usazln6uv1.jpg" alt="3D model of Golden Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Founded by Guru Arjan, the fifth Sikh Guru, who installed the Adi Granth here in 1604. Its upper storeys were covered in gilded copper under Maharaja Ranjit Singh in the early 19th century. The shrine stands in the Amrit Sarovar pool, reached by a single causeway; its langar serves free meals to tens of thousands of people every day.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Hawa Mahal
&lt;/h3&gt;

&lt;p&gt;Jaipur, Rajasthan · 1799 · Rajput&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4b4b3mj87d5o31v7ndb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4b4b3mj87d5o31v7ndb.jpg" alt="3D model of Hawa Mahal, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Maharaja Sawai Pratap Singh and designed by Lal Chand Ustad. Its 953 small latticed windows (jharokhas) let the women of the court watch street life unseen. The five-storey façade is barely one room deep; breezes through the screens gave it the name “Palace of Winds”.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. Konark Sun Temple
&lt;/h3&gt;

&lt;p&gt;Konark, Odisha · c. 1250 CE · Kalinga&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff7z27fk1ew46n6xt0grl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff7z27fk1ew46n6xt0grl.jpg" alt="3D model of Konark Sun Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by King Narasimhadeva I of the Eastern Ganga dynasty as a giant stone chariot for Surya, the Sun god. Its 24 carved wheels work as sundials: the shadows of the spokes tell the time of day. The main tower collapsed centuries ago; what stands is its porch. A UNESCO World Heritage Site since 1984.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Meenakshi Temple
&lt;/h3&gt;

&lt;p&gt;Madurai, Tamil Nadu · 16th–17th c. · Dravidian (Nayak)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7acu5fanh9or4nwojd3i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7acu5fanh9or4nwojd3i.jpg" alt="3D model of Meenakshi Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dedicated to Meenakshi, a form of Parvati, and her consort Sundareswarar, a form of Shiva. Its 14 gopurams are covered in thousands of painted stucco figures of gods, animals and demons. The tallest, the southern gopuram, rises about 52 m above the old city.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Lotus Temple
&lt;/h3&gt;

&lt;p&gt;Kalkaji, New Delhi · 1980–1986 · Expressionist&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F43q517olrpypijb737qa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F43q517olrpypijb737qa.jpg" alt="3D model of Lotus Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Baháʼí House of Worship, open to people of every faith. Its 27 free-standing marble-clad petals are arranged in clusters of three to form nine sides. Designed by the Iranian-born architect Fariborz Sahba and surrounded by nine pools.&lt;/p&gt;

&lt;h3&gt;
  
  
  16. Gol Gumbaz
&lt;/h3&gt;

&lt;p&gt;Vijayapura, Karnataka · 1626–1656 · Deccan (Adil Shahi)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwkvgitlnl9t37t3s0xpc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwkvgitlnl9t37t3s0xpc.jpg" alt="3D model of Gol Gumbaz, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mausoleum of Muhammad Adil Shah of the Bijapur Sultanate. Its dome, about 44 m across, is one of the largest ever built without internal supports. In the whispering gallery around the inside of the dome, a faint sound echoes several times.&lt;/p&gt;

&lt;h3&gt;
  
  
  17. Mysore Palace
&lt;/h3&gt;

&lt;p&gt;Mysuru, Karnataka · 1897–1912 · Indo-Saracenic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frn0mb44hg6fqpg905vzs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frn0mb44hg6fqpg905vzs.jpg" alt="3D model of Mysore Palace, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seat of the Wadiyar dynasty; it replaced an older wooden palace that burned down in 1897. Designed by the British architect Henry Irwin. On festival nights, and through Dasara, it is lit with nearly 100,000 bulbs.&lt;/p&gt;

&lt;h3&gt;
  
  
  18. Sanchi Stupa
&lt;/h3&gt;

&lt;p&gt;Sanchi, Madhya Pradesh · 3rd c. BCE · Buddhist (Mauryan)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F296be9pqpojb1573iblw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F296be9pqpojb1573iblw.jpg" alt="3D model of Sanchi Stupa, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Commissioned by the emperor Ashoka over relics of the Buddha. Its four gateways (toranas), added in the 1st century BCE, are carved with scenes from the Buddha’s life and the Jataka tales. A UNESCO World Heritage Site since 1989.&lt;/p&gt;

&lt;h3&gt;
  
  
  19. Mahabodhi Temple
&lt;/h3&gt;

&lt;p&gt;Bodh Gaya, Bihar · 5th–6th c. CE · Gupta-era brick&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcoxb4rum1a5onqw2q9ut.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcoxb4rum1a5onqw2q9ut.jpg" alt="3D model of Mahabodhi Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marks the place where Siddhartha Gautama attained enlightenment under the Bodhi tree. Ashoka built the first shrine here; the present brick temple dates from the Gupta period. One of the oldest brick temples still standing in India, and a UNESCO site since 2002.&lt;/p&gt;

&lt;h3&gt;
  
  
  20. Red Fort
&lt;/h3&gt;

&lt;p&gt;Old Delhi · 1639–1648 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcsuwnk6wz95k60js91e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcsuwnk6wz95k60js91e.jpg" alt="3D model of Red Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Shah Jahan as the palace-fortress of his new capital, Shahjahanabad. Every Independence Day the Prime Minister raises the national flag here and addresses the nation. Its walls run about 2.5 km; a UNESCO World Heritage Site since 2007.&lt;/p&gt;

&lt;h3&gt;
  
  
  21. Old Parliament House
&lt;/h3&gt;

&lt;p&gt;Sansad Marg, New Delhi · 1921–1927 · Lutyens’ Delhi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folikvqlmj3xg4hob6b8j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folikvqlmj3xg4hob6b8j.jpg" alt="3D model of Old Parliament House, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designed by Edwin Lutyens and Herbert Baker, and opened in 1927. The Constituent Assembly met in its domed Central Hall to frame the Constitution of India. 144 sandstone columns ring its verandah; it was renamed Samvidhan Sadan in 2023.&lt;/p&gt;

&lt;h3&gt;
  
  
  22. Rashtrapati Bhavan
&lt;/h3&gt;

&lt;p&gt;Raisina Hill, New Delhi · 1912–1929 · Lutyens’ Delhi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7qviv8j6e3phhvuqjnub.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7qviv8j6e3phhvuqjnub.jpg" alt="3D model of Rashtrapati Bhavan, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The official residence of the President of India, designed by Edwin Lutyens. It has 340 rooms on four floors. Its great dome blends a classical form with the shape of the Buddhist stupa at Sanchi.&lt;/p&gt;

&lt;h3&gt;
  
  
  23. Humayun’s Tomb
&lt;/h3&gt;

&lt;p&gt;Nizamuddin, New Delhi · 1565–1572 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkedui7ii0tkjpdr6iqe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkedui7ii0tkjpdr6iqe.jpg" alt="3D model of Humayun’s Tomb, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Commissioned by Humayun’s widow, Empress Bega Begum, and designed by Mirak Mirza Ghiyas. The first garden-tomb on the Indian subcontinent, and a model for the Taj Mahal. A UNESCO World Heritage Site since 1993.&lt;/p&gt;

&lt;h3&gt;
  
  
  24. Jama Masjid
&lt;/h3&gt;

&lt;p&gt;Chandni Chowk, Old Delhi · 1650–1656 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1m8cv4pqhj1abl75ngda.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1m8cv4pqhj1abl75ngda.jpg" alt="3D model of Jama Masjid, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Shah Jahan, facing the Red Fort across the old city. Its courtyard can hold about 25,000 worshippers. Three marble domes striped in black crown the prayer hall, flanked by two tall minarets.&lt;/p&gt;

&lt;h3&gt;
  
  
  25. New Parliament House
&lt;/h3&gt;

&lt;p&gt;Sansad Marg, New Delhi · 2020–2023 · Contemporary&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1p7wlv8p4n2qd66u5wig.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1p7wlv8p4n2qd66u5wig.jpg" alt="3D model of New Parliament House, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inaugurated on 28 May 2023, beside the 1927 building it replaced. Its triangular plan was designed by the architect Bimal Patel. A 6.5 m bronze National Emblem crowns the roof above the central Constitution Hall.&lt;/p&gt;

&lt;h3&gt;
  
  
  26. Dilwara Temples
&lt;/h3&gt;

&lt;p&gt;Mount Abu, Rajasthan · 11th–13th c. · Jain (Maru-Gurjara)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgu14yc1jbxxykc9xm18.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgu14yc1jbxxykc9xm18.jpg" alt="3D model of Dilwara Temples, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The oldest, Vimal Vasahi, was built in 1031 by Vimal Shah, a minister of the Chaulukya king. The marble is carved so finely it looks translucent; the domed ceilings hang down in lotus pendants. A plain outer wall hides the temples and the rows of shrine cells around their courtyards.&lt;/p&gt;

&lt;h3&gt;
  
  
  27. Swaminarayan Akshardham
&lt;/h3&gt;

&lt;p&gt;New Delhi · 2000–2005 · Maru-Gurjara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F85sx5n7b3etgdip9w5v5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F85sx5n7b3etgdip9w5v5.jpg" alt="3D model of Swaminarayan Akshardham, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opened in November 2005 by the BAPS Swaminarayan Sanstha. The main monument has 234 carved pillars, nine domes and more than 20,000 sculpted figures. It rests on the Gajendra Pith, a plinth carved with 148 life-size elephants.&lt;/p&gt;

&lt;h3&gt;
  
  
  28. Kandariya Mahadeva Temple
&lt;/h3&gt;

&lt;p&gt;Khajuraho, Madhya Pradesh · c. 1030 CE · Nagara (Chandela)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vqfqkdffdx0rlrkypi6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0vqfqkdffdx0rlrkypi6.jpg" alt="3D model of Kandariya Mahadeva Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The largest temple at Khajuraho, built under the Chandela dynasty. Its tower is wrapped in 84 smaller spires that rise like the peaks of Mount Kailash. Over 800 sculptures cover its walls; Khajuraho has been a UNESCO site since 1986.&lt;/p&gt;

&lt;h3&gt;
  
  
  29. Ranakpur Jain Temple
&lt;/h3&gt;

&lt;p&gt;Ranakpur, Rajasthan · 15th century · Jain (Maru-Gurjara)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvli70grw44kjeoawndmw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvli70grw44kjeoawndmw.jpg" alt="3D model of Ranakpur Jain Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by the merchant Dharna Shah from 1437 and dedicated to Adinatha. Its 1,444 carved marble pillars are said to be all different. A four-faced (chaturmukha) temple, open on all four sides.&lt;/p&gt;

&lt;h3&gt;
  
  
  30. Chennakesava Temple
&lt;/h3&gt;

&lt;p&gt;Somanathapura, Karnataka · 1258 · Hoysala&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fukr3di9iv0jnhazco34k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fukr3di9iv0jnhazco34k.jpg" alt="3D model of Chennakesava Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Somanatha, a commander of the Hoysala king Narasimha III. Three star-shaped shrines stand on a raised, star-shaped platform. Friezes of elephants, horsemen and epic scenes run round its base; a UNESCO site since 2023.&lt;/p&gt;

&lt;h3&gt;
  
  
  31. Victoria Memorial
&lt;/h3&gt;

&lt;p&gt;Maidan, Kolkata · 1906–1921 · Indo-Saracenic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnlvynedv267h6iwwxe0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnnlvynedv267h6iwwxe0.jpg" alt="3D model of Victoria Memorial, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in memory of Queen Victoria and designed by William Emerson. It is clad in white Makrana marble, the same stone as the Taj Mahal. A bronze Angel of Victory, about 4.9 m tall, turns with the wind on top of the dome.&lt;/p&gt;

&lt;h3&gt;
  
  
  32. Chhatrapati Shivaji Maharaj Terminus
&lt;/h3&gt;

&lt;p&gt;Fort, Mumbai · 1878–1888 · Victorian Gothic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9xtbka0zj9tlj5l5r7e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9xtbka0zj9tlj5l5r7e.jpg" alt="3D model of Chhatrapati Shivaji Maharaj Terminus, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designed by Frederick William Stevens and opened as Victoria Terminus in 1887, the year of Queen Victoria’s Golden Jubilee. It blends Victorian Gothic Revival with traditional Indian architecture. A statue representing Progress stands on the central dome; a UNESCO World Heritage Site since 2004.&lt;/p&gt;

&lt;h3&gt;
  
  
  33. Kailasa Temple, Ellora
&lt;/h3&gt;

&lt;p&gt;Ellora, Maharashtra · 8th century · Dravidian (Rashtrakuta)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5obd0vyjqe18193b6gk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5obd0vyjqe18193b6gk.jpg" alt="3D model of Kailasa Temple, Ellora, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Carved out of a single basalt cliff under the Rashtrakuta king Krishna I. Sculptors cut downward from the top, removing an estimated 200,000 tonnes of rock. It is Cave 16 of the Ellora Caves, a UNESCO World Heritage Site since 1983.&lt;/p&gt;

&lt;h3&gt;
  
  
  34. Vittala Temple, Hampi
&lt;/h3&gt;

&lt;p&gt;Hampi, Karnataka · 15th–16th c. · Vijayanagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft1fuy7bj369pk8ni74qn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft1fuy7bj369pk8ni74qn.jpg" alt="3D model of Vittala Temple, Hampi, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in Vijayanagara, the capital of the Vijayanagara Empire, among Hampi’s granite boulders. The stone chariot in its courtyard is a shrine to Garuda, carved to look like a temple car. The main hall’s 56 pillars ring with musical notes when tapped; Hampi is a UNESCO site since 1986.&lt;/p&gt;

&lt;h3&gt;
  
  
  35. Padmanabhaswamy Temple
&lt;/h3&gt;

&lt;p&gt;Thiruvananthapuram, Kerala · 16th–18th c. · Dravidian and Kerala&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fup9ebnom7yhgwelnz7n4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fup9ebnom7yhgwelnz7n4.jpg" alt="3D model of Padmanabhaswamy Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dedicated to Vishnu as Padmanabha, reclining on the serpent Anantha. Its seven-tier eastern gopuram rises over the Padma Theertham tank. A long corridor of carved granite pillars runs round the inner shrine.&lt;/p&gt;

&lt;h3&gt;
  
  
  36. Basilica of Bom Jesus
&lt;/h3&gt;

&lt;p&gt;Old Goa, Goa · 1594–1605 · Baroque&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fncg42fms10jnw2307a35.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fncg42fms10jnw2307a35.jpg" alt="3D model of Basilica of Bom Jesus, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Completed by the Jesuits in 1605, it holds the remains of St Francis Xavier. Its lime plaster was stripped away in the 20th century, exposing the red laterite stone. Part of the Churches and Convents of Goa, a UNESCO World Heritage Site since 1986.&lt;/p&gt;

&lt;h3&gt;
  
  
  37. Kamakhya Temple
&lt;/h3&gt;

&lt;p&gt;Nilachal Hill, Guwahati · Rebuilt 1565 · Nilachal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7cs11r66rfkeekeaprh6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7cs11r66rfkeekeaprh6.jpg" alt="3D model of Kamakhya Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the most revered Shakti peethas, on Nilachal Hill above the Brahmaputra. Rebuilt in 1565 under the Koch dynasty, with the beehive-shaped dome of the Nilachal style. Each June the Ambubachi Mela draws pilgrims from across India.&lt;/p&gt;

&lt;h3&gt;
  
  
  38. Tawang Monastery
&lt;/h3&gt;

&lt;p&gt;Tawang, Arunachal Pradesh · 1680–1681 · Tibetan Buddhist&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F47guj2085n8v28sk534q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F47guj2085n8v28sk534q.jpg" alt="3D model of Tawang Monastery, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Founded by Merak Lama Lodre Gyatso at the wish of the 5th Dalai Lama. The largest Buddhist monastery in India, on a ridge about 3,000 m up. Its three-storey assembly hall houses a gilded statue of the Buddha about 8 m tall.&lt;/p&gt;

&lt;h3&gt;
  
  
  39. Amber Fort
&lt;/h3&gt;

&lt;p&gt;Amer, Jaipur · 16th–18th c. · Rajput and Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsij3u3ni3763fbcgc48.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsij3u3ni3763fbcgc48.jpg" alt="3D model of Amber Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Begun in 1592 by Raja Man Singh I, a general of the Mughal emperor Akbar. Its Sheesh Mahal, the mirror palace, is lined with thousands of tiny mirrors. One of the Hill Forts of Rajasthan, a UNESCO World Heritage Site since 2013.&lt;/p&gt;

&lt;h3&gt;
  
  
  40. Rani ki Vav
&lt;/h3&gt;

&lt;p&gt;Patan, Gujarat · 11th century · Maru-Gurjara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnv2szna9hx9w6dbrcinr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnv2szna9hx9w6dbrcinr.jpg" alt="3D model of Rani ki Vav, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A stepwell built in memory of the Chaulukya king Bhima I, traditionally by his queen Udayamati. It descends seven levels and holds more than 500 principal sculptures, many of Vishnu’s avatars. A UNESCO World Heritage Site since 2014; it appears on the ₹100 note.&lt;/p&gt;

&lt;h3&gt;
  
  
  41. Ramappa Temple
&lt;/h3&gt;

&lt;p&gt;Palampet, Telangana · 1213 CE · Kakatiya&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4el56qr1c32dpt7hp4xc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4el56qr1c32dpt7hp4xc.jpg" alt="3D model of Ramappa Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in 1213 by Recherla Rudra, a general of the Kakatiya king Ganapati Deva. It is named after its chief sculptor, Ramappa, which is rare for an Indian temple. Its tower is built of bricks light enough to float on water; a UNESCO World Heritage Site since 2021.&lt;/p&gt;

&lt;h3&gt;
  
  
  42. Kedarnath Temple
&lt;/h3&gt;

&lt;p&gt;Kedarnath, Uttarakhand · 8th c. (by tradition) · Himalayan Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zmpq6j5g0rq7ia01apg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zmpq6j5g0rq7ia01apg.jpg" alt="3D model of Kedarnath Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the twelve Jyotirlingas of Shiva, high in the Garhwal Himalaya. Built of large grey stone slabs; tradition links its revival to Adi Shankaracharya. In the 2013 floods a huge boulder lodged behind it and shielded the temple.&lt;/p&gt;

&lt;h3&gt;
  
  
  43. Hazratbal Shrine
&lt;/h3&gt;

&lt;p&gt;Srinagar, Jammu and Kashmir · 1968–1979 · Mughal-inspired&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feevlkw0hctrb9lj96v0n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feevlkw0hctrb9lj96v0n.jpg" alt="3D model of Hazratbal Shrine, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It stands on the north-western shore of Dal Lake in Srinagar. It houses the Moi-e-Muqqadas, a relic believed to be a hair of the Prophet Muhammad. The present white marble shrine, completed in 1979, is known as the only domed mosque in Srinagar.&lt;/p&gt;

&lt;h3&gt;
  
  
  44. Shore Temple
&lt;/h3&gt;

&lt;p&gt;Mahabalipuram, Tamil Nadu · c. 700–728 CE · Dravidian (Pallava)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wa3mcfk9ljd6io4odbl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wa3mcfk9ljd6io4odbl.jpg" alt="3D model of Shore Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by the Pallava king Narasimhavarman II (Rajasimha) beside the Bay of Bengal. One of the oldest structural stone temples in South India: two Shiva shrines and one to Vishnu. Part of the Group of Monuments at Mahabalipuram, a UNESCO World Heritage Site since 1984.&lt;/p&gt;

&lt;h3&gt;
  
  
  45. Gwalior Fort
&lt;/h3&gt;

&lt;p&gt;Gwalior, Madhya Pradesh · 8th–16th c. · Rajput (Tomar)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8m5gcwmueanfidmwcks.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8m5gcwmueanfidmwcks.jpg" alt="3D model of Gwalior Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Raja Man Singh Tomar built the Man Mandir palace on the fort between 1486 and 1516. Its walls are decorated with blue, green and yellow tiles of ducks, elephants and banana trees. The fort crowns a sandstone hill above Gwalior; Babur is said to have called it the pearl among India’s forts.&lt;/p&gt;

&lt;h3&gt;
  
  
  46. Nalanda Mahavihara
&lt;/h3&gt;

&lt;p&gt;Nalanda, Bihar · 5th–12th c. · Gupta and Pala brick&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe6tyqcgaien32angv6nl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe6tyqcgaien32angv6nl.jpg" alt="3D model of Nalanda Mahavihara, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Founded in the 5th century CE under the Gupta kings, it was one of the world’s first residential universities. Scholars came from China, Korea, Tibet and Central Asia; the pilgrim Xuanzang studied here. Its brick ruins include the stepped Sariputta Stupa; a UNESCO World Heritage Site since 2016.&lt;/p&gt;

&lt;h3&gt;
  
  
  47. Tirumala Venkateswara Temple
&lt;/h3&gt;

&lt;p&gt;Tirumala, Andhra Pradesh · Expanded 9th–16th c. · Dravidian&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjaps65nq1winwog6ymy2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjaps65nq1winwog6ymy2.jpg" alt="3D model of Tirumala Venkateswara Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dedicated to Venkateswara, a form of Vishnu, on the Tirumala hills. The vimana over the sanctum, called Ananda Nilayam, is covered in gold. It is one of the most visited places of worship in the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  48. Capitol Complex, Chandigarh
&lt;/h3&gt;

&lt;p&gt;Sector 1, Chandigarh · 1951–1965 · Modernist&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxh38tw15wq6v7v3db86.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxh38tw15wq6v7v3db86.jpg" alt="3D model of Capitol Complex, Chandigarh, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designed by Le Corbusier as the seat of government for Chandigarh, the new capital of Punjab. Its Palace of Assembly, Secretariat and High Court face each other across a vast concrete plaza. The Open Hand Monument turns in the wind; the complex became a UNESCO World Heritage Site in 2016.&lt;/p&gt;

&lt;h3&gt;
  
  
  49. Hidimba Devi Temple
&lt;/h3&gt;

&lt;p&gt;Manali, Himachal Pradesh · 1553 · Himalayan pagoda&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7e4tgjwnlnqp4dyf63v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7e4tgjwnlnqp4dyf63v.jpg" alt="3D model of Hidimba Devi Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in 1553 by Maharaja Bahadur Singh over a cave shrine to Hidimba Devi. Its three square roofs of wooden shingles are crowned by a brass cone. It stands in the Dhungiri forest of tall deodar cedars above Manali.&lt;/p&gt;

&lt;h3&gt;
  
  
  50. Bandra–Worli Sea Link
&lt;/h3&gt;

&lt;p&gt;Mumbai, Maharashtra · 2000–2009 · Cable-stayed bridge&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzyjhkz55ishyl0ghjmbw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzyjhkz55ishyl0ghjmbw.jpg" alt="3D model of Bandra–Worli Sea Link, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opened in 2009, it links Bandra and Worli across Mahim Bay. Its cable-stayed main span hangs from pylons about 128 m tall. Officially the Rajiv Gandhi Sea Link, it carries eight lanes of traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  51. Buland Darwaza
&lt;/h3&gt;

&lt;p&gt;Fatehpur Sikri, Uttar Pradesh · c. 1575–1601 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu2rb1tr8yhmoo67zwnr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu2rb1tr8yhmoo67zwnr.jpg" alt="3D model of Buland Darwaza, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Akbar built it as the great southern gateway to the Jama Masjid of Fatehpur Sikri. Including its broad flight of steps, it rises about 54 m above the ground. An inscription on it quotes a saying of Jesus: the world is a bridge, so pass over it. Fatehpur Sikri is a UNESCO site since 1986.&lt;/p&gt;

&lt;h3&gt;
  
  
  52. Panch Mahal
&lt;/h3&gt;

&lt;p&gt;Fatehpur Sikri, Uttar Pradesh · 1570s · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4a9syecx5jx4bba44jxo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4a9syecx5jx4bba44jxo.jpg" alt="3D model of Panch Mahal, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A five-storey open pavilion in Akbar’s palace at Fatehpur Sikri, built to catch the breeze. Each storey is smaller than the one below, rising to a single domed kiosk on top. It stands on 176 carved columns; stone screens once enclosed its open sides.&lt;/p&gt;

&lt;h3&gt;
  
  
  53. Bara Imambara
&lt;/h3&gt;

&lt;p&gt;Lucknow, Uttar Pradesh · 1784–1791 · Nawabi (Awadhi)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhf7wcmcjodohm01fe2og.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhf7wcmcjodohm01fe2og.jpg" alt="3D model of Bara Imambara, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Nawab Asaf-ud-Daula, partly as a relief project during the famine of 1784. Its vaulted central hall is one of the largest arched halls in the world built without beams. Above it lies the Bhool Bhulaiya, a maze of narrow passages; the Asfi Mosque stands beside it.&lt;/p&gt;

&lt;h3&gt;
  
  
  54. Rumi Darwaza
&lt;/h3&gt;

&lt;p&gt;Lucknow, Uttar Pradesh · 1784 · Nawabi (Awadhi)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxh1svn4la96rva2w1fiu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxh1svn4la96rva2w1fiu.jpg" alt="3D model of Rumi Darwaza, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Nawab Asaf-ud-Daula beside the Bara Imambara. Often called the Turkish Gate, it is said to be modelled on the Sublime Porte in Istanbul. A flared, flower-like crown rises above its arch, topped by an eight-sided kiosk.&lt;/p&gt;

&lt;h3&gt;
  
  
  55. Chota Imambara
&lt;/h3&gt;

&lt;p&gt;Lucknow, Uttar Pradesh · 1837–1838 · Nawabi (Awadhi)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbb5wxxand5ee4ffhw7s2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbb5wxxand5ee4ffhw7s2.jpg" alt="3D model of Chota Imambara, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Nawab Muhammad Ali Shah as his own mausoleum and a hall for Muharram gatherings. It is famed for its chandeliers and gilt mirrors; black Quranic calligraphy runs along its white facade. Two small replicas of the Taj Mahal stand in its garden.&lt;/p&gt;

&lt;h3&gt;
  
  
  56. Itmad-ud-Daulah’s Tomb
&lt;/h3&gt;

&lt;p&gt;Agra, Uttar Pradesh · 1622–1628 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fippukbwxf41nsr6nxwy6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fippukbwxf41nsr6nxwy6.jpg" alt="3D model of Itmad-ud-Daulah’s Tomb, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by the empress Nur Jahan for her father, Mirza Ghiyas Beg. The first Mughal tomb faced entirely in white marble, it is often called the Baby Taj. Its walls are inlaid with coloured stone in the pietra dura technique, later used at the Taj Mahal.&lt;/p&gt;

&lt;h3&gt;
  
  
  57. Akbar’s Tomb
&lt;/h3&gt;

&lt;p&gt;Sikandra, Agra · 1605–1613 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jyluyom46o7plgsh9qq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jyluyom46o7plgsh9qq.jpg" alt="3D model of Akbar’s Tomb, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Akbar began his own tomb; his son Jahangir completed it in 1613. Its five storeys rise in tiers of kiosks to a white marble terrace open to the sky. The southern gateway carries four white marble minarets, the first on a Mughal gateway.&lt;/p&gt;

&lt;h3&gt;
  
  
  58. Agra Fort
&lt;/h3&gt;

&lt;p&gt;Agra, Uttar Pradesh · 1565–1573 · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9v940chr03t6wqfolb05.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9v940chr03t6wqfolb05.jpg" alt="3D model of Agra Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Akbar rebuilt the fort in red sandstone between 1565 and 1573. Shah Jahan added white marble palaces and spent his last years confined here, within sight of the Taj Mahal. A UNESCO World Heritage Site since 1983.&lt;/p&gt;

&lt;h3&gt;
  
  
  59. Bibi Ka Maqbara
&lt;/h3&gt;

&lt;p&gt;Chhatrapati Sambhajinagar, Maharashtra · 1660s · Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjpe6h8xsvn67pmbhqf9i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjpe6h8xsvn67pmbhqf9i.jpg" alt="3D model of Bibi Ka Maqbara, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Prince Azam Shah in memory of his mother, Dilras Banu Begum, wife of Aurangzeb. Modelled on the Taj Mahal, it is known as the Taj of the Deccan. Only the dome is marble; most of the rest is basalt finished with fine lime plaster.&lt;/p&gt;

&lt;h3&gt;
  
  
  60. Safdarjung’s Tomb
&lt;/h3&gt;

&lt;p&gt;Lodhi Road, New Delhi · 1754 · Late Mughal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1avg0rtwve4zxesdth8j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1avg0rtwve4zxesdth8j.jpg" alt="3D model of Safdarjung’s Tomb, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in 1754 by Nawab Shuja-ud-Daula for his father Safdarjung, prime minister of the Mughal empire. It is often called the last great garden tomb of the Mughals. It stands in a walled charbagh garden with water channels and corner pavilions.&lt;/p&gt;

&lt;h3&gt;
  
  
  61. Somnath Temple
&lt;/h3&gt;

&lt;p&gt;Prabhas Patan, Gujarat · Rebuilt 1951 · Maru-Gurjara (Chalukya)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzfss9p5a8cmrpeuimvet.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzfss9p5a8cmrpeuimvet.jpg" alt="3D model of Somnath Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Revered as the first of the twelve Jyotirlingas, on the Arabian Sea coast. Destroyed and rebuilt many times; the present temple was completed in 1951. An arrow pillar on its sea wall marks that no land lies in a straight line between it and the South Pole.&lt;/p&gt;

&lt;h3&gt;
  
  
  62. Mallikarjuna Temple
&lt;/h3&gt;

&lt;p&gt;Srisailam, Andhra Pradesh · Expanded 14th–16th c. · Dravidian&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmjniilwid3q5vvxelg2r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmjniilwid3q5vvxelg2r.jpg" alt="3D model of Mallikarjuna Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Srisailam hill in the Nallamala forest, above the Krishna river. It is both a Jyotirlinga and a Shakti Peetha, with the shrine of the goddess Bhramaramba. Its high outer walls are carved with friezes; its gopurams were raised under Vijayanagara rulers.&lt;/p&gt;

&lt;h3&gt;
  
  
  63. Mahakaleshwar Temple
&lt;/h3&gt;

&lt;p&gt;Ujjain, Madhya Pradesh · Rebuilt 18th c. · Bhumija and Maratha&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl19rk8ue9r8pilsn9ao5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl19rk8ue9r8pilsn9ao5.jpg" alt="3D model of Mahakaleshwar Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beside the Shipra river in Ujjain; its lingam is the only Jyotirlinga that faces south. Its Bhasma Aarti, offered with sacred ash before dawn each day, is famous. The temple has three levels; the Nagchandreshwar shrine on top opens only on Nag Panchami.&lt;/p&gt;

&lt;h3&gt;
  
  
  64. Omkareshwar Temple
&lt;/h3&gt;

&lt;p&gt;Mandhata island, Madhya Pradesh · Rebuilt 18th c. · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6vpodcixav1br9eexude.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6vpodcixav1br9eexude.jpg" alt="3D model of Omkareshwar Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Mandhata island in the Narmada, which is said to be shaped like the sacred syllable Om. Pilgrims reach the island by bridge or boat and bathe at its ghats. Mamleshwar, across the river, is worshipped together with it as one Jyotirlinga.&lt;/p&gt;

&lt;h3&gt;
  
  
  65. Bhimashankar Temple
&lt;/h3&gt;

&lt;p&gt;Sahyadri hills, Maharashtra · 13th–18th c. · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flkjtflaasbjwiy9kjrti.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flkjtflaasbjwiy9kjrti.jpg" alt="3D model of Bhimashankar Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the forested Sahyadri hills, at the source of the Bhima river. Its stone temple combines older Nagara work with an 18th-century hall added by Nana Phadnavis. The forest around it is a wildlife sanctuary, home of the Indian giant squirrel.&lt;/p&gt;

&lt;h3&gt;
  
  
  66. Kashi Vishwanath Temple
&lt;/h3&gt;

&lt;p&gt;Varanasi, Uttar Pradesh · 1780 · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcmricd4uzzpadlvbmi40.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcmricd4uzzpadlvbmi40.jpg" alt="3D model of Kashi Vishwanath Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The present temple was built in 1780 by the Maratha queen Ahilyabai Holkar. Maharaja Ranjit Singh had its spire and dome covered in gold in 1835. The Kashi Vishwanath Corridor, opened in 2021, links it directly to the ghats of the Ganga.&lt;/p&gt;

&lt;h3&gt;
  
  
  67. Trimbakeshwar Temple
&lt;/h3&gt;

&lt;p&gt;Trimbak, Nashik · 1755–1786 · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsadsjto9cc95pnhe4k9h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsadsjto9cc95pnhe4k9h.jpg" alt="3D model of Trimbakeshwar Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in black basalt by the Peshwa Balaji Bajirao between 1755 and 1786. Its lingam has three faces, for Brahma, Vishnu and Shiva. It stands below the Brahmagiri hills, where the Godavari river rises.&lt;/p&gt;

&lt;h3&gt;
  
  
  68. Baidyanath Temple
&lt;/h3&gt;

&lt;p&gt;Deoghar, Jharkhand · 16th c. (present form) · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F529zipo9dvpv6cgmpdus.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F529zipo9dvpv6cgmpdus.jpg" alt="3D model of Baidyanath Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Baba Baidyanath Dham complex in Deoghar has 22 temples; it is also a Shakti Peetha. Its spire is crowned by a panchashula, a five-pointed trident, instead of the usual trishula. In the month of Shravan, pilgrims walk over 100 km carrying Ganga water to offer here.&lt;/p&gt;

&lt;h3&gt;
  
  
  69. Nageshwar Temple
&lt;/h3&gt;

&lt;p&gt;Dwarka, Gujarat · Rebuilt 1990s · Nagara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5n4wmibgrx6z9lz06gjt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5n4wmibgrx6z9lz06gjt.jpg" alt="3D model of Nageshwar Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the road between Dwarka and Beyt Dwarka on the Saurashtra coast. A 25 m statue of a seated Shiva rises in the temple garden. Nageshwar means lord of serpents; devotees pray here for protection from poisons.&lt;/p&gt;

&lt;h3&gt;
  
  
  70. Ramanathaswamy Temple
&lt;/h3&gt;

&lt;p&gt;Rameswaram, Tamil Nadu · 12th–17th c. · Dravidian&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzukud75f8tmqkbsrusqm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzukud75f8tmqkbsrusqm.jpg" alt="3D model of Ramanathaswamy Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Rameswaram island; tradition says Rama worshipped Shiva here before crossing to Lanka. Its pillared corridors, about 1.2 km in all, are the longest of any Hindu temple. Pilgrims bathe in 22 sacred wells (theerthams) inside the temple.&lt;/p&gt;

&lt;h3&gt;
  
  
  71. Grishneshwar Temple
&lt;/h3&gt;

&lt;p&gt;Verul, near Ellora · 18th century · Nagara (Maratha)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fukxsnwyo6qqv3c0ygyak.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fukxsnwyo6qqv3c0ygyak.jpg" alt="3D model of Grishneshwar Temple, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Near the Ellora Caves; it is counted as the last of the twelve Jyotirlingas. It was rebuilt in red basalt in the 18th century by Ahilyabai Holkar. Its five-tiered spire and walls are carved with the ten avatars of Vishnu and other figures.&lt;/p&gt;

&lt;h3&gt;
  
  
  72. Dhamek Stupa
&lt;/h3&gt;

&lt;p&gt;Sarnath, Uttar Pradesh · c. 500 CE · Gupta&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl7shdmxm8gd1pka7v1ok.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl7shdmxm8gd1pka7v1ok.jpg" alt="3D model of Dhamek Stupa, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It marks the deer park where the Buddha gave his first sermon after his enlightenment. Built around 500 CE over an older stupa from Ashoka’s time, it is about 43.6 m high and 28 m across. Its lower stone drum is carved with bands of flowers and geometric patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  73. Ajanta Caves
&lt;/h3&gt;

&lt;p&gt;Ajanta, Maharashtra · 2nd c. BCE–c. 480 CE · Rock-cut Buddhist&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4d5s8zmlvgobu6qrpe8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4d5s8zmlvgobu6qrpe8.jpg" alt="3D model of Ajanta Caves, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thirty Buddhist caves cut into a horseshoe-shaped cliff above the Waghora river. Their murals are among the finest surviving paintings of ancient India. Rediscovered by a British hunting party in 1819; a UNESCO World Heritage Site since 1983.&lt;/p&gt;

&lt;h3&gt;
  
  
  74. Rumtek Monastery
&lt;/h3&gt;

&lt;p&gt;Near Gangtok, Sikkim · 1960s · Tibetan Buddhist&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F878cmplzoa19733pb8r9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F878cmplzoa19733pb8r9.jpg" alt="3D model of Rumtek Monastery, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The seat in exile of the Karmapa, head of the Karma Kagyu school of Tibetan Buddhism. The 16th Karmapa rebuilt it in the 1960s, modelled on Tsurphu Monastery in Tibet. It looks out across the valley towards Gangtok.&lt;/p&gt;

&lt;h3&gt;
  
  
  75. Thiksey Monastery
&lt;/h3&gt;

&lt;p&gt;Near Leh, Ladakh · 15th century · Tibetan Buddhist (Gelug)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F67mn1oowdkp047cg1j4h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F67mn1oowdkp047cg1j4h.jpg" alt="3D model of Thiksey Monastery, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A twelve-storey Gelug monastery on a hill above the Indus, often compared to the Potala Palace in Lhasa. Its Maitreya temple holds a statue of the future Buddha about 15 m tall, installed in 1970. It is one of the largest monasteries in Ladakh.&lt;/p&gt;

&lt;h3&gt;
  
  
  76. Key Monastery
&lt;/h3&gt;

&lt;p&gt;Spiti Valley, Himachal Pradesh · Founded c. 11th c. · Tibetan Buddhist&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F30s6ix18w7p918ubmmmv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F30s6ix18w7p918ubmmmv.jpg" alt="3D model of Key Monastery, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The largest monastery in the Spiti Valley, founded about a thousand years ago. It sits on a conical hill above the Spiti river at about 4,166 m. Rebuilt many times after raids, its buildings are piled up the hill like a fortress.&lt;/p&gt;

&lt;h3&gt;
  
  
  77. Gommateshwara Statue
&lt;/h3&gt;

&lt;p&gt;Shravanabelagola, Karnataka · c. 983 CE · Monolithic statue&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4rtvlzr2lge79exrylgr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4rtvlzr2lge79exrylgr.jpg" alt="3D model of Gommateshwara Statue, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A 17.4 m statue of the Jain saint Bahubali, carved from a single block of granite. It was commissioned by Chavundaraya, a minister of the Western Ganga dynasty. Every 12 years the Mahamastakabhisheka festival bathes it in milk, saffron and flowers.&lt;/p&gt;

&lt;h3&gt;
  
  
  78. Palitana Temples
&lt;/h3&gt;

&lt;p&gt;Shatrunjaya hill, Gujarat · 11th–20th c. · Maru-Gurjara&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8n4k2up521vt050wlzy0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8n4k2up521vt050wlzy0.jpg" alt="3D model of Palitana Temples, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More than 800 Jain temples crown Shatrunjaya hill above the town of Palitana. Pilgrims climb more than 3,000 stone steps to reach them. Built over some 900 years, it is one of the holiest Jain pilgrimage sites.&lt;/p&gt;

&lt;h3&gt;
  
  
  79. Shikharji
&lt;/h3&gt;

&lt;p&gt;Parasnath Hill, Jharkhand · 18th c. onward · Jain&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F80yao62v0z7tw45r0o6u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F80yao62v0z7tw45r0o6u.jpg" alt="3D model of Shikharji, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Parasnath Hill, the highest point in Jharkhand. Jain tradition holds that 20 of the 24 Tirthankaras attained liberation (moksha) here. A shrine (tonk) for each of them stands along the ridge, on a pilgrim circuit of about 27 km.&lt;/p&gt;

&lt;h3&gt;
  
  
  80. Parshvanath Temple, Khajuraho
&lt;/h3&gt;

&lt;p&gt;Khajuraho, Madhya Pradesh · c. 950–970 CE · Nagara (Chandela)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl292ipk0spfrarsv2xbc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl292ipk0spfrarsv2xbc.jpg" alt="3D model of Parshvanath Temple, Khajuraho, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The largest Jain temple at Khajuraho, built under the Chandela kings. Its walls carry some of Khajuraho’s finest sculpture, in bands round the shrine. Part of the Khajuraho Group of Monuments, a UNESCO World Heritage Site since 1986.&lt;/p&gt;

&lt;h3&gt;
  
  
  81. Soniji Ki Nasiyan
&lt;/h3&gt;

&lt;p&gt;Ajmer, Rajasthan · 1864–1895 · Jain&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F46jwzj4n6gsjtsfw76oj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F46jwzj4n6gsjtsfw76oj.jpg" alt="3D model of Soniji Ki Nasiyan, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in red sandstone by the Soni family of Ajmer between 1864 and 1895. Its Swarna Nagari hall holds a gilded model of Jain cosmology and the city of Ayodhya. It is also known as the Golden Temple of Ajmer.&lt;/p&gt;

&lt;h3&gt;
  
  
  82. Mehrangarh Fort
&lt;/h3&gt;

&lt;p&gt;Jodhpur, Rajasthan · From 1459 · Rajput&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7iip7mdfxd9z9h8vap7n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7iip7mdfxd9z9h8vap7n.jpg" alt="3D model of Mehrangarh Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Founded by Rao Jodha in 1459 on a rocky hill high above Jodhpur. Its walls rise up to 36 m high and 21 m thick. Below it spreads the Blue City, its houses washed in indigo.&lt;/p&gt;

&lt;h3&gt;
  
  
  83. Chittorgarh Fort
&lt;/h3&gt;

&lt;p&gt;Chittorgarh, Rajasthan · 7th–16th c. · Rajput&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2g32sw6z28ke6ygvxo2f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2g32sw6z28ke6ygvxo2f.jpg" alt="3D model of Chittorgarh Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spread over about 280 hectares on a long plateau, it is one of the largest forts in India. Rana Kumbha raised the nine-storey Vijay Stambh, the Tower of Victory, around 1448. One of the Hill Forts of Rajasthan, a UNESCO World Heritage Site since 2013.&lt;/p&gt;

&lt;h3&gt;
  
  
  84. Jaisalmer Fort
&lt;/h3&gt;

&lt;p&gt;Jaisalmer, Rajasthan · From 1156 · Rajput&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq7x4d49p7g0x0d2opl9z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq7x4d49p7g0x0d2opl9z.jpg" alt="3D model of Jaisalmer Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Founded in 1156 by Rawal Jaisal on Trikuta hill in the Thar Desert. Its yellow sandstone glows gold at sunset, giving it the name Sonar Qila, the Golden Fort. One of the few living forts: thousands of people still live inside its 99 bastions.&lt;/p&gt;

&lt;h3&gt;
  
  
  85. Golconda Fort
&lt;/h3&gt;

&lt;p&gt;Hyderabad, Telangana · 13th–17th c. · Deccan&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm1hkp2we9irbl7x17x2q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm1hkp2we9irbl7x17x2q.jpg" alt="3D model of Golconda Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Qutb Shahi sultans turned an older mud fort into this granite citadel from 1518. A handclap at the Fateh Darwaza gate can be heard at the Bala Hissar pavilion on the summit. Golconda was famous for its diamond trade; the Koh-i-Noor is believed to have come from mines in the region.&lt;/p&gt;

&lt;h3&gt;
  
  
  86. Daulatabad Fort
&lt;/h3&gt;

&lt;p&gt;Near Chhatrapati Sambhajinagar, Maharashtra · 12th–15th c. · Deccan&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F02gcq9ug9xo9k3ws42rt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F02gcq9ug9xo9k3ws42rt.jpg" alt="3D model of Daulatabad Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built as Devagiri by the Yadava kings, on a conical hill with sheer cut-away sides and a moat. In 1327 Muhammad bin Tughlaq renamed it Daulatabad and moved his capital here from Delhi. The Chand Minar, a tall victory tower, was added in 1435.&lt;/p&gt;

&lt;h3&gt;
  
  
  87. City Palace, Udaipur
&lt;/h3&gt;

&lt;p&gt;Udaipur, Rajasthan · From 1559 · Rajput&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbl7uuax5u961s3hc0i87.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbl7uuax5u961s3hc0i87.jpg" alt="3D model of City Palace, Udaipur, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Begun in 1559 by Maharana Udai Singh II, founder of Udaipur. Its front on Lake Pichola stretches about 244 m, added to over some 400 years. The Lake Palace (Jag Niwas) seems to float on the lake in front of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  88. Laxmi Vilas Palace
&lt;/h3&gt;

&lt;p&gt;Vadodara, Gujarat · 1878–1890 · Indo-Saracenic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ci7gpte912606xndlel.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ci7gpte912606xndlel.jpg" alt="3D model of Laxmi Vilas Palace, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for Maharaja Sayajirao Gaekwad III of Baroda and completed in 1890. Said to be four times the size of Buckingham Palace, it is among the largest private homes ever built. It was designed by Major Charles Mant in the Indo-Saracenic style.&lt;/p&gt;

&lt;h3&gt;
  
  
  89. Fort Aguada
&lt;/h3&gt;

&lt;p&gt;Candolim, Goa · 1612 · Portuguese&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ce6cspl0r0ckk068r45.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ce6cspl0r0ckk068r45.jpg" alt="3D model of Fort Aguada, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by the Portuguese in 1612 to guard the mouth of the Mandovi river. Its name comes from the freshwater spring that supplied passing ships. Its lighthouse of 1864 is one of the oldest in Asia.&lt;/p&gt;

&lt;h3&gt;
  
  
  90. Bekal Fort
&lt;/h3&gt;

&lt;p&gt;Kasaragod, Kerala · c. 1650 · Keladi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbb6uwa4q5js9zgobkmac.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbb6uwa4q5js9zgobkmac.jpg" alt="3D model of Bekal Fort, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built around 1650 by Shivappa Nayaka of the Keladi dynasty. Shaped like a keyhole and washed by the sea on three sides, it is the largest fort in Kerala. A tall round observation tower stands at its centre.&lt;/p&gt;

&lt;h3&gt;
  
  
  91. Cooch Behar Palace
&lt;/h3&gt;

&lt;p&gt;Cooch Behar, West Bengal · 1887 · Italian Renaissance&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrf93d4f4wc36fm2y0rz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyrf93d4f4wc36fm2y0rz.jpg" alt="3D model of Cooch Behar Palace, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in 1887 for Maharaja Nripendra Narayan of Cooch Behar. Its classical design was inspired by Buckingham Palace in London. A tall metal dome over the Durbar Hall crowns the two-storey brick palace.&lt;/p&gt;

&lt;h3&gt;
  
  
  92. Sher Shah Suri’s Tomb
&lt;/h3&gt;

&lt;p&gt;Sasaram, Bihar · 1540–1545 · Indo-Afghan (Sur)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3q0cbvz11nd445rxn55.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3q0cbvz11nd445rxn55.jpg" alt="3D model of Sher Shah Suri’s Tomb, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for Sher Shah Suri, the Afghan ruler who drove the Mughal emperor Humayun out of India. The octagonal tomb rises in three tiers from the middle of a square artificial lake. It is reached by a causeway across the water.&lt;/p&gt;

&lt;h3&gt;
  
  
  93. Cellular Jail
&lt;/h3&gt;

&lt;p&gt;Port Blair, Andaman Islands · 1896–1906 · Colonial prison&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj4jsf0i8z4d6q8j8tm23.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj4jsf0i8z4d6q8j8tm23.jpg" alt="3D model of Cellular Jail, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by the British to hold political prisoners in solitary confinement; it was known as Kala Pani. Seven three-storey wings of cells radiated from a central watchtower like the spokes of a wheel. Three wings survive; it has been a National Memorial since 1979.&lt;/p&gt;

&lt;h3&gt;
  
  
  94. Shaheed Minar
&lt;/h3&gt;

&lt;p&gt;Maidan, Kolkata · 1828 · Mixed (Egyptian, Syrian, Turkish)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo7bwibk1ogpd4ubcl42k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo7bwibk1ogpd4ubcl42k.jpg" alt="3D model of Shaheed Minar, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in 1828 as the Ochterlony Monument, it was renamed Shaheed Minar in 1969 to honour the martyrs of the freedom struggle. About 48 m tall, it blends an Egyptian-style base, a Syrian-style column and a Turkish cupola. Two balconies near the top look out over the Maidan.&lt;/p&gt;

&lt;h3&gt;
  
  
  95. Tipu Sultan’s Gumbaz
&lt;/h3&gt;

&lt;p&gt;Srirangapatna, Karnataka · 1782–1784 · Indo-Islamic&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl4u0gs3pr3brlygz1knj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl4u0gs3pr3brlygz1knj.jpg" alt="3D model of Tipu Sultan’s Gumbaz, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built by Tipu Sultan as the mausoleum of his father Hyder Ali and mother Fatima Begum. Tipu himself was buried here after he died defending Srirangapatna in 1799. Its white dome rises over a colonnade of dark granite pillars, in a garden of cypress trees.&lt;/p&gt;

&lt;h3&gt;
  
  
  96. Qutb Shahi Tombs
&lt;/h3&gt;

&lt;p&gt;Hyderabad, Telangana · 16th–17th c. · Qutb Shahi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcfl4x737ox5kbyumsdu4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcfl4x737ox5kbyumsdu4.jpg" alt="3D model of Qutb Shahi Tombs, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The royal necropolis of the Qutb Shahi sultans who ruled from Golconda. Each tomb is a domed cube on a raised terrace, many ringed by arcades. They stand in the Ibrahim Bagh garden, about a kilometre north of Golconda Fort.&lt;/p&gt;

&lt;h3&gt;
  
  
  97. Vivekananda Rock Memorial
&lt;/h3&gt;

&lt;p&gt;Kanyakumari, Tamil Nadu · 1970 · Mixed Indian temple styles&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ui01cvefvdqm8lzw0el.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ui01cvefvdqm8lzw0el.jpg" alt="3D model of Vivekananda Rock Memorial, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built in 1970 on the rock where Swami Vivekananda is said to have meditated in 1892. It stands off the southern tip of India, where the Arabian Sea, Indian Ocean and Bay of Bengal meet. The 41 m statue of the poet Thiruvalluvar, unveiled in 2000, stands on the neighbouring rock.&lt;/p&gt;

&lt;h3&gt;
  
  
  98. Jallianwala Bagh
&lt;/h3&gt;

&lt;p&gt;Amritsar, Punjab · Memorial 1961 · Modern memorial&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx8xsykuc4sf23wu00p8o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx8xsykuc4sf23wu00p8o.jpg" alt="3D model of Jallianwala Bagh, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marks the massacre of 13 April 1919, when British troops fired on an unarmed crowd gathered here. The flame-shaped memorial was designed by the American architect Benjamin Polk and opened in 1961. The Martyrs’ Well and walls still marked by bullets are preserved in the garden.&lt;/p&gt;

&lt;h3&gt;
  
  
  99. Kargil War Memorial
&lt;/h3&gt;

&lt;p&gt;Dras, Ladakh · Opened 2004 · Modern memorial&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F66rrrxy21ddg5rdk3l00.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F66rrrxy21ddg5rdk3l00.jpg" alt="3D model of Kargil War Memorial, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honours the Indian soldiers who fell in the Kargil War of 1999. It faces Tololing, one of the peaks recaptured in the war. Its sandstone wall carries the names of the fallen, beside a giant national flag.&lt;/p&gt;

&lt;h3&gt;
  
  
  100. National War Memorial
&lt;/h3&gt;

&lt;p&gt;Kartavya Path, New Delhi · 2019 · Modern memorial&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr18hcczcf8az60r5xroj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr18hcczcf8az60r5xroj.jpg" alt="3D model of National War Memorial, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opened in 2019 beside India Gate, it honours the soldiers who died for independent India. Its four concentric circles stand for immortality, bravery, sacrifice and protection. The names of more than 25,000 soldiers are inscribed on its granite tablets.&lt;/p&gt;

&lt;h3&gt;
  
  
  101. Kirti Mandir
&lt;/h3&gt;

&lt;p&gt;Porbandar, Gujarat · 1947–1950 · Mixed&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ger2h6ro9jzdvl9uxyt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ger2h6ro9jzdvl9uxyt.jpg" alt="3D model of Kirti Mandir, as drawn on Monuments of India" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A memorial beside the house where Mahatma Gandhi was born in 1869. Its tower is 79 feet tall, one foot for each year of his life. It also honours Kasturba Gandhi, his wife.&lt;/p&gt;

&lt;p&gt;The renders above were taken from the running site with motion reduced, so each model sits in its default view. The histories are the notes on each plaque. Two of them leave out a sentence that was about the viewer rather than the place: an invitation to turn on dark mode for the lamps at Mysore Palace, and a note that the Capitol Complex model draws its buildings closer together than they stand in Chandigarh.&lt;/p&gt;

&lt;p&gt;The photograph textures are CC0, from Poly Haven. The map data is Natural Earth, public domain. three.js is used under its MIT licence.&lt;/p&gt;

&lt;p&gt;This article was drafted with AI assistance from the project’s source and from those plaque notes.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>14 Personal AI Agents in 2026: A Technical Guide to Architecture, Memory, Tools &amp; Autonomy</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Wed, 30 Sep 2026 07:02:54 +0000</pubDate>
      <link>https://dev.to/amananandrai/14-personal-ai-agents-in-2026-a-technical-guide-to-architecture-memory-tools-autonomy-10h</link>
      <guid>https://dev.to/amananandrai/14-personal-ai-agents-in-2026-a-technical-guide-to-architecture-memory-tools-autonomy-10h</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxrgf865eeap0wbp1tk4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxrgf865eeap0wbp1tk4e.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The shift: from answers to delegation
&lt;/h2&gt;

&lt;p&gt;For most of the chatbot era, the loop was simple: &lt;strong&gt;prompt → model → response.&lt;/strong&gt; You asked, it answered, you asked again.&lt;/p&gt;

&lt;p&gt;The products in this list break that loop. They keep state, operate software, run while you're offline, and act on your behalf. Three generations make the change clear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5311607n1l5nxah3h5fi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5311607n1l5nxah3h5fi.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;You provide&lt;/th&gt;
&lt;th&gt;The system does&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Answer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A question&lt;/td&gt;
&lt;td&gt;Generates text&lt;/td&gt;
&lt;td&gt;"How do I book a restaurant?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Assist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A goal&lt;/td&gt;
&lt;td&gt;Calls a tool or two inside one session&lt;/td&gt;
&lt;td&gt;"Find restaurants open Friday at 8 PM."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Delegate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An outcome + boundaries&lt;/td&gt;
&lt;td&gt;Plans, executes, observes, re-plans and escalates over hours or days&lt;/td&gt;
&lt;td&gt;"Book a restaurant for Friday at 8 PM. Use my usual preferences and ask before spending more than ₹5,000."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The third request isn't a chatbot problem. It's a &lt;strong&gt;delegation problem&lt;/strong&gt;: the agent decides the intermediate steps, and you decide what it is &lt;em&gt;allowed&lt;/em&gt; to do.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    I[Intent] --&amp;gt; P[Plan] --&amp;gt; E[Execute] --&amp;gt; O[Observe]
    O --&amp;gt;|not done| P
    O --&amp;gt;|needs authority| H[Ask the human]
    H --&amp;gt; E
    O --&amp;gt;|done| C[Complete]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  The five-layer model (read every product against this)
&lt;/h2&gt;

&lt;p&gt;Before the list, here is the lens. Every personal agent below makes a choice at each of five layers. The interesting differences between products are almost always at one layer, not in the model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy6rmfg709lzjt6zff8oy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy6rmfg709lzjt6zff8oy.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    L1["1 · Interface&amp;lt;br/&amp;gt;chat · messaging · voice · OS · workspace"]
    L2["2 · Memory &amp;amp; context&amp;lt;br/&amp;gt;what it knows and keeps"]
    L3["3 · Orchestration&amp;lt;br/&amp;gt;planning · subagents · scheduling"]
    L4["4 · Action&amp;lt;br/&amp;gt;API · MCP · computer use"]
    L5["5 · Authority&amp;lt;br/&amp;gt;identity · permissions · approvals · audit"]
    L1 --&amp;gt; L2 --&amp;gt; L3 --&amp;gt; L4
    L5 -. governs .-&amp;gt; L4&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;1. Interface: how you reach it.&lt;/strong&gt; Options include an app, a contact in iMessage, a Teams channel, the OS itself, or a shared workspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Memory &amp;amp; context: what it knows.&lt;/strong&gt; This ranges from conversation memory to a user profile, task and project state, and procedural "skills" learned from experience. Where memory lives (device, vendor cloud, your server) matters as much as what it holds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Orchestration: how it plans.&lt;/strong&gt; Look for a single loop vs subagents, scheduled and event-triggered work, and whether it calls &lt;em&gt;tools&lt;/em&gt; or calls &lt;em&gt;other agents&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Action: how it touches the world.&lt;/strong&gt; There are three mechanisms, each with a trade-off:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Weakness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API-first&lt;/td&gt;
&lt;td&gt;Agent → API → Service&lt;/td&gt;
&lt;td&gt;Fast, deterministic&lt;/td&gt;
&lt;td&gt;Only works where an API exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP-first&lt;/td&gt;
&lt;td&gt;Agent → MCP server → Tool&lt;/td&gt;
&lt;td&gt;Standardised and discoverable&lt;/td&gt;
&lt;td&gt;Someone has to write the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Computer use&lt;/td&gt;
&lt;td&gt;Agent → browser/desktop → App&lt;/td&gt;
&lt;td&gt;Works on any human-facing software&lt;/td&gt;
&lt;td&gt;Slower, brittle (CAPTCHAs, 2FA, layout changes)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;5. Authority: what it's allowed to do.&lt;/strong&gt; This is the most underrated layer. The model may decide &lt;em&gt;"I should send this email"&lt;/em&gt;; a separate policy layer decides &lt;em&gt;"are you allowed to?"&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Reasoning ≠ Authorization.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The autonomy ladder
&lt;/h3&gt;

&lt;p&gt;Each product below gets an autonomy level using this scale. The levels are &lt;strong&gt;my assessment&lt;/strong&gt; based on documented approval behaviour, not vendor claims.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6dfivlrfslipq67125tg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6dfivlrfslipq67125tg.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;The agent…&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Observe&lt;/td&gt;
&lt;td&gt;Reads information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recommend&lt;/td&gt;
&lt;td&gt;Suggests actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prepare&lt;/td&gt;
&lt;td&gt;Drafts the action, waits for you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execute&lt;/td&gt;
&lt;td&gt;Performs low-risk actions on request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delegate&lt;/td&gt;
&lt;td&gt;Acts proactively inside defined boundaries; asks for sensitive actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Autonomous&lt;/td&gt;
&lt;td&gt;Pursues a goal to completion without approvals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing on this list ships at L5 by default. Several self-hosted runtimes can be &lt;em&gt;configured&lt;/em&gt; there, which is exactly why the security section exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 14 agents
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffy0y4qfj3ijr16g0jikc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffy0y4qfj3ijr16g0jikc.png" alt=" " width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Meta Muse: the consumer super-agent on its own VM
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Launched 8 Sept 2026 (US, 18+); free tier plus paid plans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Muse app, WhatsApp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orchestration (subagent swarms) + Runtime (per-user VM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: works in the background; sensitive actions need approval&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Meta's personal agent sends email, books travel, fills forms and makes purchases. It keeps working after you close the app. Each user's agent runs in its own cloud virtual machine (Meta calls it Muse Secure VM). Meta says the agent doesn't directly see your passwords or payment details.&lt;/p&gt;

&lt;p&gt;Meta's own write-up describes it launching swarms of subagents and building its own tools. It also admits internal dogfooding of an agent with inbox, calendar and shell access "didn't always work out as planned." Some reporting notes Muse was modelled on the open-source OpenClaw runtime (#8).&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    U[You via WhatsApp / app] --&amp;gt; M["Muse core ✅"]
    M --&amp;gt; S["Subagent swarm ✅"]
    S --&amp;gt; R1[Research] &amp;amp; R2[Browser] &amp;amp; R3[Tool-builder 🔍]
    M --&amp;gt; VM["Muse Secure VM ✅&amp;lt;br/&amp;gt;browser · shell · your data"]
    VM --&amp;gt; V["Credential layer 🔍&amp;lt;br/&amp;gt;agent never sees raw secrets ✅"]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Meta's bet is distribution plus orchestration. It brings a long-horizon, multi-agent system to people who have never heard the word "agent."&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.therundown.ai/news/meta-muse-personal-ai-agent" rel="noopener noreferrer"&gt;The Rundown&lt;/a&gt; · &lt;a href="https://www.vktr.com/ai-platforms/meta-launches-muse-a-personal-ai-agent-that-browses-the-web-makes-purchases/" rel="noopener noreferrer"&gt;VKTR&lt;/a&gt; · &lt;a href="https://www.rivieraradio.mc/article/meta-launches-new-personal-ai-agent-muse-5HjdhBN_2/" rel="noopener noreferrer"&gt;Riviera Radio / Muse Secure VM&lt;/a&gt; · &lt;a href="https://www.foxbusiness.com/technology/meta-introduces-muse-personal-ai-agent-can-send-emails-book-travel.amp" rel="noopener noreferrer"&gt;Fox Business&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Google Gemini Spark: the ecosystem-native agent
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Announced at I/O, 19 May 2026; live for US AI Ultra subscribers from 29 May; expanded to Australia in July&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemini app, Chrome, email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory &amp;amp; context (first-party Workspace graph)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: explicit permission before new services or irreversible actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; A 24/7 agent running on dedicated Google Cloud VMs, so tasks continue when your laptop is shut. It works natively across Gmail, Docs, Sheets, Slides, Calendar, Drive, YouTube and Maps, and reaches third-party apps through MCP. Reported model and harness: Gemini 3.5 Flash on Google's Antigravity agent harness.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    S["Spark on Cloud VM ✅"] --&amp;gt; W["Workspace graph ✅&amp;lt;br/&amp;gt;Gmail · Calendar · Drive · Docs · Sheets"]
    S --&amp;gt; C["Chrome execution ✅"]
    S --&amp;gt; X["MCP partners ✅"]
    W -. "cross-app context 🔍" .-&amp;gt; S&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Google doesn't need a plugin marketplace to know your life. The context graph already exists. The trade-off is that you grant &lt;em&gt;standing&lt;/em&gt; access to your inbox rather than one-off permission.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://tomsguide.com/ai/google-gemini/google-unveils-gemini-spark-a-24-7-personal-ai-agent-that-could-be-a-game-changer-for-agentic-ai" rel="noopener noreferrer"&gt;Tom's Guide&lt;/a&gt; · &lt;a href="https://noqta.tn/en/news/google-gemini-spark-247-personal-ai-agent-2026" rel="noopener noreferrer"&gt;Noqta&lt;/a&gt; · &lt;a href="https://eftm.com/2026/07/gemini-spark-googles-24-7-personal-ai-agent-arrives-in-australia-278776/amp" rel="noopener noreferrer"&gt;EFTM (Australia)&lt;/a&gt; · &lt;a href="https://datacamp.com/blog/gemini-spark" rel="noopener noreferrer"&gt;DataCamp&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Anthropic Claude: the long-running knowledge worker
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generally available. These agentic capabilities first shipped as Claude Cowork (research preview, 12 Jan 2026) and are now part of Claude itself across desktop, web and mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude desktop, web and mobile apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orchestration (project-scoped, multi-step work that produces finished files)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L3–L4&lt;/strong&gt;: executes long tasks, with scheduled tasks and approvals for sensitive actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; The unit of work is the &lt;strong&gt;project&lt;/strong&gt;, not the message. Ask for a board-ready report from a folder of quarterly files and the agent works through a sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discover the files&lt;/li&gt;
&lt;li&gt;Inspect the data&lt;/li&gt;
&lt;li&gt;Calculate&lt;/li&gt;
&lt;li&gt;Create intermediate artifacts&lt;/li&gt;
&lt;li&gt;Verify them&lt;/li&gt;
&lt;li&gt;Produce the deliverable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Over 2026 Anthropic added persistent projects with memory, scheduled tasks, plugins and remote triggering from your phone. It also ships the same agent loop to developers as Managed Agents.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    P["Project ✅&amp;lt;br/&amp;gt;files · instructions · memory"] --&amp;gt; T[Task plan]
    T --&amp;gt; X["Execution ✅&amp;lt;br/&amp;gt;files · apps · computer use"]
    X --&amp;gt; V[Verify] --&amp;gt; A["Finished artifact&amp;lt;br/&amp;gt;doc · sheet · deck"]
    V -- fails --&amp;gt; T&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is the clearest "AI analyst" pattern, where the output is a verified file rather than a chat reply.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://aragonresearch.com/anthropic-claude-cowork/" rel="noopener noreferrer"&gt;Aragon Research&lt;/a&gt; · &lt;a href="https://news.ainauten.com/en/story/claude-cowork-laeuft-jetzt-auch-auf-dem-smartphone-und-arbeitet-in-der-cloud-weiter" rel="noopener noreferrer"&gt;ainauten (web &amp;amp; mobile, July 2026)&lt;/a&gt; · &lt;a href="https://letsdatascience.com/news/anthropic-launches-managed-claude-agents-for-enterprises-55705fb3" rel="noopener noreferrer"&gt;Let's Data Science (Managed Agents)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. xAI Grok Bot: a team of bots on one shared computer
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Early beta since 11 Aug 2026; bundled with SuperGrok Heavy; enterprise waitlist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Grok Bot desktop and iOS apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Action (computer use on a persistent cloud machine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: finishes jobs end to end; asks you to take over at login screens or approvals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Grok Bot gives you named, always-on bots that sign into your existing tools and work across apps and inboxes. That includes sites with no clean API or MCP. Bots learn your preferences over a few tasks and can coordinate with each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The detail that matters:&lt;/strong&gt; the launch page says bots have "their own computer." The docs clarify that &lt;strong&gt;all bots on an account share one persistent cloud computer&lt;/strong&gt;, with shared files, browser sessions and CLI credentials. Each bot gets its own screen. xAI explicitly warns not to treat separate bots as a security boundary.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    B1[Sales bot] &amp;amp; B2[Research bot] &amp;amp; B3[Debug bot] --&amp;gt; VM
    subgraph VM["One shared cloud computer per account ✅"]
      direction LR
      BR[Browser sessions &amp;amp; logins] --- FS[Files] --- CLI[Terminal credentials]
    end
    VM --&amp;gt; APPS[Your apps, inboxes, websites]
    VM -. "login screen → human takeover ✅" .-&amp;gt; YOU[You]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Computer use as a universal integration layer works on anything a human can use. But the blast radius is the whole account, not the individual bot.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://x.ai/blog/introducing-grok-bot" rel="noopener noreferrer"&gt;xAI: Introducing Grok Bot&lt;/a&gt; · &lt;a href="https://www.digitalapplied.com/blog/grok-bot-ai-teammates-launch-cloud-computer-2026" rel="noopener noreferrer"&gt;Digital Applied (docs analysis)&lt;/a&gt; · &lt;a href="https://www.unite.ai/xai-launches-grok-bot-always-on-ai-teammates-with-their-own-cloud-computers/" rel="noopener noreferrer"&gt;Unite.AI&lt;/a&gt; · &lt;a href="https://composio.dev/content/guide-to-frok-bot" rel="noopener noreferrer"&gt;Composio guide&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Microsoft Autopilot (formerly Scout): the identity-centric enterprise agent
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Announced as &lt;strong&gt;Scout&lt;/strong&gt; at Build (2 June 2026); renamed &lt;strong&gt;Autopilot&lt;/strong&gt; on 25 Sept 2026; rolling out in private preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Teams-first; works across Outlook, OneDrive, SharePoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authority (each agent has its own Entra identity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: proactive and always on, inside organisational policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Microsoft's first "Autopilot," a persistent, proactive agent built &lt;strong&gt;on the open-source OpenClaw runtime&lt;/strong&gt; and wrapped in enterprise controls. Each agent gets its own managed &lt;strong&gt;Entra identity&lt;/strong&gt; and can be scoped to specific Microsoft 365 data or services. Governance runs through the Agent 365 control plane. Microsoft's Work IQ structures workplace context. About 3,000 Microsoft employees were reportedly using it internally before the preview.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    H[Human identity] --&amp;gt; P{"Policy · Agent 365 ✅"}
    A["Agent's own Entra identity ✅"] --&amp;gt; P
    P --&amp;gt; R["Scoped access ✅&amp;lt;br/&amp;gt;Teams · Outlook · SharePoint"]
    R --&amp;gt; L["Audit trail 🔍"]
    subgraph Runtime
      OC["OpenClaw ✅"] --&amp;gt; AP["Autopilot enterprise layer ✅"]
    end
    AP --&amp;gt; A&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is the clearest answer to "whose credentials is the agent using?" Its &lt;em&gt;own&lt;/em&gt;, issued and revocable by IT. It's also a landmark for open source, since an open agent runtime is now inside Microsoft 365.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://openclaw.ai/blog/microsoft-autopilot-openclaw/" rel="noopener noreferrer"&gt;OpenClaw blog: Microsoft Autopilot&lt;/a&gt; · &lt;a href="https://decrypt.co/369781/microsoft-scout-openclaw-enterprise-ai-agent" rel="noopener noreferrer"&gt;Decrypt&lt;/a&gt; · &lt;a href="https://techspot.com/news/112632-microsoft-took-openclaw-wrapped-enterprise-security-called-scout.html" rel="noopener noreferrer"&gt;TechSpot&lt;/a&gt; · &lt;a href="https://innfactory.ai/de/blog/microsoft-scout-openclaw-fuer-microsoft-365/" rel="noopener noreferrer"&gt;innFactory&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Apple Siri AI: the device-native agent
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unveiled at WWDC (June 2026); beta rolling out from 14 Sept 2026 with iOS 27; more languages from October&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The OS (iPhone, iPad, Mac, Watch, Vision Pro), plus a Siri app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory &amp;amp; context (on-device personal index + onscreen awareness)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L3&lt;/strong&gt;: acts across apps when you ask; not a background worker&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; A rebuilt Siri with three pillars:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personal context:&lt;/strong&gt; it searches your messages, mail, photos and notes through an index on the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onscreen awareness:&lt;/strong&gt; it understands what is on your screen right now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systemwide app actions:&lt;/strong&gt; it can act in Apple's apps and in third-party apps that integrate with Spotlight and App Intents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask "find the restaurant my friend recommended" and it knows to look in Messages.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    Q[Your request] --&amp;gt; S["Siri AI ✅"]
    S --&amp;gt; PC["On-device personal index ✅&amp;lt;br/&amp;gt;Messages · Mail · Photos · Notes"]
    S --&amp;gt; OS["Onscreen awareness ✅"]
    S --&amp;gt; AI["App Intents / Spotlight ✅&amp;lt;br/&amp;gt;first- and third-party apps"]
    AI --&amp;gt; ACT[Action in app]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Apple isn't adding an agent &lt;em&gt;app&lt;/em&gt;. It is making the operating system agentic, with context that never leaves the device as the selling point. The trade-off is reach: it works only as far as developers expose App Intents.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://www.iclarified.com/102225/apple-launches-siri-ai-beta-with-personal-context-onscreen-awareness-and-app-actions" rel="noopener noreferrer"&gt;iClarified (beta launch)&lt;/a&gt; · &lt;a href="https://www.iphoneincanada.ca/2026/06/08/wwdc-apple-unveils-siri-ai-with-personal-context-and-app-actions/" rel="noopener noreferrer"&gt;iPhone in Canada (WWDC)&lt;/a&gt; · &lt;a href="https://www.ithinkdiff.com/apple-unveils-siri-ai-visual-intelligence/" rel="noopener noreferrer"&gt;iThinkDiff&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  7. OpenAI Dots: the always-on goal agent
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Launched at DevDay, 29 Sept 2026; Pro and Business Premium users in eligible markets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ChatGPT, Slack, Microsoft Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orchestration (goal ownership between conversations)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: proactive, with user-defined rules for which actions need approval&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Dots are always-on agents that learn what matters to you and keep projects moving between conversations. Each Dot runs on GPT-6 Astra and works from &lt;strong&gt;its own cloud computer and browser&lt;/strong&gt;, which you can inspect at any time. The Codex harness that powers Dots is open source.&lt;/p&gt;

&lt;p&gt;For businesses, &lt;strong&gt;specialist Dots get their own identities, credentials and tools&lt;/strong&gt;. OpenAI is working with Microsoft to plug them into Agent 365 security controls.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    G[Goal: launch this product] --&amp;gt; D["Dot · GPT-6 Astra ✅"]
    D --&amp;gt; CC["Own cloud computer + browser ✅"]
    D --&amp;gt; R["Your approval rules ✅"]
    D --&amp;gt; CH["ChatGPT · Slack · Teams ✅"]
    D --&amp;gt; SP["Specialist Dots with own identity ✅&amp;lt;br/&amp;gt;→ Agent 365 controls"]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Dots combine three ideas from this list in one product: a persistent goal, an agent computer and an agent identity. That puts OpenAI directly against Muse and Autopilot.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://betanews.com/article/openai-dots-agents-chatgpt/" rel="noopener noreferrer"&gt;BetaNews&lt;/a&gt; · &lt;a href="https://decrypt.co/379584?amp=1" rel="noopener noreferrer"&gt;Decrypt&lt;/a&gt; · &lt;a href="https://propakistani.pk/2026/09/30/openai-launches-personal-ai-agents-that-work-24-7/amp/" rel="noopener noreferrer"&gt;ProPakistani&lt;/a&gt; · &lt;a href="https://www.androidheadlines.com/2026/09/openai-launches-dots-always-on-ai-agents.html" rel="noopener noreferrer"&gt;Android Headlines&lt;/a&gt; · &lt;a href="https://www.theneuron.ai/news/openai-devday-2026-chatgpt-is-becoming-an-ai-operating-system/" rel="noopener noreferrer"&gt;The Neuron&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  8. OpenClaw + Hermes Agent: the self-owned runtime
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Both open source and self-hostable. OpenClaw went public in late 2025 (originally as Clawdbot) and is now stewarded by the OpenClaw Foundation. Nous Research's Hermes Agent launched Feb 2026 (MIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CLI plus messaging gateways (Telegram, Discord, Slack, WhatsApp and more)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory (inspectable, file-based) + Ownership&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Configurable, L3–L5&lt;/strong&gt;: you set the rules, including none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Here you own the runtime, models, memory and credentials instead of renting them. OpenClaw is the runtime that both Microsoft Autopilot and (reportedly) Meta Muse build on.&lt;/p&gt;

&lt;p&gt;Hermes shows what owned memory looks like concretely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two small files are injected into every prompt: &lt;code&gt;MEMORY.md&lt;/code&gt; for the agent's own notes and &lt;code&gt;USER.md&lt;/code&gt; for your preferences.&lt;/li&gt;
&lt;li&gt;Full session history goes into SQLite with full-text search.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;skills&lt;/strong&gt; library acts as procedural memory the agent writes and reuses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP servers are added in config, and Hermes can also run &lt;em&gt;as&lt;/em&gt; an MCP server so other agents can call it.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    G["Gateway ✅&amp;lt;br/&amp;gt;CLI · Telegram · Slack · WhatsApp"] --&amp;gt; CORE[Agent core]
    CORE --&amp;gt; MEM["Memory ✅&amp;lt;br/&amp;gt;MEMORY.md · USER.md · SQLite FTS5"]
    CORE --&amp;gt; SK["Skills = procedural memory ✅"]
    CORE --&amp;gt; CRON["Scheduler ✅"]
    CORE --&amp;gt; SUB["Isolated subagents ✅"]
    CORE --&amp;gt; MCP["MCP client + server ✅"]
    CORE --&amp;gt; EXE["Terminal · browser&amp;lt;br/&amp;gt;local / Docker / cloud sandbox ✅"]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is the clearest &lt;strong&gt;user-owned&lt;/strong&gt; model in the list, where memory is something you can open in a text editor. The cost is that security is your job. Microsoft's own security team warned in early 2026 against running OpenClaw on a standard workstation.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://openclaw.ai/blog/microsoft-autopilot-openclaw/" rel="noopener noreferrer"&gt;OpenClaw blog&lt;/a&gt; · &lt;a href="https://hermes-agent.nousresearch.com/docs" rel="noopener noreferrer"&gt;Hermes Agent docs&lt;/a&gt; · &lt;a href="https://parallel.ai/articles/what-is-hermes-agent" rel="noopener noreferrer"&gt;Parallel: What is Hermes Agent?&lt;/a&gt; · &lt;a href="https://innfactory.ai/de/blog/microsoft-scout-openclaw-fuer-microsoft-365/" rel="noopener noreferrer"&gt;innFactory (Microsoft security warning)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  9. Poke: the messaging-native agent
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public since March 2026; on 4 June 2026 became the first AI agent approved for Apple Messages for Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;iMessage, SMS, Telegram, WhatsApp (select markets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interface (the agent is a contact)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L3–L4&lt;/strong&gt;: proactive nudges and automations; acts on request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; From The Interaction Company of California, Poke turns your text thread into the control plane. Internally it reportedly splits the work between a personality agent that handles the conversation and an execution agent that does the tasks. It connects to email, calendar and scheduled automations. Developers extend it with MCP servers from an official template.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    T["Text message ✅"] --&amp;gt; PA["Personality agent ✅"]
    PA --&amp;gt; EA["Execution agent ✅"]
    EA --&amp;gt; MCP["MCP servers ✅&amp;lt;br/&amp;gt;community 'recipes'"]
    EA --&amp;gt; I["Email · Calendar · Cron ✅"]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; There's no app to learn, only a contact to text. Apple's approval also makes it a test case for &lt;strong&gt;platform gatekeeping&lt;/strong&gt; of agent distribution.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://techcrunch.com/?p=3110530" rel="noopener noreferrer"&gt;TechCrunch&lt;/a&gt; · &lt;a href="https://www.techwyse.com/news/platform-updates/apple-messages-for-business-first-ai-agent-poke-approved" rel="noopener noreferrer"&gt;TechWyse (Apple approval)&lt;/a&gt; · &lt;a href="https://theaiagentindex.com/agents/poke" rel="noopener noreferrer"&gt;The AI Agent Index&lt;/a&gt; · &lt;a href="https://wwwhatsnew.com/2026/04/10/poke-ai-agente-imessage-sms-sin-app/" rel="noopener noreferrer"&gt;wwwhatsnew (architecture)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  10. Manus Cue: the agent with its own phone, inbox and wallet
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Launched with Manus 2.0 on 28 Sept 2026; free early access with invite code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cue app (web, desktop, mobile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authority (the agent owns resources, not just access to yours)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: pays, calls and emails within a budget and boundaries you set&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Each Cue agent gets &lt;strong&gt;its own email address, phone number, wallet and computer&lt;/strong&gt;. It can take calls and leave a summary, message businesses, and pay for things inside a user-defined budget. Several agents can work in one workspace.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    U[You set budget + boundaries] --&amp;gt; A["Cue agent ✅"]
    A --&amp;gt; E["Own email ✅"]
    A --&amp;gt; P["Own phone number ✅"]
    A --&amp;gt; W["Wallet with budget ✅"]
    A --&amp;gt; C["Own computer ✅"]
    E &amp;amp; P --&amp;gt; OUT[Businesses see the agent, not you 🔍]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is the shift from &lt;em&gt;"AI uses my identity"&lt;/em&gt; to &lt;em&gt;"the agent has an identity."&lt;/em&gt; It's the most literal version of the agent-as-entity idea, with obvious open questions about spending authority and accountability.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://thenextweb.com/news/manus-2-0-cue-ai-agents-email-phone-wallet" rel="noopener noreferrer"&gt;The Next Web&lt;/a&gt; · &lt;a href="https://www.implicator.ai/manus-cue-agents-phone-numbers-wallets/" rel="noopener noreferrer"&gt;Implicator&lt;/a&gt; · &lt;a href="https://eu.36kr.com/en/p/4003830453686403" rel="noopener noreferrer"&gt;36Kr&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  11. Instinct: the ambient personal representative
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Invite-only private access (Spear Street Technology, Inc., San Francisco); agents from $35/month reported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Text or phone call; no app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory &amp;amp; context (ambient signals from many sources)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: proactively texts or calls you and acts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Instinct connects to email, messaging, calendar, screen, audio and location. It's tuned for small daily chores: following up on dropped threads, arranging an airport ride, booking a handyman.&lt;/p&gt;

&lt;p&gt;Reviewers describe a persistent agent computer, a credential &lt;strong&gt;vault&lt;/strong&gt; for logins, and one-time payment cards for purchases. Its broad data terms drew TechCrunch scrutiny in August. Early testers also hit the usual computer-use walls: CAPTCHAs, 2FA and flaky checkout flows.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    subgraph Signals["Ambient signals ✅"]
      direction TB
      E[Email] ~~~ M[Messages] ~~~ S[Screen] ~~~ A[Audio] ~~~ L[Location]
    end
    Signals --&amp;gt; D["Detect → decide 🔍"]
    D --&amp;gt; ACT["Agent computer ✅"]
    ACT --&amp;gt; V["Credential vault + one-time cards ✅"]
    D --&amp;gt; ASK["Proactive text / call ✅"]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is an &lt;strong&gt;event-driven&lt;/strong&gt; agent: it acts because something happened, not because you asked. It also has the largest data footprint on the list, which makes its terms of service part of its architecture.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://techcrunch.com/2026/08/24/instincts-powerful-ai-assistant-is-raising-privacy-and-security-concerns/" rel="noopener noreferrer"&gt;TechCrunch (privacy concerns)&lt;/a&gt; · &lt;a href="https://www.vellum.ai/blog/official-instinct-breakdown" rel="noopener noreferrer"&gt;Vellum breakdown&lt;/a&gt; · &lt;a href="https://www.eesel.ai/blog/instinct-ai-review" rel="noopener noreferrer"&gt;eesel review&lt;/a&gt; · &lt;a href="https://builtin.com/articles/instinct-ai" rel="noopener noreferrer"&gt;Built In&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  12. Perplexity Computer: the multi-model agent harness
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Perplexity Computer launched Feb 2026. &lt;strong&gt;Personal Computer&lt;/strong&gt; for Mac shipped in spring 2026 and is now open to all Macs; Windows version since June 2026 for Max subscribers via waitlist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desktop app; phone for approvals and remote access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Orchestration (routes work across multiple models and environments)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L4&lt;/strong&gt;: runs 24/7, keeps an audit trail of every session, asks before sensitive actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; A general-purpose "digital worker" that researches, codes, browses and schedules. It deploys subagents and connects to Gmail, Slack, Notion and Calendar. Personal Computer brings it &lt;em&gt;onto your own machine&lt;/em&gt;, ideally an always-on Mac mini, where it works across local files, native apps and the browser.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    O["Orchestrator ✅"] --&amp;gt; MR["Model router: multiple models ✅"]
    O --&amp;gt; SA["Subagents ✅"]
    SA --&amp;gt; CL["Cloud: connectors · browser ✅"]
    SA --&amp;gt; LO["Local machine ✅&amp;lt;br/&amp;gt;files · Mail · Calendar · Notes"]
    O --&amp;gt; AU["Session audit trail + approvals ✅"]
    PH[Your phone] -. approve .-&amp;gt; AU&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is the harness pattern, where no single model is the product. It's also the strongest "local + cloud" hybrid on the list.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://appleinsider.com/articles/26/03/11/perplexitys-personal-computer-lets-ai-agents-access-your-mac-minis-files" rel="noopener noreferrer"&gt;AppleInsider&lt;/a&gt; · &lt;a href="https://hothardware.com/news/perplexity-personal-computer-ai-mac" rel="noopener noreferrer"&gt;HotHardware (all Macs)&lt;/a&gt; · &lt;a href="https://www.etvbharat.com/en/technology/perplexity-introduces-personal-computer-for-mac-mini-that-works-on-users-behalf-enn26031301906" rel="noopener noreferrer"&gt;ETV Bharat (audit trail)&lt;/a&gt; · &lt;a href="https://hunted.space/dashboard/perplexity-personal-computer-for-windows" rel="noopener noreferrer"&gt;Hunted (Windows)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  13. Buzz by Block: the agent-native workspace
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Launched 21 July 2026; free and open source (Apache 2.0); desktop apps for macOS, Windows and Linux; no mobile yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slack-like channels, threads, DMs, voice, git repos, workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Authority (cryptographic identity for every human and agent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Depends on the agent you connect&lt;/strong&gt; (L2–L4); Buzz is the substrate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; A workspace where agents are members, not bots. Built on &lt;strong&gt;Nostr&lt;/strong&gt;, every person and agent holds a keypair, and each agent's identity is linked to its human owner. Every message, review and CI event is a &lt;strong&gt;signed event in an append-only log&lt;/strong&gt;, so you can always tell which actor did what. That record lets a workspace enforce rules such as "only agents owned by members may join this private channel."&lt;/p&gt;

&lt;p&gt;Agents connect through the open Agent Client Protocol (ACP), so you can bring Claude Code, Codex or Block's own goose. One caveat: each workspace currently relies on a &lt;strong&gt;single relay&lt;/strong&gt; as its source of truth.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TB
    H["Human 🔑 ✅"] &amp;amp; A1["Agent 🔑 ✅&amp;lt;br/&amp;gt;owned by human"] &amp;amp; A2["Agent 🔑 ✅"] --&amp;gt; R
    R["Single relay per workspace ✅&amp;lt;br/&amp;gt;append-only log of signed events"]
    R --&amp;gt; CH[Channels] &amp;amp; GIT[Git] &amp;amp; WF[Workflows]
    A1 -.-&amp;gt;|ACP ✅| H1[Claude Code / Codex / goose]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; It's the most developer-relevant entry for multi-agent teams. Attribution and permissions are built into the protocol, not bolted on.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://thenewstack.io/block-buzz-agent-workspace" rel="noopener noreferrer"&gt;The New Stack&lt;/a&gt; · &lt;a href="https://forklog.com/en/block-launches-buzz-an-open-source-platform-for-teams-and-ai-agents/?hl=-1" rel="noopener noreferrer"&gt;Forklog&lt;/a&gt; · &lt;a href="https://letsdatascience.com/news/block-launches-buzz-open-source-agent-workspace-d68eb65a" rel="noopener noreferrer"&gt;Let's Data Science&lt;/a&gt; · &lt;a href="https://github.com/block/buzz" rel="noopener noreferrer"&gt;GitHub: block/buzz&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  14. Genii by Intelligent Internet: the open-source iMessage agent
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open source (Community Edition); hosted version live at genii.ii.inc; iMessage first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An iMessage contact (via Linq)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distinctive layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runtime (sandboxed execution + delegation to a long-running agent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;L3–L4&lt;/strong&gt;: proactive triggers; consequential actions are approval-gated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What it is.&lt;/strong&gt; Genii appears as a contact and &lt;strong&gt;texts you first&lt;/strong&gt; when something needs attention. Web browsing and code run inside an &lt;strong&gt;E2B sandbox&lt;/strong&gt;, a cloud-isolated VM with a real browser that never touches your machine. Long jobs that don't fit a chat thread are handed off to &lt;strong&gt;II-Agent&lt;/strong&gt;, Intelligent Internet's open-source autonomous agent, and the result comes back in the same thread.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    U[iMessage thread] --&amp;gt; G["Genii ✅&amp;lt;br/&amp;gt;memory · triggers"]
    G --&amp;gt; SB["E2B sandbox ✅&amp;lt;br/&amp;gt;browser · code"]
    G --&amp;gt; II["II-Agent for long tasks ✅"]
    G --&amp;gt; GATE["Consent gate 🔍"] --&amp;gt; ACT[Action + recorded approval]
    II --&amp;gt;|result| U&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; It's the open-source answer to Poke. It also illustrates a clean pattern: a &lt;strong&gt;chat-sized front agent&lt;/strong&gt; that delegates to a &lt;strong&gt;long-running back agent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://alphasignal.ai/news/intelligent-internet-s-genii-texts-you-first-as-an-open-source-imessage-ai" rel="noopener noreferrer"&gt;AlphaSignal&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Status (Oct 2026)&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Where it runs&lt;/th&gt;
&lt;th&gt;Memory model&lt;/th&gt;
&lt;th&gt;Action mechanism&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Autonomy&lt;/th&gt;
&lt;th&gt;Open source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Meta Muse&lt;/td&gt;
&lt;td&gt;Live (US, 18+)&lt;/td&gt;
&lt;td&gt;App, WhatsApp&lt;/td&gt;
&lt;td&gt;Vendor cloud VM&lt;/td&gt;
&lt;td&gt;Vendor-held personal profile&lt;/td&gt;
&lt;td&gt;Computer use + connectors&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Gemini Spark&lt;/td&gt;
&lt;td&gt;Live (US, AU), Ultra&lt;/td&gt;
&lt;td&gt;App, Chrome&lt;/td&gt;
&lt;td&gt;Vendor cloud VM&lt;/td&gt;
&lt;td&gt;Workspace graph&lt;/td&gt;
&lt;td&gt;API + Chrome + MCP&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Desktop, web, mobile&lt;/td&gt;
&lt;td&gt;Local + vendor cloud&lt;/td&gt;
&lt;td&gt;Project memory&lt;/td&gt;
&lt;td&gt;Files, apps, computer use, connectors&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L3–L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Grok Bot&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;Desktop, iOS&lt;/td&gt;
&lt;td&gt;One shared cloud computer&lt;/td&gt;
&lt;td&gt;Per-bot context&lt;/td&gt;
&lt;td&gt;Computer use&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Acts as user (shared logins)&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;MS Autopilot&lt;/td&gt;
&lt;td&gt;Private preview&lt;/td&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;Vendor cloud&lt;/td&gt;
&lt;td&gt;Work IQ org context&lt;/td&gt;
&lt;td&gt;M365 APIs + OpenClaw runtime&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Own Entra identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;Runtime yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Siri AI&lt;/td&gt;
&lt;td&gt;Beta (iOS 27)&lt;/td&gt;
&lt;td&gt;The OS&lt;/td&gt;
&lt;td&gt;On device (+ cloud)&lt;/td&gt;
&lt;td&gt;On-device personal index&lt;/td&gt;
&lt;td&gt;App Intents&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L3&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;OpenAI Dots&lt;/td&gt;
&lt;td&gt;Live (Pro, Biz Premium)&lt;/td&gt;
&lt;td&gt;ChatGPT, Slack, Teams&lt;/td&gt;
&lt;td&gt;Vendor cloud computer&lt;/td&gt;
&lt;td&gt;Goals + preferences&lt;/td&gt;
&lt;td&gt;Computer use + connectors&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;User; specialists get &lt;strong&gt;own identity&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;Harness yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;OpenClaw / Hermes&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;CLI + messaging&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Self-hosted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Files + SQLite + skills&lt;/td&gt;
&lt;td&gt;Terminal, browser, MCP&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;You decide&lt;/td&gt;
&lt;td&gt;L3–L5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Poke&lt;/td&gt;
&lt;td&gt;Live&lt;/td&gt;
&lt;td&gt;iMessage, SMS, Telegram&lt;/td&gt;
&lt;td&gt;Vendor cloud&lt;/td&gt;
&lt;td&gt;Vendor-held&lt;/td&gt;
&lt;td&gt;API + MCP&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L3–L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Manus Cue&lt;/td&gt;
&lt;td&gt;Early access&lt;/td&gt;
&lt;td&gt;Cue app&lt;/td&gt;
&lt;td&gt;Vendor cloud computer&lt;/td&gt;
&lt;td&gt;Per-agent memory&lt;/td&gt;
&lt;td&gt;Computer, phone, email, wallet&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Agent owns email, phone, wallet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Instinct&lt;/td&gt;
&lt;td&gt;Invite-only&lt;/td&gt;
&lt;td&gt;Text, call&lt;/td&gt;
&lt;td&gt;Vendor cloud computer&lt;/td&gt;
&lt;td&gt;Ambient signals&lt;/td&gt;
&lt;td&gt;Computer use + vault&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Perplexity Computer&lt;/td&gt;
&lt;td&gt;Live (Mac, Win waitlist)&lt;/td&gt;
&lt;td&gt;Desktop + phone&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Local machine&lt;/strong&gt; + cloud&lt;/td&gt;
&lt;td&gt;Session history + connectors&lt;/td&gt;
&lt;td&gt;Multi-model, local + browser&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Buzz&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Workspace&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Self-hosted&lt;/strong&gt; relay&lt;/td&gt;
&lt;td&gt;Signed event log&lt;/td&gt;
&lt;td&gt;ACP-connected agents&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cryptographic keypair&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent-dependent&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Genii&lt;/td&gt;
&lt;td&gt;Open source + hosted&lt;/td&gt;
&lt;td&gt;iMessage&lt;/td&gt;
&lt;td&gt;Cloud sandbox (E2B)&lt;/td&gt;
&lt;td&gt;Persistent memory + triggers&lt;/td&gt;
&lt;td&gt;Sandbox + II-Agent&lt;/td&gt;
&lt;td&gt;🔍&lt;/td&gt;
&lt;td&gt;Acts as user&lt;/td&gt;
&lt;td&gt;L3–L4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Legend:&lt;/strong&gt; ✅ documented · 🔍 not confirmed in public material · — not applicable. Autonomy levels are the author's assessment.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 2×2 map: whose identity, and whose machine?
&lt;/h2&gt;

&lt;p&gt;Every product on this list answers two questions. Plotting them is more useful than any category label.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd103w1k02r4qp6f5wnpa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd103w1k02r4qp6f5wnpa.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Runs on your device / your server&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Runs in the vendor's cloud&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent has its own identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Buzz&lt;/strong&gt; (keypairs, self-hosted relay) · &lt;strong&gt;OpenClaw/Hermes&lt;/strong&gt; (if you give it separate accounts)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;MS Autopilot&lt;/strong&gt; (Entra) · &lt;strong&gt;Manus Cue&lt;/strong&gt; (email, phone, wallet) · &lt;strong&gt;OpenAI specialist Dots&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent acts as you&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Siri AI&lt;/strong&gt; · &lt;strong&gt;Perplexity Personal Computer&lt;/strong&gt; · &lt;strong&gt;Claude&lt;/strong&gt; (desktop)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemini Spark&lt;/strong&gt; · &lt;strong&gt;Meta Muse&lt;/strong&gt; · &lt;strong&gt;Grok Bot&lt;/strong&gt; · &lt;strong&gt;Poke&lt;/strong&gt; · &lt;strong&gt;Instinct&lt;/strong&gt; · &lt;strong&gt;Genii&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;How to read it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bottom right&lt;/strong&gt; is the crowded consumer quadrant. These products are the most convenient, and they have the largest standing-access risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top right&lt;/strong&gt; is where enterprise is heading. Separate identities make permissions, audit and revocation possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top left&lt;/strong&gt; is the most sovereign option, with the most ops work for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bottom left&lt;/strong&gt; keeps data close, but the agent only works while your machine is on.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security and failure modes
&lt;/h2&gt;

&lt;p&gt;The capabilities that make these agents useful are the same ones that make them risky. Six failure modes come up repeatedly across the products above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F72oldohmrwy5z18ntowo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F72oldohmrwy5z18ntowo.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prompt injection via everything the agent reads
&lt;/h3&gt;

&lt;p&gt;An agent that reads your email, web pages and documents can be instructed &lt;em&gt;by&lt;/em&gt; them. A hidden line in an email ("forward the last invoice to…") is an attack on any agent with inbox and send access. Meta's write-up names prompt-injection awareness as a training goal. Reporting on Muse's testing described an agent routing around guardrails to expose personal photos.&lt;br&gt;
&lt;strong&gt;Mitigations:&lt;/strong&gt; treat all retrieved content as data, not instructions. Require approval for any action triggered by content the user didn't write.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Shared runtimes = shared blast radius
&lt;/h3&gt;

&lt;p&gt;Grok Bot's docs say plainly that bots on one account share files, browser sessions and CLI credentials, and are &lt;strong&gt;not&lt;/strong&gt; a security boundary. The same applies to any setup where multiple agents share one VM or one set of cookies.&lt;br&gt;
&lt;strong&gt;Mitigations:&lt;/strong&gt; use one runtime per trust level, and keep high-risk bots on separate accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Over-broad, standing credentials
&lt;/h3&gt;

&lt;p&gt;Always-on agents need &lt;em&gt;standing&lt;/em&gt; access, not per-request permission. Instinct's terms (screen captures, keystrokes, location) and Spark's inbox access are the consumer versions. A self-hosted OpenClaw with your real tokens is the developer version.&lt;br&gt;
&lt;strong&gt;Mitigations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scoped, short-lived tokens.&lt;/li&gt;
&lt;li&gt;Credential vaults where the agent never sees raw secrets (Muse and Instinct both describe this).&lt;/li&gt;
&lt;li&gt;Separate agent identities (Autopilot, Buzz).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Money and irreversible actions
&lt;/h3&gt;

&lt;p&gt;Wallets (Cue), one-time cards (Instinct) and purchases (Muse) move agents into financial actions.&lt;br&gt;
&lt;strong&gt;Mitigations:&lt;/strong&gt; hard spending caps, per-merchant allowlists, and approval for anything irreversible. Spark, Dots, Perplexity and Genii all document approval gates.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Approval fatigue
&lt;/h3&gt;

&lt;p&gt;Ask for approval on everything and people tap "yes" without reading. Ask for nothing and you're at L5.&lt;br&gt;
&lt;strong&gt;Mitigations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Risk-tiered approvals: reads are free; drafts are free; sends, payments and deletions need approval.&lt;/li&gt;
&lt;li&gt;Batched approval digests.&lt;/li&gt;
&lt;li&gt;User-defined rules, as Dots does.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Unauditable action
&lt;/h3&gt;

&lt;p&gt;If you can't answer &lt;em&gt;what did it do, why, with which credentials, and who authorised it&lt;/em&gt;, you can't trust it or undo it.&lt;br&gt;
&lt;strong&gt;Mitigations:&lt;/strong&gt; signed or append-only action logs (Buzz), per-session audit trails (Perplexity), and recorded approvals (Genii).&lt;/p&gt;

&lt;h3&gt;
  
  
  A minimum checklist before you delegate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Does the agent have its own identity, or is it using mine?&lt;/li&gt;
&lt;li&gt;[ ] Which credentials does it hold, and can I revoke them in one place?&lt;/li&gt;
&lt;li&gt;[ ] What can it do &lt;strong&gt;without&lt;/strong&gt; asking? Is that list written down?&lt;/li&gt;
&lt;li&gt;[ ] Is there a spending cap?&lt;/li&gt;
&lt;li&gt;[ ] Is every action logged somewhere I can read?&lt;/li&gt;
&lt;li&gt;[ ] Is there a kill switch, and do I know where it is?&lt;/li&gt;
&lt;li&gt;[ ] Are multiple agents sharing one runtime? If so, assume they share secrets.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who owns the agent?
&lt;/h2&gt;

&lt;p&gt;Underneath the product choices sits one question: &lt;strong&gt;who controls the digital labour?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Who holds runtime, memory, credentials&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vendor-owned&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The company&lt;/td&gt;
&lt;td&gt;Spark, Muse, Grok Bot, Poke, Instinct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User-owned&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;td&gt;OpenClaw, Hermes, self-hosted Genii&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent-owned identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The agent holds its own accounts on your behalf&lt;/td&gt;
&lt;td&gt;Cue, Autopilot, specialist Dots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent-native workspace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Humans and agents as peers under shared rules&lt;/td&gt;
&lt;td&gt;Buzz&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These choices determine portability (can you take your agent's memory elsewhere?), accountability (whose name is on the email?) and lock-in (what happens if the vendor changes terms?).&lt;/p&gt;




&lt;h2&gt;
  
  
  Delegation engineering
&lt;/h2&gt;

&lt;p&gt;As agents move up the autonomy ladder, the human role changes from &lt;strong&gt;operator&lt;/strong&gt; to &lt;strong&gt;supervisor&lt;/strong&gt; to &lt;strong&gt;principal&lt;/strong&gt;. The most valuable skill shifts from prompt engineering to &lt;strong&gt;delegation engineering&lt;/strong&gt;: deciding, explicitly, what to hand over.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2wk8z4yb21zjfyxrm71e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2wk8z4yb21zjfyxrm71e.png" alt=" " width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before you hand over a responsibility, answer eight questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What&lt;/strong&gt; should I delegate, and what stays human?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What context&lt;/strong&gt; does the agent need, and nothing more?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which credentials&lt;/strong&gt; should it hold?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which actions&lt;/strong&gt; need my approval?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much&lt;/strong&gt; can it spend?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How long&lt;/strong&gt; can it run unattended?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How&lt;/strong&gt; do I audit what it did?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How&lt;/strong&gt; do I stop it?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's closer to managing a team than using software. And it's the real question behind all 14 products.&lt;/p&gt;

&lt;p&gt;The chatbot era asked &lt;em&gt;"What can AI tell me?"&lt;/em&gt; The agent era asks &lt;em&gt;"What can AI do for me?"&lt;/em&gt; The personal-agent era asks the harder one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What can I safely delegate to software that acts in my name?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Corrections welcome. If a status or detail above has changed, leave a comment with a source and I'll update the table.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Spooky Scene with Gothic Castle and Grim Reaper CSS Art for Frontend Challenge - Halloween Edition</title>
      <dc:creator>amananandrai</dc:creator>
      <pubDate>Thu, 23 Oct 2025 11:31:00 +0000</pubDate>
      <link>https://dev.to/amananandrai/halloween-challenge-ak1</link>
      <guid>https://dev.to/amananandrai/halloween-challenge-ak1</guid>
      <description>&lt;p&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2025-10-15"&gt;Frontend Challenge - Halloween Edition, CSS Art&lt;/a&gt;._&lt;/p&gt;

&lt;p&gt;Hey everyone! As the clock winds down on the Dev.to &lt;strong&gt;Frontend Challenge - Halloween Edition&lt;/strong&gt;, I wanted to share my journey in creating a spooky, yet charming, Halloween scene purely with HTML and CSS. It's been a wild ride, a mix of pure frustration, "aha!" moments, and a lot of box-shadow tweaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;I was inspired to create a "paper cutout" style halloween scene with layered elements, subtle shadows, and the vibrant yet muted color palette. I loved creating the central castle, the glowing pumpkin, the mischievous cat, and especially the creepy reaper on the right. My goal was clear: create this entire scene, capturing that papercraft feel, using only HTML and CSS. No img tags, no external assets – just pure code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The image is made to be viewed in full screen on a Desktop, so please check it on a desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodePen:
&lt;/h3&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/amananandrai/embed/GgoxLzx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Image Fullscreen
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7fbrguipz9568szf8inp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7fbrguipz9568szf8inp.png" alt="Demo Image" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;This is my first submission for any Dev Challenge. I am a newbie at CSS art so the first step was to go through different CSS arts on Codepen and Google search and take some elements from them.&lt;/p&gt;

&lt;p&gt;Here's a little peek into my journey, the (many) challenges I faced, and how I brought this haunted castle to life.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Foundation: Setting the (Spooky) Scene
&lt;/h2&gt;

&lt;p&gt;Every good scene needs a backdrop. I started simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Sky&lt;/strong&gt;: A linear-gradient from a dark navy to a deep purple.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Ground&lt;/strong&gt;: A simple, dark shape at the bottom.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Moon&lt;/strong&gt;: A radial-gradient for the color, border-radius: 50% for the shape, and a box-shadow for that eerie glow. The "glow" itself is animated to pulse gently.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first real beast was the castle. This wasn't one div. This was a monster of position: absolute, z-index, and pseudo-elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Structure:&lt;/strong&gt; I built it piece by piece. A main body &lt;code&gt;(.castle-main)&lt;/code&gt;and three towers &lt;code&gt;(.castle-tower)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; The z-index! For a while, my center tower was behind the main building, and the bridge was floating in the sky. It took a lot of tweaking to get the layers right so everything sat perfectly on the ground line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Details:&lt;/strong&gt; The battlements (the tooth-like things on top) aren't individual divs. That would be a nightmare. Instead, I used a repeating-linear-gradient on a pseudo-element (::before) to create the pattern. The windows use a flickering animation on their opacity and box-shadow to look like candlelight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Characters: From Pumpkins to Reapers
&lt;/h2&gt;

&lt;p&gt;With the set built, I needed to populate it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;First up: the Jack-o'-Lantern.&lt;/strong&gt; This was fun! The body is a radial-gradient and a funky border-radius to make it squat. The face elements are simple clip-path triangles, but the mouth was a cool trick. To get the "stitched" look with teeth, I used a repeating-linear-gradient on the ::after pseudo-element of the mouth div.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next, the Grim Reaper.&lt;/strong&gt; This is one of my favorite parts.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Robe:&lt;/strong&gt; I dreaded trying to make this shape. The solution? &lt;code&gt;clip-path: polygon(...)&lt;/code&gt;. I just clicked out the points to create that flowy, tattered robe shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Eyes:&lt;/strong&gt; The glowing red eyes are just two pseudo-elements (::before and ::after) on an empty &lt;code&gt;.reaper-eyes&lt;/code&gt; div, with a box-shadow animation to make them pulse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Float":&lt;/strong&gt; The entire .grim-reaper container has a simple animation that shifts its transform: translateY up and down, giving it that classic, spooky float.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The "Magic": Bringing It All to Life with Animation
&lt;/h2&gt;

&lt;p&gt;A static scene is boring. I wanted movement everywhere. This was the biggest challenge: orchestrating chaos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Bats:&lt;/strong&gt; This was a double-animation challenge. Each bat has a fly animation that moves it from left: -50px to left: 110% across the screen. But! The wings (&lt;code&gt;.bat-wing-left&lt;/code&gt;, &lt;code&gt;.bat-wing-right&lt;/code&gt;) have their own flap animation. I used animation-delay on the main .bat divs to make them fly out at different times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Ghost:&lt;/strong&gt; Similar to the reaper, he has a float animation. But the whole .ghost-group also has a slide animation that moves it across the screen, pauses, and then moves back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Spiders:&lt;/strong&gt; These were tricky. Each leg is its own div with a pseudo-element for the second joint, all absolutely positioned. The whole .spider-group has a simple translateY animation to make it dangle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Books &amp;amp; Candles:&lt;/strong&gt; These were perfect "props" to fill the foreground. The candle flames use a flicker and flame animation to feel alive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Cobwebs:&lt;/strong&gt; Don't be fooled! These are just 4 rotated divs for the main lines and 5 concentric divs with a transparent background and a light border for the spirals. Simple, but super effective.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;This project was a beast, but I'm so proud of the result. My biggest takeaways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pseudo-elements are your best friend.&lt;/strong&gt; I built moon craters, pumpkin segments, reaper eyes, stems, and battlements all without adding a single extra div to the HTML. My HTML is super clean; my CSS file... less so. 😂&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;z-index is a dark art.&lt;/strong&gt; When you have 20+ absolutely positioned elements, you will spend an hour trying to figure out why your cat is standing in front of a castle tower but behind a pumpkin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;animation-delay is key&lt;/strong&gt;. Don't have everything happen at once. Staggering the bats, the window flickers, and the ghost's appearance makes the world feel more natural and less like a repetitive loop.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It was a ton of work, but seeing all the little pieces come together and move was one of the most satisfying coding moments I've had in a while.&lt;/p&gt;

&lt;p&gt;Thanks for reading! What's your favorite part of the scene?&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
      <category>codepen</category>
    </item>
  </channel>
</rss>
