“This is the most fun I had onchain in a long time”
— creators and users of BasePaint.
Let me tell you a story about building BasePaint, a collaborative pixel art project that is unlike what you typically see in the crypto space.
I’ve been writing this post for the last 100 days and did my best to make sure it’s not too boring. Buckle up and consider minting!
I remember the first time I saw the source code for an NFT smart contract. My mind was absolutely blown away. I felt like a teenager again, discovering my first computer in the 90s. And while everyone during the 2021 NFT summer was obsessed with floor prices, I just couldn’t get over how awesome and fundamentally different Ethereum was.
I needed to build something for it. A crypto-native project that would exercise all the awesome capabilities this system provided.
The idea of an app similar to Reddit’s The Place or The Million Dollar Homepage was just out there. Crypto was the perfect vehicle for it.
Around November 2021 I registered 1mpx.xyz domain for it. I spent several months building it out. Sleepless nights writing Solidity code that would render a BMP onchain.
But despite technical advancements, I still had no answer to the two most important questions: “Why would someone participate in this?” and “How to make the canvas look nice?”. You see, most /r/Place and TMDH clones end up looking like this or this — random incoherent squiggles on the surface and ponzies under the hood to drive adoption.
One day scrolling Farcaster feed I stumbled upon Base and their call for Onchain Summer. Coinbase is making its own L2 (based on the OP stack) and it needs apps.
I assumed tens of thousands of Coinbase users would come to web3 looking for things to do onchain. I wanted there to be an app that is not about trading coins or minting commemorative NFTs. Something actually fun to do onchain.
I also knew that if we had a fun project, Coinbase, and their partners would help us promote it. I’m very familiar with the pain of crypto-marketing. Base’s promise of support made me pull the trigger on starting this project.
This was the perfect opportunity to revive the 1MPX idea. However, I knew I wouldn’t be able to pull this off by myself.
I really love building in the open. Tweeting about my projects has been a huge source of energy and inspiration for me. But the most powerful thing about building in the open is that it allows me to meet like-minded people.
I met Zach about a year ago — he found one of my project ideas kind of interesting and volunteered to help out with the designs. I really loved jamming on it with Zach in Figma. That feeling when two brains multiply each other.
This time, I was also super lucky because Zach was kind of in a similar mind-space thinking about /r/Place and the fun application of crypto. Together, we shaped and refined the ideas into a fun and engaging product.
When we started, the Base launch was about 2 weeks away.
We took the 1mpx idea as the starting point. Inspiration also came from old Gameboy consoles, Teenage Engineering, Mario, Final Fantasy, DuoLinguo, Nouns, and many other products.
We quickly abandoned the idea of “tile ownership” — it motivates the behavior of hoarding tiles without making nice art. The VRGDA auctions were also axed to make the product more appealing to web3-noobs. We also skipped DAOs and treasuries, it was much simpler to directly distribute the profits to the artists.
Then we narrowed down the wide space of ideas to core mechanics. We wanted people to come to the project to make art, ideally every day. We also wanted to give people a way to make money from the art they make. Pixel art was the easiest — most people are already familiar with it, it provides a nice set of constraints but can also look very nice.
But we also knew that you can’t just open up the canvas to everyone, otherwise, you’ll end up with a terrible mess. So we came up with the idea of brushes — people will need a brush to participate. We’d control the flow of brushes to make sure it’s divided by regular folks and artists.
Base launch was looming and we didn’t have much time. We had to trim down the scope. E.g. one of the core ideas was a “continuous canvas”, every day it would grow in one direction and make it all feel like a single piece of artwork.
Zach really wanted BasePaint to have live cursors and a chat on the side (kind of like Twitch). But he also knew that these features tend to be complicated and marked them on a wishlist. I took it as a challenge and squeezed chat and live cursors into the earliest version of the product.
I’m so glad we launched with both chat and live cursors on day 1. These features really make BasePaint feel like a “place”, somewhere you can go to and feel it’s alive, with people working on art and talking at the same time. Discord wouldn’t have been the same.
We also iterated on tokenomics. The goal was to make minting and painting very accessible, while also retaining some degree of scarcity and future value. The brush costs only 0.0026 ETH (~$5), a flat price without curves or other complexities. Every day, the created canvas goes on sale for 0.0026 ETH (~$5) as an Open Edition. This means anyone can mint the artwork they like, but once the day is over, the supply of that piece is limited forever.
By the end of 2 weeks, we had something like this:
BasePaint is kind of a two-sided marketplace — you have artists who create the artwork and the collectors who pay for it. Typically, it’s very hard to bootstrap, especially in crypto, without using wild speculation incentives.
The good news was that Base promised to give us the initial boost of awareness and legitimacy. We knew this would drive the demand side of minting for at least a day or two.
Now we needed to find artists. Our testnet launch 2 days prior confirmed our fear — when left unchecked, people will simply resort to drawing their names and dick pictures.
Zach and I reached out to our friends and friends-of-friends. We also prowled dozens of Discord servers of pixel-art-related communities, DM’ed a bunch of pixel artists we loved on Twitter. Most of our calls remained unanswered, but fortunately for us, we found a group of people who really loved the project idea and gave us a shot.
A few days after launch, it was clear that our engine was working. Early artists were earning thousands of dollars, and we had a steady stream of minters.
But most important of all — the artwork looked stunning. Really, really, really beautiful.
For the last 100+ days, the first thing I check on my phone is not Twitter, Farcaster, or Hacker News. It’s BasePaint. And it’s not a coincidence, we designed it this way.
BasePaint has this nice core loop where you paint on day 1, return to mint the final canvas on day 2, and then come back again on day 3 to claim your earnings.
We designed BasePaint to have many addictive loops. Another one is for new users. Anyone can come in and paint anything without even connecting a wallet. To save, they just need to wait a little bit until the next brush mint. As they are waiting, they also see other people’s cursors come to the canvas, click around, and a few minutes later a new piece of art appears. They also see the live chat they can participate in. BasePaint feels like a lively place where they can just hang out during the day.
Themes was not part of the original idea of BasePaint. We just noticed that it’s very hard for artists to draw something on a blank canvas without any prompt. So ad-hoc on the launch day we’ve added support for a custom little title that appears on top of the canvas — it really helped rally everyone’s contributions into a cohesive picture. On Day 2 we realized that reusing the same palette would make everything look too similar, so I hacked together a way to change the palette each day.
Unsurprisingly, the number of mints after day 1 dropped significantly.
Surprisingly, after dropping it started rising again.
The thing that helped us most with the growth was partnerships. Coinbase introduced us to the folks behind Pixelmon Kevin and they promised to promote our tweets if we had a “Pixelmon Kevin” day. The artwork turned out to be really cool, and through this partnership, we also managed to get BasePaint in front of new people.
Since then, we’ve partnered with Lens, PartyDAO, @songadayman, Blitkin, and Nouns! We’ve also had “permissionless” themes for Jack Butcher, XCOPY, Pepe, and many others, which brought even more people to BasePaint.
We are also experimenting with a referral program, courtesy of ChainVine. Anyone can sign up to become BasePaint’s ambassador by filling out a form and they can earn up to 100% of BasePaint’s protocol fee.
With the growth and success came the bots. They found a way to snipe brushes as these were minted, and automated spam the canvas with random pixels. We’ve built moderation tools to help fight that, but it’s a constant arms race.
At first, I iterated on BasePaint without smart contracts. I knew that if we got the UX right, I’d be able to write a smart contract for it.
For the pixel editing experience, I was able to pull together scrapes from 1MPX. It has some smarts like the undo history, keyboard shortcuts, and storing in-progress painting to localStorage.
The rest of the web app is pretty conventional — I used NextJS, ConnectKit, tRPC, Prisma, Tailwind, viem and wagmi.
The core of BasePaint is 2 smart contracts written in Solidity: BasePaint (ERC1155 of artwork) and BasePaint Brush (ERC721 of brushes). My only regret here is not making the smart contract upgradeable — I wish I could add support for delegation and limit the ability for bots to sell brushes on marketplaces.
The most interesting bit is probably Brush minting, it uses EIP-712 signatures controlled from our server, so we can change the rules of who can mint brushes and when. E.g. the 1 brush per hour rule is implemented by using a timestamp-based nonce in signatures. Whoever uses it first, gets the brush for that hour, but the brush is not created if nobody mints it.
This time I used something different for backend indexing. Ponder is a great little indexing framework. It was super easy to get started: just write a function that given an event from the smart contract creates/updates entities in its database. Long term, however, it turned into a source of pain — because indexing is linear, every time I make a change now it has to re-index everything, which takes up to an hour. Good problem to have.
BasePaint is truly a type of product that I think wouldn’t exist without web3. I wouldn’t even consider building it on the conventional payments tech.
Payments. It’s super easy to send and receive ETH via smart contracts. The core of BasePaint’s payment system is just a few lines of code.
Trustless. I can’t cheat the artists out of their profit share even if I wanted to. All smart contracts are verified and open source, so anyone can take a look and make the decision to participate on their own.
Permissionless and composable. Anyone can build on top of these smart contracts. E.g. BasePaint Bot is a service that allows anyone to subscribe to BasePaint artwork, and they can do it without any sort of “API" keys” or permission from us.
NFTs. It's a truly unique thing that doesn’t exist on web2. Nobody in their right mind would pay $$ for a jpeg file you can simply right-click-save. But the ownership info is worth something. Most trading apps and wallets support showing your NFTs, so we didn’t have to re-invent a way to view your purchased art gallery.
Accounts. We use ENS to show user accounts throughout the app (chat, voting, leaderboards, etc.), so we don’t have to re-implement user identity in any way. We use “Sign In With Ethereum” to manage user sessions and authenticate their votes.
Pragmatically, web3 is really a great tool for implementing apps like BasePaint.
I’m very, very deep into Ethereum. I’ve invested a lot of time in learning the tools and I feel super productive in this ecosystem. I briefly considered building the previous version of BasePaint on Solana or Tezos, but that felt like a distraction.
But Ethereum mainnet is also not a great place for an app like BasePaint. “Would you like to place these 20 silly pixels for $3.74?”
It was clear that this sort of app requires a cheap and fast L2. But which one? Before BasePaint, I spent a lot of time thinking about which Ethereum-based blockchain to go for. Anything we’d pick that’s not mainnet carries with it its own onboarding cost — we need to educate the users on how to bridge, how to pay for gas, etc. Fortunately, with Base, our launch strategy depended on Base, and the Base team made sure people had smooth onboarding to their L2.
On the development experience side, the Base team has done a great job at integrating the new L2 in all the tools you’d expect. OpenSea, Etherscan, Viem, Ethers, wagmi, and Foundry — all have first-class support for Base. These are little things and technically just a configuration of (chain ID, RPC URL), but I imagine it must have been a lot of work making this experience seamless and partnerships sorted out.
Of course, none of this would have been possible without the OP stack. We are standing on the shoulders of giants.
As of today, BasePaint has distributed over 190 ETH ($389,562) to artists. In the middle of crypto winter. With zero ponzinomics. This is still crazy to me.
BasePaint ended up leading the charts of NFT projects on Base. We have been listed among the most used dApps.
The quality of the artwork has been nothing short of sublime. I’m blown away every time I visit the gallery — and it only seems to be getting better.
Dudly, one of the OG BasePaint artists has noticed that every day we post a timelapse of the canvas creation process. So he abused that to create an animation. Animation! Totally unexpected and delightful to discover (watch the eye from 0:08 on the video below).
This was so successful that we even experimented with having animation as the theme. It turned out quite nicely, drag the slider around here.
Speaking of fun things, sometimes we run some fun experiments to spice things up for the artists. There was a day when the palette was reduced to only 2 colors, or when only 100px brushes could paint yellow, or splitting artists into Red and Blue teams, or having a live music concert while people were painting.
One of our canvases end up on Times Square
This Dune dashboard uses onchain events from BasePaint and scatterplot to make art.
You can tell this Thanksgiving BasePaint was pretty high on my list of things to be grateful for. Honored to be part of this community
After launch, we got bombarded with this type of questions. But we also know that coordinating large groups of humans is a very hard problem, and it’s not the problem we need to solve just yet.
BasePaint is currently ruled by the benevolent dictatorship regime of w1nt3r and zherring. This allows us to make some unpopular decisions in the name of the greater good. We are careful to not break the delicate balance of skill and accessibility. We could probably make a ton of money selling brushes to everyone on some crazy bonding curve, but the ethos of our project is not that. BasePaint is about making great art where everyone who’s interested enough can contribute.
We are slowly giving away control though. We used to pick theme names ourselves, but then we decided to give this power to the people who hold BasePaint artworks. We started with a Prop House, then moved the voting into the BasePaint app itself (using quadratic voting).
Here’s a thing that served us really well so far — we try to never overpromise. We’ve been burned by so many crypto projects of the last several years that had these ambitious roadmaps, only to fall short and become irrelevant.
Instead, we choose to experiment and focus on things we believe in. BasePaint is an island of wholesomeness in the crypto world. We love this side of crypto — creative, fun, permissionless.
If you love the idea of BasePaint, here are a few things you can do: