Skip to content

Instantly share code, notes, and snippets.

View julianlam's full-sized avatar
🤔
I may be slow to respond.

Julian Lam julianlam

🤔
I may be slow to respond.
View GitHub Profile
@julianlam
julianlam / audiomarks.md
Created October 21, 2026 15:36
Introducing AudioMarks — simple audio annotations #blog

What AudioMarks is

AudioMarks is an app I created with the help of AI assistance to scratch an itch: I would often hear something interesting in a piece of music and want to note it down, only to have nowhere to do it.

This app allows you to add a personal annotation to any piece of playing music, be it a file playing from the device, streaming through YouTube, or a podcast playing in another app.

It saves the annotations to file so they can be easily backed up or moved from phone to phone.

What inspired it

@julianlam
julianlam / garbage-in-garbage-out.md
Created October 20, 2026 14:48
Garbage in, garbage out. #blog

It seems much of the discussion on Hacker News circles around AI — usage of it, the latest model releases, thought pieces about it (this one included)...

Amongst all that I came upon an interesting quote:

Getting interesting information into it is still going to be just as slow as it is in the regular world. You have to build, tinker, experiment, get data, get knowledge, etc. — https://news.ycombinator.com/item?id=50166775

This reminds me of yet another truism in many aspects of life (though it certainly does apply strongly in programming). This time from the Magic School Bus:

[The class is gathered around a computer terminal. Carlos' cousin Mikey had scripted all of their school-opening chores into a program, but it went sideways and ran in circles. They printed out the code for review] Carlos: Here's your program, Mikey.

@julianlam
julianlam / yamaha-dtx-multi-12-cheatsheet.md
Created October 17, 2026 23:55
Yamaha DTX-MULTI 12 Cheat Sheet #blog

In my capacity as Music Director for the Dundas Concert Band, I often have to work within immovable constraints.

One of those was the fact that while the band owned a pair of timpani, it was not physically feasible nor safe to move them up and down the stairs at the Dundas Town Hall week after week, and to and from venues.

Before I arrived, the previous band director had purchased a Yamaha DTX-MULTI 12 to work around this problem.

Here's a short list of reference steps for doing typical things with the unit.


@julianlam
julianlam / malletstation-gig-bag.md
Last active October 18, 2026 00:46
Gig Bag for the Pearl EM1 MalletSTATION #blog

I've been lugging the MalletSTATION to rehearsals and performances in its original cardboard box. I was pretty certain after a couple more trips the whole thing would fall apart catastrophically!

I ended up buying the 88-key AKOZLIN brand off Amazon, which fits the EM1 with the protective foam that came with the original box (you all kept the box, right? haha) We're planning to custom cut a couple panels of coroplast to add rigidity, but this is a snug-fitting, solid gig bag for the EM1.

image

Update: 17 October 2026

@julianlam
julianlam / ai-llm.md
Last active October 13, 2026 15:44
How I use AI/LLMs #blog

It's worth noting down — for my own historical record, if anything — what my approach is to LLM usage and AI assisted coding, and how this has evolved over the months and (hopefully) years.

whisper.cpp / audio summarization

I began my exploration sometime this past summer (2026) when I wanted to build a tool to summarize our weekly scrums meeting through audio recording/parsing.

With the help of Gemini, I cobbled together a working prototype with whisper.cpp and some basic model to summarize the text.

Sufficiently impressed, I wanted to see whether this could apply to my day-to-day coding (spoiler alert; yes it does.)

@julianlam
julianlam / dmm-ceros-locksafe-review.md
Last active October 10, 2023 14:59
DMM Ceros Locksafe; A Review #blog

Product photo of the DMM Ceros Locksafe Carabiner

Soon after field testing the Mammut Smart 2.0, I became acutely aware that the carabiner I had paired with the device — the Metolius Element II — was sub-optimal:

  1. The I-shaped stock in the basket end meant that there was less surface area in contact with the rope, and brake effectiveness was reduced.
  2. Lack of anti-crossloading features meant that the carabiner sometimes flipped/rotated during usage.

The two features I needed for it to pair nicely with the Smart:

  1. Round stock at the HMS end
@julianlam
julianlam / test-driving-mammut-smart-2.md
Last active October 9, 2023 01:07
Test driving the Mammut Smart 2.0; A Review #blog

The Mammut Smart Belay Device

Having been climbing more seriously for the last 6 years, my exposure to belay devices has been restricted to that which my local gym allows — that is — the Grigri.

Since its introduction in 1992, the Grigri has become a ubiquitous item at climbing gyms and crags. As an assisted belay device, it offers unparalleled performance and positions itself as a solid alternative to older belay plates and tubes.

When I discovered that there were other products on the market that offered similar benefits to the Grigri, I jumped at the chance to test-drive them. My search brought me to two popular contenders, the Black Diamond ATC Pilot, and the Mammut Smart 2.0.

I later purchased a Smart from my local retailer and finally had the opportunity to put it to use today. The following is a brief usage review including some pros, cons, and surprises. T

@julianlam
julianlam / html-string-into-dom.md
Created August 15, 2023 15:47
Inserting an HTML string to the DOM #blog

Question: How do you insert an HTML string (e.g. <p>this is a paragraph <a href="#">with an anchor!</a></p>) into the DOM?

It's easy with jQuery, $(htmlString). But what if you don't want to use jQuery? It's also pretty straightforward.

const container = document.getElementById('container');
let html = '<p>this is a paragraph <a href="#">with an anchor!</a></p>';
html = new DOMParser().parseFromString(html, 'text/html').body.childNodes;

container.append(...html);
@julianlam
julianlam / nodejs-trust-caddy-certificate-authority.md
Last active March 7, 2025 21:08
How to have Node.js trust Caddy self-signed certificate #blog

Caddy has a neat feature where all routes automatically come with HTTPS enabled. Caddy achieves this by self-signing its own certificate via a certificate authority that is (or can be) added to the system CA list.

However, Node.js comes bundled with its own certificate authority list, so even if Caddy's CA is added to the system, Node won't allow it.

Here's how to allow calls to local https services served by Caddy:

  1. If needed, run caddy trust as root to install the Root CA.
  2. Run node with the environment variable NODE_EXTRA_CA_CERTS and point it to the local CA file.
    • Not sure what that is? Maybe you're on Debian or a derivative (e.g. Ubuntu, Pop!_OS, etc.): NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
@julianlam
julianlam / lactation-energy-bites.md
Last active June 11, 2023 22:08
No-Bake Lactation/Energy Bites #blog

My wife found this recipe for energy bites that contain galactagogues — milk-promoting foods and herbs that could aid in building milk supply.

They also double as a really tasty (and energy-rich) snack for days when you just want something quick!

I had this recipe written down in my notebook, but I refer to it often enough I may as well put it up here as well. It also contains measurements for the tackier liquid ingredients in GRAMS, because measuring larger volumes of things like peanut butter and honey by volume don't make much sense due to variability.


Ingredients