A Singular Reading Experience
How I turned Adam's Notebook into a literal Three.js book on a desk — hybrid ink and paper, no half-measures, shipped before the page turns were perfect — and why this article lives inside the thing it describes.
How I turned Adam's Notebook into a literal Three.js book on a desk — hybrid ink and paper, no half-measures, shipped before the page turns were perfect — and why this article lives inside the thing it describes.
You’re reading this inside a notebook.
Not a theme named after one. Not a paper texture slapped on a blog template. A kraft-covered book on a wooden desk, pages that turn, an Index tab that slides out from the leaf like it belongs there. If your browser and screen can carry it, Three.js is holding the physical object while the words you’re reading are still real HTML, selectable, searchable, indexable.
A month ago this site already looked like an engineer’s notebook. Warm paper. Dot grid. Better than boilerplate. That was enough for a while. Then I made the metaphor literal.
I’ve been mulling this update over for a while. I started learning Three.js at my last job, and the itch never really went away. Then the job search got real, I’d been part of a workforce reduction earlier in the rebuild, and I took stock of what I could actually show people.
A lot of the work I’d done since becoming a software engineer was either no longer published, or lived behind private company repos. Transforming my blog from a simple set of styled posts into a solid portfolio piece in and of itself was a no-brainer. I’ve got other projects coming online soon. But this is the URL on my resume. Making it fun to visit seemed like a great use of my time.
The CSS notebook look had been a test and a practical decision: push past default AI aesthetics, make the site feel human. I wrote about that rebuild in Better Than Boilerplate, the Astro migration, the engineering journal habit, the push against anonymous scaffolding. It worked. It also still felt unfinished. Looking like a notebook isn’t the same as being one, and when the site is the portfolio, half-measures start to read as half-effort.
The early bet was simple: the book can be 3D, but the words should stay real.
Three.js owns the desk, the covers, the lighting, the page turns. The text, links, and forms stay ordinary markup, projected onto the page so they line up with the spread. That keeps the writing selectable and searchable, and it keeps the site honest as a website underneath the theater.
I may still go further someday. I’d love to bake the text into the pages themselves. I think it can be done, but I’d want a shadow DOM (or equivalent) for SEO, and I don’t yet know enough about what happens when everything lives purely in the canvas. Hybrid is the honest choice for now.
It’s also where most of the sweat went. Two rendering systems pretending to be one object will fight you: text that flashes in the wrong corner before the intro finishes, paper textures painting twice, a flipping page that somehow ends up behind the words you’re reading. None of that belongs in a feature list. It’s just the cost of making the metaphor hold.
Early builds still linked out to legacy chrome for About, Contact, and the policy pages. The notebook had an escape hatch. The site didn’t feel cohesive.
I wasn’t protecting immersion for its own sake. I was porting. If it couldn’t be a singular experience, it felt like I was half-assing it.
So the back matter moved into the book: About, Contact, Policies as leaves you turn to, not destinations you leave for. On phones and small screens, the 3D desk steps aside for a simpler paper spread, because a singular experience still has to work when the easel won’t fit.
Desktop gets the desk. Everyone gets a notebook.
Ask me what still bothers me and I’ll point at page turning.
It’s better than it was. And it’s still buggy. I plan to learn more about making the pages feel like paper. For now, this had to be good enough so I didn’t spend all my time chasing perfection.
Perfect is the enemy of done. I have a job search to continue and other side projects to build. I can always iterate.
That sentence is doing a lot of work in this article, and I mean it. The portfolio value of shipping a coherent experience beats the portfolio value of an unfinished masterpiece of paper physics.
I left a little something past the last “serious” page of the book.
I’m not going to tell you where it is, or what it is. Intrigue has a half-life, and I’d rather you find it, or not, on your own terms. What I will say: it’d be great if people stumbled onto it and just started smiling. I’m particularly proud that, on a phone, that little corner of the site behaves like an old handheld. Mobile visitors miss the full Three.js desk. They still get a reason to grin.
If you never find it, the notebook still holds. If you do, you already know why I bothered.
I don’t have a single lesson queued up for a single audience. Recruiters, engineers, people shipping under pressure, people who care about progressive enhancement, people who just like weird personal sites, pull whatever speaks to you.
For me, the through-line looks like this:
The beauty of this project is that this article is meta-built inside of it. You’re not reading a retrospective hosted next to the work. You’re turning pages in the work.
The page turns still aren’t perfect. The book is open anyway.