<?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: stefanos.chr</title>
    <description>The latest articles on DEV Community by stefanos.chr (@lopofsky).</description>
    <link>https://dev.to/lopofsky</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1357975%2F8f9ee428-989d-4fd3-a7c4-a1ebeca254c3.png</url>
      <title>DEV Community: stefanos.chr</title>
      <link>https://dev.to/lopofsky</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lopofsky"/>
    <language>en</language>
    <item>
      <title>Your Stack Is Colonizing Itself — And You're Paying the Cognitive Tax</title>
      <dc:creator>stefanos.chr</dc:creator>
      <pubDate>Fri, 08 May 2026 11:32:04 +0000</pubDate>
      <link>https://dev.to/lopofsky/your-stack-is-colonizing-itself-and-youre-paying-the-cognitive-tax-5dff</link>
      <guid>https://dev.to/lopofsky/your-stack-is-colonizing-itself-and-youre-paying-the-cognitive-tax-5dff</guid>
      <description>&lt;h2&gt;
  
  
  Returning Each Layer to Its Rightful Place: The Architecture Behind Mycelium
&lt;/h2&gt;

&lt;p&gt;There is a particular kind of fatigue that accumulates quietly. Not the fatigue of a hard sprint, but the fatigue of &lt;em&gt;maintenance&lt;/em&gt; — of holding three abstraction layers in your head to understand one screen, of debugging a mutation that is half in a React hook, half in a REST endpoint, and half in a database trigger. Of explaining to a customer why a small change requires a deployment. Of waking up at 2am because you cannot remember whether the source of truth for that field is the cache, the API response, or the database row.&lt;/p&gt;

&lt;p&gt;This post is about a framework called &lt;strong&gt;Mycelium&lt;/strong&gt;, and the architectural philosophy behind it. It is not a benchmark post. It is not a "we're faster than X" post. It is written for developers who have started to suspect that the complexity they are managing is not inherent to their domain — it is &lt;em&gt;accidental&lt;/em&gt;, and it was introduced by their tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Is Colonization
&lt;/h2&gt;

&lt;p&gt;Every layer in the modern web stack has a tendency to colonize its neighbors.&lt;/p&gt;

&lt;p&gt;SQL gets colonized by ORMs that think in objects rather than sets, flattening the most powerful query language ever built into a thin object-mapping veneer. Templates get colonized by JavaScript frameworks that treat the DOM as a reactive state machine, importing the entire rendering model of the server into the browser. The server gets colonized by the client, which expects not HTML but JSON, making the server a dumb data pipe and reassigning the job of "application" to a JavaScript bundle.&lt;/p&gt;

&lt;p&gt;The result is that every layer is doing someone else's job badly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proterative design&lt;/strong&gt; is the principle that frames the alternative. The word comes from the Latin &lt;em&gt;proterare&lt;/em&gt; — returning things to their original, rightful place. Applied to a web system, it means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQL thinks in sets.&lt;/strong&gt; Joins, aggregations, mutations, durable truth. This is what it was built for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templates render structure and behavior.&lt;/strong&gt; They receive a payload and produce HTML. That is their entire job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The server orchestrates request flow.&lt;/strong&gt; Thin, explicit, no magic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The network moves messages.&lt;/strong&gt; Transport is transport. It is not storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a new idea. It is, in fact, the oldest correct idea in web development. What is new is building a framework that enforces it as a structural constraint rather than a convention that slowly erodes under deadline pressure.&lt;/p&gt;




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

&lt;p&gt;Mycelium is not designed for teams building the next Figma or Linear. It is designed for a specific kind of developer — one who is also, to varying degrees, a systems thinker, a domain expert, a customer success rep, and an operator.&lt;/p&gt;

&lt;p&gt;The target is the developer who works with SMBs: custom ERP tools, booking systems, operational dashboards, internal tooling for businesses that run on human expertise rather than viral growth. Businesses where the most valuable conversations happen not in a Jira ticket but sitting across from a warehouse manager, a hotel owner, or a clinic administrator who is explaining how their world actually works.&lt;/p&gt;

&lt;p&gt;These developers need to move fast, stay close to the domain, and — critically — sleep at night. The codebase they ship is also the codebase they will maintain, extend, and explain to a customer who wants one small change in eighteen months.&lt;/p&gt;

&lt;p&gt;Complexity is not their friend. Cognitive overhead is not a sign of seriousness. The simplest system that correctly models the domain is the professional result.&lt;/p&gt;




&lt;h2&gt;
  
  
  Filesystem Routing: The App as a Readable Artifact
&lt;/h2&gt;

