<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Disperse Data by Tudor (two-door)</title>
        <link>https://paragraph.com/@tudorizer</link>
        <description>A prescribed dose of tech sanity for the digitally overwhelmed.</description>
        <lastBuildDate>Sun, 12 Apr 2026 16:54:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Disperse Data by Tudor (two-door)</title>
            <url>https://storage.googleapis.com/papyrus_images/88d19f312eb503e1a5992d5d4aead71d.gif</url>
            <link>https://paragraph.com/@tudorizer</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Wallets Through (web3) History]]></title>
            <link>https://paragraph.com/@tudorizer/wallets-through-web3-history</link>
            <guid>rJdxhvWaiprgGRGcRaJC</guid>
            <pubDate>Thu, 27 Feb 2025 20:13:33 GMT</pubDate>
            <description><![CDATA["Not your keys, not your coins." The phrase cuts through crypto like a knife. Simple. True. Final. Whether you're new to crypto or a veteran, understanding how we got here matters. Picture this: someone hands you a series of random letters and numbers. These characters control everything you own on the blockchain. Lose it, all is gone. Share it, all is stolen. This was true in 2009. It's still true today. The core challenge remains: how do we put cryptographic keys in everyone's hands? T...]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h2 id="h-intro">Intro</h2></div><p>"Not your keys, not your coins." The phrase cuts through crypto like a knife. Simple. True. Final. Whether you're new to crypto or a veteran, understanding how we got here matters.</p><p>Picture this: someone hands you a series of random letters and numbers. These characters control everything you own on the blockchain. Lose it, all is gone. Share it, all is stolen. This was true in 2009. It's still true today. The core challenge remains: <strong><u>how</u> </strong>do we put cryptographic keys in everyone's hands?</p><p>The math behind blockchains is elegant. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hackernoon.com/keys-are-not-identities">Public-private key</a> pairs. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/cryptography/comments/xvom3z/im_trying_to_explain_how_a_digital_signature/">Digital signatures</a>. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://cacr.uwaterloo.ca/hac/">Hash functions</a>. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/@SpaceandTimeDB/understanding-merkle-trees-252f83aa6e51">Merkle trees</a>. Each piece clicks. Easy-peasy, right? But most people first touch this technology through something with a familiar name: a wallet.</p><p>We borrowed the word "wallet" from the physical world. It worked because everyone knows what a wallet does. It holds your cash. Your cards. Your license. The photo of someone you love. The receipt from that special night. But as our lives move to the blockchain, maybe we need a better analogy.</p><p>Let's trace how we got here. Two things matter: <strong>keys and coins</strong>. One controls, one holds value. Together, they tell the story of how crypto tried to make cryptography work for everyone.</p><div class="relative header-and-anchor"><h3 id="h-keys">Keys</h3></div><p>The math was solid. The cryptography worked. But people needed ways to use their keys. Evolution came in waves. Each wave brought new tools. Each tool made keys easier to use. The audience grew larger. What started with cryptographers spread to developers, then to tech-savvy users. Although mass adoption remains a distant shore.</p><div class="relative header-and-anchor"><h3 id="h-i-the-clis-command-line-interfaces">I - the CLIs (Command-Line Interfaces)</h3></div><figure float="none" width="308px" data-type="figure" class="img-center" style="max-width: 308px;"><img src="https://storage.googleapis.com/papyrus_images/6bfc467bab67496d09aa8f1cc23ac736.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAIAAAAUMWhjAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVR4nO2WoavrMBTGo2bqBzNVhdnB1GBqojAoTAwKc1X7Cwrzc4WJiUFdxXxhYqJQEaioiAhUREQMKiIiKiIKFRF5rHmUd+/utsvdnnjwfvKQnI/znfScAqWUlJJzTghBCOGXQQhRSquqUi1AKQUhPBwO5/P59ey4FYjjeL/fF0VxFeCcR1Gk3k1d11EUSSlBURS+76dpGsfx6SO3kdOd4O2ZNE1938cYA4RQmqZN0wgh+EeEEFULY6yqqi7eBTXVDZzzpmniOKaUAowxIaQsS4zxpzI551LKT0F9XwjxwB99C0J4FUAIcc5By/F43O12juN4nrdcLnu9nhCi3++Px2OMMaXUcRx9EgDgeZ7ruovFgjH2SABjXBTFaDRarVaEkM1mAwCYTCaO49i2vd1u5/P5bDZbr9eu65qmaVnWdDq1bXs4HFqWBQDI87xLeldASimECMOwLEvGmDYxy7IgCJRSuhm3dn3LoqIoIIQAgMFgoGs3DCNJEsMwOjdM06SUJklCKVVKNS1/5npiEcYYQqifRJIkhBClFGOsLEshRN5S13UQBJfL5V7SJwI6+n0THvNFDzqBBxryZz3oBN6I/C/wjK9f0T8rgFr+hkDSfvmAEHI6nfQAkG+iaQdJHMeEkOvKDMPwvRWodj6GYXhdmdqsKIqyLNNj50WyLIMQhmH4e+lrQcZYlmVv+avAGOd53q28X9eZ18TeYtYAAAAAAElFTkSuQmCC" nextheight="486" nextwidth="648" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">sketch of command-line interface in a terminal</figcaption></figure><p>Bitcoin Core (originally called Bitcoin-Qt) was released in 2009. At first, we had a piece of software which ran in the terminal. CLI – <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://carlalexander.ca/introduction-command-line-interface/">command-line interface</a> – meant typing text commands to interact with your computer. No buttons to tap/click on. No URLs to access. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blog.royalsloth.eu/posts/the-complexity-that-lives-in-the-gui/">No visual interfaces</a>. The barrier to entry was a bit higher than using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.commandlinefu.com/commands/matching/curl/Y3VybA==/sort-by-votes">cURL</a>. It functioned as both a non-custodial cryptocurrency wallet and a kind of validator.</p><p>A typical interaction looked like this:</p><pre data-type="codeBlock" text="$> bitcoin-cli sendtoaddress &quot;1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa&quot; 0.1"><code>$<span class="hljs-operator">&gt;</span> bitcoin<span class="hljs-operator">-</span>cli sendtoaddress <span class="hljs-string">"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"</span> <span class="hljs-number">0</span><span class="hljs-number">.1</span></code></pre><p>This command would send 0.1 BTC to a wallet address - assuming you typed the 34-character string perfectly. One mistyped character and your funds are forever gone.</p><p>There was no encryption until <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://bitcoin.org/en/release/v0.4.0">version 0.4</a>, so before this, keys were stored in plain text, on the local hard drive. Users faced a brutal choice: risk losing their funds through technical mistakes, or risk theft through inadequate security.</p><p>Developers built tools for developers.</p><p>Security paranoia bred creativity. Some printed or engraved their private keys on physical objects: paper, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/Bitcoin/comments/x910t6/how_does_one_go_about_engraving_their_keyphrase/">metal</a>, wood, you name it. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.casascius.com/">Casascius coins</a> were cool for a while. Still are IMHO. Blame holograms.</p><figure float="none" width="441px" data-type="figure" class="img-center" style="max-width: 441px;"><img src="https://storage.googleapis.com/papyrus_images/45df2f48eb9cfafeef98530d716961a9.jpg" blurdataurl="data:image/png;base64,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" nextheight="480" nextwidth="480" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Actual image of a golden Casascius coin. Not a 3D render or AI slop</figcaption></figure><p><strong>User Experience (UX) rating: ★☆☆☆☆</strong></p><p>- Required technical expertise</p><p>- High risk of user error</p><p>- No safety mechanisms</p><p>- Direct blockchain interaction</p><div class="relative header-and-anchor"><h2 id="h-ii-custodial-services">II - custodial services</h2></div><p>Command lines scared people away. The industry saw an opening. "Give us your keys," they said. "We'll keep them safe."</p><figure float="none" width="475px" data-type="figure" class="img-center" style="max-width: 475px;"><img src="https://storage.googleapis.com/papyrus_images/ed59cea1b4a61a6eecf152435e7905ad.png" blurdataurl="data:image/png;base64,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" nextheight="1210" nextwidth="1226" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">blockchain.info circa 2014</figcaption></figure><p>Mt. Gox led the way in 2010. Started as a trading card exchange, it became crypto's first major exchange. By 2014, it handled 70% of all Bitcoin transactions. Then it fell. Hard. Hundreds of thousands of Bitcoin vanished. Millions in value, gone. A decade later, users finally got some coins back - about $8 billion worth. An expensive lesson in "not your keys, not your coins."</p><p>Between 2010 and 2013, other services followed: MyBitcoin, Instawallet, Bitcoinica, BitFloor, Cryptoxchange and more. Some were actually exchanges besides simple services to store keys. People mixed up the two concepts and most of these services didn't end up well. Hacks, scams and general loss of funds were too easy.</p><p>At least they lowered the barrier to:</p><p>1. obtain Bitcoin</p><p>2. store Bitcoin</p><p>The user experience was simple and akin to managing a bank account. One step forward from the terminal.</p><p>The risk of giving away free reign over your keys was too high. At that point, you might as well email them your credit card PIN.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://Blockchain.info">Blockchain.info</a> (established 2011, eventually .com) started as a blockchain explorer and, like most business who want to take advantage of the attention and recurrent traffic, they added a wallet service.</p><figure float="none" width="402px" data-type="figure" class="img-center" style="max-width: 402px;"><img src="https://storage.googleapis.com/papyrus_images/ef07b67f98319b111c48f6f119515d66.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAIAAAAUMWhjAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIklEQVR4nK2WobLqMBCGY/oEiFoMAoNBYzDoGh4BxVNgUFF9gJqqVatWrYqqQlVFRcVVVa3iDOwh04EeuHTuJ5iQpvmz+ZPdGhFh5qZpLpeLc04bChHBVOq6RkQRMcx8Pp/3+/1qtSqKYrfbFXfW67WO6B70ff/UeKV/ICKIyMyGiMqyzLIsz/PD4bBcLmez2Xw+N+b26Hq9ish1EiEERDQAEGNMvTFGXUKMMYTQvuDHCCE0TeO9H64mxggABhFjjHJHPQghpNeeaO5cLhdtpLYaxswatNJ13S0CFdAuIrLWbrfbLMtWq5Uxxlq72+02m81+v18ul8P3R0HEruvGBTSC0+k0n8/X6/VmszHGFEWxWCzyPD8ej7PZzFqrI59IVjFzWu5IBMw82VLFOfdBQE+Y4r2nO8zsnNPftPvJg77vvxBIETjnAEDvQdu2r1MrzrmyLJPGFwIAwMxqBiJex9DBABBC+CcBIkoCegHzPM+yzFqrpzbNG0IQEV34dAEiMn+TjiMiThGo6zqEAABqLxFpI2XGtO9fRDD0oKqqj0dWvvVgKKC5uvuE995am7brCwERadv2Y9InomGu/OxB2tlpV9p9KyAvCee1f5iLhrONCyS7JtD3PQCkJf4KDAtOjBERq6rit7jHeX1qE5H3Pul1XXcrOHVdD10SES1qo/W2e1uTnwL6LZlEhIipWGs2/evv06P3aDYzIqIa/xcA0M+WH1wUfiemD0OjAAAAAElFTkSuQmCC" nextheight="740" nextwidth="980" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">how custodial services fit together</figcaption></figure><p><strong>UX rating: ★★☆☆☆</strong></p><p>- Simple</p><p>- A bit more secure than the terminal</p><p>- Not much more than a bank account</p><p>- <em>Sometimes</em> open-source</p><div data-type="callout" type="tip"><link rel="preload" as="image" href="https://paragraph.xyz/editor/callout/tip-icon.png"><div class="callout-base callout-tip" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/tip-icon.png" class="callout-button"><div class="callout-content"><div><p>Bitcoin is only one token. Somewhere between this phase and the next, the number of alternative tokens exploded. For brevity, I won't mention too many of them.</p></div></div></div></div><div class="relative header-and-anchor"><h2 id="h-iii-browser-plugins">III - browser plugins</h2></div><p>Web browsers became the new frontier.</p><figure float="none" width="423px" data-type="figure" class="img-center" style="max-width: 423px;"><img src="https://storage.googleapis.com/papyrus_images/3188beec031e8380199b1f35d9ef746a.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAANCAIAAABHKvtLAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIUlEQVR4nJ2ToY7DMAxAjYoLh4rG9gX9iv7BYGFg4WChoamhoWnoaGBoaalpaE7XaNXd7ba1fShSHD/bckBVh2Fwzg3DMC4gYnhNjJGZRSQvlLP3nn8jIojovQciapoGAKqqqusaANq2zTmnlPJriMjMcs6IWFUVAMQY19v0gIiAmX+me593pbxCROdcEZQSm6ap6/pyuaxhUJotwu0OETEzADidTqradd31eu373jnX9z0R/SPIe7jf7+M4dl3HzNM0pZTMbJ3MPM/TNIUQvkd0THC73QDAzEIIIqJPeO9FJMa4W5CWyPP5DABbHh7sgJnLFqVPHBSIyDzPWyKPC2zp4LPgzz/YO6L8UYCIe7OXL7ZVoKqI+LxnbyAiVd1YyhdMmDBXWIdCDgAAAABJRU5ErkJggg==" nextheight="580" nextwidth="1386" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">sketch of browser + wallet relation</figcaption></figure><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://archive.trufflesuite.com/guides/truffle-and-metamask/">MetaMask changed everything in 2016</a> during the DevCon 2 conference. Suddenly, crypto lived where people lived - in their browsers. It did mean people had to download and install one additional piece of software. Some were reluctant because browser extensions can be a breach of privacy, but convenience won over.</p><p>MetaMask brought gifts. Self-custody without command lines. Key management without complexity. A wallet that felt like an app. It opened doors to Web3. To NFTs. To DeFi. Millions of users followed.</p><p>Store the seed phrase in a fire-proof safe at your grandma's house and your exposure to most of the attacks was greately reduced. A win is a win.</p><p>dApps were born. They are like websites or apps, but run (aka. persist data) on various blockchains and this earns them the "d" prefix from decentralized.</p><p><strong>UX rating: ★★★☆☆</strong></p><p>- Simplified transaction flow</p><p>- Requires an additional plugin</p><p>- Always-available access</p><p>While browser plugins revolutionized access, they were a single point of failure. What if more people should have complete control over their funds? Split the risk. Enter the era of multi-signature wallets.</p><div class="relative header-and-anchor"><h2 id="h-iv-multi-sigs">IV - multi-sigs</h2></div><p>What if you can't trust yourself with your own keys? A "Bitcoin Improvement Propolsal" (BIP) introduced the concept of multi-sig in 2011 through BIP11. The idea evolved a bit since then.</p><p>Ethereum introduced smart contracts, and because the blockchain is a public ledger, developers connected the dots. Numbers and flags indicating how many N ___insert_arbitrary_unit_of_measure___ correspond to each wallet could be stored on blockchains through smart contracts. Multi-sig wallets were born.</p><figure float="none" width="455px" data-type="figure" class="img-center" style="max-width: 455px;"><img src="https://storage.googleapis.com/papyrus_images/1f66bc9c88c7d5d2fd59218ea820d2e5.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAJCAIAAADcu7ldAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNklEQVR4nJWSLZLDMAyFfYVeojykvKgHCPIBisp6gKAwsyCzoDKhMDExMTOxMDOzMDF3NppmZ3fbTvdDHuvn6Vl2AOC9v1wu3vsQQs55/gMiqmopZRzHvu9jjCJiISJalqXWysyn02kcR1VdlsX6MLMDgBgjAPR9j4j1GbK2E5Hz+exWSikWSik1TTPPMwDsdjvnXNu2x+Ox6zpTdcxca1XV+ppSCiJ2XYeIwzAAwFYyTZNzbpomACgPcs6brW8B46kAM+/3exFJKZn39ICZb7ebWWTm7eks51MHiHi9Xs3K8hNVFZEQgh1MxiCinPNHAnnlacgK48rhcPDe25JtFCL6SGBeeT/BMAxN0zjnvPdt24YQ/rFkEXnlYIOILE1WSimq+uWAiFJKdvsKRLRf8d7lrz628zvoRNcScfNvvAAAAABJRU5ErkJggg==" nextheight="580" nextwidth="1990" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">example multi-sig relation</figcaption></figure><p>Gnosis Safe lead the way. Built for anyone who couldn't trust a single key. Two signatures out of three. Three out of five. Five out of seven. Choose your security level. Choose your trusted circle.</p><p>The corporate world took notice. DAOs embraced it. Teams adopted it. Multi-sig became the standard for serious money. But complexity crept in. More keys meant more coordination. More signatures meant more delays. Security and speed fought their eternal battle.</p><p>The UX was akin to an upside-down pyramid. N wallets need to sign so 1 multi-sig can act upon the blockchain.</p><p><strong>UX rating: ★★★☆☆ (not better, not worse)</strong></p><p>- more secure than a single-sig wallet</p><p>- more complicated to use; perfectly ok for some use cases</p><div class="relative header-and-anchor"><h2 id="h-v-mobile-apps">V - mobile apps</h2></div><p>Mobile apps dominated consumer tech. They could do anything. Including hold keys. But holding keys wasn't enough - what's the point of holding keys if you can't use them?</p><figure float="none" width="264px" data-type="figure" class="img-center" style="max-width: 264px;"><img src="https://storage.googleapis.com/papyrus_images/675fdcbc3e69c94661050c7b7e92dbb9.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAWCAIAAAAuOwkTAAAACXBIWXMAAAsTAAALEwEAmpwYAAABs0lEQVR4nLWVodLiMBDH42uQSGZ4ACSOB+AFeIFaRA0Ci0BXrI6IiIqIqanAxMRUxMRUITAxa2pq8s2xd73M9W5oOb6f6LTb7vy72f8mLMZorQUAzrmUUoyQ8xFCAIC1NsbInHMAEL8BAHDOMSmlc45zvtlsrtdrURR5nl8ul6Iozufz6XRq2zbG2Pf9XIG2baWUTGvdNM1ut2OMHQ6HPM9Xq9V6vV4ul+yJc+49AUT8KYCI8Rvouk4p9UMghEDP/RO6Ga5xGuMSfwuMK3hjQca8ENBaA8BEpwJA0zR//NnfBeiLuq611mmw+7WAA2mk6zoAeDwerysgASFECIGMlGWZUipt0kCaorUmv00SUEoh4vF45Jzv93vvvX2S5ltrKXEo2ns/T2C73dIoMMYWiwXdZFk2BI0x/yVgjNFPOOda67quqaVVVVlrb7fb+xVIKWk4BtJFTyPDrFRVNaMHUkqy3RQohXM+qQICEcuy5JyraZRlSU57PQfpa0TspoGI87aKN+j/JTDu56dA2q6FEPf7PXXFR4jDgUNH5sePhBACAHjvWYzRGCOEmGiYiQghaM6/AELwLMFrncY/AAAAAElFTkSuQmCC" nextheight="580" nextwidth="826" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">mobile browser</figcaption></figure><p>Browser plugins proved something important: non-technical users wanted wallets ready at a click. But mobile browsers struggled with plugins. The solution? Turn wallets into browsers. Now every dApp journey started through a wallet's lens.</p><p>This tech later circled back to desktops. Brave (launched Jan 2016) and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blogs.opera.com/desktop/2018/09/opera-delivers-the-first-desktop-browser-with-built-in-crypto-wallet-access-labs-version/">Opera (launched 2018)</a> tried to replicate the mobile browser experience of having wallets built-in. They came late to the party. The mix of "wallets" and "browsers" felt forced. "Wallets" means money, currency, serious stuff. The stuff you can eventually exchange for a Lambo. Browsers are for casual surfing, no?</p><p><strong>UX rating: ★★★☆☆</strong></p><p>- one-single app for all your web3</p><p>- not open-source</p><p>- avenue to become a lot more noisy, opinionated and pushy than a regular browser</p><div class="relative header-and-anchor"><h2 id="h-vi-smart-wallets">VI - smart wallets</h2></div><p>Smart wallets brought new promises. Account abstraction (AA). Programmable accounts. Gas abstraction. Words that meant little to users but changed a lot about how wallets worked.</p><p>Take <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://safe.global/">Safe</a> (formerly Gnosis Safe) or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.argent.xyz/">Argent</a>. They let you recover accounts through guardians - trusted friends or devices. No more lost seed phrases. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.privy.io/guide/react/authentication/login/whitelabel/">Privy</a> is building quite a bit in this space.</p><figure float="none" width="387px" data-type="figure" class="img-center" style="max-width: 387px;"><img src="https://storage.googleapis.com/papyrus_images/210295c47a839effb807fb4ea5cb31ef.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAVCAIAAACor3u9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4klEQVR4nK2Vq7arMBCGU41EYVB9BVQVqg9RhavC1aH6BlXIuHFxcZHjIsfFRUbGRWavMuv0Aj09tPt8gpVwmZ/8k8yIGKO11ntPRG4iTJjP0Vp77/MzQmvddZ0Qoq7rsiybpqmqqigKYwwR2dUQESKO45hSyjmniauAUqrv+6Iouq5rJ8qyrOs6f0iawgHAbBFCShlC4In3nu1yzllrccIYg4h6BYjY972UEhEBwBiTUhI3TSKCiXEcT6fT8Xi8XC7WWh5ba2OM4S0pJSklEfGbRKS1vlrEKyCiw+EgnqnrmgfH4/HmwxuUUo8WKaXuAojIz275mY3XsEog5xxjxH+RXgnPBJ4sehTgRBHRcrNzdK01AHwpEEIAgN1uJ4To+/5v1kspY4zfCMQYAaBtW05vVVVN07Rtu9/vN5uNUoo/BoBfCQzDwGe7mgT4ut1ujTH/YQVSyqUnM74XyDmP48hJXuKc894j4sufWCsQY3xfFcxUBj4TMMYsD9ob0oJHgdv0LsAldxYivwr0Rv5xBbxZ7tWUc2uMWd8DZhDRMAxKKW4kAOCceyrXKSVE5L7mnLv1OPozmPF4n4hCCOfzWWvN1Z732LVcc8bixEtDVhJCkFLODBQpJa21lJKbwS9ZbpMf2QpwLQjEKYMAAAAASUVORK5CYII=" nextheight="740" nextwidth="1148" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">the wallet has relations spreading beyond what you see</figcaption></figure><p>Crypto folks started talking about different types of wallets: externally owned accounts (EOAs) (the "vanilla" ones we had from day 1) and smart wallets (smart contracts which can act on behalf of users).</p><p>This shift brought familiar authentication patterns - like email-based recovery and multi-factor authentication - to blockchain interactions.</p><p>These smart wallets have a few other notable features, but their main claim to UX-fame is that they work just like your e-mail. Most people use Gmail, MS Outlook, Yahoo, [insert centralised email provider here]. That's flawless, right? Convenience wins again.</p><p><strong>UX rating: ★★★★☆</strong></p><p>- smoother UX than a regular wallet</p><p>- back to email and co.</p><div class="relative header-and-anchor"><h2 id="h-your-ownership">Your (ownership)</h2></div><p>With this evolution of wallet tech, the concept of ownership has become increasingly nuanced. You might think you own the currency in your wallet - it's there, nobody can take it from you (barring security breaches). You are your own bank and investment manager. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.barstoolsports.com/blog/1275959/chaos-strikes-the-finance-world-patagonia-is-refusing-to-make-vests-for-business-bros">Wall St bros</a> envy you. But what does ownership really mean?</p><p>Today's crypto wallets are command centers - managing identifiers (<em><u>not identities</u></em>), authorizing transactions, and connecting to various services.</p><p>True ownership died somewhere between subscription services and terms of agreement. You might not even own the seat warmers in your car. What's the point of owning, if there's a paywall to unlock meaningful access to a feature?</p><p>Perhaps it's time to move beyond the wallet metaphor entirely. We don't say "digital cameras" or "<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Horseless_carriage">horseless carriages</a>" but simply "cameras" and "cars". They're tools for proving who you are and what you can do on networks that matter.</p><p>Should I explain why you don't really own the Oura ring on your finger? Or how surveillance has a real price tag?</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sign.kernel.community/essay?ref=sheldrake">If there's no ownership, what's the value?</a> The value is in access, history, context. In the digital footprints you leave and the reputation you build.</p><div class="relative header-and-anchor"><h2 id="h-coins">Coins</h2></div><p>Your tokens are not currency. They are proof. Proof that you were there. Proof that you participated. Proof that you believed.</p><p>Take CryptoPunks. People say they're worth millions. But that's not why they matter. They matter because they mark a moment. Summer 2017. The birth of something new. You don't own an asset; you own a verifiable relationship with a moment in time.</p><p>These aren't baseball cards. They're not stocks. They're not even digital art, not really. They are timestamps. Proof that you were there when it happened. When it changed. When it mattered.</p><p>The coins in your wallet tell your story. Where you've been. What you believed in. What you built. The networks you joined. The risks you took.</p><p>That's what sits in your wallet. Not money. Stories.</p><div class="relative header-and-anchor"><h2 id="h-not">Not</h2></div><p>As we've seen through this journey of wallet evolution, the tools we use to interact with blockchain networks have come a long way. Yet, human-friendly solutions remain elusive.</p><p>History has many versions of information systems: books, wallets, computers, libraries, banks, browsers, spreadsheets, and all the nuances in between. Each solved specific problems of their era.</p><p>Now we face a new world. Everything connects to everything. Hyper-connected. Old tools don't fit anymore. A wallet can't hold the internet. A browser can't secure your future.</p><p>No wallet deserves five stars. Not yet. Not when billions need to use it. Not when it holds their future.</p><p>We need something new. Something that fits this connected world. Something as simple as email, as secure as a vault, as personal as a signature.</p><p>The old metaphors are dying. Let them die.</p><div class="relative header-and-anchor"><h2 id="h-closing-thoughts">Closing Thoughts</h2></div><p>We tried to make cryptography simple. Still trying.</p><p>Command lines scared people away. Custodial services got hacked. Browser plugins helped but created new problems. Multi-sig added security and complexity. Mobile wallets promised convenience but brought confusion. Smart wallets look familiar but hide their risks.</p><p>Two steps forward, one step back. [1]</p><p>The challenge isn't technical. We solved the math. We wrote the code. The challenge is human. How do we make the complex feel simple? How do we keep security without sacrificing speed? This article isn't just about history - it's about understanding where we are and where we need to go for crypto to reach its potential.</p><p>As we move toward mass adoption, the technology needs to become invisible, working silently in the background while users focus on what matters: using their assets, not managing them.</p><p>Where will we be 5 years from now? The journey continues. The challenge remains.</p><hr><p>Thanks to Philip (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/sheldrake">@sheldrake</a>) for catching inconsistencies and pushing for clarity. To <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/afrochicks">@afrochicks</a> for suggesting structural changes that made me question my choices. To <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/beecurious">@beecurious</a> for bringing the beginner's mind - fresh eyes see what experts miss. To <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/ccarella.eth">@ccarella.eth</a> for encouraging personality over dry facts. And to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/tako-unik/">@tako-unik</a> for asking the hard questions about audience and purpose.</p><hr><div class="relative header-and-anchor"><h3 id="h-references">References</h3></div><p>[1] A more accurate visualization stuck in my head is pixel-by-pixel animation like in the old Snake game. For the snake to move forward, the rightmost pixel must turn black, while the last pixel must turn white. Done fast enough, it creates the illusion of movement. Same snake, same number of pixels in length. The only moment the snake grows is when it eats.</p><figure float="none" width="579px" data-type="figure" class="img-center" style="max-width: 579px;"><img src="https://storage.googleapis.com/papyrus_images/780b202f54532720764821b086b7fba8.gif" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAPCAIAAAAK4lpAAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABPUlEQVR4nGNgYGHQdhYyC5A28hLXdhaiIlKx4WHgZGBglmRYdKha102oa23G1d+rjr6affLdfFLRlV8r0UROv1uw/lIHsyQDA6cMQ8/aDAZBhuQGlyu/Vu59NGXfo6nEo6OvZq+/1Fk+Lezoq9lo4qvOtoAsYBBiWH+pc9q2op13J5Jk9D4wOvxy1uZrXa3LkjAtRrHg9LsFZJi+D4ZOvptPwAJKTN/3aOpebEGHYsHRV7P3PpoCQRRatg+bBR1HX82+8X/tnf+bbvxfS30Ldt2bOP9QFQMMzNlXfvLd/L1UtGDzta4tN3ukTRh4FBhkzJnXXmxHS3P7KA+i4+/m3fu/6en/7ff+b6Lc9H1YI3nXvYkQRItI7qSKq/fhjoOek+/mH301m4ro5Lv5ay+2gy1gYdByEqBuOYpcmgIArdJtHO8NYfYAAAAASUVORK5CYII=" nextheight="574" nextwidth="1200" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">frame-by-frame progress</figcaption></figure><p></p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>web3</category>
            <category>history</category>
            <category>finance</category>
            <category>social</category>
            <category>anthropology</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/b5f3c06f3140ceae94467ea369ebb2aa.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Beyond the Hype: Your Complete Guide to ML Development]]></title>
            <link>https://paragraph.com/@tudorizer/beyond-the-hype-your-complete-guide-to-ml-development</link>
            <guid>oTsFa2JNhR6NsyebZwYX</guid>
            <pubDate>Mon, 16 Dec 2024 17:13:57 GMT</pubDate>
            <description><![CDATA[This article is meant to expand on this open visual map I assembled over the last few months. Ready to build something amazing? A product or a business? You're not alone! The world of AI is exploding with possibilities. There are tools, platforms, frameworks, and resources everywhere you look - maybe even too many to sort through on your own. That's where this guide comes in. We'll walk through each step of the ML development cycle together. You'll discover what ...]]></description>
            <content:encoded><![CDATA[<div data-type="callout" type="info"><link rel="preload" as="image" href="https://paragraph.xyz/editor/callout/information-icon.png"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>This article is meant to expand on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dub.sh/ml-dev-cycle">this open visual map</a> I assembled over the last few months.</p></div></div></div></div><div class="relative header-and-anchor"><h2 id="h-intro"><strong>Intro</strong></h2></div><p>Are you excited about <strong>AI</strong>? Ready to build something amazing? A product or a business? You're not alone!</p><p>The world of AI is exploding with possibilities. There are tools, platforms, frameworks, and resources everywhere you look - maybe even too many to sort through on your own. That's where this guide comes in.</p><p>We'll walk through each step of the ML development cycle together. You'll discover what matters, when it matters, and why. Some steps blur into each other, and certain platforms serve multiple purposes. That's okay. Skim through what interests you most, and dive deeper when something catches your eye.</p><p>Speedrunning? Focus on getting from raw idea to happy customer. Everything in between is just details we can optimize along the way.</p><div class="relative header-and-anchor"><h2 id="h-the-foundation"><strong>The Foundation</strong></h2></div><p>Starting out? You might fixate on models and deployment. That's natural. But there's more to the story.</p><div data-type="callout" type="tip"><link rel="preload" as="image" href="https://paragraph.xyz/editor/callout/tip-icon.png"><div class="callout-base callout-tip" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/tip-icon.png" class="callout-button"><div class="callout-content"><div><p>This article has <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://news.ycombinator.com/item?id=42433046">been published on HackerNews too</a>. Any votes/comments are welcome.</p></div></div></div></div><p>As you move beyond those first prototypes, you'll discover that building AI products involves a deeper journey. Let me show you why each step matters:</p><p>- <strong>Data Quality Issues</strong>: Poor data in means poor results out. When your initial data curation falls short, you'll face endless cycles of expensive re-training and cleanup.</p><p>- <strong>Technical Debt</strong>: Rush to deploy now, pay the price later. Without proper infrastructure and monitoring, you're building on quicksand. Each shortcut becomes a future roadblock.</p><p>- <strong>Resource Waste</strong>: Teams without a plan burn through resources like wildfire. They train models they don't need. They over-provision infrastructure they barely use. Money vanishes into the digital void.</p><p>- <strong>Maintenance Nightmares</strong>: Documentation matters. Monitoring matters. Skip these fundamentals, and you'll find yourself unable to maintain or improve your models. Your future self will not thank you.</p><p>- <strong>Scalability Barriers</strong>: Ad-hoc solutions create bottlenecks. These barriers become walls. Walls that prevent your AI solutions from growing with your success.</p><p>Following a structured development cycle changes everything. It helps teams see around corners. It keeps resources flowing to the right places. Most importantly, it builds AI solutions that last - solutions that deliver real business value, day after day.</p><p>Let's walk through each step of this lifecycle together. In a systematic manner.</p><div class="relative header-and-anchor"><h2 id="h-1-data-acquisition-and-curation"><strong>1. Data Acquisition and Curation</strong></h2></div><p>It all starts with data. Raw. Messy. Full of potential.</p><p>Your data might come from anywhere. Public datasets wait on Kaggle. Governments share treasure troves of information. Research institutions open their archives. Or maybe it's your own data, living in warehouses, CRMs, and countless spreadsheets. Need something specific? Third-party providers stitch together custom solutions - for a price.</p><p>But raw data isn't enough. It needs care. Attention. Purpose.</p><p>You'll clean it first - removing duplicates, handling missing values, smoothing out the rough edges. Then comes curation. Adding context. Labels. Metadata. It's complex work, but specialized tools make it manageable.</p><p>Let's look at an example. Here's raw data, exported from a legacy system:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9f14a3c1af463db85ce26955ff581aed.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAICAIAAAAX52r4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5ElEQVR4nI2SsU/bQBTGbykDXZrmDyBypSJniH0eSDwUme3YzoslOhTTMaNZSsKWrZguxXQp8mo6EMnrLUhcEQXFA8t1qNTK6lKsjhe6vSq8YiFY+g2nu9PT+73vvUeKoojjWAgBAEKIsiwBIEmSLMvgvyWlTJKkfmqtPx4caK0BgOzvfyCEhGEIAEEQYF5yIwCobqVvVF9qVVUFAG+2tgghZVliQFVV8/OPlVKzVF+/fb+qfiNtMBhw7gNAGIac+4ZhUOo8mpvr9/tYF573BADj8Xip26XUGY1GGMPYapqmM8DF5PLzlwnGRdHm2tpLAPA8z3XdF8vLnrfC2Crn/qv1dc5902xHUYTO7gKyLDPNtuetxHGMANu2d3ffzQCn58XF5PLP9TUCgiDAXplmu2PZlDoIW2i1TLPdbDY596fT6T0HR+OjjmW5rlsDOPfzPP8HOD0vEDAcbuMwomizY1m2bXPudyyLMdbr9TzPo9RZaLWklHd7VbeIMfZ+bw/9vd3ZQZfk+OTs+OQMAWEYLnW7AMAYw5KfLy5S6hiG8aTRwAV7OAYASNO08bRpGM+Gw20EbGy8LstyBvh1Vf0of2KoUkpKqbWWUgoh8jw/PPwkbvVwhWoppYQQUkqlFP4URYEO/gIXtxqwZCknjQAAAABJRU5ErkJggg==" nextheight="227" nextwidth="957" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://csvbase.com/tudorizer/raw-medical-data">source</a></figcaption></figure><p>Now see it transformed - structured, labeled, ready for action:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/46040a9a4abcdf51464a7f2f435f36fb.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAGCAIAAAAt7QuIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABuklEQVR4nD2RsW/TQBTG7w9IWaiUgSqdMsW6LrEuA93NQsdG2ShlieWN6rF6dVmKPFJdy0CaTFV0nWydWCK/lI6PBaFjQcSHECzeD+GT8pu+4Xv63vsei6JoGseDIBiGIQAcj8dR9GwYhoMgOD199WRvj3MuhIiiqNvtcs4HQfDi5KTX2y/Ksmkaznme5604OB6Pz8/fCjGaTCbDMHy8u5skCdvU9uLdhZRXL1umcVyUJQAYY95fXiqliAgRb5dLrT89fH4gosVi0evtS3llrd3ZefT08DDP806nAwBKKSnlvAURjTFsU/+SUq6qCgBen50lSZKmaZZlzjmlFCK6FqWUMcZrrbWU0jlHRIwxIUZKqX6/b1q8YWtmv//8RUSiL7fLZbumRkSttZ83xjQtRGSt9doYs17fW2uJCACKsrTW1vWmaRrbYozx5v8BX799/3B9rbX2FwC8IaKPs5lzrijLVVU555qmUerOhznn0jRljD0/OvIBQoj5fM4Yy7JsVVVEpNTden3vB9mPn/XNzUxrnaYpAGRZRkS+Aa01EflLEdFau61LiBEAICLnB9M4RkT/au8pynJb0T+r0npIq2r5LQAAAABJRU5ErkJggg==" nextheight="326" nextwidth="1616" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://csvbase.com/tudorizer/cleaned-medical-data">source</a></figcaption></figure><p>Privacy matters here. Compliance isn't optional. GDPR, CCPA, HIPAA - they're not just acronyms. They're promises to protect. If your data warehouse handles these well, you're ahead of the game.</p><div class="relative header-and-anchor"><h2 id="h-2-the-foundation-models"><strong>2. The Foundation: Models</strong></h2></div><p>Let's assume you're familiar with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=5sLYAQS9sWQ">what an AI/ML model</a> is. Your first big decision? The classic "<strong>buy vs. build</strong>" question.</p><p>Think about this. Some models are trained on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/OpenAI/comments/11sbw40/estimate_of_amount_of_compute_used_to_train_gpt4/">25,000 GPUs</a>. They learn from billions of data points. They cost millions to create. You could use one of those. Or you could build your own from scratch. Each path leads somewhere different.</p><p>Let's make it crystal clear:</p><p>- Buying means using someone else's model</p><p>- Building means training your own</p><p>Concrete example. Say you're working with human language. You need to understand words, sentences, grammar. The smart move? Grab an open-source model like Llama 3 or Mistral. They've done the heavy lifting.</p><p>But maybe your company is different. Maybe you've got unique data about Earth's climate that no one else has. Petabytes of satellite imagery. Years of temperature readings. That's when you might want to train your own model, just like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.aiwire.net/2024/09/25/ibm-and-nasa-launch-open-source-ai-model-for-advanced-climate-and-weather-research/">IBM and NASA</a> did.</p><div data-type="callout" type="tip"><link rel="preload" as="image" href="https://paragraph.xyz/editor/callout/tip-icon.png"><div class="callout-base callout-tip" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/tip-icon.png" class="callout-button"><div class="callout-content"><div><p>Consider the climate impact. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.technologyreview.com/2019/06/06/239031/training-a-single-ai-model-can-emit-as-much-carbon-as-five-cars-in-their-lifetimes/">The equivalent of five cars' lifetime emissions</a> is no small footprint.</p></div></div></div></div><p>Here's a framework to help you weigh these trade-offs:</p><table style="min-width: 475px"><colgroup><col style="width: 450px"><col></colgroup><tbody><tr><th colspan="1" rowspan="1" colwidth="450"><p><strong>Benefits</strong></p></th><th colspan="1" rowspan="1"><p><strong>Costs</strong></p></th></tr><tr><td colspan="1" rowspan="1" colwidth="450"><p><strong>Off the shelf models:</strong></p><p>- Faster time to market</p><p>- No infrastructure headaches</p><p>- Battle-tested reliability</p><p>- Rich documentation and examples</p><p>- Risk reduction - experts did the heavy lifting</p><p></p><p><strong>In-house models:</strong></p><p>- Your data stays yours</p><p>- Perfect fit for your domain</p><p>- Complete quality control; identify and correct biases early</p><p>- Edge cases? Handled</p><p>- Long-term cost efficiency - no API fees, no vendor lock-in</p></td><td colspan="1" rowspan="1"><p><strong>Off the shelf models:</strong></p><p>- API fees add up. Fast</p><p>- Vendor lock-in is real; you're dependent on the provider for support, updates and troubleshooting;</p><p>- Quality monitoring never stops</p><p>- Hidden biases lurk in pre-trained data</p><p><br><strong>In-house models:</strong></p><p>- Infrastructure isn't cheap (GPUs, TPUs, etc.)</p><p>- Talent costs more: ML engineers, data scientists, compliance teams</p><p>- Development never ends</p><p>- Operations overhead grows with scale</p></td></tr></tbody></table><div data-type="callout" type="tip"><link rel="preload" as="image" href="https://paragraph.xyz/editor/callout/tip-icon.png"><div class="callout-base callout-tip" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/tip-icon.png" class="callout-button"><div class="callout-content"><div><p>The buy vs. build decision isn't final.<br></p><p>Your choice can evolve. Many start with pre-trained models, then build in-house capabilities as they grow. It's a journey, not a destination. Hybrid approaches are common.</p></div></div></div></div><p>Let's see this framework in action with a few examples:</p><p>1. <strong>Customer Service Automation</strong></p><p>- <u>Buy</u><em>:</em> OpenAI's API handles queries. Your prompts shape the voice</p><p>- <em><u>Build</u>:</em> Your data trains your model. Your rules. Your way</p><p>- <em><u>Key factor</u>:</em> How much proprietary support data do you have?</p><p>2. <strong>Document Processing</strong></p><p>- <em><u>Buy</u>:</em> Pre-trained OCR and NLP do the heavy lifting</p><p>- <em><u>Build</u>:</em> Custom models speak your document's language. They are fit for your types of documents.</p><p>- <em><u>Key factor</u>:</em> How unique are your documents?</p><p>3. <strong>Product Recommendations</strong></p><p>- <em><u>Buy</u>:</em> Generic algorithms point the way</p><p>- <em><u>Build</u>:</em> Your user data creates magic. Your models are tailored to your users' preferences.</p><p>- <em><u>Key factor</u>:</em> Is your user behavior data unique enough to matter?</p><div class="relative header-and-anchor"><h2 id="h-3-fine-tuning-for-success"><strong>3. Fine-tuning for Success</strong></h2></div><p>Whether you <strong>"buy or build"</strong>, fine-tuning matters. It refines models to fit your needs as they evolve. This process is efficient, with a smaller dataset. It saves time and resources. But be cautious. Limited data can lead to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.reddit.com/r/MachineLearning/comments/pyk40l/d_machine_learning_overfitting_is_your_friend_not/">overfitting</a> - a dead end for models.</p><p>Fine-tuning means continuous improvement.</p><p>Think of training as teaching a child from birth. It's slow. Demanding. Resource-hungry. The model learns to spot patterns in data, testing its knowledge against validation sets. Fine-tuning? That's more like teaching new tricks to an expert. You're building on existing knowledge. Adapting. Refining.</p><p>Watch out. The pitfalls are subtle:</p><p>- It's still slow</p><p>- It still needs serious compute power</p><p>- Too little data? You'll underfit</p><p>- Too much focus? You'll overfit</p><p>- Balance is everything</p><p>There's a hidden danger: catastrophic forgetting. Your model might excel at new tasks but forget its original skills. Symptoms? <strong>Loss of performance</strong> on tasks the model was initially good at. Like a musician who masters jazz but can no longer play classical.</p><p>One more thing: guard against data-leakage. Keep your training and validation sets separate. Clean. Distinct. Your model's future depends on it.</p><div class="relative header-and-anchor"><h2 id="h-4-model-hosting-infrastructure"><strong>4. Model Hosting Infrastructure</strong></h2></div><p>A trained model is simple, really. Just weights and biases. Numbers in a file. That's all.</p><p>The format? It varies. You might see <code>.safetensors</code>. Or <code>.bin</code>. Maybe <code>.h5</code> or <code>.pt</code>. Each serves its purpose.</p><p>Working with teams? You'll need somewhere to host these files. Somewhere that handles versions. Hugging Face shines here. Git works too, though it needs some setup. Those <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://git-lfs.com/">large files</a> can be tricky.</p><p>Data engineers know this dance. DevOps teams too. Hosting isn't new - we've been doing it for years. But AI brings its own twists:</p><p>1. Model serving infrastructure</p><p>2. Version control with A/B testing</p><p>3. GPUs, GPUs, GPUs</p><p>Think security. Think access control. These models can hold secrets - treat them like your company's crown jewels. Like that critical internal database you guard so well.</p><div class="relative header-and-anchor"><h2 id="h-5-showcasing-your-models"><strong>5. Showcasing Your Models</strong></h2></div><p>This step has the smallest footprint. Yet it can feel the most rewarding.</p><p>Working on open-source or research models? You'll want to give others a chance to play. Who doesn't like testing a good AI?</p><p>Streamlit and Gradio make this simple. They handle the hard parts - all those client-server interactions you'd rather not think about. They're true full-stack solutions. All your UI elements live in a few files. Sometimes just one.</p><p>Platforms like Hugging Face shine here. They've sparked a new trend of "AI apps". Host your model on their platform. Build your UI on top. Watch the magic happen.</p><div class="relative header-and-anchor"><h2 id="h-6-production-deployment"><strong>6. Production Deployment</strong></h2></div><p>So your model is ready for prime time. Your users are eager to try it out. Exciting times!</p><p>How will it integrate with your product? Through inference endpoints, usually. REST APIs or real-time websockets. They take inputs. Process them. Return results.</p><p>For LLMs, it's different. SDKs handle the heavy lifting. They abstract away the complexity. Make it simple.</p><p>REST APIs? They're everywhere in AI. Most providers follow similar patterns. Especially for chat interfaces. Makes switching providers easier.</p><p>Models need maintenance, like any system. Updates. Retraining. Replacement. That's where <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ibm.com/topics/mlops">MLOps</a> shines. CI/CD pipelines automate the process. Keep deployments consistent. Make updates smooth.</p><p>Watch your resources in production. Inference isn't cheap. It's not like simple CRUD operations. Your hardware needs will vary. GPUs are a common requirement. Small models might run on CPUs. Image generation? That needs GPU power. Lots of it.</p><div class="relative header-and-anchor"><h2 id="h-7-monitoring-and-maintenance"><strong>7. Monitoring and Maintenance</strong></h2></div><p>Once your model is in production, you'll want to keep an eye on it. Like any system, it will have its quirks. Its edge cases. Its moments of brilliance and confusion.</p><p>While monitoring might feel familiar to DevOps teams, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ml-ops.org/content/mlops-principles">ML ops</a> brings its own challenges. Its own metrics to watch. Its own patterns to understand.</p><p>Here's what you'll need to track:</p><p>1. <strong>Accuracy</strong> - is it still getting things right?</p><p>2. <strong>Latency</strong> - how fast does it respond?</p><p>3. <strong>Throughput</strong> - how many requests can it handle?</p><p>4. <strong>Cost</strong> - are resources being used efficiently?</p><p>5. <strong>Model drift</strong> - is it losing touch with reality?</p><p>6. <strong>Error rates</strong> - where does it stumble?</p><p>7. <strong>Confidence scores</strong> - does it know when it's unsure?</p><p>When your model sits in a critical path, monitoring can't wait. Real-time alerts matter. Budgets need watching. Thresholds need setting.</p><p>For example: Watch how your model performs on real-world data over time. Set alerts for sudden accuracy drops. Don't ignore those gradual declines. They'll sneak up on you.</p><div class="relative header-and-anchor"><h2 id="h-closing"><strong>Closing</strong></h2></div><p>Remember, you don't have to tackle everything at once. Each step in the ML lifecycle can be handled by different teams. Different expertise levels. It's modular.</p><p>I've started maintaining a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dub.sh/ml-dev-cycle">curated list</a> of helpful tools and resources. It's open-source. Growing. Living. Feel free to check it out and contribute if you'd like!</p><p>Did you find this guide helpful? <strong><em><u>Share it with others</u></em></strong> who might benefit. The future of AI and ML is whatever we make of it.</p><p>Let's make it amazing.</p><p></p><p>P.S. Thanks to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/itsbrenoca/">Breno</a> for reviewing this post and for invaluable feedback.</p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>ai</category>
            <category>ml</category>
            <category>mlops</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/490df62702f2501552e73ed74ce6eed8.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Fascination with Seeds Instead of Fruits]]></title>
            <link>https://paragraph.com/@tudorizer/fascination-with-seeds-instead-of-fruits</link>
            <guid>L2YgWqlNHh28BvQAaAmt</guid>
            <pubDate>Mon, 11 Nov 2024 11:08:03 GMT</pubDate>
            <description><![CDATA[Seeds grow eventually into fruits. Fruits bear seeds, but could also be enjoyed on their own. Which is the common metaphor. Fruits are results. Seeds need effort, right conditions and, most importantly, time. What are you focusing your scarce attention on? Fruits or seeds. Don't judge each day by the harvest you reap, but by the seed you plant. Robert Louis Stevenson Evaluating Potential.Garry Tan from YC, as well as others in similar positions, often speaks abou...]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h2 id="h-fascination-with-seeds-vs-fruits"><strong>Fascination with Seeds vs. Fruits</strong></h2></div><p>Seeds grow eventually into fruits.</p><p>Fruits bear seeds, but could also be enjoyed on their own. Which is the common metaphor. Fruits are results. Seeds need effort, right conditions and, most importantly, time.</p><p>What are you focusing your scarce attention on? Fruits or seeds.</p><blockquote><p><strong>Don't judge each day by the harvest you reap, but by the seed you plant.</strong><br><em>Robert Louis Stevenson</em></p></blockquote><div class="relative header-and-anchor"><h2 id="h-evaluating-potential"><strong>Evaluating Potential</strong></h2></div><p>Garry Tan from YC, as well as others in similar positions, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://openvc.app/blog/seed-stage-is-about-picking-winners">often</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=JLznSSp2NBU">speaks about picking winners</a>. Winners, and humans in general, are a bit more complex than seeds and fruits, but the metaphor holds true at any stage of growth. All winners have a bag of failures.</p><p>As fruits are an end result, winners could hit a dead-end.</p><p>Would it not be optimal to find winners just before they hit it big?</p><p>Seeds, "future-fruits", are on a growth trajectory.</p><p>Future winners, sometimes find themselves on a similar trajectory. A winning trajectory is like a seed's optimal growth conditions:</p><ul><li><p>Upward progress (like a seedling breaking through soil)</p></li><li><p>Accelerating rate of improvement (similar to exponential plant growth phases)</p></li><li><p>Accumulating advantages (nutrients in the soil building up)</p></li><li><p>Positive feedback loops (stronger roots enabling better nutrient absorption)</p></li><li><p>Resilience to setbacks (well-rooted plants surviving storms)</p></li></ul><p><br>Just as a healthy seedling shows early signs of growth, individuals on winning trajectories showcase:</p><ul><li><p>Rapid skill acquisition</p></li><li><p>Expanding network effects</p></li><li><p>Increasing opportunities</p></li><li><p>Growing resource access</p></li><li><p>Compounding knowledge base</p></li></ul><div class="relative header-and-anchor"><h2 id="h-fallacies-and-markets"><strong>Fallacies and markets</strong></h2></div><p>Choosing the right seed could be perceived as gambling. The Gambler's Fallacy is the mistaken belief that if something happens more frequently than normal during a given period, it will happen less frequently in the future to "balance things out" (or vice versa).</p><p>In a fair contest where each game is independent, previous wins or losses have no influence on future outcomes.</p><p>Even after 100 wins in a row, the probability of the next game remains unchanged (assuming all other factors are constant).</p><p>However, the Gambler's Fallacy doesn't apply when lessons from one game roll into the next iteration and even less when trajectories are considered.</p><p>Just as some seeds carry better genetics from stronger parent plants, serial entrepreneurs carry forward their accumulated advantages. The "seed" metaphor refers more to potential and trajectory rather than purely to newcomers or first-time ventures.</p><p>Planting seeds and expecting future fruits is a complex probability problem. It can be expressed as <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://benhay.es/posts/exploring-distributions/">multinomial distributions</a> due to the many possible outcomes.</p><p>We can simplify this by reducing it to a basic binary question: "Will this seed result in a fruit?" This creates a simpler binomial distribution.</p><p>However, this simplification has limitations. It falls short when we're expecting rare outcomes or unique fruits - which is often the case in entrepreneurship and innovation.</p><p>While individual bets might be risky, markets have historically proven to be effective at pricing risk and predicting fruitful outcomes. This is where prediction markets enter the picture – they harness the collective wisdom of many participants to estimate probabilities of future events.</p><p><strong>Should we start prediction markets for seeds?</strong></p><p><strong>Should we start prediction markets for picking the next unicorn?</strong></p><p>Clever tech has been developed to simplify the process of spinning up this type of markets, yet reaching a critical mass of participants remains difficult. Critical mass is a combo of both number and variety of participants. Without such critical mass, the odds are not representative of said expectations. Some fundamental assumptions around incentive alignments needs to be made. Early traction could replace prediction markets, as a sort of clunky proxy.</p><div class="relative header-and-anchor"><h2 id="h-upward-trajectories-through-compounding"><strong>Upward trajectories through compounding</strong></h2></div><p>If growth is a trajectory, patterns like the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://conferences.inf.ed.ac.uk/cogsci2001/pdf-files/0152.pdf">Hot Hand Phenomenon</a> are more likely to be amplified. The flip side is that the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://theconversation.com/regression-to-the-mean-or-why-perfection-rarely-lasts-74694">regression to the mean</a> doesn't hit as hard when on a trajectory.</p><p>Future events appear to be subject to randomness. Less so in hindsight.</p><p>Unlike pure chance games, entrepreneurs can leverage:</p><ul><li><p>Accumulated experience and learning from previous ventures</p></li><li><p>Established networks (investors, talent, customers)</p></li><li><p>Pattern recognition; better ability to identify promising opportunities</p></li><li><p>Better risk assessment capabilities</p></li><li><p>Access to capital based on track record</p></li><li><p>Reputation advantages</p></li></ul><p>These factors compound, increasing the odds of future success.</p><p>A (potentially-over)simplified model could look like this:</p><pre data-type="codeBlock" text="# python
def success_probability(previous_successes):
    # baseline success rate
    base_rate = 0.01
    # multiplier for each success
    experience_factor = 1.5
    # compound network effect
    network_factor = math.pow(1.2, previous_successes)
    # cap at 90% (relatively arbitrary. What is ever 100%?)
    return min(base_rate * experience_factor * network_factor, 0.9) "><code><span class="hljs-comment"># python</span>
def success_probability(previous_successes):
    <span class="hljs-comment"># baseline success rate</span>
    <span class="hljs-attr">base_rate</span> = <span class="hljs-number">0.01</span>
    <span class="hljs-comment"># multiplier for each success</span>
    <span class="hljs-attr">experience_factor</span> = <span class="hljs-number">1.5</span>
    <span class="hljs-comment"># compound network effect</span>
    <span class="hljs-attr">network_factor</span> = math.pow(<span class="hljs-number">1.2</span>, previous_successes)
    <span class="hljs-comment"># cap at 90% (relatively arbitrary. What is ever 100%?)</span>
    return min(base_rate * experience_factor * network_factor, 0.9) </code></pre><div class="relative header-and-anchor"><h2 id="h-non-agricultural-studies"><strong>(Non-agricultural) Studies</strong></h2></div><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.hbs.edu/faculty/Pages/item.aspx?num=37618">HBS</a> suggests founders who succeeded in a previous venture have a 30% chance of succeeding in their next venture.</p><p>Failed founders perform better than first-time entrepreneurs.</p><p>Experienced gardeners are better at spotting which seedlings show the most promise.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.scirp.org/reference/referencespapers?referenceid=1271645">Network studies</a> show that entrepreneurs' networks grow exponentially with each venture, supporting the <code>network_factor</code> in the probability model.</p><div class="relative header-and-anchor"><h2 id="h-closing-thoughts"><strong>Closing thoughts</strong></h2></div><p>Growth is a process. Low to high, small to large, slow to fast.</p><p>Picking winners is a matter of spotting winning trajectories. Recognize the seedlings that show promise before they bear fruit. This insight applies beyond entrepreneurship to talent development, personal growth, and opportunity evaluation.</p><p>Remember:</p><ul><li><p>Today's fruits were yesterday's seeds</p></li><li><p>The best time to plant was yesterday; the second best is today</p></li><li><p>Not every seed will sprout, but every success story started as a seed</p></li><li><p>Focus on trajectories, not just current results</p></li><li><p>Compound growth rewards early believers</p></li></ul><p>Be early. Plant wisely. Nurture growth. Fruits will follow.</p><div class="relative header-and-anchor"><h2 id="h-closing-questions"><strong>Closing questions</strong></h2></div><p>What trends today are seeds and what are their fruits?</p><p>What are the odds of a seed becoming a fruit?</p><p>Who is planting seeds today?</p><p></p><p>Reach out on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/tudorizer">Farcaster</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/in/tudorm/">LinkedIn</a> or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/tudorizer">Twitter</a>. Would love to hear your thoughts and challenges!</p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>opportunity</category>
            <category>bias</category>
            <category>web3</category>
            <category>selection</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/399abe392f46b194a132481b83335363.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Lined notebooks (ruled paper) vs. blank pages ]]></title>
            <link>https://paragraph.com/@tudorizer/lined-notebooks-ruled-paper-vs-blank-pages</link>
            <guid>MF08QV8sVnta9QkD0YYa</guid>
            <pubDate>Fri, 11 Oct 2024 17:11:50 GMT</pubDate>
            <description><![CDATA[My handwriting is not as legible as I'd like it to be. Some people have suggested I write more, others have suggested to simply slow down. Both are right, so I started a Morning Pages ritual every day. 3 pages, no judgement, just stream of consciousness, no expectations beyond the process itself. My medium of choice is a li...]]></description>
            <content:encoded><![CDATA[<blockquote><p>Wishing a fantastic week to all 10 of you! <span data-name="glowing_star" class="emoji" data-type="emoji">🌟</span></p><p>If you're enjoying my writing, please share this post with your second-best friend and join the /tudor channel on Farcaster <span data-name="handshake" class="emoji" data-type="emoji">🤝</span></p></blockquote><p>My handwriting is not as legible as I'd like it to be. Some people have suggested I write more, others have suggested to simply slow down. Both are right, so I started a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://juliacameronlive.com/basic-tools/morning-pages/">Morning Pages</a> ritual every day. 3 pages, no judgement, just stream of consciousness, no expectations beyond the process itself.</p><p>My medium of choice is a <strong>lined notebook</strong>, because it strikes the right balance of freedom and guidance.</p><p>A completely blank page is intimidating. Gathering one's thoughts is difficult enough, so dealing with slanted lines and inconsistent spacing is the last thing the mind needs. Particularly in moments when aesthetics are at a premium.</p><p>Although <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Paper-ruling_machine">John Tetlow</a> invented the machine to automate drawing lines, generations before him have come up with the idea – the right type of lines on notebook paper.</p><p>The early inventors must have experimented with various alternatives to parallel, horizontal lines, before settling on a few conventions.</p><p>As with all conventions, we have a few choices and contexts to choose from, as alternatives to horizontal lines. From quadrille ruled paper to music sheets, these guides are an ubiquitous tool, for both students and professionals.</p><p>Could we use plain blank paper? Sure, especially if pushing artistic boundaries.</p><p>Guidelines and norms are important for our activities, particularly in collaborative environments.</p><p>Very recently Farcaster redefined how channels work, essentially drawing new guidelines. Time will tell if these changes are for the better. One certainty is that the existing communities are writing on a new set of lines, metaphorically speaking.</p><div class="relative header-and-anchor"><h3 id="h-1-are-the-lines-clear-to-you">1. Are the lines clear to you?</h3></div><div class="relative header-and-anchor"><h3 id="h-2-if-you-were-to-draw-a-new-set-of-lines-within-a-cozy-corner-of-your-internet-what-would-they-look-like">2. If you were to draw a new set of lines within a cozy corner of your internet, what would they look like?</h3></div><div class="relative header-and-anchor"><h3 id="h-3-within-your-team-are-you-drawing-the-right-lines">3. Within your team, are you drawing the right lines?</h3></div><div data-type="callout" type="info"><link rel="preload" as="image" href="https://paragraph.xyz/editor/callout/information-icon.png"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>Part of this doc was inspired by the /okbanger episode about <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=1qIle2H6WlE">control</a>.</p></div></div></div></div><p>Photo by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://unsplash.com/@dayday95?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Damon Lam</a> on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://unsplash.com/photos/grayscale-photography-of-kanji-text-oKpGy7_WsjE?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>writing</category>
            <category>norms</category>
            <category>guidelines</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/444e4c095cf7bed3572b1d63d9d97800.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Personal Farcaster Healthcheck]]></title>
            <link>https://paragraph.com/@tudorizer/personal-farcaster-healthcheck</link>
            <guid>kz9xqXUn2nWdSI5caKfc</guid>
            <pubDate>Fri, 04 Oct 2024 15:10:46 GMT</pubDate>
            <description><![CDATA[Farcaster stands apart. It's (sufficiently) decentralized. Raw data flows freely. Most creators track the perfromance of their content. But what if we flipped the script? What if we tracked our own engagement? It's a simple idea. Maybe even foolish. But it's possible here, where data runs wild and tools like Dune await. I introduce to you the personal Farcaster healthcheck. Ready to use.Why This Matters (in Theory)Consistency. Engagement. Quality. These are the pillars. Be a beacon in your co...]]></description>
            <content:encoded><![CDATA[<p>Farcaster stands apart. It's (sufficiently) decentralized. Raw data flows freely.</p><p>Most creators track the perfromance of their content. But what if we flipped the script? What if we tracked <u>our own</u> engagement?</p><p>It's a simple idea. Maybe even foolish. But it's possible here, where data runs wild and tools like Dune await.</p><p>I introduce to you <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dune.com/tudorizer/personal-farcaster-healthcheck">the personal Farcaster healthcheck</a>. Ready to use.</p><div class="relative header-and-anchor"><h2 id="h-why-this-matters-in-theory"><strong>Why This Matters (in Theory)</strong></h2></div><p>Consistency. Engagement. Quality. These are the pillars.</p><p>Be a beacon in your cosy corner of the web. Contribute. Show up.</p><p>This dashboard lays bare your Farcaster life. It shows your patterns. Your strengths. Your weaknesses. Use this knowledge. Grow from it.</p><p>See your casts, reactions, replies, and recasts. Understand your impact. Forge stronger bonds.</p><div class="relative header-and-anchor"><h2 id="h-how-to-dive-in"><strong>How to Dive In</strong></h2></div><p>1. Visit the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dune.com/tudorizer/personal-farcaster-healthcheck">dashboard</a>.</p><p>2. Get a Dune account. Free is just fine. If you already have one, you know the drill.</p><p>3. Type your username in the <code>user_input_fname</code> box.</p><p>4. Hit "Run" in the top right.</p><p>5. Read. Learn. Act.</p><div class="relative header-and-anchor"><h2 id="h-closing-references"><strong>Closing References</strong></h2></div><p>If you find value here and feel the urge to give back, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zora.co/collect/base:0x75568f0e4bbed6610cb6a7ee8729bb55a188bdda/3">mint this memento</a>.</p><p>For those who dig deeper, the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu/dune-personal-farcaster-healthcheck">source code</a> awaits on GitHub. It's there for posterity. And for you.</p><div class="relative header-and-anchor"><h3 id="h-what-would-make-you-cast-more-interesting-content">What would make you cast more interesting content?</h3></div><p></p><p></p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>farcaster</category>
            <category>data</category>
            <category>dune</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/a66c268f6b2691c9c407e2134b18d43b.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[/magicframes All-pay Auction]]></title>
            <link>https://paragraph.com/@tudorizer/magicframes-all-pay-auction</link>
            <guid>fE8LxO0PDRhBQqrcxxbA</guid>
            <pubDate>Thu, 16 May 2024 14:39:12 GMT</pubDate>
            <description><![CDATA[2 weeks ago we announced a new Frame template for /magicframes: Auctions. Not any auction, because wanted to push some limits and test some theories, ...]]></description>
            <content:encoded><![CDATA[<p>2 weeks ago we announced a new Frame template for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/magicframes">/magicframes</a>: Auctions.</p><p style="text-align: start">Not any auction, because wanted to push some limits and test some theories, but rather an <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Bidding_fee_auction"><strong>Bidding Fee Auction</strong></a>, a distinct category of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/All-pay_auction">All-pay Auctions</a>. To contextualise, we named these "<strong><em>DEGEN Auctions</em></strong>".</p><p style="text-align: start">They have been around for a while, although less popular than other established siblings, Dutch or English.&nbsp;</p><p style="text-align: start">On an axis between English Auction and Raffle, the <strong>DEGEN Auctions</strong> sit close to the middle:</p><ul><li><p>like traditional auction, the winner is not random and it requires a drop of skill, mostly around timing and understanding the mechanic</p></li><li><p>like a raffle, the winner has a high reward while all others loose money</p></li></ul><p><strong>DEGEN Auctions</strong> aim to test player behavior, including their response to competition and value assessment in high-stake, low-win scenarios.</p><p>One of the motivations for engaged players to continue is the sunk-cost fallacy.</p><p></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ea8f1031a70217beef981c3e40435246.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAGCAIAAAAt7QuIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaUlEQVR4nGWRsWvCQBTG7x9owekGJ+d0cc+/YDvExUHI4lBaxypkkFB0MYVKszg1Q3FLQEIpvKEQumSQHDhEKQ0FOQohaOEQ5OKS0gRD0B8f3PC++957d4hznqRQSlmB3W73tVi8jEaWYZzqZ7UqmhljURTlUUVQdnDOnQNuyszzbMt66PWGiqL3B3p/MFSUXG+2PfO8zOm6LiHENE1KaRZVBGVlP+VohH0cf87n6zCkQfC9XO6221xFG+c8iiLG2On4/xtUq1WMsSiKlUplPB4DQLFBV5a7snx9eXXXbH4A7OP4KDpJEkJIqVQSRREAHMcBANd1AcA0TQBAkiSVy2WUgjEWBEHTtCw9SRJdVS/OzttSvS3VLcNYh+HvZrOP46NOjUYDY4wQEgShVqthjFut1lMK4pznX8QYyx4uv/k+nQ47HcswnjVNV9VHRdFV9XUyub+5pUGQ23zfdxyHEAIAvu/bth0cqn/OCbcrORVzUQAAAABJRU5ErkJggg==" nextheight="296" nextwidth="1656" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: start"></p><p style="text-align: start">Some theories to verify were:</p><ol><li><p>People like to compete against friends and strangers for a prize <span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span></p></li><li><p>Frames are a good, casual playground for such experiments <span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span></p></li><li><p>All players are comfortable with Frame Transactions <span data-name="construction" class="emoji" data-type="emoji">🚧</span></p></li><li><p>Players are less apprehensive about playing with memecoins <span data-name="construction" class="emoji" data-type="emoji">🚧</span></p></li><li><p>It's a good alternative to mints or token sales <span data-name="construction" class="emoji" data-type="emoji">🚧</span></p></li></ol><div class="relative header-and-anchor"><h2 style="text-align: start" id="h-what-we-auctioned">What We Auctioned</h2></div><p style="text-align: start">The item offered is important. It should have a clear, market-established value that people know and can quickly asses if the risk of losing your entire bid is worth it. Eg. a bid of 10$ for a PS5 worth 500$ is in the realm of buying a lottery ticket.</p><p style="text-align: start">No opportunity for price discovery here, because it would break the psychology behind the game mechanics.</p><p style="text-align: start"><a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://www.sothebys.com/en/articles/dmitri-cherniak-ringers-879-goose-lays-6-2m-golden-egg-at-generative-art-auction">The vision here isn't along the lines of Sotheby's selling a priceless piece of art with a very high,</a>&nbsp;yet unknown ceiling to some avid collectors or status-seeking-money-bags.</p><p style="text-align: start">We decided to auction off a fun, nounish, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/yellow">/yellow</a> token with a nod to Farcaster and Base:</p><div data-type="embedly" src="https://warpcast.com/toadyhawk.eth/0x77f14d39" data="{&quot;large&quot;:true,&quot;title&quot;:&quot;Toady Hawk 🟡🎩 ᖽ  on Warpcast&quot;,&quot;description&quot;:&quot;Today’s Collective Noun is just… chef’s kiss 🤌\n\n- Farcaster arch head ✅ \n- @base blue stripes ✅ \n- Yellow noggles and background ✅ \n\nAnd it popped up on the 1st day post-Farcon to boot! 🤯\n\nFollow along with the auction &amp; bid in-frame👇 https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/95f4a9f2-766a-46b7-83ac-d882c9ff9200/original https://frames.paperclip.xyz/nounish-auction/yellow-collective&quot;,&quot;url&quot;:&quot;https://warpcast.com/toadyhawk.eth/0x77f14d39&quot;,&quot;thumbnail_url&quot;:&quot;https://storage.googleapis.com/papyrus_images/0df4f3010b2f2b4d58cf3bfab5f41236.png&quot;,&quot;provider_url&quot;:&quot;Farcaster&quot;}" format="large"><div class="react-component embed my-5" data-drag-handle="true" data-node-view-wrapper="" style="white-space:normal"><a class="twitter-card-link" href="https://warpcast.com/toadyhawk.eth/0x77f14d39" target="_blank" rel="noreferrer"><div class="twitter-summary-large-image"><img src="https://storage.googleapis.com/papyrus_images/0df4f3010b2f2b4d58cf3bfab5f41236.png" class="large-summary-image"><div class="twitter-summary-card-text"><span>Farcaster</span><h2>Toady Hawk 🟡🎩 ᖽ  on Warpcast</h2><p>Today’s Collective Noun is just… chef’s kiss 🤌

- Farcaster arch head ✅ 
- @base blue stripes ✅ 
- Yellow noggles and background ✅ 

And it popped up on the 1st day post-Farcon to boot! 🤯

Follow along with the auction &amp; bid in-frame👇 https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/95f4a9f2-766a-46b7-83ac-d882c9ff9200/original https://frames.paperclip.xyz/nounish-auction/yellow-collective</p></div></div></a></div></div><div class="relative header-and-anchor"><h2 id="h-what-went-well">What Went Well</h2></div><p style="text-align: start">Before going further, the auction itself:</p><div data-type="embedly" src="https://warpcast.com/tudorizer/0x79268237" data="{&quot;large&quot;:true,&quot;title&quot;:&quot;Tudor 🟣🟡 Engineer to fCTO on Warpcast&quot;,&quot;description&quot;:&quot;I'm auctioning my favourite /yellow (worth 0.5 ETH) in a \&quot;Degen Auction\&quot; format, starting at 1 DEGEN.\n\nSad to see this little fella go, but I'm sure it will land in good hands.\n\nBid now! https://magicframes.xyz/spell/auction/34&quot;,&quot;url&quot;:&quot;https://warpcast.com/tudorizer/0x79268237&quot;,&quot;thumbnail_url&quot;:&quot;https://storage.googleapis.com/papyrus_images/a3b21724740df72bf66a9fc991691dd2.png&quot;,&quot;provider_url&quot;:&quot;Farcaster&quot;}" format="large"><div class="react-component embed my-5" data-drag-handle="true" data-node-view-wrapper="" style="white-space:normal"><a class="twitter-card-link" href="https://warpcast.com/tudorizer/0x79268237" target="_blank" rel="noreferrer"><div class="twitter-summary-large-image"><img src="https://storage.googleapis.com/papyrus_images/a3b21724740df72bf66a9fc991691dd2.png" class="large-summary-image"><div class="twitter-summary-card-text"><span>Farcaster</span><h2>Tudor 🟣🟡 Engineer to fCTO on Warpcast</h2><p>I'm auctioning my favourite /yellow (worth 0.5 ETH) in a "Degen Auction" format, starting at 1 DEGEN.

Sad to see this little fella go, but I'm sure it will land in good hands.

Bid now! https://magicframes.xyz/spell/auction/34</p></div></div></a></div></div><p style="text-align: start">Some players became very competitive.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7d9d5d9236c79ad9b2f48a83c09cc137.gif" blurdataurl="data:image/png;base64,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" nextheight="224" nextwidth="320" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: start">The auction lasted far longer than we expected, given our relatively small potential outreach and audience, so the excitement from a Friday evening continued well into Saturday.</p><p style="text-align: start">As a developer I started getting paranoid about various things that could break or get hacked over night, which is why I did my best to reply to everyone. The burden of MVPs!</p><p style="text-align: start">30 players placed 199 bids over a span of almost 19 hours. The cast got 1.3k of views.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3d5b74f538793b9475148d86f22a59de.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAIAAAAzPjmrAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0klEQVR4nKVVy0rDQBQddeFnCHbhUr9E8AOyGMjGhYJDzVDEB1ilNESxum8VF0FExEVoSRehIL5gmJC2hK58cWn1C3QzUkfHPrRN7SGLO5fLOSd37mXQ+NgoasdBJlMLw/99ry+N15fGzdWVPF5fXjbpFhYXCSGpbwCA+Bc49ylNmKbFuS8zYbWCamEohgMASGqMdc59xS6EqIVhU2BQy/V6Q1k2TQtjndIE577KtwmUg2AzmSwHAUSD+HZtGNQwaC532Jpsrfn5g4Hsc+7v7mYw1vP5Qt/iAQQ492/v7pTr7m70EmCM9aamNGEYdH11rVqpRuHtFOgeTXnM5wsY6xjrj0/PS/PzckumZ6ZjsVhvT0IITdMQQhtrG3+2yDQtShMAILtRdF2EUDptZj/Rd/AAgDH2+x3U6w2M9VzuUAyNL4HziwvGmBoyNSERB7cbnQL3Dw8qZRj06Oh4eO8SbS0CgNnZub6dgchr//b+/iPAuR9xd8QgaAoUXTe5tS1vNR5fVjYJIcqspmkqjseXHceRcSqVymazMnYchxCiqBlj9tmpWyigHcsaGxkteV7J89RLUA6C1lehIy55noxPbPvEtmVcdN3WstWVlYmpyb39vQ+GSYqiDNpGHwAAAABJRU5ErkJggg==" nextheight="751" nextwidth="1415" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Query source: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://dune.com/queries/3733870/6280362/">https://dune.com/queries/3733870/6280362/</a></p><p style="text-align: start">For reference, around 400 bids would be needed to reach the market value of the NFT auctioned. Anything beyond is profit for the seller.  There's a formula!</p><p style="text-align: start">We did not break even.</p><div class="relative header-and-anchor"><h2 style="text-align: start" id="h-lesson-learned">Lesson Learned</h2></div><p style="text-align: start">The Hub API has an experience-breaking delay. Reactions take a while to appear in the&nbsp;<a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://github.com/framesjs/frames.js/blob/da834e97d50cae4a853fed50a685789c78caad82/docs/pages/reference/js/getFrameMessage.mdx#L22">Frame Message</a>&nbsp;from&nbsp;<a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://framesjs.org/">frames.js</a>&nbsp;so players had to refresh the frame a few times. This might be a data propagation issue, although the&nbsp;<code>FrameActionHubContext</code>&nbsp;is populated through a Neymar hub. There might be a few ways to improve this flow. Still experimenting.</p><p style="text-align: start">We need to be better at explaining the rules, because this auction format is even less known than I thought. Regardless of existing similar web2 businesses and TV ads.&nbsp;<a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://en.wikipedia.org/wiki/Curse_of_knowledge">Curse of knowledge</a>. One immediate step was to populate the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://grimoire.magicframes.xyz/magic-frames/spells/degen-auction">official docs</a>.</p><p style="text-align: start">The Frame Transaction experience is great, but not full-proof. One of the first bugs we hit was when people placed bids from wallets that were not verified on Farcaster, thus we couldn't obtain the their username to display who the current bidder is. This exact area broke in multiple ways though.</p><p style="text-align: start">Still on Frame Transactions, the mobile UX opened the Coinbase Wallet app, but failed to open alternative ones like Rainbow. Must investigate this further.</p><div class="relative header-and-anchor"><h2 style="text-align: start" id="h-unused-stock">Unused Stock</h2></div><p style="text-align: start">Other popular auction formats have certain goals:</p><ul><li><p>get the highest price possible for an item</p></li><li><p>raise funds and grow membership of a DAO like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/yellow">/yellow</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/purple">/purple</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nouns.wtf/">Nouns</a>.</p></li><li><p>allow customers to decide their buy-in price like&nbsp;<a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://hotterwheels.xyz/">hotter wheels</a></p></li></ul><p style="text-align: start">Raffles are great at raising engagement with your audience, although border-line engagement farming and certainly&nbsp;<a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://warpcast.com/bitfloorsghost/0xc3df4b1d">in the grey area</a>&nbsp;for the healthy growth of a social platform.</p><p style="text-align: start"><strong>Where do all-pay auctions fit in?</strong></p><p style="text-align: start">Our theory? Midway between auctions and raffles again.</p><p style="text-align: start">Unused stock is a missed chance to engage with a potential audience. A missed 2nd chance.&nbsp;</p><p style="text-align: start"><a target="_blank" rel="noopener noreferrer nofollow" class="dont-break-out novel-text-stone-400 novel-underline novel-underline-offset-[3px] hover:novel-text-stone-600 novel-transition-colors novel-cursor-pointer" href="https://etherscan.io/tokenholdings?a=0xb1a32FC9F9D8b2cf86C068Cae13108809547ef71&amp;__cf_chl_tk=jX9N1zqhSYs_H5nsGhFGkiWy7Yvh7.XvwT5aWicR6hY-1715795319-0.0.1.1-1621">Nouns has &gt;500 NFTs sitting in the treasury</a>. What if a small number of them would be auctioned off?</p><p style="text-align: start">A creator has an NFT which is valuable with a healthy floor price in their wallet. Why not auction it off and allow fans to collect it, a lower price point for the individual, but high enough for the creator?</p><p style="text-align: start">These auctions are sometimes meant to run across multiple days. Why not keep "Channel Tourists" entertained and allow them to punt a bid?</p><div class="relative header-and-anchor"><h2 style="text-align: start" id="h-whats-next">What's next?</h2></div><p style="text-align: start">A few marketplaces and communities have DC'ed us to run auctions, but we're mostly focusing on implementing lessons + feedback from players, as well as fix bugs and clarifying comms.</p><p style="text-align: start">The Farcaster protocol is moving fast and they recently announced <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/dwr.eth/0xad16b85a">programmatic Direct Casts</a>, which are perfect for keeping players informed about the progress of the auction, as long as the balance between informative and noisy is achieved.</p><p style="text-align: start">Follow us on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/magicframes">/magicframes</a> where we continue to experiment and build tools native to web3 communities. We tip and buy pizza for feedback.</p><div class="relative header-and-anchor"><h2 id="h-closing">Closing</h2></div><p>Thanks <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/brenoca">@breno</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/iggy">@iggy</a> for review and feedback. </p><p>To the players, I'm grateful for your participation and support! <span data-name="heart" class="emoji" data-type="emoji">❤</span> <br><br>WAGMI</p><p></p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>farcaster</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/17450507e8ac8e952f50ecc07a0cc9e6.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Nouns x Farcaster]]></title>
            <link>https://paragraph.com/@tudorizer/delivering-nouns-x-farcaster</link>
            <guid>FsiL24Bq64ZTdoe1gKMS</guid>
            <pubDate>Wed, 27 Mar 2024 22:13:34 GMT</pubDate>
            <description><![CDATA[How can we best ensure that 3 months from Friday Nouns has at least one amazing Farcaster client? Delivering a great app is not trivial and complexity...]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h3 id="h-how-can-we-best-ensure-that-3-months-from-friday-nouns-has-at-least-one-amazing-farcaster-client">How can we best ensure that 3 months from Friday Nouns has at least one amazing Farcaster client?</h3></div><p>Delivering a great app is not trivial and complexity creeps up easily from behind punchy feature names, wireframes, sketches and concept art.</p><p><strong>I value pragmatism</strong>, so allow me to be boring for a moment. </p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nounsfarcaster.com?source=tudorizer">Nouns x Farcaster</a> clients have layers:</p><ul><li><p>data layer: aggregate, filter and store the Nounish content</p></li><li><p>presentation layer: display the data in an engaging and aesthetic manner</p></li><li><p>governance layer: decisions on client features, curation, contributing</p></li></ul><div class="relative header-and-anchor"><h2 id="h-data">Data</h2></div><p>The data layer is mostly already out there, because <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/nouns">/nouns</a> have historically done a cracking job at creating and putting-it-out-there! <em>Algonouns</em> enhances this layer, by collecting and sort it, based on transparent and customisable criteria. It introduces a new primitive fit for the ethos of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nouns.build/">Nouns</a>. Unlike most social apps, Algonouns optimises for discovery and connection, instead of ads and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.lisnewsletter.com/p/love-vs-fame-a-framework-for-social">“fame”</a>.</p><div class="relative header-and-anchor"><h2 id="h-presentation">Presentation</h2></div><p>Presentation matters. "<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ia902800.us.archive.org/3/items/thedesignofeverydaythingsbydonnorman/The%20Design%20of%20Everyday%20Things%20by%20Don%20Norman.pdf">Good UX</a>" is relative and unpacks based on type of content, user habits and accesibility. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://imagedelivery.net/BXluQx4ige9GuW0Ia56BHw/a11e6094-5229-40fa-7021-d5d6f40eeb00/original">Illustrations</a> (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/momotsuki/0xdf4fb370">source</a>), <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zora.co/collect/zora:0x72d07beebb80f084329da88063f5e52f70f020a3/1?referrer=0xf3517EaeEC9772BB66F3a35Ff99f238822caEfcf">videos</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=jPTVtUAhVo0">stories</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2M5anU3d2VvZjBlczB3azYydmc0eGxzOTl0Y3Y3bnJpc25qa3cyNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/dqUAj2tZHKnj8DIBDS/giphy.gif">gifs</a> are meant to shine in <em>NounTok</em>. The familiar feed + voting in <em>Nouncaster</em> aims to quickly pop nuggets of news, while nurturing reactions by voting or replying. More <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://news.kiwistand.com/">Kiwi News</a>, less Facebook. <strong>Nounishness</strong> is part of the content and adds or subtracts weight to how readers perceive the latest DAO launch (as one example).</p><div data-type="callout" type="info"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p><strong>Tangent:</strong> Kiwi News introduced <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://paragraph.xyz/@kiwi-updates/kiwi-feedbot-submissions-open?referrer=0x3e6c23CdAa52B1B6621dBb30c367d16ace21F760"><strong>Feedbot</strong></a> recently, with a similar goal.</p><p></p></div></div></div></div><div class="relative header-and-anchor"><h2 id="h-governance">Governance</h2></div><p>Finally, the governance layer should be concise and permissive. A lot of issues are solved by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://creativecommons.org/public-domain/cc0/">CC0</a> and open-source, models which in the long run outlive even the coolest <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://en.wikipedia.org/wiki/Benevolent_dictator_for_life">BDFLs</a>. You don't have to be <strong>Nounish</strong> to read the spec and contribute your own curation buy assembling an algo in <em>Algonouns</em>.</p><p><strong>References and context</strong></p><p>A video deep-dive in Algonouns: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.loom.com/share/b14cf7b8792249aeabe91b1489c59c93?sid=fc473216-4101-457a-bc07-61c5ce897dc9">https://www.loom.com/share/b14cf7b8792249aeabe91b1489c59c93?sid=fc473216-4101-457a-bc07-61c5ce897dc9</a></p><p>Nouncaster in the prop.house: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://prop.house/0x767a3bdf2aa3b3201b794927a997fcf4e50d4702">https://prop.house/0x767a3bdf2aa3b3201b794927a997fcf4e50d4702</a></p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>nouns</category>
            <category>farcaster</category>
            <category>delivery</category>
            <category>managing complexity</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/d9be4073e8f3560c8d092617df684d6a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Not Your Average Frames Tutorial]]></title>
            <link>https://paragraph.com/@tudorizer/not-your-average-frames-tutorial</link>
            <guid>WGwqnuISk7ZSk80pH9B7</guid>
            <pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Let’s build a Farcaster Frame! After reading this tutorial, you will be have an understanding of the main components driving a Frame and see them...]]></description>
            <content:encoded><![CDATA[<h2>Intro</h2><p>Let’s build a Farcaster Frame!</p><p>After reading this tutorial, you will be have an understanding of the main components driving a Frame and see them in action.</p><p>As content for this tutorial I assembled a little trivia-style game: MVP or Not MVP. The objective is to guess whether a product or service were MVPs when publicly announced. Players select one of two options and at the end receive a score based on the number of correct answers.</p><p>Frames are rather simple primitives and after reading <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.farcaster.xyz/reference/frames/spec">the official spec of a Frame</a>, you might get a sense of what they are and why they unlock a new level of interactivity inside social feeds. They extend the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ogp.me/">OpenGraph protocol</a> by adding dynamic content on top of what was meant to standardise static metadata about web pages.</p><p>How do you build one?</p><div data-type="callout" type="warning"><div class="callout-base callout-warning" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/warning-icon.png" class="callout-button"><div class="callout-content"><div><p>Some familiarity with Next.js is encouraged, although you could simply clone the repo, run it and tinker with the code, a lot of less obvious conventions are imposed by the framework.</p></div></div></div></div><p>Along the way, I will explain some fundamentals and lessons learned.</p><h2>Architecture</h2><p>This demo has the following components:</p><ol><li><p>The Frame front-end - to render URLs with Frame meta tags</p></li><li><p>The Frame Server - to handle taps on buttons and advance the game</p></li><li><p>Persistent Storage for the game state - to store the game across sessions</p></li><li><p>A Farcaster Hub - to validate FIDs and message data</p></li></ol><figure float="none" width="696px" data-type="figure" class="img-center" style="max-width: 696px;"><img src="https://storage.googleapis.com/papyrus_images/044ec2964fa00f2c8af0f6e8655f5165.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAIAAAAzPjmrAAAACXBIWXMAABYlAAAWJQFJUiTwAAADv0lEQVR4nJWU/2sbZRzH8zfUgQ3ofrHg6g/mFzuUKNsVRnSjFbaHWZNVOAezIDm6uqY645SbP3hOugVbDh1yPwiPWDja1Wv9cquMPJMkF5peD9t4uHWnaeC4JHJpmzyJbHmkeWqoXTb1/cPx8NzzPK/n837ez+MhhGCMnaKTy68XSkWn6OCm7uTu5PI5Qhp0QKVayRiZzIp+997dSrWSy+ecoqOvLqeW0hhj8mB5CCHKwvzBl/3B4VPdvU/7jx8eCA+G3z97OnLmdOTMyTeDzxx7duyj6KyqPNf/PHPyyPjV2JUvPu164anJLz977OATr0feeMjqO4BkYjEywkdG+NiVq9/Mfj81dW1mZv67uR8X1Pj09Nz09Fz2l1+bG6/S7VeqlY2tDUJI6Y/SvUbj3wE3FhIfvDf+ifB5dvXW/SPy67ahZ6lRGOM/6/WHr9gGkE7plmWt539T1R/kXVJVVdO0lZWsvrS6ew41HULY3d0NITQMAzVlmmZbQMPQs8PDI/v3P87/U4IgTExOgBePfnju/LdTX8cuXPh4bGzy4sX4/Hzi+vXhcDgajUIIZVmmX5Zl2wPM7O3Bwdf6+voRQoqiqKqqKIosywghjgsHBwZ/Qlq9hpcWFwuOk1tbKzgOIUQQhD35AQDcn6htgLWW6+09Egy+SghxXZd67bouIYTjwvv2PXp5fCIaPQ8AOH7iBM/zEMJoNPrkgQMIoRvxOEKImhkIBNoDaAUAAEVRBEGg/sRiMVmWOY67dOny2u3fMa4CAPx+vyAIkiQJgjA6OqooCh0MIVRVVZblB1p09KVjDMN4PB6v1wsA6Onp8TTV0dEx8MqpyLl3r83OQPgVNaG1TUVRNE1DCImi2IrZniK2U2To2bfH3jl0+FBXV5ff7+/r6/f5fBTQ2dk5cvatZooauydjjG3b5nmedrIsSy1tH9Obca1YKLX9TZr3IJ3Sadt1XVVVaRxZlpUkifZDCAOBgNSUKIqGYbQH7K4OY1yr1fcAVFWllbEs6/V6OY6j5liWRe19pKlQKCRJkqZp/7sCRVF8Pl8oFGIYJhQKEUJEUXRd1zRNAAC9B3SXtm3T+nYArlv+LwCEUCAQYBjGsizaI0kSxtgwDJZlGYYZGhoCADAM0wrVNkDP/JxOLadTy8lE5mY8nUxkkolMKqmnU8vZ1VvJRKb1RiGEYrEYDT59Huh1M01TEARRFHmeF5uCTe0AarV6rVbf3NgqlzfL5c1ioVQslGh7c2OLnkTrYNS/RQGt86RhbQlCaNs2IeQvPNrlaQdqkD8AAAAASUVORK5CYII=" nextheight="938" nextwidth="1742" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">High-level system diagram of components in the Frame powering the game demo.</figcaption></figure><p>When Farcaster clients try to embed the content of an URL, they look at all the <code>&lt;meta&gt;</code> tags in the <code>&lt;head&gt;</code> . If clients find a set of tags that correctly define a Frame, they render it, otherwise they fall back to the OG protocol.</p><p>The first rendered frame is cached, so the best practice is to not have dynamic data on it.</p><p>When users tap any of the Frame buttons, Farcaster makes a request to the Frame Server to perform some logic and return the content of another Frame.</p><p>The URL of the Frame Server is defined by the <code>&lt;meta property="fc:frame:post_url" content="..." /&gt;</code> tag.</p><h2>Step 1 - Create a first static Frame</h2><p>This is almost trivial given the <code>generateMetadata</code> functionality in Next.js 14, because inside this function we only need to return an object with the right keys.</p><p>Here’s my example:</p><figure float="none" width="728px" data-type="figure" class="img-center" style="max-width: 728px;"><img src="https://storage.googleapis.com/papyrus_images/67b059a9ddb69ebc1ac3cf416cf66d34.png" blurdataurl="data:image/png;base64,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" nextheight="1512" nextwidth="1402" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: right"><a target="_blank" rel="noopener noreferrer" class="dont-break-out notion-link-token notion-focusable-token notion-enable-hover" href="https://github.com/tudormunteanu/frames-demo-1/blob/main/app/page.tsx">Source from /app/page.tsx</a></p><p><code>fc:frame:post_url</code> and <code>fc:frame:image</code> point to the Frame Server, which for this Next.js app is hosted on the same machine as the front-end.</p><p>This Frame contains a single button, with default actions. Tapping it makes a POST request to <code>/api/start</code> with info about the user who tapped and index of the button.</p><h2>Step 2 - Responding to the button</h2><p>This logic sits server-side on the Frame Server, so it has access the persistent storage service to initiate the game.</p><figure float="none" width="726px" data-type="figure" class="img-center" style="max-width: 726px;"><img src="https://storage.googleapis.com/papyrus_images/389640203e0b1f9bf3cd44d5b2bb368a.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAARCAIAAAAzPjmrAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFW0lEQVR4nH3UfUwTdxjA8YdBe0fFV0BKX67tXe/6Qlva3rWl772jtJRXQYEwQAEpQml5sfIy53wB3yJxm8qCixp1mJi9xJllyaZOo3vzbUUHiZplm/tjyaJGki3L9meXgpLMmSXfPLm/Pnd5fr8cJL9JPuz97PHQVw9jl36KXf6x98q96JX7sauzPVdnotfu9lybjnyZiFxLxK7fjl2/3XvrVu/tG7Hvvo7cutx5/YvOmxfDNy50Ji5sSnzeNf1JePp8R+J8x/cfh2fOdc5Otd5MfpSE5K4ZApEG5E5VmkwJYuJZUhwwHDA5SOSAYSD2yN1NnuZqujakK68011iEdhFIJCAXg0ycmrgY8HzARUCIgMhLPavSIPviwBwkR+8XIiS7zGLj64vQQitSaOEbGMTAoCYGNdGIeSEzSpsEjAFhClGLHmH0CKPimXWoRY0wKj5N8hmSz1B8q3I+gmcleEUioC5t/gP+3j7rzqNr8cBaVahU6ivH/SEZt1ZbHsTYoNwflAeqNJWczB/Agz6pP0iEPPm+EqLMJfKxipAHC3iwYEBVXaquCVBrOLKqRFXDUTV2SWmooEm5nPm07yn8/tpdjqrY4O7vD3S91blvW+2WusK62Lp9LfauoaK2UTa6k42OB7fErW1veCODdftrnPFoeXxH01jcvml3y94WX7c5220V+hkhR+exxlyfIYfVrvTQwqAs03iu5zE8GZl2iR3tRRvq9VWNpto2R/OrTENVQd1G98Yue0uLubHD3sqt9jlXOIuFxbYcn36517TK7ZYELMtcRcJiY7YHTzcp0kw4j5Fn0LIMRpbBSNNpLMOaC+SH3Y/gt6FEia6u0Tnw7uDk2dGpBqapq+ZAI92+n+vfzQ3s8MTGg8MHSobHOw4dHjnB4ZUalKZ4JiK9kEBMeLoRTzcpUUaJ2hSIBUdscr5VzrfK+DYF6sgF6oPII/h1KOFWVlToW4er4+PhvbtaRkOq8mJJ6PXKnf3+oYPr3xmrG2/nhteX7Q8ZuyptMRavJhEzhdAUQpOo5aV6KsSeC+qzkSfwy+C0bgXjl1c68ziPqLQ6v2SNuHQtUWlbYafStGqegUzXz2egeCYyw0jyTAv0/+hSvk0ucOWA5kz3E/g5focReds8cT9RXUo1bKBqO7X1YUOjR8ipecYClFbzTRTfrEJoFcosfvhLdMS2qGNokSzTmQOaqcgc3OtLqBGq3lCnAJwEkgCVAigCNGqeUc03LerP6Rf1f63luY4JHDKBOxu0p7rn4MHmGQXglVgoqm9qVFTVcu0NZREKdCkdoUmeSYXQmiWWRX2B/q8u5VkXdUzgkKCubNCe7J6D+/FZMYjXycqPlo2MunrqLc1D9WMDJVu31uytNTS3Fkf3dL453ne03hmWg2H+BSn6RX2elmbaMYFDjNrFqF2S6VkFmuNdczAdu6NbbqpS19CZtCXLpkcZPWKx53K2HFYrsJlzvFYhR69mC5Y5F9eyoGN8y8v1TJco0ylG3atAe6LnT3gw8kOFrppZ6kidJ0Iv/F4ofuoiqlELyWeIjFQkYlUiRQRSpFziJAQOQuDABU4F6pBnOuQCl2KpS57lwZZ6sKU+aZZXmuWVZBVng+F45C+4EZ2WgFT5ikYGOAZKDJTSVKQUSAkoJalJikElBpUIVPmgEoJaCOo80OSBJhc0q0GbM18uFGQ/S7cyNQsBREfCTyE5kRxjD+7xT+zk3t7OHtrOHtrGHt7GHt7qOzLsPTLkmxj0Tgyxk4PcZJydHPAd3cwe6/OliniORX3Hu73HutmT3dypLu50mH2vgz0d5s5sZM+EufdbfVPfHkz+A7OnmbJpNpLhAAAAAElFTkSuQmCC" nextheight="882" nextwidth="1638" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: right"><a target="_blank" rel="noopener noreferrer" class="dont-break-out notion-link-token notion-focusable-token notion-enable-hover" href="https://github.com/tudormunteanu/frames-demo-1/blob/main/app/api/start/route.ts">Source at /app/api/start/route.ts</a></p><p>The Request object is key here, because it contains a payload sent by Farcaster with an encoded version of the message, the FID of the user who triggered the action and the URL of the frame. These can be validated by a Farcaster HUB. I use <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://neynar.com/">Neynar</a> in this demo. The validation logic itself is fairly straight-forward and lifted from the official Frames demo. See it inside <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu/frames-demo-1/blob/main/app/frames.ts">app/frames.ts</a>.</p><p>To separate display from business logic, the endpoint completes with a 302 redirect to the page which renders a new Frame and new buttons.</p><p>The first screen had a single button, so there’s no need to check its index, because it can only have one function: start the game.</p><p>After the redirect to <code>/start</code> a frame renderes with the first level:</p><figure float="none" width="395px" data-type="figure" class="img-center" style="max-width: 395px;"><img src="https://storage.googleapis.com/papyrus_images/ca904fc1f1a44e08e6f7eab0c5ddd932.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAWCAIAAAAuOwkTAAAACXBIWXMAABYlAAAWJQFJUiTwAAADaUlEQVR4nL2UW6jbdBzH82+G9jS9nLacNTltmqa5NP82t5OmyWmTpknb09Oz0x7PZd1QGYp4GWOycWQ4QSZ4AW+oCAqC7/oksr0PcaBj+rKxvcwHH2QPgohvPippMXblsOPGjj8+/AlffuGT3z/5B2GICkUIBwRDVJACLqAoGjqAQlGUzPC+AACAHEABAMgMNysAyEOTAQByCzMCAAAIzYA8qHIPQTqVLEM+Epnbs3u6JkmQ/2dBhixwRjpbShL84ayAkzBXlKOx1KR/+s77nmC8FUjZPT26cGPr/JUTr1954Z0fz358880vfy83jlIk3mp5kiSVy2VVVRuNBoSw2WyapslxnKqquXHtL+gMnzv3wfcvvn3t7LtXz7z/w8uf3Pr04h9W99hc+JBl2YqiCIJQqVQoikokEoIgyLJM0zTP87FYLJ1Oh8Phewj8qcVyabQ1+OKjD3+5defry79+8+3t3366MVztYFjUsizXdSGEpmlqmmaaJs/zmqY5jqPreqPRwHF8Zvf2eAeFPFEXhcufv/XXn3d+vn795DOjl04dV2U4P59kGCabzWYyGZIkKYoSBCGfz+M4DiEsFosQQgzD7r1FfsSXyJ2d1nsXnv7uqzcufba71eO6a3Iuf5ii6FqtJstyrVazbZsgiFarZdu2YRiaphmGYZpmMpncf4IQiqCHkMmnD1CARR+Jxx8FAEmlUpIkcRzHsixN0wsLCxBCmqZZlmUYRlEUhmESicT+godbYErgPzOYPUzBoQIh8M8PDPiMj3tohknnXYDQ/zIBTcB5LBmPJOKR+YBoJIGF47HwXeGY2SQ653dG5uJYOD7bHE1SRAlhs1JNdLr2IKBjDVZbG5v9x4fdUcf6N+81h029Z1e7veYw6DzibW+sjB5bObbZPx7kEwzJ5XKKLzBEZ629HdB3N3cGT5zffe2pJ0/23c0gH3SPthvrbr0/6O6stbfXO9urrY0To2fPnXl19/Qrp57fXe/4eYApe2xWQtisqPD1xlJ7mrrqmZK7LHvToaV1DNHRK01L6wThsuwaFceUXEN06qpXlz1/HV9I/LIvYIgKsyj6631CE2WOVE29V5U8TXRqS+2q5Bn6ii57pt4z9Z5VP8LmlLHggVkUS4VqqVDlSbVELXGkKtD6JCkVqrCoM4vi3zfe5xqMjXzyAAAAAElFTkSuQmCC" nextheight="732" nextwidth="1074" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Screenshot of a Frame of one level</figcaption></figure><p>So far we covered 3 paths:</p><ul><li><p><code>/ (root path)</code></p></li><li><p><code>/api/start</code></p></li><li><p><code>/start</code></p></li></ul><p>These 3 paths cover the core loop of any Frame:</p><ol><li><p>Render</p></li><li><p>Interact</p></li><li><p>Call Frame Server</p></li><li><p>Repeat</p></li></ol><figure float="none" width="675px" data-type="figure" class="img-center" style="max-width: 675px;"><img src="https://storage.googleapis.com/papyrus_images/4eac9cbf03357170cfa4b7b8b3892909.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAZCAIAAADfbbvGAAAACXBIWXMAABYlAAAWJQFJUiTwAAAD60lEQVR4nJ2Vf2gbZRjH33+LINZAhcBQKkjcP9bCUAZCGOiiCGYblbMVPPffBab2RKm3xhVvoMgVnexArXKTzS71B3GH2qQHNS3ZaGO91vbI3ZqsCfGapEt2yR3cXSUNryQv7Wqb9Ee+vBx37z33fni+z/O+ByCEuqEvJ5dN01SzqlYuaeXS+GRofDJUf9R0Q9cNXV6WZ/6KjU+GKhsVOaEEf+PhwQQghNz1KwCAtkcfBB2g/YlHTuM9x04eP3by+JGnHwMdoPv5Z15548yR7sePPvcUAIAevtjxpBM8ADJq5qCAykZFzapyQtHKmppVdUOvbFQghPm1fEbN5NfyaJh16Ya+msvqRvnu3bxtmWVNs0zDtszcqlrWtMaA3apsVBCjmdZte+TzDwd8PYNvvzY8dO6HK198c2koEv75oAAk8//ami8Wcook8mMjX3924dtLH1398uObkd/rb6r7AHav1UjVxblbDd1oqKYZZDIZHMdpmkZXiqIQuKQVFUmEEPb19p4+dcrv9/f19mIYJoriPgBZlhmG4TiOZVkIIc/zLpcLbArHcbREOilPhYP/VioEQRQKBZIkBUFg60IeNACYpikIAsdxbW1tAACXy8UwDAAgEAiQJNnZ2UmSJMMwXq+XZVn/4PmL9IWH2tv7+/tr39fjRVHkOG6vDBA5Go0SBJHJ1BqcYRie5wmCAABwHMcwjCAIKNKyLFEUKYqSZdnhcFAUFQgEEKBxBjuEggqFAo7jGIbhm9rxMUVRBEHQNE2SJIZh0Wh0nxpsX337vdvtblZACKsU9YEsy03eNslgh3ieRwVERrEsy3EcQn4/Ohr85UZDZw4BmAwH/YPnKYryer2oo1wul8fjUZTb77/b33D3HgKgSGIk/FMoHMYwjGVZBKBp2uPx+Hw+2zIF/nrrAMs0bv7x67pto5JyHOd0Oh0OB8uyHo8H+aZIIgo4LKB2qiiSiDYthJCmaZZlMQzr6upiGGarm1OJeEkrtgpYmksl4uhZFEW3240scjqdNE2j+ZWEpN1baz2DdPJ+CzY8WeOLs/nVdIuAlYSU/efOdsCOe8s05mORdFLOr6a1Yi6npnJqyjKNFjKobl5ro17V2szs9ISv78Tw0LkBX8/lT94b8PW8/nL31a8+vS0tbFX+EBbtlm2ZM9OhmekQPzayEJsaD14L37g2wY/WN0d1/zZdiE3NTk/EF2fnYxFFEhdiU8rS3N9/Rudjkb19366mgHXbHnwLO3vm2VdfOOrrO9F/9iV318PvvPkiPzby43eXlaW5zcCaY7vHfYBlWc0Y6aS8kpBKWlG7t5ZOyqlEPH1Hafjj3SOD/wDk+/j4lc5FVgAAAABJRU5ErkJggg==" nextheight="1228" nextwidth="1584" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">The 1, 2, 3 cycle is repeated as long as there is content to display inside this frame.</figcaption></figure><p>To chain multiple levels together, I split the game in 3 stages:</p><ol><li><p><code>/start</code> - the first screen which starts the game</p></li><li><p><code>/next</code> - levels 1 through 5</p></li><li><p><code>/over</code> - the final screen</p></li></ol><p>Each stage is comprised of an API endpoint plus a corresponding Next.js page.</p><p>Diving into <code>/next</code> as an example, this is the API endpoint:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/24555f17bf6f904d5a649f1659f3529e.png" blurdataurl="data:image/png;base64,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" nextheight="1872" nextwidth="1548" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: right"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu/frames-demo-1/blob/main/app/api/next/route.ts">Source from /app/api/next/route.ts</a></p><p>Assuming the game did not end, the code to render the next level Frame looks like this:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1cb30fbec34d15ea15648d18c22ef3f7.png" blurdataurl="data:image/png;base64,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" nextheight="2006" nextwidth="1694" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: right"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu/frames-demo-1/blob/main/app/next/page.tsx">Source from /app/next/page.tsx</a></p><p>The API endpoint passes query params to the Next.js page it redirects to. Here, the game id is sent so the page knows which image to display.</p><p>Next.js runs the above code client-side, so we won’t have access to server-side functionality like Storage.</p><h2>Step 3 - Rendering Images</h2><p>So far the app takes advantage of mostly Next.js boilerplate code, while following the Frame specs. The final challenge is rendering images for the frames. Fortunately, there are quite a few options available:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/vercel/satori">Satori</a> for generating SVGs from HTML</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/lovell/sharp">Sharp</a> for rasterizing SVGs to PNGs</p></li></ul><p>Here's a glance over the code:</p><figure float="none" width="673px" data-type="figure" class="img-center" style="max-width: 673px;"><img src="https://storage.googleapis.com/papyrus_images/571d66a5cbf9f4c35af8eef1d9bce108.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAgCAIAAACtjN7AAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFM0lEQVR4nB3R61eSBxzA8d8ulqI8KBjovHJ7fIDHB0VA4Hl4BBRQvCAaIspNECITM12XtWrepqWZWlbbmDbtrItOTWUatcrTWVtbL9rO2d7txc7Zi/4Md+yc78vPuy/s/7n/+8DqX6e33vSv/Rpb+2/yzbvpP97N/v3v5NtfBnZe9u/sxRIr/uX95D68/SzZa+9dHV4IV7SONcSmOi/GT8184brgV3tapc3mIiOWUsKDIw8D9+GfkVcdKk8PGfXIPSdVgdPariFLrFvpNnJJmkPSHMrApbGPsK3oNrwZ2GoqbYv3zX976uZY5/BpU++1zpHBprOWguraAos2U6PLItEP0ZXQOrwe2Irazr6OP78amn746cKLifWnVxMx80kH1hLWhHTZlC6LFIL4QXAdfu7bMBYaHMJamqfTsJSK1NIyBoEBSqQRpamE/HCZmkUKAL0f2oAXPatWoXXMN3Wqrv9ibX8PGfUrfN3acIfU6Sba2rVeFVMnAPRecBP2Yut0gSlMhqNUqN8aC9KR2mKrpcjaJG6wCG21WDPJM/IB/c6/Ac9718wS57OvX26MP5wfXJw8Hr/QMnKu7cvz7ivd9qFOc79FZC8E0R3/I3gcXavkVkaokE8bcJW62nCnU+5yyJw2zNGEHVVlkqUMdTFgd7o2IRFeNYrtQ/45G9rairY08m0KRFWeoZanq8tY2jKWrpxFFQO2ENiC3Z5NPhSesF0aC0y3KztcSt/xmljMNjjQdM4sbMRSlRVsugiwuP8RbB7bEIKgEXM1ylwaNklyDVSOSXvEoOVVK7L0MqZGzqKKALvt24aNyCYf+E14p0MRUmWSlRy9NFWJp6ulDJWMqcGZulKELADpLW8CHh3bEoK4AtFEyVg8dnc6eMsisEsZKgIhcaZOhugIFl0A0pu+bfghvF0EArPQ0UAEJIcq8AwNgWjRwxVYmhpnkTiLlCH6QpDd8CRgpXu7GERanjlSe9FOuOulTrPYUY+318lcOIuUIDocofNBOu/dgQehA0rm1p32zHqp405VsB5vd5OResIjQXQyll6C6PNBOt2RgHvBTeHHpZH6cbKgXgCEKEUhTFHwPyhHGWqUSaJMEkPoT0A660vConddnk2ZxEeFh8qwNLWSayxjVxHZRmmmHmWS4gwKQ+hckMz4krAcSojSiPOmwWuDdxb7lmwVnjrU2SBzSzOrxBmUOINCDyg+5dmF5fBuHojOGQaWz6zEP9/Eswwylr6EeYDEGZToPc2B0knPE4j7t2Vsjausq4JbXZKlF6QoBakaYbq2MEUlSNOKMigxsyoH5BMdSfjKt11ZXNtlPeNQBsySDnt5oEbYqjpi0QuPKnLr+Gm6kiwTD4jLnU/htm9bmWtNjiZ/nN5zVQ2aULdD5tXybM2KMCVqK2boME4ND4hx70/wTddjcXqFHXPTfDvOMUrZRmm2ScKulnLMIoQWZRoEzCouyCd8ezDv26HEjrn+lQstE6OemfvTz040DRNcayXfjnFqihFaiJi4IB/17MF1764oXXUj+v2wN+6lz4yHlkaDiyKELkjVFSO0gGUUINXZQIx5X8K8/4lV4TViHerChvwUdX6KOi9Nm3f4fQwyj0EWMKrYQAx17sEN/1OXru9KcGmme2HAfnkstDweuTsUWByKLjm1J3Xijhr1CQ4oRjyv4HowmZtKFLEONuJsA55jqRS2lOc3yPPqUXYVyjWhubWpIBhsTcBvV/ddyksRw2xAP+2nD2rXXPFQ19wHzbmpuU79fHPlxOOp/f8B5hydaly+LPwAAAAASUVORK5CYII=" nextheight="3356" nextwidth="1456" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p style="text-align: right"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu/frames-demo-1/blob/main/app/api/images/level/route.tsx">Source app/api/images/level/route.tsx</a></p><h2>Step 4 - Recap</h2><p>The cycle is complete once the image for a new frame is rendered. Forks in the logic path can be added and the flow expanded path this point. We can now build navigation for a tiny, focused app.</p><figure float="none" width="636px" data-type="figure" class="img-center" style="max-width: 636px;"><img src="https://storage.googleapis.com/papyrus_images/ea2ff9a6e721f381a987a213669b5ec6.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>That was it!</strong> This minimal game emphasizes the best parts of building Farcaster Frames.</p><p>Constraints are great for innovation as they provide focus, encourage creativity, foster resourcefulness, create urgency, x promote efficiency. These limitations encourage innovators to concentrate on specific problems, think creatively, utilize resources effectively, act swiftly, and seek efficient solutions. The key lies in approaching them with a positive and creative mindset, turning challenges into opportunities for breakthroughs.</p><p>In times when the UI stack for building web apps is getting more and more complex, Frames feel like a fresh take, back to first principles of interaction, natively supported on most platforms.</p><p>If Next.js is too much and because most of the content is rendered on the server, you can choose almost any other framework, regardless of language. I was tempted to replicate this demo in Flask, FastAPI or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hono.dev/">Hono</a>.</p><h1>Play!</h1><p>Play "MVP or Not MVP" here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/tudorizer/0xd122d681">https://warpcast.com/tudorizer/0xd122d681</a></p><p>Checkout the repo: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu/frames-demo-1/">https://github.com/tudormunteanu/frames-demo-1/</a></p><h1>FAQ</h1><div data-type="details" class="details"><p data-type="detailsSummary" class="detailsSummary"><span style="margin-right: 8px">▼</span>Why did you not use frames.js, onchainkit or frog.fm?</p><div data-type="detailsContent" class="detailsContent"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/framesjs/frames.js">Frames.js</a> , <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://frog.fm/">frog.fm</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/coinbase/onchainkit">onchainkit</a> are great libraries that abstract away a lot of boilerplate code, while introducing good practices. I decided to not use them for the purpose of this demo, to highlight some fundamentals that app frameworks like Next.js already include.</p><p>My intention was to keep dependencies to a minimum, to focus on the core.</p></div></div><div data-type="details" class="details"><p data-type="detailsSummary" class="detailsSummary"><span style="margin-right: 8px">▼</span>What is the full tech-stack used in the demo?</p><div data-type="detailsContent" class="detailsContent"><ul><li><p>Next.js 14</p></li><li><p>React</p></li><li><p>Vercel Cloud hosting + CI/CD</p></li><li><p>Satori + Sharp</p></li><li><p>Neynar for access to a Farcaster Hub</p></li><li><p>TypeScript</p></li><li><p>yarn</p></li></ul></div></div><div data-type="details" class="details"><p data-type="detailsSummary" class="detailsSummary"><span style="margin-right: 8px">▼</span>Where can I find other interesting frames?</p><div data-type="detailsContent" class="detailsContent"><p>The floor is lava: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/pplpleasr/0xe21ad88f">https://warpcast.com/pplpleasr/0xe21ad88f</a></p><p>Top Frames in Launchcaster: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.launchcaster.xyz/?sort=top&amp;text=frame">https://www.launchcaster.xyz/?sort=top&amp;text=frame</a></p></div></div><div data-type="details" class="details"><p data-type="detailsSummary" class="detailsSummary"><span style="margin-right: 8px">▼</span>What is the version constant and why use it?</p><div data-type="detailsContent" class="detailsContent"><p>At the moment, the version is appended to relevant URLs to bust the response cached by Farcaster. It does it by appending a unique query param to the URL (classing web2 pattern). The value can be anything unique and I chose a timestamp for simplicity.</p><p>This is particularly useful if used to version releases of your Frame, manually or as part of a CI/CD pipeline.</p></div></div><div data-type="details" class="details"><p data-type="detailsSummary" class="detailsSummary"><span style="margin-right: 8px">▼</span>Why not use the <code>ImageResponse</code> which uses <code>satori</code> under the hood?</p><div data-type="detailsContent" class="detailsContent"><p>That's just syntactic sugar.</p></div></div><div data-type="details" class="details"><p data-type="detailsSummary" class="detailsSummary"><span style="margin-right: 8px">▼</span>What are all the possible <code>&lt;meta&gt;</code> tag properties relevant to building a Frame?</p><div data-type="detailsContent" class="detailsContent"><p>The minimum required properties are:</p><p>fc:frame (currently can only be <code>vNext</code>)</p><p>fc:frame:image</p><p>og:image</p><p>The minimum required properties are:</p><p><strong>fc:frame</strong> (currently can only be <code>vNext</code>)</p><p><strong>fc:frame:image</strong></p><p><strong>og:image</strong></p><p>Other optional properties are:</p><p><strong>fc:frame:button:$idx</strong></p><p><strong>fc:frame:post_url</strong></p><p><strong>fc:frame:button:$idx:action</strong></p><p><strong>fc:frame:button:$idx:target</strong></p><p><strong>fc:frame:input:text</strong></p><p><strong>fc:frame:image:aspect_ratio</strong></p><p><strong>fc:frame:state</strong></p><p>Find the full spec with explanations in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.farcaster.xyz/reference/frames/spec#required-properties">the official Farcaster docs</a>.</p></div></div><h1>See also</h1><p>The state of the Open Graph protocol doesn't <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chriscoyier.net/2023/01/28/open-graph-blues/?ref=tudorizer">seem to be great</a>. Twitter has <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards?ref=tudorizer">cards</a>, while Google went with another standard from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://schema.org?ref=tudorizer">schema.org</a>. </p><p>While the core value prop is simple: "encourage websites to include metadata which tells other platforms what they should look at", the value prop of similar standards might soon be challenged by AI, given the relatively narrow and content driven scope of the intention.</p><p>I'm hopeful this enhancement of the standard will live on at Farcaster and improvements like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.notion.site/Frame-Transactions-Public-Draft-v2-9d9f9f4f527249519a41bd8d16165f73?ref=tudorizer">Frame Transactions</a> take it to new heights. Building it in public, sufficiently-decentralised and outside the tutelage of one entity might lead to a different fate.</p><hr><p>If you have further questions or need additional clarification on any of the content discussed in this tutorial, don't hesitate to reach out on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/tudorizer">Warpcast</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://x.com/tudorizer">Twitter</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/in/tudorm/">LinkedIn</a> or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/tudormunteanu">GitHub</a>. I'm always open for conversations and eager to assist!</p><p>Remember, learning is a journey, not a destination. Let's keep exploring together.</p><hr><p>Thanks to everyone who reviewed this article, gave feedback and tips. Particularly <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/tomasp1189?ref=tudorizer">Tommy</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/markeljan?ref=tudorizer">Mark</a>.</p><p></p>]]></content:encoded>
            <author>tudorizer@newsletter.paragraph.com (Tudor (two-door))</author>
            <category>farcaster</category>
            <category>frames</category>
            <category>web3</category>
            <category>tutorial</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/b058ea787a53f870275d95f14fd2d076.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>