Kevin Yap
banner
kevinyap.ca
Kevin Yap
@kevinyap.ca
Software developer working on Google Chrome. Previously: Relay.app, Riot Games, and MLSE Digital Labs. I made @zeal.gg and @surveil.land, and post about code, games, and baseball. kevinyap.ca 🇨🇦
Pinned
I'm back on the Modern RCQ grind this season, but ever since Spicerack was shut down, it's been difficult to find events.

Decided to build surveil.land over the weekend to help locate RCQs, Store Championships, and other competitive MTG events (like 5Ks) around the world.
surveil.land | Competitive MTG Event Locator
Find RCQs, Store Championships, and other high-stakes events near you.
surveil.land
@surveil.land had a few hours where it wasn't properly indexing new events, but it seems like it's fully recovered and caught up on its backlog now.

(Cloudflare Workers started taking more CPU time than allotted by the free plan, so the jobs were just timing out instead of executing.)
August 29, 2026 at 5:20 PM
When I initially wrote @surveil.land, there were zero Store Championship events stored in the database, and I wasn't sure if there was a bug in the event-fetching logic, or if there actually were just no events scheduled worldwide. Glad it ended up being the latter!
Now that the current Modern RCQ season is wrapping up, stores are starting to schedule their Store Championships for Reality Fracture. There are already 438 events indexed on surveil.land!
July 31, 2026 at 7:21 PM
If Gausman gets traded at the deadline, the Jays BETTER give him a player-friendly contract for a year or two so that he can retire a Blue Jay. The man and his family love Toronto more than any other player I can think of, and he's such a great ambassador for our team and the country.
Kevin Gausman on the Trade Deadline:

“I hope I don’t go anywhere. I don’t want to go anywhere. That would be my wish, and that would mean that we’re playing good baseball. But I also realize it’s a business. Whatever happens, it’s kind of out of my control.” #BlueJays
July 26, 2026 at 10:02 PM
Will be rooting for the sixteen Ruby Storm players this weekend! Wondering whether it's one or two specific testing teams that decided to run the deck, or just a bunch of individual pilots.
July 16, 2026 at 8:54 PM
I only just now got around to watching @adef.bsky.social's "naneinf" Balatro run, but it's *by far* my favourite GDQ run of all time.