&lt;p&gt;In Mycelium, routes are not registered. They are &lt;em&gt;discovered&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The filesystem is the routing table. An app's logic lives under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps_logic/&amp;lt;app&amp;gt;/routes/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mycelium's &lt;code&gt;discover_routes()&lt;/code&gt; function walks this directory and reads Python handlers, HTML templates, and WebSocket endpoints as first-class route definitions. No decorator registration, no central &lt;code&gt;urls.py&lt;/code&gt;, no route array to maintain in parallel with the file that actually handles the request.&lt;/p&gt;

&lt;p&gt;This means that opening the filesystem &lt;em&gt;is&lt;/em&gt; reading the application. A new developer — or your future self at 11pm — can navigate the project tree and understand its structure without running the application or reading framework documentation.&lt;/p&gt;

&lt;p&gt;Locality of behavior, the principle championed by htmx's Carson Gross, applies here at the filesystem level: the handler, the template, and the metadata for a route all live together, in one place, with no indirection.&lt;/p&gt;

&lt;p&gt;At startup, &lt;code&gt;sync_app_routes()&lt;/code&gt; upserts discovered routes into the &lt;code&gt;app_routes&lt;/code&gt; table and deletes stale rows. The database becomes a verified mirror of the filesystem. If the two disagree, the framework tells you explicitly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The &lt;code&gt;route_metadata.json&lt;/code&gt;: Behavior as Data
&lt;/h2&gt;

&lt;p&gt;Every route's behavior is declared in a single file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;apps_logic/&amp;lt;app&amp;gt;/route_metadata.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical entry looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"/cashier/dashboard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"db_queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cRud_bl_cashier_dashboard"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mqtt_reads"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"terminal_status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payments_latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"redis_reads"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"session_state"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cashier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"db_queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cUd_bl_cashier_post_payment"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"redis_ops"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"post_db"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"alias"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payments_latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{'state': 'posted'}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"ttl_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cashier"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not configuration in the negative sense — not XML-era ceremony. It is a &lt;strong&gt;declaration of intent&lt;/strong&gt;. Reading this file answers the questions that matter when you return to a route after six months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What data does this route need?&lt;/li&gt;
&lt;li&gt;Where does that data come from?&lt;/li&gt;
&lt;li&gt;Who is allowed to call it, and how?&lt;/li&gt;
&lt;li&gt;What side effects does a POST trigger, and in what order?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework validates this file at sync time. Unknown endpoints are rejected. Missing discovered routes are auto-added. MQTT and Redis aliases are validated against their manifest files. The normalized result is written back. The metadata file cannot lie.&lt;/p&gt;

&lt;p&gt;This is proterative at the metadata level: behavior belongs to the route, not scattered across middleware stacks, decorator chains, or client-side route guards.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transport Is Not Truth: MQTT and Redis in Their Rightful Place
&lt;/h2&gt;

&lt;p&gt;Two common mistakes in complex web systems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using a message broker as if it were a database.&lt;/li&gt;
&lt;li&gt;Using a cache as if it were a source of truth.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mycelium makes both mistakes structurally impossible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MQTT&lt;/strong&gt; is available as a transport primitive. A payment terminal publishes a retained message on a topic. A cashier dashboard renders that latest signal at page load. That is a legitimate use of MQTT — movement of state that is &lt;em&gt;useful now&lt;/em&gt; but not &lt;em&gt;durably significant&lt;/em&gt;. The broker is for movement. When that payment needs to be reported, audited, or reconciled, it is written to Postgres.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redis&lt;/strong&gt; is available as an explicit keyed state layer. Routes declare their reads and writes through aliases. Templates receive Redis results in &lt;code&gt;payload["redis_results"]&lt;/code&gt; — explicitly, not magically. Redis is never the only proof that a business mutation happened.&lt;/p&gt;

