Barnes Family Logo
HomeAboutProjectsBlogContact

© 2025 Chandler Barnes. All rights reserved.

GitHubLinkedInTwitter
Barnes Family Logo
HomeAboutProjectsBlogContact

© 2025 Chandler Barnes. All rights reserved.

GitHubLinkedInTwitter
Sparkling particles and glitter on a dark background
tutorialSeptember 5, 2025

I Wrote This Blog Post in Invisible Ink

How I (tried to) recreated the iOS Messages invisible ink effect using React, Canvas, and a particle system

ByChandler Barnes
#react#canvas#animation#web-development
Share this post:
TwitterLinkedIn
← Back to blog

Related Posts

Building a 404 Particle Game: When Canvas Hits Its Limits
engineering•Sep 4, 2025•5 min read

Building a 404 Particle Game: When Canvas Hits Its Limits

The journey from HTML Canvas to PixiJS, and why sometimes you need to throw out your first implementation (or three)

#webgl#game-development#performance+2 more
Abstract code visualization
announcement•Sep 2, 2025•1 min read

Hello World - Welcome to My Blog

Introducing my new blog where I'll share insights on software engineering, web development, and building scalable systems.

#announcement#meta#web-development

On this page

  • The Idea
  • Version One: Too Many Particles, Not Enough Sense
  • Version Two: The Reveal Grid
  • Version Three: Wrapped Text Is a Monster
  • Polish, Pain, and Particles
  • Accessibility & Performance (a.k.a. Pretending to Be Responsible)
  • Fun Extras
  • Why Does This Exist?
  • Closing Thought
Sparkling particles and glitter on a dark background
tutorialSeptember 5, 2025

I Wrote This Blog Post in Invisible Ink

How I (tried to) recreated the iOS Messages invisible ink effect using React, Canvas, and a particle system

ByChandler Barnes
#react#canvas#animation#web-development
Share this post:
TwitterLinkedIn
← Back to blog

Related Posts

Building a 404 Particle Game: When Canvas Hits Its Limits
engineering•Sep 4, 2025•5 min read

Building a 404 Particle Game: When Canvas Hits Its Limits

The journey from HTML Canvas to PixiJS, and why sometimes you need to throw out your first implementation (or three)

#webgl#game-development#performance+2 more
Abstract code visualization
announcement•Sep 2, 2025•1 min read

Hello World - Welcome to My Blog

Introducing my new blog where I'll share insights on software engineering, web development, and building scalable systems.

#announcement#meta#web-development

On this page

  • The Idea
  • Version One: Too Many Particles, Not Enough Sense
  • Version Two: The Reveal Grid
  • Version Three: Wrapped Text Is a Monster
  • Polish, Pain, and Particles
  • Accessibility & Performance (a.k.a. Pretending to Be Responsible)
  • Fun Extras
  • Why Does This Exist?
  • Closing Thought

The Idea

Loading...

Loading...

Version One: Too Many Particles, Not Enough Sense

Loading...

I thought: “How hard can this be? Throw some particles on a canvas, let them wiggle around, and BOOM magic dust. ✨”

Turns out: very hard.

  • If I used a fixed number of particles, sometimes it looked like a mosquito swarm, other times it looked like three lonely dots floating through space.
  • If I cranked the particle count higher, my laptop fans spun so loud they could’ve lifted a drone.
  • Text revealed… but only in bursts, like a flashlight flickering on and off in a horror movie.

I tried to fix it by having particles scatter away from your mouse or finger. Which worked, but made the reveal temporary, like brushing sand off a beach only for the waves to dump it back a second later. Not exactly the vibe.


Version Two: The Reveal Grid

So I needed a system to make the reveal stick. Enter: the Reveal Grid.

Imagine your text is covered in thousands of tiny squares. Every time you swipe across, the squares in that area “remember” they’ve been cleaned, and stay that way.

That gave me the progressive, permanent reveal I wanted. Slowly but surely, your words appear iOS-style like you’re scratching away a lottery ticket.

Loading...

But of course, that created new problems.


Version Three: Wrapped Text Is a Monster

You know what canvas hates? Paragraphs.

Canvas is great at drawing one single line of text, but the moment you try to let text wrap naturally, it just laughs at you. My invisible ink effect broke completely. Words either stretched off the page like a runaway train, or jumped around in misaligned ways that made it look like my blog had been cursed.

This is the moment where most reasonable people would’ve quit. Instead, I doubled down and invented an entirely new system:

  • CSS masks to handle the actual revealing of text, so paragraphs flow and wrap like normal blog text.
  • Canvas particles floating on top, doing the noisy, glittery, raccoon-bait visual thing.

They don’t even know each other exist, but together they pull off the illusion.


Polish, Pain, and Particles

