<?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>Semicolon</title>
        <link>https://paragraph.com/@semicolon</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 15 Apr 2026 09:36:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Semicolon</title>
            <url>https://storage.googleapis.com/papyrus_images/78ba25dde832b808e1bbf70631f7666e</url>
            <link>https://paragraph.com/@semicolon</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Announcing /farcodes ]]></title>
            <link>https://paragraph.com/@semicolon/announcing-farcodes</link>
            <guid>G1moSH6Dj0hUvCIhM0un</guid>
            <pubDate>Mon, 08 Jul 2024 13:10:51 GMT</pubDate>
            <description><![CDATA[What is /farcodesFarcodes is a new set of frames to help you share your referral codes, and find your friend's codes - all in a way that reduces spam...]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h2 id="h-what-is-farcodes">What is /farcodes</h2></div><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/farcodes">Farcodes</a> is a new set of frames to help you share your referral codes, and find your friend's codes - all in a way that reduces spam on your feed. You can try it out right now at the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/farcodes">/farcodes</a> channel.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6129cb513334c90647c8630748b2ea85.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAIAAABj86gYAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAEVElEQVR4nJWVzW/bZBzHnzXKm+P6PY6d2HHs57EdN84a13l30iZZ4s5ZkmZtVzZW1sGqCgkuXDgggUCaBOK0+05IHLnADXHhAKfdOHAACcGdvwFQapR1U1Op0keP7ceyP8/v+/h5DBIMAkDcu/fky2fPwVouwaA4BZM0BARqqdqvY/Vub3T74Gz//rv17ixKaAkGhSQ5I07BkIzqqlaHkzeXPUvAQhDPW84gmD+KUnApWKNQPqO9XxLUQkmxt5HdVSwvrTiC5vKqy0jltOLEKRgltAhe8HaPHjz5sNwIInghfMNLQXiIEhqvOJrlAUyJElroiDEGyG4JekO2vKzRlM22bLYVy5Mtj5VuklmbEK0QPFPEeAO7UNMrgiihEbypWR2nubvZDEjBCqNY1A5duNlT7W3dGejOwHCHhnOrWB2hzf7CarayZit33sqWx6vu5YL4eTKSXjcrPVayw4gXubmDT54+czsT15uopW5Wb2T1Bq84Ga0qGU06W4pTMMWhFIdw3gyfWlEBBTHOyKG6arUjhBbOBIjKTuv286++aQ0OvcFBa7Bf784rrbE3OKh2pt3hYX1nz2mNK62gsTNzvUnVC3DevKoC2WgqxebyxsKBKQDwbmfSHR60+/PB7r1qZ+zPHnZ239j2j3rjN/35465/NLrzsDu8J+mNZbCXCFKsLut1yxmY5Z0k89KBcQanbWf0QQb1RXMkmqOM2mB4RPM6IxhLOMHAaQWjYYxaJeCQUmzZVX8xw+c9SXoRHc5AK12AVE5nZcQqiFUhnUe0ZDCKyRYWpGExjYq8bmfMUtaMMSu+IowzZKNpOf0Uq8cvCEgW6hjHAJwGGAMwAaRygBZvpHkg8CCXuSELEVmMqWIMZpP6hmAkrxBk1C1Jr6+njf8XKrMQUGlkRMkUAAyIoih5K8MNMlwnnVZSQi6Rk1NynlDyhKpxRoEuWjy8XBASwQsRvLC8TNIwzqB4LDfe8U8/+vjrv/9879PP5vXhUbA/7QV7w+nx7MFbe8fHs+NJb7bj9F1YM9nXl/Ergtc4F+iRG+LRbP/z77794d9/Pnj6xchoPwiORm7/Zn6jrJVtrWLDLRtWTaki4prO5q8nOI8IVta4AgA5kLpLMi+G8k+3pB/7ue/bws+93B9j+Hug/TbW/pqgX8aFriStUWgxsmsJXMAbgIaArAByHiMnsfUgsR6sE3fI9T2G2OOpwzx3IDFTnixz2fh1KyBY2GNRNwHbuOYm8nZSKacUe10tkapBKIhQdEatIbdasGqiUlNQdNU6WAXGGcVqgJyRN7x/5/DMn7+z6U1Nx694d4tbfqkWDKcn/eCh6fhFN0CV0cqtYhUJBtndw5p/0gze3p6deZPT+u3HNf8kbGv+iTc59SanNf9RZ3ZmNabhVn8NQZyCkt6QzTYhWDhfvIAZnmCciXEmKWxQ4sZVm90VcPImnS0RohW+4nyM6gUWVVKiRQjFS384/wHuiP1wiwWWZAAAAABJRU5ErkJggg==" nextheight="882" nextwidth="1406" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><div class="relative header-and-anchor"><h3 id="h-how-it-works">How it works</h3></div><p>Firstly find a referral program that's supported so far, you can find an exhaustive list in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/farcodes">/farcodes</a> channel. For example you can try out the Uber Eats program <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/semicolon.eth/0x4a7a6ef3">here</a> and paste the code from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ubereats.com/invite">https://www.ubereats.com/invite</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/22c3572cd4a3fd4c733dd14871d11a5c.gif" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAVCAIAAACor3u9AAAACXBIWXMAAAPoAAAD6AG1e1JrAAAE2UlEQVR4nK1VW2/bZBj+Mi9LatVx7fjw+Xy24zhOmjhNmlOTNMuhXQ9ka7pua9TR0zZtXDA0xAUIcTFpiBuQ+BuIO34DEjeIG674D9wPMeS6i8roeoX0yLIt28/7Pu/zPgYy4xCIiCMcdUPEEMmnpGNbdOR83q1n9BKOcERcTF8GAuF16LWDicmV2ZSa0ZdsMZ/RA1ctQVw/B6mDQXMrawQQ15gbAhKTTjLKn/vFfrkzGkxa5b7BeQJjEwh/ETOCRbfRLPdoVLIE/+Hdx9PJyb3x0bCxpdCOQjs6m9VZH1T9br3Ys8U8gfBkQmZRSSdEFjdEJsPihikWNaGgcJ7OeSp0FZhVoUsiPI5w6XjYNxaDOCJ4SuHlxx/1m1uuXlFg1uByPK7X/e1PTr4FRbex6DYMLhuqlJTJhDx3jY9OCk6Vx/V0XKRRmUIVGpUjsJiqcB6LqVQyvEzHRYm2Tx+9WqmsWULeFPIa6wqEUTC7exvPQL+54erBrHEqKQuUxcwrHGHdGRzZUpCK8yymMvNq9ACJ8My8aqsBmwq5o1J4TO2Nnt9sT/JWzVHLOsxxhF5xR4eTz0EhU4+apVEZgNTTRy/+/uvNdPJ4f+eovjjISW1HrHCUJTEulQyLjZCKwWgeZJzHYrBW6Pzxy8/j0Z4OPVsqRh1U3OH+xgtQL/Y8Y4lNhQViMVj2Ws8efZrTSoG1FGSaJaXjq3WDy4YqJf+FdEKEmKnQPhmXsmrw/avvim5Tg74jBxGBb7Qn60/ASqWft5Y5TCWQUHosBgGYc3FuwAtL+XY16C669Up+hcf1mYyRMnOADpzR0/1vJNKjknICcBDTOMLkCFNiHBpVFhAuAdJgye/QqBy5Iponi6kiacm4CkmDxbSFmBAZ7J0OeCr8lkA5HGGkEyKVVP67K1RSBq3yUIOZqLq3HaR4yuYZm6csFlPJC8afYSEmSIwDcZ3FVIGyLt3ECADiRiQOjcpzgLm/c/zbr79/cOvB9nCvVRn6Tt2za1mj6miBzDgCYwmUJRAGT4UnCuMoTIbF1KsIlkurGuemYpCM89cBsTXa/fGHn25vTqc7x/fGhweT051b9/duH053jg52Tw52Tx/cOTzYPb03fng0fbq3OR2P7kNcu4rg2cOvj3e/7BQ/HFSOO8UpDngAQK3Y69bW68Xeem/cLA/7je217rhTXWsG/UFzc9TZbleGw852M+iz86H0Fx38LsHmzYPJrRPfaFt8zeSrLKqm5xSX1lqiXil0l/LdktfsVIem4CGAwmIQBQwKGCwGrwHc07qHO18plLfw1iOXEPCUQSR4EuFSMYpIRCGhZGizLZqmkFOhC3FdoCyIa2dzkmaBQaOSAQtld8jhJhnn30tQK/ZKbjPMgHj48jxgAUBZ0lhIqGxKp1E5FcYZd3EJIkcZgi9SJjMvCYx91QwEygqNfKYjjnDLpdUvPnvZqY5Wa+slr2mKeY3PGYIvMHbktIsrHdU0i6nLCbLqedJFWfTk6Pnr1282+ne3R3c3+pOV6uhstoNGabWy2Cl77UapW/VbtWI38MK+Z4H6XoJ2Zejby7NFI5AwvPiztmTmbEvP7kcDCI/JMLeppGyJfrQZ0tUSlf2Wby+T18+/coXh3oer3wIr1WGl0O1U10whtxAL/zn/L8E/g2gHLM8WYrYAAAAASUVORK5CYII=" nextheight="912" nextwidth="1390" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>And that's it! Your code is now logged in Farcodes. Now when a friend of yours - or even a complete stranger goes to find a referral code for Uber Eats, they might just see yours!</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e278051ea27c631fa622cd78daecc10e.gif" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAVCAIAAACor3u9AAAACXBIWXMAAAPoAAAD6AG1e1JrAAAEt0lEQVR4nJ1UyW8bZRz9wsSxM9gZz759M+PZZ2yP932Jl5LYdTa32E7buE3bgJpITVtUlkNRy4FFVBxAnDlxgAt/BhInzj2WAwf+A04UOQNRCKQqkZ5Goxn99vceoFEJQzgiIOABgXsdXtHFArRVIenGcmQQRhGeCAj/CQ5TO6VxKbFBBqEtZ9xYztXytpxyYxk3lhFxnY8oAqaBYqLOR1UyKKLzosdKv+8WPuxUWt3tYW9sQk9iLL/MMfzsUYQ3xORyeUVhdWoBbqyMR+vXJ1s3L/WvDNd2Jlu7aadu8AmNi4NiqpXQC34YHhAgQOl5jiV0ltAMmDLktMLHFT4e4xyFj2t8gkal4xphwOKIwIYVz66l3WbabXp23bPrJkw7WjGulw3RAxm35lkVP0BmzAeHj7r1Qdlr5RMNMgjJIKRRiUblo+fshQrJ/nf/FxmEbFgRcZ3DVA5T69luv71ZTbdZVKJDMovKoOw12bBCBuEioJNW8cUfLx7ef1RMderFnsQ6uuj5Rzq1Ih9/l5cETGVRiY/EIGWIlCkzloBpIq6LUQ3wuBaZY8kgJBCeCSut6qCcazswb0cqNlmOIvxxv6dABIRFgGMIx4TgsD+9vXP38trO9cmd1foaxA2VdfjIbDJQ9NoyY+GIQAYgFZIdOpaETsqtp8yKZ1VdLXdWdh43+/UbtlRZBNyTO9tP3z/slEeWmNY4V2EsV6nujZ6sNW+DtFuBlBZ5jcLmWSwAqxSsCXo+1cm4NfuIcP8mKBmASwjLY9abqw+SamsB0B8d3Dy8dlXhkraUsqWcyjqmkBksTxuZNZAyGvySpTIphUqKlClQBkeoM6ogfGSOjczNJHIKUYTnMA1SehRhuCWFmIc//fjz119+c7Fzeas36RQ3Fdq2pPL+tU82W2+DtyafDmr3NhrvbDQfmkIpCEg2rHCE5tOfPGM/AqVLjEkGRY6I0ai0P7l+qTeuprtZt1r2Wp5aTKj1Vm5YclcBg2ocpvO4QaNKQi/+8vzX7dEtCpV1MRnjnLNkHEU4ckHa7B6s1nbRkPz8q3e/f3in252M1qaT4a2cUSk5/Xu3vhiv3gWeXogiXDTAhedolXO++/aHN5rrRBCKjMnj2lkFiIBAh5SKt563exSq9JKDtnFBZeMK4/g0PTpDzhAyoF3uc5jqExwP8AAgi4D2Fx098qiXYBEQYUDSqGQKOVep2lLagilbzsiMBSkDUjqkdNCtDkyY9P3uSJYzob48L3FCaNTC7CrbWzfu7t0fb0zHG9PJ1q4FUwpjS7Sl0DZgwzMb8O957DOvDjIIFwD927Nnnz9+KuKGzick2pJo05HKB9PPLnUPQCnV4qN/rejVeyf+icP999ZXxp5VsWN5g08ojG2K2eGFvVZhCCBl0CicKflcExABgUWly6Obg95ktbFpy1knlpNo0xRye6PH68t74KSFnWeC4EzV02sf7+58UEo0DMEzRM/g48V4e7O1385PQC3bObnQc0zAhMTl8qRWGDpyxtGKhujZUqqR7V9dv3exvgNKiSa3pByL9v9mjyI8uxQTsNjMOylTpEyFcdhIDENmwlpCWNAorNSy7axbPfcEs6ggJAOnY/2O/wSuegYKCLTNRwAAAABJRU5ErkJggg==" nextheight="912" nextwidth="1390" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><div class="relative header-and-anchor"><h3 id="h-algorithm">Algorithm</h3></div><p>People typically only need one referral code from any given program, so whose codes get shown first? When you try to redeem a code farcodes will:</p><ol><li><p>Try to find a referral code from one of your mutuals and show that</p></li><li><p>Otherwise, try to find a referral code from someone you follow</p></li><li><p>Otherwise, promote a referral code from anyone hopefully ordered in a way that promotes equitable access to referrals.</p></li></ol><div class="relative header-and-anchor"><h3 id="h-whats-next">What's next?</h3></div><p>There's a lot of programs I need to add, so for the next while I'll just be adding them in daily. Make sure you follow the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/channel/farcodes">/farcodes</a> channel or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://farcaster.id/semicolon.eth">me</a> for updates on programs as they stream in!</p><p></p><p></p>]]></content:encoded>
            <author>semicolon@newsletter.paragraph.com (Semicolon)</author>
            <category>frames</category>
            <category>farcaster</category>
            <category>launch</category>
        </item>
        <item>
            <title><![CDATA[ComposeCast.xyz]]></title>
            <link>https://paragraph.com/@semicolon/composecastxyz</link>
            <guid>RC50AjRZVDRYUe28tnZY</guid>
            <pubDate>Fri, 26 Apr 2024 05:07:17 GMT</pubDate>
            <description><![CDATA[There's a low impact (for now) centralizing force in the Farcaster ecosystem. I had this realization when building the https://far.date frame recentl...]]></description>
            <content:encoded><![CDATA[<p>There's a low impact (for now) centralizing force in the Farcaster ecosystem. I had this realization when building the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://far.date">https://far.date</a> frame recently - a good number of frames need to be able to prompt a user to make a cast. Additionally many Farcaster ecosystem applications/clients are read-only by design. The only way for these applications and frames to write a cast is by sending the user to: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/compose?text=Blah">https://warpcast.com/~/compose?text=Blah</a> </p><p>Which is great for Warpcast and not so great for everyone else. This isn't the end of the world, Warpcast deserve all the success in the world, but it would be better if there was a client agnostic way of prompting for a cast. There's some options that could be considered at the protocol level.</p><div class="relative header-and-anchor"><h2 id="h-option-1-compose-frame-action">Option 1 - Compose frame action </h2></div><p>One approach could be supporting a new <strong>compose</strong> action type in frames. I.e. a frame implementor would nominate a button as a compose prompt, clicking the button would tell the client to begin composing a cast with the format text in the <strong>target</strong>. </p><pre data-type="codeBlock"><code><span class="hljs-operator">&lt;</span>meta property<span class="hljs-operator">=</span><span class="hljs-string">"fc:frame:button:1:action"</span> content<span class="hljs-operator">=</span><span class="hljs-string">"compose"</span> <span class="hljs-operator">/</span><span class="hljs-operator">&gt;</span>
<span class="hljs-operator">&lt;</span>meta property<span class="hljs-operator">=</span><span class="hljs-string">"fc:frame:button:1:target"</span> content<span class="hljs-operator">=</span><span class="hljs-string">"Sample text you want to prompt the user to share"</span> <span class="hljs-operator">/</span><span class="hljs-operator">&gt;</span></code></pre><p>This probably isn't the worst idea in the world, but the problem with this approach is it presupposes that the client that's showing the frame has permission to, or wants to cast on the user's behalf. I.e. this works for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://supercase.xyz">supercast.xyz</a> but doesn't work for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://farcasteruserstats.com">farcasteruserstats.com</a> say.</p><p>If the client has to delegate that responsibility, then we're back to them just firing off to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/compose?text=Blah">https://warpcast.com/~/compose?text=Blah</a></p><div class="relative header-and-anchor"><h2 id="h-option-2-compose-farcaster-scheme">Option 2 - Compose Farcaster scheme</h2></div><p>There's currently (afaik) only two Farcaster scheme URLs supported widely right now. <code>farcaster://connect?channelToken={Token}&amp;nonce={Nonce}&amp;siweUri={Uri}&amp;domain={Domain}</code> and <code>farcaster://fid/123</code>.</p><p>We could introduce another one which matches the Warpcast scheme: <code>farcaster://connect?text=Blah&amp;embeds[]=google.com</code></p><p>This should probably be done too, but relying entirely on this would have it's downsides too. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto://"><strong>mailto://</strong></a><strong> </strong>works because there's very few contexts when it comes to email; basically just work or personal email.</p><p>But when it comes to Farcaster, in the not so distant future I might very well have a client for general posting, one for movie reviews, one for gaming, one for work, one for board games, and so on. I.e. <code>farcaster://connect</code> is a good idea, but always delegating to that will centralize too.</p><div class="relative header-and-anchor"><h2 id="h-option-3-aggregator">Option 3 - Aggregator</h2></div><p>If you agree with the above, then I think the honest solution is that there needs to be some interpretation of user preferences at the application layer. This is not going to be easy going forward, and it's just won't be reasonable for individual frame developers or even SME-like Farcaster clients to build that infrastructure. </p><p>As time goes on it will get exponentially harder to support all the clients for all the primary Farcaster verbs (like compose), which will mean that we'll get pareto quickly via most implementers only supporting a "Compose via Warpcast" and "Compose via Supercast" etc. but not "Compose via App that was built 2 days ago".</p><p>It is also not reasonable to expect a frame developer, or a read-only client developer to know the user's preferences. These preferences might not be publicly inferable. You might for instance be able to infer that a user prefers to compose casts through Warpcast because their messages are usually signed by Warpcast. However, in the future it's more likely most apps will sign through some third party like Neynar which obfuscates the origin. Additionally if we find ourselves in a world where users self sign messages more frequently, (i.e. via self hosted applications) then we won't be able to infer this publicly.</p><p>Finally there are some user preferences that are just only knowable by the user. For instance, if I'm prompted to post a cast via a frame I saw in Warpcast, I might want to override and instead cast that via Supercast.</p><div class="relative header-and-anchor"><h2 id="h-composecastxyz">ComposeCastxyz</h2></div><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/88ee5080b31fb8abfe12acc696bc66b7.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>I've spent the last couple days building out <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://composecast.xyz">https://composecast.xyz</a> which I think is a good enough option for now to replace <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/compose">https://warpcast.com/~/compose</a> links. </p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://ComposeCast.xyz">ComposeCast.xyz</a> is fully MIT licensed and available here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/0xSemicolon/composecastxyz">https://github.com/0xSemicolon/composecastxyz</a>. Feel free to self host it, add as a subdomain like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://compose.yourdomain.com">compose.yourdomain.com</a> and so on.</p><p>User preferences are stored on device only via IndexedDB. There is no backend and the application is purely static. This should mean it can survive for a while with no support. The configurations are Automerge CRDTs so in the future - with a bit more work - they could be synced via File Access APIs.</p><p>If you're already sending users to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/compose?test=Blah&amp;embeds[]=google.com">https://warpcast.com/~/compose?text=Blah&amp;embeds[]=google.com</a> you can update the URL to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/~/compose?test=Blah&amp;embeds[]=google.com">https://composecast.xyz?text=Blah&amp;embeds[]=google.com</a>.</p><div class="relative header-and-anchor"><h3 id="h-fair-playing-ground">Fair Playing Ground</h3></div><p>In lieu of any information about a user's preferences, the clients presented to the user are randomized every session. As more clients get added this might need to be addressed but for now I think this is the fairest option.</p><div class="relative header-and-anchor"><h3 id="h-user-preference-1-starred-clients">User Preference #1 - Starred Clients</h3></div><p>When a user composes a cast through this platform they can nominate it as a preferred / starred client. On future sessions it will render as starred always at the top of the stack.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c6460bdbe6de2526832a5bd42bcc55c4.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><div class="relative header-and-anchor"><h3 id="h-user-preference-2-automatic-redirects">User Preference #2 - Automatic Redirects</h3></div><p>When the <code>document.referrer</code> or the query param <code>referrer</code> is a well known URL <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://composecast.xyz">composecast.xyz</a> will automatically pop up the client being referenced. Users can additionally set to automatically redirect so that after the first use <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://composecast.xyz">composecast.xyz</a> will disappear when being used by that application.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1335abc2e4421afa96d1c18e2c67d5e2.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://composecast.xyz/?text=Blah%20blah%20blah&amp;referrer=warpcast.com">https://composecast.xyz/?text=Blah%20blah%20blah&amp;referrer=warpcast.com</a></figcaption></figure><p>Also the client being referred will be prioritized in the list and very clearly highlighted.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8787cf7eb733b657d59b22c44cbf26bb.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><div class="relative header-and-anchor"><h3 id="h-client-preference-1-order-jacking">Client Preference #1 - Order Jacking</h3></div><p>If the developer who is creating the link has a preference of client that should be used for the post then they can nominate the clients they would prefer the user pick from via <code>preferred[]</code> query parameters.</p><p>For example, if a frame developer knows that only <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://supercast.xyz">supercast.xyz</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://warpcast.com">warpcast.com</a> support a feature they need for the cast to be posted (maybe video, improved UI for some other primitive) then they can nominate them </p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fa443cd44cc9f26cea14f041ba1c30fb.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class=""><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://composecast.xyz/?text=Blah%20blah%20blah&amp;preferred[]=supercast.xyz&amp;preferred[]=warpcast.com">https://composecast.xyz/?text=Blah%20blah%20blah&amp;preferred[]=supercast.xyz&amp;preferred[]=warpcast.com</a></figcaption></figure><div class="relative header-and-anchor"><h2 id="h-issues">Issues</h2></div><ol><li><p><code>document.referrer</code> works but won't be present for most use cases, will probably need a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://composecast.xyz">composecast.xyz</a> frame to get that working properly. In the interim clients could intercept <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://composecast.xyz">composecast.xyz</a> links and attach a <code>referrer</code> query param (or just go straight to their compose screen if they don't need to respect user preference).  </p></li><li><p>This should really be a PWA and I haven't set that up yet, there's also a set of performance tweaks to do.</p></li></ol><div class="relative header-and-anchor"><h2 id="h-future">Future</h2></div><p>First of all thanks for getting this far. If you are you building a farcaster client, or you know someone who is, or you want to contribute, or you're just interested in this problem please DM me on FC and lets get it supported on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://composecast.xyz">composecast.xyz</a>. Additionally PRs are open so have a go!</p><p>Long term we just need to support more clients. At the moment there's 5 clients supported, but only 1 of them actually supports instant fulfilment because only 1 actually has a <code>/compose</code> like route that accepts query params.</p><p>What I'd like to get done this year:</p><ol><li><p>Double digit % of all farcaster clients supported</p></li><li><p>Self hosted clients supported</p></li><li><p>Neynar option added</p></li><li><p>Import / export preference configuration via file system access APIs</p></li><li><p>Frame to get <code>document.referrer</code> working in most cases</p></li></ol><p><span data-name="wave" class="emoji" data-type="emoji">👋</span></p><p><br></p><p></p>]]></content:encoded>
            <author>semicolon@newsletter.paragraph.com (Semicolon)</author>
            <category>farcaster</category>
            <category>frames</category>
            <category>composability</category>
            <category>warpcast</category>
        </item>
        <item>
            <title><![CDATA[Frames extension idea: Statuses ✅]]></title>
            <link>https://paragraph.com/@semicolon/frames-extension-idea-statuses-✅</link>
            <guid>9bFRqrlid98Difw53NNg</guid>
            <pubDate>Mon, 29 Jan 2024 10:19:30 GMT</pubDate>
            <description><![CDATA[1) WhatThere's currently no way of showing a dynamic experience in a frame without a user interacting with a frame. You could push details about the ...]]></description>
            <content:encoded><![CDATA[<h2>1) What</h2><p>There's currently no way of showing a dynamic experience in a frame without a user interacting with a frame. You could push details about the user in the first get, but it would make frames less indexable, and could leak session data without permission. </p><p>The idea is to add a new meta tag <strong>fc:frame:status</strong> which indicates the "status" that will be shown if a condition is met. Here's an example:</p><pre class="dont-break-out text-sm md:text-base"><code>&lt;meta property="fc:frame:status:✅" content="ERC721:0x123...:*" /&gt;</code></pre><p>This would indicate that the frame for the current user should receive the status <span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span> if the user has any ERC-721 from the supplied contract.</p><p>Another condition could be an individual token, <strong>ERC721:0x123...:1 </strong>or a range of tokens <strong>ERC721:0x123...:1-2,4-5</strong>. The client can then indicate on the frame that the status has been achieved. For example, Warpcast might choose to display the status this way:</p><figure float="none" width="528px" data-type="figure" class="img-center" style="max-width: 528px;"><img src="https://storage.googleapis.com/papyrus_images/01db71b749b51c519b98e7a0a87012f7.png" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Additionally, it might be useful to add additional metadata that could drive how certain states are interpreted by the client, for instance indicating which image should be displayed if a status has been achieved.</p><pre class="dont-break-out text-sm md:text-base"><code>&lt;meta property="fc:frame:status:✅:image" content="https://..." /&gt;</code></pre><p>Unlike the first option this could leak some amount of information to the website, e.g. if I sent someone.eth the NFT 0x123...:1 and I was tracking views to the image specifically crafted for that NFT I would know at what point in time they saw the cast (or at least when a client claimed to have shown it). This might be something privacy focused users opt out of.</p><h2>2) Why</h2><ol><li><p>Helps indicate state without having to interact with the frame:</p><ol><li><p>Check if I still have my tamagotchi <span data-name="alien_monster" class="emoji" data-type="emoji">👾</span>, does it need cleaning <span data-name="poop" class="emoji" data-type="emoji">💩</span> or is it dead <span data-name="skull" class="emoji" data-type="emoji">💀</span></p></li><li><p>Have I already won <span data-name="crown" class="emoji" data-type="emoji">👑</span> or lost <span data-name="loudly_crying_face" class="emoji" data-type="emoji">😭</span> the game someone started with me</p></li><li><p>Am I currently holding the hot potato <span data-name="potato" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f954.png" draggable="false" loading="lazy" align="absmiddle"></span> or has it exploded <span data-name="bomb" class="emoji" data-type="emoji">💣</span></p></li><li><p>Have I already completed this task <span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span> (Mint, Survey, whatever - i.e. POAP)</p></li></ol></li><li><p>Think Frame Friday showed how creative people can be, these are just some ideas but I'm sure smart people could come up with a million more.</p></li><li><p>Might help frame spam, i.e. I can see on the frame I've successfully interacted with the frame that minted the token.</p></li><li><p>There's even space for some real-time component to this in the far future, e.g. if the client is listening for changes to the user's NFT wallet both the utf-8 icon statuses and even the images could be updated accordingly.</p></li><li><p>It's extensible I've so far only discussed the condition name ERC721, however clients could converge on other conditions such as Liked:&lt;Cast&gt;, Retweeted:&lt;Cast&gt; etc.</p><p></p><p></p></li></ol><p></p>]]></content:encoded>
            <author>semicolon@newsletter.paragraph.com (Semicolon)</author>
            <category>frames</category>
            <category>farcaster</category>
            <category>nft</category>
        </item>
    </channel>
</rss>