&lt;p&gt;Both transports are declared in their own alias manifests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps_logic/&amp;lt;app&amp;gt;/routes/mqtt/*.json
apps_logic/&amp;lt;app&amp;gt;/routes/redis/*.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And referenced by alias in &lt;code&gt;route_metadata.json&lt;/code&gt;, not by raw topic strings or key names. The runtime resolves aliases to tenant-safe topics and keys. Templates never see infrastructure.&lt;/p&gt;

&lt;p&gt;The rule is simple and applies everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Broker for movement.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis for explicit keyed state.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Postgres for truth.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templates render &lt;code&gt;payload&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Metadminer: Situational Awareness in Production
&lt;/h2&gt;

&lt;p&gt;A framework that enforces structural constraints needs a way to surface those constraints visibly. That is the role of &lt;strong&gt;Metadminer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Metadminer is not a debugger and not a log viewer. It is a &lt;strong&gt;system legibility layer&lt;/strong&gt;. Its purpose is to answer the question every experienced developer asks before touching production code: &lt;em&gt;what is the system actually doing right now, and does it match what I believe it is doing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In practice, this means Metadminer surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The route tree&lt;/strong&gt; — every discovered and synced route across all apps, with their current sync status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint metadata&lt;/strong&gt; — the validated &lt;code&gt;route_metadata.json&lt;/code&gt; for any endpoint, normalized and readable, alongside its role constraints and query bindings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The DB query catalog&lt;/strong&gt; — every SQL function registered across apps, with its operation type, payload contract, and last-sync timestamp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport alias maps&lt;/strong&gt; — resolved MQTT topics and Redis keys per tenant, per app, per route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache state&lt;/strong&gt; — what is warm, what is stale, what would be reloaded on the next request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift indicators&lt;/strong&gt; — explicit flags when filesystem state, database catalogs, and runtime caches have diverged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The intended user experience is this: a developer inheriting a Mycelium app, or returning to one after six months, should be able to open Metadminer and, within five minutes, understand the entire system without reading source code. Every query, every route, every permission, every transport alias is visible and traceable.&lt;/p&gt;

&lt;p&gt;This is situational awareness in the same sense a pilot uses the term: not an alarm system, but a persistent, reliable picture of the system's state against which anomalies become immediately visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Developer Experience This Is Designed For
&lt;/h2&gt;

&lt;p&gt;Mycelium is opinionated about the relationship between a developer and their customers.&lt;/p&gt;

&lt;p&gt;The best software for an SMB is built by someone who has sat with that business and listened. Not conducted a requirements session — &lt;em&gt;listened&lt;/em&gt;. The warehouse manager explaining why they sort pick orders by aisle rather than by timestamp. The hotel owner explaining the edge case with group bookings during local festivals. The clinic administrator explaining the three kinds of appointment cancellation that have completely different implications for the schedule.&lt;/p&gt;

&lt;p&gt;These stories are the domain. Metabolizing them into a data model, a set of SQL functions, a route structure, and a template is the craft. The framework should not add a fourth job: managing its own complexity.&lt;/p&gt;

&lt;p&gt;Mycelium is designed so that a solo developer or a small team can own a system end-to-end — from the Postgres schema to the deployed container to the customer conversation — without fracturing their attention across framework layers that do not correspond to anything in the domain.&lt;/p&gt;

&lt;p&gt;The aspiration is not a framework that makes you faster. It is a framework that makes your system &lt;strong&gt;legible to yourself&lt;/strong&gt;, your team, and eventually your successor — at any point in the project's life, without heroic effort.&lt;/p&gt;

&lt;p&gt;That legibility is the condition for sleeping at night.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Mycelium Is Not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is not a competitor to Django or FastAPI for teams building API-first products.&lt;/li&gt;
&lt;li&gt;It is not designed for SPAs, or for systems where the client owns significant application state.&lt;/li&gt;
&lt;li&gt;It is not trying to eliminate JavaScript — Alpine.js is a first-class citizen for behavior that belongs in the browser.&lt;/li&gt;
&lt;li&gt;It is not a low-code tool. It is for developers who want more control, not less, but want that control to be &lt;em&gt;located correctly&lt;/em&gt; rather than spread across the stack.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Current State and Invitation
&lt;/h2&gt;

&lt;p&gt;Mycelium is built on FastAPI, with htmx for hypermedia interactions, Alpine.js for browser-local behavior, Jinja2 for templating, and Postgres as the application's durable core. The framework is under active development.&lt;/p&gt;

&lt;p&gt;If you are a developer who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;builds custom tools for real businesses rather than platforms for other developers,&lt;/li&gt;
&lt;li&gt;finds the cognitive overhead of the modern JS stack disproportionate to the problems it solves,&lt;/li&gt;
&lt;li&gt;values a codebase that reads like its domain rather than like its framework,&lt;/li&gt;
&lt;li&gt;and cares about the long-term maintainability of what you ship as much as the speed of shipping it —&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then this architecture was designed with you in mind.&lt;/p&gt;

&lt;p&gt;The philosophy has a name. The implementation has structure. The next step is finding the people who have been thinking the same way, perhaps without a framework to anchor it.&lt;/p&gt;

&lt;p&gt;If that is you, I would like to hear from you.&lt;br&gt;
The repo is open source (Apache2 License), on github: &lt;br&gt;
&lt;a href="https://github.com/Lopofsky/mycelium" rel="noopener noreferrer"&gt;https://github.com/Lopofsky/mycelium&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Mycelium is the framework. The proterative principle was first articulated in the experimental project proterative (2020) and remains the architectural north star for every design decision in the framework.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>htmx</category>
      <category>postgres</category>
      <category>python</category>
    </item>
  </channel>
</rss>