Spoilers in the thread (watch the run if you haven't!) 🧵
Pushing Balatro to naneinf. @adef.bsky.social was not messing around in this run! #SGDQ2026
July 14, 2026 at 1:33 AM
Made top 8 of the Modern Challenge on Ruby Storm with Hex Magic! Card plays way better than I thought it would.

R1: [W] Affinity ⛈️⛈️
R2: [W] Simic Ritual ⛈️⛈️
R3: [W] Ruby Storm ❌⛈️⛈️
R4: [W] Jeskai Energy/Blink ❌⛈️⛈️
R5: [L] Boros Energy ⛈️❌❌
R6: [W] Grixis Moonshadow ⛈️❌⛈️
QF: [L] Boros Energy ❌❌
June 28, 2026 at 6:44 PM
Got to learn about Cloudflare Pages Functions (yes, double pluralized) while building out this feature!

The problem I needed to solve was being able to rewrite the Open Graph tags in the static HTML to show event info based on the link, even though the site itself is effectively a SPA.
surveil.land now shows a "details view" when clicking on an event, with a unique shortlink that makes it easy to share with your friends (eg. surveil.land/e/4KcDJSrR).

The rich embed for the link also shows the store name and date inline for added convenience when sent on platforms like Discord.
June 25, 2026 at 4:16 AM
Pushed some updates to @surveil.land thanks to feedback I got after posting it on /r/spikes:

- Added format and country filters.
- Fixed searching for Canadian postal codes (embarrassing; I initially tested with my own and it worked, but it turns out that was a fluke)
June 22, 2026 at 10:41 PM
It's been over 6 years since I've done a write-up on a project that I've built (way too long), so today I tried a new technique to overcome my fear of publishing: forcing myself to just write everything in one sitting and then hitting publish.

Here's my post on how and why I built @surveil.land!
Building a Better RCQ Locator
I built a website for finding Regional Championship Qualifiers for Magic: The Gathering that you can check out at https://surveil.land.
kevinyap.ca
June 19, 2026 at 6:01 PM
I'm back on the Modern RCQ grind this season, but ever since Spicerack was shut down, it's been difficult to find events.

Decided to build surveil.land over the weekend to help locate RCQs, Store Championships, and other competitive MTG events (like 5Ks) around the world.
surveil.land | Competitive MTG Event Locator
Find RCQs, Store Championships, and other high-stakes events near you.
surveil.land
June 15, 2026 at 6:39 PM
Breaking down competitive games by how much micro/meso/macro skill they test you on, rather than just their genre, is a really cool framework for understanding why certain games appeal more to people than others.
Once you see this, You’ll see Competitive Games Differently
YouTube video by Surnex
www.youtube.com
June 5, 2026 at 8:34 PM
I'm fairly certain the Ferrari Luce is just a blue Magic Mouse with four wheels. Indisputably a Jony Ive Project™.
May 25, 2026 at 10:34 PM
I created @zeal.gg (a rank-tracking site for League of Legends) back in 2018 while playing a ton of League in uni. Now nearly eight years later, I've found myself building a new site related to tracking games of Magic: the Gathering.

Guess this is just my side-project niche for life.
May 19, 2026 at 11:43 PM
This was a 95.1-mph four-seamer and 90.2-mph off the bat, meaning Barger returned it right back home 11-mph *faster* than it was hit. The outfield assist to home has got to be one of the sweetest plays in baseball.
Addison Barger just nailed the runner at home with a 101.2-mph throw from the outfield. #BlueJays
May 9, 2026 at 7:44 PM
Okamoto moved back in the box after the April 17th game, which gives us exactly 18 games pre- and post-adjustment.

- First 18 games: .188 / .263 / .290 (.553 OPS), 4 RBI
- Next 18 games: .308 / .400 / .708 (1.108 OPS), 19 RBI (!)

Love how well he's fitting in with the #BlueJays.
May 9, 2026 at 2:01 AM
First PR merged on @tangled.org, into Tangled itself! 🧑‍💻

Doing local dev on an atproto app was neat because even though my local DB was unseeded, the app consumes live firehose data, so I was able to see how these changes looked on real data just by letting it run for a bit!
appview/timeline: collapse identical events #1400
Group consecutive timeline events (defined as being the same action and operating on the same target) together so that the same target is not seen multiple times in a row. This notably does not comple...
tangled.org
May 5, 2026 at 12:53 PM
First Modern RCQ of the season. Pivoted to Boros last minute with 2 MD Flashback, then was anxious about Belcher and Neoform so I added 2 Vexing Baubles to the SB.

Made top 8, then lost T2 then T3 to Neoform in the QF despite my best efforts to cast Bauble, so no invite.

List felt great though!
May 3, 2026 at 9:33 PM
Following @mitchellh.com's post, I checked out out @tangled.org and it really reminds me of early days of GitHub when you could actually discover people and interesting repos from the global timeline.

Mirrored my Advent of Code solution repo and will probably start bringing other projects over too.
kevinyap.ca/advent
My Advent of Code solutions in Python.
tangled.org
April 29, 2026 at 5:56 PM
I stumbled upon the realization that calling "prime = win" for Ral flips would be valid†, and inadvertently let this cursed idea loose in the Storm Discord — sorry not sorry if anyone pulls this on you in paper.

† For any 𝑛-sided die where 𝑛 ∈ {2,4,6,8}.
April 25, 2026 at 6:23 AM
Ramping up the Modern grind again now that RCQ season has begun. I've been excited to test out Flashback in Storm since SOS spoilers, and happened to go 5-0 in the first league that I tried it in!

R1: Izzet Wizards ❌🌩🌩
R2: Ruby Storm ❌🌩🌩
R3: Boros Energy 🌩🌩
R4: Phoenix Dredge 🌩🌩
R5: Jeskai Blink 🌩🌩
April 24, 2026 at 4:17 AM
Great write-up on how Shazam's audio fingerprints work, and how songs can be robustly and quickly identified, even when there's a lot of background noise obscuring the actual music.

Spoiler: it's hashing, as is the case with most interesting CS problems.
I built an interactive guide on how Shazam (the music identification app) works!

This is the next installment in my newly coined "How The Heck?" series, where we explore everyday tech that can feel like magic (QR Codes, GPS, and now this one).

Hope you enjoy it!

perthirtysix.com/how-the-heck...
April 20, 2026 at 8:06 PM
Spending the day migrating @zeal.gg off of Heroku and onto @fly.io, along with some other infra simplifications like using Postgres as the job queue instead of requiring Redis for that purpose. I honestly should've done this *years* ago but have just been too lazy to do it until now.
April 12, 2026 at 7:00 PM
Cannot believe Gausman had an 11 K 6 IP opening day, but didn't get credited with the win because Hoffman threw a wild pitch and ended up with 4 K 1 IP, a blown save, and stole the win.

Our funny stat game is SO BACK. #BlueJays
March 28, 2026 at 2:33 AM
They played RISE during the hype videos for the Blue Jays home opener and I momentarily thought I was watching a League of Legends stream
RISE (ft. The Glitch Mob, Mako, and The Word Alive) | Worlds 2018 - League of Legends
YouTube video by League of Legends
www.youtube.com
March 27, 2026 at 11:24 PM
One of my biggest pet peeves on the road; glad Transport Canada is taking this seriously. Please fill this out if you're a fellow Canadian that also hates being blinded by LED headlights! 🔦

(It's more of a 5-minute survey than 15 minutes like they claim, so just do it!)
Care about safety, and glare from bright headlights? Complete the transport Canada survey: tc.canada.ca/en/corporate...
March 21, 2026 at 4:03 PM