<?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>tmw</title>
        <link>https://paragraph.com/@tmw</link>
        <description>Web2 CTO |||||| Web3 Buidler </description>
        <lastBuildDate>Thu, 09 Apr 2026 13:15:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>tmw</title>
            <url>https://storage.googleapis.com/papyrus_images/434103d0b9871fcac50ee4dc82e420e214ff8be1dd85b2246e393623b9f3acf4.png</url>
            <link>https://paragraph.com/@tmw</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Cleaning 70k entries]]></title>
            <link>https://paragraph.com/@tmw/cleaning-70k-entries</link>
            <guid>S7ujdRgt7GpKUk0mGrfq</guid>
            <pubDate>Mon, 27 Jun 2022 17:08:23 GMT</pubDate>
            <description><![CDATA[My chest was tight when we pushed the raffle page live. The posse has taken down our website before and this was probably the biggest thing we’d launched since the Test Subject DB. We’d learnt a lot since then; we now have a whole load testing process where we can model the volume we have come to expect and build our tech accordingly. On the flip side I also didn’t know how quick uptake would be! As we all know, the market is weird right now. As I hit the deploy button I refreshed our databas...]]></description>
            <content:encoded><![CDATA[<p>My chest was tight when we pushed the raffle page live. The posse has taken down our website before and this was probably the biggest thing we’d launched since the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pssssd.xyz/db">Test Subject DB</a>. We’d learnt a lot since then; we now have a whole load testing process where we can model the volume we have come to expect and build our tech accordingly.</p><p>On the flip side I also didn’t know how quick uptake would be! As we all know, the market is weird right now. As I hit the deploy button I refreshed our database every 5 minutes, seeing the entries come in and texting Joe a running count. <strong>I did not expect we’d hit almost 70k unique entries in 48 hours</strong>. Although, we couldn’t celebrate just yet, it was time to clean the list for bots and malicious intent.</p><p>It’s pretty expected that a project of our “hype” would have lots of people trying to bot it, multi-wallet or abuse it in general. We actually received some screenshots of developers writing and testing their code! As a dev myself, it was interesting to see that the amount of bot entries grew exponentially as time went on; developers had clearly been working on programmatically interacting with the page or structuring their API requests through trial and error, finally cracking it towards the end of the raffle window. We knew this was going to happen, and we were ready.</p><p><strong>In the end we ended with around 3x the wallets that we were aiming for, all ready to mint.</strong> I wanted to share some of the insights that we had doing this, and some of the techniques, so that we can spread our knowledge to other collections launching in the future:</p><h2 id="h-p1-data-collection" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">P1: Data Collection</h2><p>I had a rough idea of bots as the raffle went on as we were using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.google.com/recaptcha/about/">Google reCAPTCHA</a> which gave every entry a score from 0 to 1 (0 being likely a bot, 1 being not a bot). They base this on a bunch of factors that I won’t go into, but in short, it’s clever. We also collected a hashed version of the ip (you hash it to prevent storing personal information on the server but still being able to check for uniqueness) and from the Discord and Twitter authentication we could check ages of accounts. We enforced uniqueness on Discord, Twitter and ETH address. Everything else were used for context, rather than hard cut-offs. In general we didn’t want to exclude genuine people who, for example, may have only figured out what Discord and NFTs were in the last couple weeks.</p><h2 id="h-p2-scoring" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">P2: Scoring</h2><p>We worked with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/Sarangowri4">gMan</a> who has de-botted raffles recently for projects like Boki, Lacoste and Sneaker Heads (as well as working with RCC and others with his other product: NFT Sentry). I won’t go into all the specifics as that is his secret sauce but I’ll tell you about some interesting decisions we made. Mostly because I found it fascinating!</p><h3 id="h-wallet-balances-multi-walleting" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Wallet Balances/ Multi-walleting</h3><p>One of the key ways to bot a raffle is to move ETH around. You enter with one wallet, transfer the 0.35 ETH to another and then enter again. This bypasses any validation you have. Luckily this is fairly easy to detect.</p><p>Firstly you can look at wallet funders, and detect which wallet has funded the entry and you can jump back as many transactions as you want to start to build a complex picture of wallet relations. Our longest chain of eth transfers was 124 wallets long! And a single wallet funded over 90 raffle submissions.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/06179f558bf7d315ec0cd8bd3a891e48b8bbeb390ce6098939b20c267cfd72c4.png" alt="A snapshot of one of our wallet chains" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">A snapshot of one of our wallet chains</figcaption></figure><p>There are of course thresholds to this, as friends or partners pay each other in ETH all the time. That’s why very few of these things are hard cut-offs but instead context that we can combine with other factors that help us to make informed decisions.</p><p>Secondly, we also looked at balances, and whether you actually had ETH in your wallet when you entered (technically it was possible to spoof it on the client to get round validation at the time). But we didn’t just look at ETH, but also stables. Especially in the bear market right now, a lot of people transferred into ETH to enter the raffle and then back into stables. In hindsight I should have checked stables on entry and not just ETH, and would encourage other projects to do this for future raffles in the current market!</p><p>Both of these gave us a picture of genuine funding.</p><h3 id="h-ips" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">IPs</h3><p>I mentioned earlier we collected IP hashes, generally this allows you to spot when one person is sending multiple entries from the same location. We didn’t force uniqueness on this, I’ve seen enough stories of partners in the same household wanting to mint and be refused; however it’s unlikely there is a 4 or 5 person household all entering from the same IP. More context.</p><h3 id="h-recaptcha" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">reCAPTCHA</h3><p>ReCAPTCHA can be blocked by ad-blockers and other privacy software, so if we didn’t have a score we didn’t penalise you.</p><h3 id="h-polygraph" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Polygraph</h3><p>We put these in there as basic questions that were easy to answer if you had some interest in the project. Ultimately we wanted winners of the raffle to be biased towards community members that had missed out on Test Subject status. We only cut-off entries who got them all wrong, otherwise it just affected the overall scoring.</p><h2 id="h-summarising" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Summarising</h2><p>What I’ve found interesting doing this is that it’s shocking that any project can do a fully open public mint. Perhaps at a certain scale bot developers aren’t interested, but even if there is a small risk, it doesn’t seem worth it, even if you’re doing a raffle where “everybody” wins.</p><p>All of the above, helped us build context on every entry and form a holistic picture of who were likely bots and those that were real people. Because of this, <strong>I have a high degree of confidence that those minting in our public allocation will be genuine holders</strong>. If you are a lucky winner, it’s worth reminding you that the public mint will be oversubscribed. I know, I know, and I’m sorry. But no-one wants a slow mint or multiple complex phases and even with the oversubscription the gas will be fine and much better than if there was no raffle at all (as seen above) - more on this in a future post.</p><p>More details on mint day (30th) timings/ phases coming soon.</p><hr><h3 id="h-ps-for-holders" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">P.S. For Holders</h3><p>Everyone who entered our raffle and we deemed not malicious had a chance to win. But it’s worth saying that all of the above wallet intel could also be used to start to look at your behaviour as a holder and filter on that. I say that only because I reckon most people don’t know that? I certainly didn’t think about it before this; so it’s worth being aware of what you think your wallet says about you as you enter future raffles.</p><h3 id="h-ps-for-projects" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">P.S. For Projects</h3><p>We now have a fairly good dataset on wallet addresses, discord and twitter accounts that are bots or malicious. I’m more than happy to share this with any project creator who reaches out.</p>]]></content:encoded>
            <author>tmw@newsletter.paragraph.com (tmw)</author>
        </item>
        <item>
            <title><![CDATA[The Possessed Mint Details]]></title>
            <link>https://paragraph.com/@tmw/the-possessed-mint-details</link>
            <guid>RaE3xj0GG7Qr89VEXrlT</guid>
            <pubDate>Wed, 08 Jun 2022 18:36:31 GMT</pubDate>
            <description><![CDATA[Feels like we’ve been waiting for this day forever right? I’ll get straight into the details and then explain a bit more about our rationale below:Public Raffle Entry: June 14th - 16th (48 hours)Mint Date: June 30th (AL and winners of public raffle)AL Mint Price: 0.25Public Mint Price: 0.35By the time Mint Date rolls around it’ll be a little over 5 months since we announced ourselves on Twitter. From a hype perspective, we definitely could have pushed to launch earlier. From a market perspect...]]></description>
            <content:encoded><![CDATA[<p>Feels like we’ve been waiting for this day forever right? I’ll get straight into the details and then explain a bit more about our rationale below:</p><ul><li><p><strong>Public Raffle Entry:</strong> June 14th - 16th (48 hours)</p></li><li><p><strong>Mint Date:</strong> June 30th (AL and winners of public raffle)</p></li><li><p><strong>AL Mint Price:</strong> 0.25</p></li><li><p><strong>Public Mint Price:</strong> 0.35</p></li></ul><p>By the time Mint Date rolls around it’ll be a little over 5 months since we announced ourselves on Twitter. From a hype perspective, we definitely could have pushed to launch earlier. From a market perspective it probably would have been a smarter decision. But from a project and brand perspective, it wasn’t right. @whatthefurr and I always said that we wanted to take our time to build out the brand, community, art and tech so that we could really deliver something of a high quality with longevity and a vision; something where the art draws you in but the purpose and community keep you here.</p><p>Probably worth saying a couple things about the market and price, especially since everyone is like “FREE MINTS ARE THE NEW META!!!”. Firstly, I don’t think they are (remember Simp DAOs anyone?) and I have more thoughts on this that’ll just distract from this announcement if I go into it too much. Secondly, we’ve seen projects successfully mint out recently that aren’t free mints, and if anything what I hope is that this new “meta” means that we start to expect more from projects that aren’t free; high quality art, tight-knit communities, experienced founders and visions to change the world beyond our web3 bubble. Hopefully you feel our mint price is fair value for that. Thirdly, 1 ETH is 1 ETH.</p><p><em>Small disclaimer:</em> We wanted to announce all these details with enough notice as possible so you have the opportunity to plan around it. We <strong>hate</strong> stealth drops/ surprise mints and <strong>will never do this.</strong> However, this does mean that anything could still change, the market could completely collapse, or our delivery could get hampered as maybe @whatthefurr or I get ill. My point is, we’ll try our best not to move the goal posts but there are cases where this could still happen.</p><h3 id="h-faqs" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">FAQs</h3><ul><li><p><strong>Is it 3 NFTs or 1?</strong> When you mint one of The Possessed you get a single NFT that animates from Blessed to Possessed. You can change this on-chain to animate from Possessed to Blessed, meaning you can use the Blessed or Possessed as your static/ animated pfp.</p></li><li><p><strong>How many can I mint?</strong> The majority of people will only be able to mint 1.</p></li><li><p><strong>What is the allocation between AL and public?</strong> We’ll still be giving out AL (Test Subject) spots to community members and we have a few more agreed collabs coming up which means we can’t give an exact split right now.</p></li><li><p><strong>Have I lost my chance to become a Test Subject?</strong> No! We’ll be giving out Test Subject (AL) spots all the way up until the raffle winners are announced, which will be around the 27th/ 28th.</p></li><li><p><strong>How do I enter the public raffle?</strong> We’ll announce the raffle URL when it opens on the 14th via our Twitter. You will need to connect your Twitter, Discord and wallet (and have 0.35 ETH in that account) to enter.</p></li><li><p><strong>How many times can I enter the public raffle?</strong> Only once. We’ll be processing the list after the raffle is closed to remove duplicates, bots and malicious wallets.</p></li><li><p><strong>Can I win the public raffle if I am on the AL?</strong> No, and if you win a Test Subject (AL) spot between the raffle closing and winners being announced then you’ll be on the AL and not the public allocation.</p></li><li><p><strong>Does winning the public raffle guarantee mint?</strong> I know this can be annoying but unfortunately no. We’ll be slightly oversubscribing the public allocation so that we don’t have to do any complicated 3rd/4th phases. The raffle mainly serves as a mechanism to reduce gas wars and bots.</p></li><li><p><strong>Does being on the AL guarantee mint?</strong> Yes, until the public mint opens. More information on exact timings to be confirmed.</p></li><li><p><strong>How do I know if I’m on the AL?</strong> If you registered your Discord or Twitter address with your ETH address when you won a giveaway then you can check here <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://pssssd.xyz/connect">https://pssssd.xyz/connect</a> - we’ll be making changes to this over the coming week to allow you to just check just your ETH address and to fix some issues where Twitter/ Discord accounts are no longer accessible.</p></li><li><p><strong>Can you mint on mobile/ ledger etc.?</strong> We’ll be supporting MetaMask, Coinbase Wallet, Wallet Connect and other browser injected wallets (e.g. Brave).</p></li><li><p><strong>Has the contract been audited/ gas optimised?</strong> Yes. I could go into way more technical detail as I think the way we’re minting is really interesting but will save that for another day.</p></li></ul>]]></content:encoded>
            <author>tmw@newsletter.paragraph.com (tmw)</author>
        </item>
        <item>
            <title><![CDATA[whoami]]></title>
            <link>https://paragraph.com/@tmw/whoami</link>
            <guid>FkX7itZrWjEf1AhAfjln</guid>
            <pubDate>Tue, 08 Feb 2022 16:43:55 GMT</pubDate>
            <description><![CDATA[For those that follow NFT projects, it’s starting to become more and more important that a team is doxxed. It’s not necessary, and I respect anyone that wants to remain anonymous on the internet, but doxxing certainly increases trust with a project and it’s founders. You trust me with your ETH, I trust you with my identity. For me, it’s not like this is a big reveal. My twitter account is only pseudonymous and only became so in the last 6 months. It’s pretty easy to figure out who I am or wha...]]></description>
            <content:encoded><![CDATA[<p>For those that follow NFT projects, it’s starting to become more and more important that a team is doxxed. It’s not necessary, and I respect anyone that wants to remain anonymous on the internet, but doxxing certainly increases trust with a project and it’s founders. You trust me with your ETH, I trust you with my identity.</p><p>For me, it’s not like this is a big reveal. My twitter account is only pseudonymous and only became so in the last 6 months. It’s pretty easy to figure out who I am or what I look like. Regardless, there is a difference between making you Sherlock Holmes for information and being upfront.</p><h2 id="h-quick-note-on-pseudonymity" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">(quick note on pseudonymity)</h2><p>I just find it much more comforting and freeing. I think this is true for a lot of people. It’s certainly not to troll or be outrageous on the internet. I think a lot of people think is the reason when someone “hides” their identity online. For me, it goes back to when I started playing World of Warcraft at 15/16. While talking with my guildies over voice chat (is Ventrilo still going?), I had a different confidence and freedom that I didn’t have at school and it helped me grow into adulthood.</p><p>Anyway, enough deep shit.</p><h2 id="h-me" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Me</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fb10dd512d2e128adc5c2b634e1d172c47f199f8e848e0455c04521de9d1224a.png" alt="Pssssd fam in Margate, UK" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Pssssd fam in Margate, UK</figcaption></figure><p>That’s me on the left (@whatthefurr is on the right). I’m a 31 year old 6’6” white male (he/him). I used to live in London but now travel and work remotely from different places around Europe. In between these trips I still base myself in the UK.</p><p>I studied Computer Science at University and for the last 7 years I was the Co-Founder and CTO of a startup called <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hubblehq.com">Hubble</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fedcb4ae2a513011829521c5c400f8739b79efe587d7c9e007e894847e9ed9f5.png" alt="Hubble" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Hubble</figcaption></figure><p>Over my time there we won Deloitte&apos;s 26th Fastest Growing Technology Company in the UK, Property Week&apos;s Innovator of the Year and Best Places to Work, 2 years in a row. I was also part of Forbes 30 under 30 list. We raised over $10 million and I did everything from build the initial platform to growing the team to 50 people while managing and leading the engineering, product and design side of the business.</p><p>Is that enough web2 for you? 😅</p><h2 id="h-web2-greatergreater-web3" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">web2 &gt;&gt; web3</h2><p>Mid last year I left my startup. I needed a new challenge and was experiencing a little burnout. I could go way more into this but... another day. I’d been investing in crypto for a while but never really explored web3 proper; when you’re so zoomed in working on something it’s hard to zoom out and see what else is going on in the world.</p><p>Over these last few months I can’t describe how much I’ve been enjoying learning more and more. It’s been a while since I’ve felt this passionate. The last time was when I founded Hubble. When you get it, web3 has a magnetism to it. Not only that, I’ve just enjoyed building again (or buidling 👀). Nothing has ever replaced that flow state for me like a good day spent coding.</p><p>After spending too many hours trading NFTs and doing degen things I decided I needed to create. I had this fun Christmas idea to wrap NFTs as Christmas presents in a smart contract and only allow them to be unwrapped on Christmas Day, it was called <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nftysanta.com">NftySanta</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9a15c8af7c9c6812ac438deb79e2350019fee9aa1456e94e70d7d1081b88901e.png" alt="Nfty Santa" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Nfty Santa</figcaption></figure><p>People thought it was cool, but it never got much (any) traction. The only present sent was mine (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x1f4E4eF54dB90934DE8fB2d68438C68660099Ad4">you can check it on etherscan lol</a>). Either way I didn’t care, I was happy to take my first project from idea to the Eth mainnet, even if the gas to deploy it wasn’t worth it.</p><h2 id="h-the-possessed" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Possessed</h2><p>Over this time I’d been talking with my friend, @whatthefurr, who I’d known throughout my time at Hubble. We’d never directly worked together, just been friends, enjoyed drinks, dinner, holidays, business chats, hip hop appreciation and all that. As you can already tell, he’s an incredible artist (I’ll let him go into his background more). With my journey into crypto and his art it all just started to fall in place. We released a couple of teasers on personal accounts in replies to art requests and it started to get some love.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/whatthefurr/status/1479543101278597123">https://twitter.com/whatthefurr/status/1479543101278597123</a></p><p>A month later and we’re here!</p><p>In general though I believe the art and dev are only a small part of a successful NFT brand. Don’t get me wrong, it’s a big part. It drives the hype, love and support. But you got to follow through. I believe we can do that. Because at the end of the day, @whatthefurr and I aren’t just creatives and makers, we can build brands; and I can’t wait to tell you about our ideas for the vision of The Possessed and it’s roadmap another day... Make sure to follow us <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/tmw_buidls">@tmw_builds</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/whatthefurr">@whatthefurr</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ThePossessedNFT">@ThePossessedNFT</a> to hear about it first.</p>]]></content:encoded>
            <author>tmw@newsletter.paragraph.com (tmw)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/c1c8bde6420dbba5b0d47078e777198febcda5dde98cb02d24e688516a638e84.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Creating generative animated PFPs using After Effects]]></title>
            <link>https://paragraph.com/@tmw/creating-generative-animated-pfps-using-after-effects</link>
            <guid>VVk6qUS48kVOkJqyc1BJ</guid>
            <pubDate>Thu, 27 Jan 2022 20:48:51 GMT</pubDate>
            <description><![CDATA[Yesterday @whatthefurr (Joe) and I (@tmw_buidls / Tom) launched the first teaser of The Possessed; an NFT collection of generative animated characters. I’m biased but I think they’re f*cking based https://twitter.com/ThePossessedNFT/status/1486407373623341058 Joe is the artist, I am the dev. In a world of rugs, hacks and scams we want to be transparent from the outset about who we are, what we’re building, why and how. This is how we believe NFT projects should be built. We’ll post more about...]]></description>
            <content:encoded><![CDATA[<p>Yesterday <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/whatthefurr">@whatthefurr</a> (Joe) and I (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/tmw_buidls">@tmw_buidls</a> / Tom) launched the first teaser of The Possessed; an NFT collection of generative animated characters. I’m biased but I think they’re f*cking based</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ThePossessedNFT/status/1486407373623341058">https://twitter.com/ThePossessedNFT/status/1486407373623341058</a></p><p>Joe is the artist, I am the dev. In a world of rugs, hacks and scams we want to be transparent from the outset about who we are, what we’re building, why and how. This is how we believe NFT projects should be built. We’ll post more about ourselves in the future; but first I want to focus on the art.</p><p>Each of the Possessed is made up of hand drawn traits, edited in Illustrator and animated in After Effects. Each trait has a human state and a possessed state.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/hoody.mp4?autoplay=true&amp;loop=true&amp;muted=true">https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/hoody.mp4?autoplay=true&amp;loop=true&amp;muted=true</a></p><p>After animating each one of these in After Effects, we needed to generatively combine traits together in order to create each unique character. To do this we turned to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://lottiefiles.com/">Lottie</a>. It’s is an open source animation file format built for the web and therefore interactable with Javascript; and it has a plugin for After Effects. Using this plugin we export each trait to a Lottie JSON file and then merge them back together programmatically.</p><p>Easy right? I thought so, but Lottie file formats are complicated and so like great devs do, I turned to Google: <em>“how to merge Lottie files together”.</em> Apparently we’re the first people to do this… or at least write about it.</p><h2 id="h-an-efficient-but-unreadable-file-format" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">An efficient but unreadable file format</h2><p>Lottie files are not optimised for readability. Things like the animation timings are stored in very unhelpful variable names such as <code>op</code> and <code>ip</code>… Although at least <code>assets</code> and <code>layers</code> were obvious enough and clearly what I needed to merge. Ok, so all I need to do is:</p><ul><li><p>Group traits together with their Lottie files</p></li><li><p>Loop through each trait and pick a value</p></li><li><p>For each trait merge the assets and layers into the final Lottie file</p></li></ul><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/background.mp4?autoplay=true&amp;loop=true&amp;muted=true">https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/background.mp4?autoplay=true&amp;loop=true&amp;muted=true</a></p><p>What the?! Where are the..? Argh, apparently 0 is the top layer… I need to reverse the order I loop through traits in.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/chalked.mp4?autoplay=true&amp;loop=true&amp;muted=true">https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/chalked.mp4?autoplay=true&amp;loop=true&amp;muted=true</a></p><p>WHY ISN’T THIS WORKING?!</p><p>*returns from walk*</p><p>Looks like assets and layers are linked by an ID, so that each layer knows what asset to animate, makes sense. Apparently when you export these files from After Effects the IDs for each trait are <strong>exactly the same</strong>. Makes less sense. Time to re-map the IDs. For a while I tried to be fancy and loop through the nested hellhole of incomprehensible variable names. But I was trying to be smart when the dumb approach was better:</p><ol><li><p>Turn the trait’s Lottie file into a String</p></li><li><p>Find and replace the ID with a unique trait ID</p></li><li><p>Turn the String back into JSON</p></li></ol><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/possessed.mp4?autoplay=true&amp;loop=true&amp;muted=true">https://zwgmjglfbdtrssvsabxw.supabase.in/storage/v1/object/public/public/possessed.mp4?autoplay=true&amp;loop=true&amp;muted=true</a></p><p>Success! Right now have 32 traits across 8 categories which generates 40,320 unique characters. Math is cool. But this still isn’t enough variants for us to be happy. <strong>We want every single one of The Possessed to look different (not just be different)</strong> and, of course, some traits to be rarer than others.</p><p>Want to see when we create new traits? Want to come along on our ride as we post about Dev, Design, Roadmap decisions and more? Follow <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/ThePossessedNFT">@ThePossessedNFT</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/whatthefurr">@whatthefurr</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/tmw_buidls">@tmw_buidls.</a></p><p>And if you like this, share it and I’ll write more.</p>]]></content:encoded>
            <author>tmw@newsletter.paragraph.com (tmw)</author>
        </item>
    </channel>
</rss>