In my quest to make more usable software in a shorter amount of time, I've been working on two related projects that take advantage of HTML canvases. Calling them small is a bit of a misnomer. They're local-first and I can (and will!) deploy these to something like cloudflare pages.

Inkfinite & PDFs

desertthunder.dev/inkfinite
web based infinite canvas
https://tangled.org/desertthunder.dev/inkfinite

A friend posed the question, "how is this any better than MS paint?" and I couldn't answer that so today I've been thinking about what has stuck with me with respect to similar apps and tools. The canvas feature in Obsidian springs to mind and the power to have arrows "cling" to elements. Obsidian lets you embed notes and write markdown right in blocks. I'd be lying if constantly being on leaflet didn't inspire me too. I made a diy-wrapped for my music listening with a leaflet canvas. Do you ever play with an app and think, man, I really want to make that? How did they do that??

Owaisify Wrapped™️
Favorite Songs
https://leaflet.pub/ae251293-a3a3-4e09-be0f-eb74afbff539

I've also been experimenting with a different todo file format with this and the pdf project. They're "vimdoc" style with 80 character width sections and * tagged * headers for easy ripgrepping and reading in the terminal. It's fun to experiment with different processes.

Since working on Volkara almost non-stop this past summer, these past few days have been the longest I've spent with JS/TS and I gotta say its been painful to move away from Go & Rust even temporarily.

Volkara
Comprehensive productivity application with task management, time tracking, and decision-making tools.
https://volkara.stormlightlabs.org/

I feel like I'm programming blind and nothing is as straightforward. There's never really any guarantee that what you're building will work but errors/exceptions just feel like they pop out of nowhere in web apps. This is particularly frustrating integrating with PDF.js. That library does so much (and has been a godsend for most of my adult life) but it's like I have to put a debugger in every new call to the rendering engine. To compare it to what I've done with compiled languages, I made a small toolbox/CLI with Rust called picopdf with a SmallPDF style set of operations. Painless! I've used pulldown-cmark so much that it was easy to walk through a generated tree and even add converting markdown to PDF.

I'm calling the PDF app pdfstorm at the moment. I'm not a huge fan of the name but it's the name its got for now. Once I open source this, it'll likely be different because I already made a thing called storm and pdfstorm makes no sense.

Because of the workspace setup, I'm scared of writing tests for the tools. PDF.js works fine in the browser but having it run with vitest and jsdom in library packages took a lot of time and polyfill-ing. I'm really considering switching to Playwright for a lot of this work just so the environments are consistent. The point of this little diatribe is that I really don't like wrestling with build systems.

The React compiler is pretty nice. It's helped me catch common footguns pretty quickly. What's frustrating is that some libraries are incompatible. I made a simple virtualizer hook because some tanstack libraries aren't made with the memo api in mind. There's a directive to get around this but I'm not fond of working around compilers.

The goal with this app is to make an e-reading application that supports common operations (again SmallPDF style), and note taking. This is for me mostly, as I want to highlight and save notes I take on downloaded PDFs and export them as markdown notes for version control.


Next up in the "small web app" cinematic universe: a new version of a Tone.js powered ambient music app I made a few months ago.