Once it technically worked, the real fun began:

  • Particles were too spastic, so I had to smooth their motion into something dreamier.
  • The “reveal” button sometimes refused to go away, like an overeager stagehand still standing on set after the curtain rises.
  • Alignment between text and canvas was… let’s say “haunting.” Letters floated like they were levitating a few pixels above their shadows.

One by one, I solved them. Slower sine waves, fade-in characters, baselines adjusted until text finally looked like… well, text.

Loading...

Accessibility & Performance (a.k.a. Pretending to Be Responsible)

Was this effect necessary? Absolutely not. But I still didn’t want it to be evil.

  • Screen readers just get the plain text, no particle circus.
  • Keyboard users can reveal text with Enter or Space.
  • I capped particle counts and optimized animations so your device doesn’t sound like it’s about to launch into orbit.

Still, you probably don’t want more than 5 invisible-ink sections on a single page unless you want your blog to double as a space heater.


Fun Extras

Because why stop at one shiny toy?

The answer is Loading....

Or maybe you want a dramatic reveal:

Loading...

Why Does This Exist?

There’s no grand vision here. I didn’t invent a new framework or revolutionize web design.

I just made scratch-off lottery ticket text for my blog because it made me laugh. And honestly? Watching people swipe across the screen to reveal words is more delightful than any serious design essay I could’ve written.


Closing Thought

This could’ve been a beautiful deep-dive about performance tuning, grid algorithms, and web animation standards. Instead, it’s a chaotic scrapbook of particles, CSS hacks, and raccoon jokes.

I timeboxed this, which is why it turned out so crappily.

The Idea

Loading...

Loading...

Version One: Too Many Particles, Not Enough Sense

Loading...

I thought: “How hard can this be? Throw some particles on a canvas, let them wiggle around, and BOOM magic dust. ✨”

Turns out: very hard.

  • If I used a fixed number of particles, sometimes it looked like a mosquito swarm, other times it looked like three lonely dots floating through space.
  • If I cranked the particle count higher, my laptop fans spun so loud they could’ve lifted a drone.
  • Text revealed… but only in bursts, like a flashlight flickering on and off in a horror movie.

I tried to fix it by having particles scatter away from your mouse or finger. Which worked, but made the reveal temporary, like brushing sand off a beach only for the waves to dump it back a second later. Not exactly the vibe.


Version Two: The Reveal Grid

So I needed a system to make the reveal stick. Enter: the Reveal Grid.

Imagine your text is covered in thousands of tiny squares. Every time you swipe across, the squares in that area “remember” they’ve been cleaned, and stay that way.

That gave me the progressive, permanent reveal I wanted. Slowly but surely, your words appear iOS-style like you’re scratching away a lottery ticket.

Loading...

But of course, that created new problems.


Version Three: Wrapped Text Is a Monster

You know what canvas hates? Paragraphs.

Canvas is great at drawing one single line of text, but the moment you try to let text wrap naturally, it just laughs at you. My invisible ink effect broke completely. Words either stretched off the page like a runaway train, or jumped around in misaligned ways that made it look like my blog had been cursed.

This is the moment where most reasonable people would’ve quit. Instead, I doubled down and invented an entirely new system:

  • CSS masks to handle the actual revealing of text, so paragraphs flow and wrap like normal blog text.
  • Canvas particles floating on top, doing the noisy, glittery, raccoon-bait visual thing.

They don’t even know each other exist, but together they pull off the illusion.


Polish, Pain, and Particles

Once it technically worked, the real fun began:

  • Particles were too spastic, so I had to smooth their motion into something dreamier.
  • The “reveal” button sometimes refused to go away, like an overeager stagehand still standing on set after the curtain rises.
  • Alignment between text and canvas was… let’s say “haunting.” Letters floated like they were levitating a few pixels above their shadows.

One by one, I solved them. Slower sine waves, fade-in characters, baselines adjusted until text finally looked like… well, text.

Loading...

Accessibility & Performance (a.k.a. Pretending to Be Responsible)

Was this effect necessary? Absolutely not. But I still didn’t want it to be evil.

  • Screen readers just get the plain text, no particle circus.
  • Keyboard users can reveal text with Enter or Space.
  • I capped particle counts and optimized animations so your device doesn’t sound like it’s about to launch into orbit.

Still, you probably don’t want more than 5 invisible-ink sections on a single page unless you want your blog to double as a space heater.


Fun Extras

Because why stop at one shiny toy?

The answer is Loading....

Or maybe you want a dramatic reveal:

Loading...

Why Does This Exist?

There’s no grand vision here. I didn’t invent a new framework or revolutionize web design.

I just made scratch-off lottery ticket text for my blog because it made me laugh. And honestly? Watching people swipe across the screen to reveal words is more delightful than any serious design essay I could’ve written.


Closing Thought

This could’ve been a beautiful deep-dive about performance tuning, grid algorithms, and web animation standards. Instead, it’s a chaotic scrapbook of particles, CSS hacks, and raccoon jokes.

I timeboxed this, which is why it turned out so crappily.