<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Architecture on Marcello Barnaba</title>
    <link>https://sindro.me/tags/architecture/</link>
    <description>Recent content in Architecture on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 12 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/tags/architecture/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Panmind Stack: Building 2020s Architecture in 2010</title>
      <link>https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/</link>
      <pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/</guid>
      <description>&lt;p&gt;In 2009, a small team in Rome started building &lt;a href=&#34;https://github.com/Panmind&#34; target=&#34;_blank&#34;&gt;Panmind&lt;/a&gt;, a collaborative platform for sharing and organizing knowledge. The company was &lt;a href=&#34;http://mind2mind.is/&#34; target=&#34;_blank&#34;&gt;Mind2Mind S.r.L.&lt;/a&gt;, founded by Emanuele Caronia.&lt;/p&gt;&#xA;&lt;p&gt;Panmind itself didn&amp;rsquo;t survive. But the stack we built for it did something interesting: it anticipated architectural patterns that wouldn&amp;rsquo;t become mainstream for five to ten years. We were building single-page applications before the term existed, streaming analytics before Segment, and sharing sessions across languages before JWTs.&lt;/p&gt;&#xA;&lt;p&gt;I &lt;a href=&#34;https://sindro.me/posts/2010-08-05-panmind-at-ruby-social-club/&#34;&gt;presented some of our open-source spin-offs&lt;/a&gt; at the Ruby Social Club in Milan in 2010, but that post only scratched the surface — it was a quick rundown of Rails plugins. This is the deeper story: three technologies, three problems solved too early, and how the same ideas showed up in every major framework that followed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;act-1-jquery-ajax-nav--spa-before-spas&#34; id=&#34;act-1-jquery-ajax-nav--spa-before-spas&#34;&gt;Act 1: jquery-ajax-nav — SPA Before SPAs&lt;a class=&#34;heading-anchor&#34; href=&#34;#act-1-jquery-ajax-nav--spa-before-spas&#34; aria-label=&#34;Link to this section&#34;&gt;¶&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;picture&gt;&#xA;  &lt;source type=&#34;image/webp&#34;&#xA;    srcset=&#34;https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_f74790f9fea5874f.webp 768w, https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_43fb1f4e34d8393d.webp 1024w, https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_cd72c73c62ee28cd.webp 1536w, https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_a1b20eeb0b96a6be.webp 1920w&#34;&#xA;    sizes=&#34;(max-width: 599px) calc(100vw - 2rem), (max-width: 1199px) calc(100vw - 3rem), 47rem&#34;&gt;&#xA;  &lt;img src=&#34;https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_7772f317ffbc934b.jpg&#34;&#xA;    srcset=&#34;https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_7772f317ffbc934b.jpg 768w, https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_2dd194eba710bcc7.jpg 1024w, https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav_hu_a017208bac229054.jpg 1536w, https://sindro.me/posts/2026-04-12-panmind-ahead-of-its-time/act1-ajax-nav.jpg 1920w&#34;&#xA;    sizes=&#34;(max-width: 599px) calc(100vw - 2rem), (max-width: 1199px) calc(100vw - 3rem), 47rem&#34;&#xA;    width=&#34;768&#34; height=&#34;429&#34;&#xA;    alt=&#34;Hash-based routing in a vintage browser — polling for changes, hidden iframes for IE, the URL fragment as the only programmable piece of the address bar&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/picture&gt;&lt;/p&gt;&#xA;&lt;p&gt;Panmind needed to feel fast. Clicking a link shouldn&amp;rsquo;t reload the entire page — it should swap just the content area, instantly. In 2023 you&amp;rsquo;d reach for React, or Turbo, or HTMX. In 2009, none of those existed. There was no History API. There was no &lt;code&gt;pushState&lt;/code&gt;. The URL hash fragment — the bit after &lt;code&gt;#&lt;/code&gt; — was the only part of the URL you could change without triggering a page reload. So that&amp;rsquo;s what we used.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
