Motion in Camouflage
TLDR: Motion in Camouflage Demo
- click to pause the animation
- not tested on mobile
- includes flickering motion
I ended up on this page of “optical toys” that I thought was fun since the demos here illustrate how perception can deviate from objective reality. This is often something critical to keep in mind when creating design systems since “looks the same” or “feels the same” often doesn’t necessarily mean “is using the exact same values” for colors, shadows, animations, etc.
In particular I found this one interesting: https://optical.toys/persistance-of-vision-static-cube/
It reminded me of the camouflage effect from the original Predator movie.

And I thought it would be fun to have a version where you could modify the parameters a bit.
The key observation for this demo is that the shape is ONLY revealed through its motion. If you click anywhere on the scene the animation will pause and the shape will disappear. (A few additional modes were added for fun; they don’t follow this same behavior, but it will be obvious which ones only reveal shape via motion.)
Motion in Camouflage Demo — click to pause the animation.
- Warning: includes flickering motion
- Warning: not tested on mobile
- GitHub Repo
AI-Assisted Development Thoughts April 2026
Start with Vibes
I started in Replit and Google AI Studio with initial interaction explorations. It works well to bounce between free options for this because currently ROI for time spent drops off pretty steeply with vibe-only tools. It feels like most of them still have the entire codebase in context by default, which makes progress both slow and unpredictable. “Vibing” to fix bugs still is often still a recipe for frustration.
Move to LLM-Assisted
After that I moved the code to my machine so I could use Cursor and Claude. Claude I sometimes use for large scale architectural setup or changes, but Cursor has gotten a lot better at this recently.
Some things that LLMs / Cursor / Claude are good at:
-
Isolated code changes where you know exactly what you want
Using fresh context for each task, these can easily be done in parallel. It’s sometimes a good idea to quickly review the changes since there are often many ways to accomplish even simple tasks. -
Rearranging or disabling / enabling existing elements
This one is interesting because it’s not actually difficult to do these tasks, but it forces you to switch modes from thinking about the experience to thinking about how it’s built. Sometimes it’s nice to stay focused on iteratively refining the experience.
Some things that LLMs still struggle with:
-
Fixing code that never worked
Our canvas renders via React 3 Fiber and multiple buffers, which isn’t the most common use case. LLMs default to the “normal” way of doing things, so in cases where you have a good reason to do something unconventional, LLMs can get into a state where their “understanding” of the code doesn’t match reality. This is also where vibe coding often becomes untenable since the cycles are slow and making progress requires context the LLM is missing. -
Debugging
If you can point to a specific error message, your AI-assistant can help you, but if you’re describing a broken experience without specifics of how to fix it, you’re much less likely to get useful AI contributions. -
Quality
Often when someone shares their vibe-coded web app there are obvious bugs, missing links, broken responsiveness, or other undesirable behavior. For most of these issues Cursor / Claude are good tools to help resolve them, but you should assume that the experience is broken for any use-case you haven’t specifically tested for. This applies doubly for anything you’ve built that is creative or diverging from the “average” way of doing things.