changelog

(Updated )

A list of all that's new and improved in 42colors.


  • - Made 42colors.com responsive. It's important to be able to share your art with friends when you're in person. Now you can!
    • Fixed the canvas flickering that was happening on iOS devices due to how I was using `drawImage` from a webgpu canvas to a 2d canvas.
    • Made the footer and navigation mobile responsive.
    • Added undo and redo buttons so that those operations are available on touch devices.
  • - Updated the number field component to work with touch inputs. Thanks Base UI!
  • - Added a move tool to 42colors.com so it's more intuitive how you can navigate around the canvas. You can either select this tool in the top right toolbar or toggle into it by holding the spacebar.Once selected it enables moving around the canvas with arrow keys too.
  • - Disabled all complex tools when you aren't logged in.
  • - Created the voting system.You can now vote on your favorite plots to encourage the artist, propel them up the leaderboard, and give them more pixels.

    Key features:
    • Your personal log now shows aggregated vote data for who you vote for and for the votes you receive. It even has a way to quickly navigate to the plots in question.
    • There is a new "top" tab in the plots popover that ranks plots by the number of votes they have. Soon I'll build a proper leaderboard with time based filters, but for now this is the best way to find the top art on the platform.
    Little details:
    • Voting for a plot gives the author 1000 pixels. I'll probably tweak this as the economy for pixels evolves, but wanted it to be very incentivizing even with the current low user count.
    • You can only vote for a plot once.
    • You can't vote for your own plot.
    • You can't vote until you have published art of your own.
  • - Added social links in the footer menu — find us on Discord, Twitter, and Bluesky!
    • Added a way for admins to draw override plot protection. This is exclusively used for clearing non family friendly art.
    • Optimized the rendering of the realtime pixels you draw and the canvas UI (like the plot polygons) in two ways.
      • First, I render the realtime pixels and polygons on a per chunk basis. This means that only the pixels that are in the chunk you are drawing in are rendered.
      • Second, I'm rendering these canvases on demand now instead of every frame. This isolates heavy computation to only when it's needed rather than doing it every frame.
      This took over a week, and I' relieved this work is behind me, but I'm glad I did it and it will become increasingly important as people draw and the canvas grows.
    • Created the eyedropper tool.
    • Click on the canvas to quickly pick your primary color. Right click to similarly set your secondary color.

      You can also hold Option/Alt to temporarily switch to eyedropper mode from any tool. Releasing the Option/Alt key will revert to your previous tool.
    • Dropped some optimizations for the bucket tool rendering. At this point it is still pretty rough haha. Working on it!
    • Created the bucket tool.
    • Added keyboard shortcuts for camera zoom: Cmd/Ctrl + + to zoom in and Cmd/Ctrl + - to zoom out.
    • Show the title of a plot when it's selected.
  • - BIG day
    • Make is so you could drag from outside the polygon to add new vertices when editing an existing plot.
    • Made it so you could drag the points of your polygon when creating a new plot.
    • Created the line tool.
  • — 42colors.com now auto-selects the plot in the middle of your screen and displays a menu for common ops.This popover favors the bottom side, but will switch to the top position to prevent overflow, and while your scrolling, pointer events are ignored, so that your cursor doesn't get stuck.
  • — MVP is in sight. Going to start posting on here now.
    • Nobody cares until I actually have the MVP done. Lots of changes have happened, but you'll just have to wait until I ship the v1.
    • Created /design for iterating the design system. Basically a simpler storybook.
    • Shipped an update preventing non authed users from drawing.
    • Created a toast UI for explaining this to users.
  • — Experimented a bunch with how to efficiently transfer canvas data. I settled on something that is sending binary data that only includes the colors, they are then rendered based on the offset of where they were fetched from. Since I'm limiting the color palette to 42 colors I am using 1 byte for each "pixel" on the screen. This means I can fetch a 400 x 400 tile and it's at most 16,000 bytes before compression.
    During this time I also setup file based cache for the entire 10,000 x 10,000 canvas so that each request doesn't hit the database. 100,000,000 bytes is only 95 MBs, so I could keep this in memory, but I plan on expanding the canvas to by a factor of 10 so this file cache will eventually be 9.5GBs.
  • — Started working on the project again and created this route interception pattern where all routes are modals by default.
  • — Created this changelog