Hello Internet Surfer,
I am a software developer in Canada. This is my personal website, where I blog about whatever I am learning and experiencing. In my down time, I am into a bit of running, a bit of coding, a bit of touch typing, and a bit of cubing… that sort of thing. Pretty uneventful, honestly.
A little More details
- Running: I mainly run half-marathons. My PB is 01:53:30.
- Coding: I enjoy algorithmic problem-solving and used to be active in competitive programming. Since AI is making this less and less relevant, I haven’t competed much for a while. These days my main focus has shifted to Project Euler—I really hope to solve all the problems one day. I’m currently at 444 out of 985.
- Touch typing: I’ve tried QWERTY, Dvorak, and Colemak-DH. I’ve reached 90+ WPM on all of them at some point, but eventually stuck with Colemak-DH. I’ve completed 56,000 races on TypeRacer, averaging 120 WPM with 99%+ accuracy. My daily driver is a low-profile, 5-column Corne. Detailed config.
- Speed cubing: I mainly solve 3 by 3. My recent 100-solve average is 12.76 seconds, and my PB single is 7.75 seconds (scramble:
F R2 D2 L2 B2 D2 R2 B' R2 B R' D' F U B' U2 B L F'). I’ve been cubing for a long time, but I’ve never competed in a WCA competition.
Nerd Stuff
Just some tech specs about how this site is built. Feel free to scroll right past this if it’s not your thing.
Frameworks
The site is built with Next.js and React, deployed as a static export. Styling is Tailwind CSS — utility classes directly in markup, no separate stylesheet to maintain. Content lives in .dj files parsed with gray-matter for front matter and rendered with react-djot. That’s more or less the whole stack.
Why Djot
Djot is another markup language. It keeps the writing experience simple — plain text first, with lightweight formatting and native math support — but it still gives me precise control when I need it. The big reason I like it is attributes: Djot supports both inline and block attributes as a built-in feature. I can just write something like [this is red]{.text-red-500} and it renders as “this is red” with that class attached, so Tailwind can style it directly.
To make that work well in React, there’s react-djot: a Djot renderer that mimics react-markdown, keeping the same component-driven workflow while using Djot instead of Markdown. It renders to React elements (no dangerouslySetInnerHTML), so it stays composable and avoids injecting raw HTML.
What I particularly like is how far its extension points go. You can override any node’s renderer via a components prop — same idea as react-markdown. But each custom component also receives the raw AST node, and there’s a standalone renderNode export you can call from anywhere. Together, these let you do structural transformations from the outside: for instance, this site turns [div.figure] blocks into proper <figure><figcaption> HTML entirely at the consumer level, without touching the library.
Contact & Licensing
Please feel free to email me with typo catches, broken links, or specific questions about a post. To save us both time, make sure your questions are specific and show what you have tried — broad, open-ended questions are tough for me to answer over email.
Everything on this site is free to use — just credit me and link back if you do.