Sign in

Kevin Yap

@kevinyap.ca
244 followers 791 following 410 posts

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 🇨🇦

PostsRepliesMedia
Kevin Yap @kevinyap.ca · 27/09/2026
Got last-minute tickets to this game since I hadn't seen a Scherzer start. Honestly thought that Schneider was going to let him throw a complete game. George getting a double and Max going 7 IP 1 ER 7 K and both receiving massive standing ovations was such a fantastic end to the season.
000
Kevin Yap @kevinyap.ca · 29/08/2026
@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.)
221
Kevin Yap @kevinyap.ca · 31/07/2026
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!
000
Kevin Yap @kevinyap.ca · 26/07/2026
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.
020
Kevin Yap @kevinyap.ca · 16/07/2026
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.
000
Kevin Yap @kevinyap.ca · 14/07/2026
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!) 🧵
110
Kevin Yap @kevinyap.ca · 28/06/2026
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 ❌❌
Magic Online screenshot of a decklist titled "Ruby Storm [Hex Magic]". There is a screenshot overlayed of the top 8 standings:

1. Backoff (8-1)
2. Suechtier (7-2)
3. Polikasoill (7-1)
4. LegendaryHuman (6-2)
5. Coradorable (5-2)
6. pwqz (me!) (5-2)
7. jev_ (5-2)
8. Alakai (4-3)

The decklist is as follows:

Maindeck:
4 Pyretic Ritual
1 Flashback
1 Elegant Parlor
1 Gemstone Caverns
1 Grapeshot
2 Arid Mesa
4 Reckless Impulse
2 Wooded Foothills
4 Manamorphose
4 Ruby Medallion
2 Wish
3 Past in Flames
4 Wrenn's Resolve
4 Desperate Ritual
4 Ral, Monsoon Mage
2 Valakut Awakening
1 Sacred Foundry
2 Artist's Talent
3 Scalding Tarn
2 Bloodstained Mire
1 Steam Vents
4 Mountain
3 Hex Magic
1 Thundering Falls

Sideboard:
2 Wear // Tear
1 Untimely Malfunction
1 Past in Flames
1 Empty the Warrens
1 Grapeshot
3 Prismatic Ending
2 Brotherhood's End
1 Blood Moon
3 Flusterstorm
120
Kevin Yap @kevinyap.ca · 25/06/2026
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.
000
Kevin Yap @kevinyap.ca · 22/06/2026
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)
101
Kevin Yap @kevinyap.ca · 19/06/2026
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!
kevinyap.ca
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.
001
Kevin Yap @kevinyap.ca · 15/06/2026
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
surveil.land | Competitive MTG Event Locator
Find RCQs, Store Championships, and other high-stakes events near you.
2134
Kevin Yap @kevinyap.ca · 05/06/2026
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.
youtube.com
Once you see this, You’ll see Competitive Games Differently
YouTube video by Surnex
000
Kevin Yap @kevinyap.ca · 25/05/2026
I'm fairly certain the Ferrari Luce is just a blue Magic Mouse with four wheels. Indisputably a Jony Ive Project™.
Overhead marketing photo of the Ferrari Luce with an Apple Magic Mouse edited in next to it.
000
Kevin Yap @kevinyap.ca · 20/05/2026
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.
020
Kevin Yap @kevinyap.ca · 09/05/2026
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.
020
Kevin Yap @kevinyap.ca · 09/05/2026
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.
010
Kevin Yap @kevinyap.ca · 05/05/2026
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!
tangled.org
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...
1270
Kevin Yap @kevinyap.ca · 03/05/2026
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!
Screenshot from Moxfield of my Ruby Storm decklist.

Maindeck:
2 Artist's Talent
3 Bloodstained Mire
4 Desperate Ritual
2 Elegant Parlor
2 Flashback
1 Gemstone Caverns
2 Glimpse the Impossible
1 Grapeshot
1 Lindblum, Industrial Regency
4 Manamorphose
3 Mountain
3 Past in Flames
4 Pyretic Ritual
4 Ral, Monsoon Mage
4 Reckless Impulse
4 Ruby Medallion
2 Sacred Foundry
3 Scalding Tarn
1 Thundering Falls
1 Valakut Awakening
2 Wish
3 Wooded Foothills
4 Wrenn's Resolve

Sideboard:
1 Blood Moon
1 Brotherhood's End
1 Empty the Warrens
1 Fire Magic
1 Grapeshot
3 Orim's Chant
1 Past in Flames
1 Untimely Malfunction
2 Vexing Bauble
3 Wear // Tear
110
Kevin Yap @kevinyap.ca · 29/04/2026
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.
tangled.org
kevinyap.ca/advent
My Advent of Code solutions in Python.
1180
Kevin Yap @kevinyap.ca · 25/04/2026
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}.
Screenshot of a Discord conversation. Transcript:

pwqz (Yesterday at 18:27):
I didn't even know there was a coin flip tool in the Companion app lol. I'd recommend just rolling a D6 and assigning some set of values to heads (odds, evens, primes, etc)

junshiro (Yesterday at 19:02):
@pwqz prime = I win is just so good

nubbet (Yesterday at 19:48):
@pwqz This will be my ral rule. Primes I win is gas
000
Kevin Yap @kevinyap.ca · 24/04/2026
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 🌩🌩
Deck screenshot for "Ruby Storm [Jeskai Flash]" in Magic Online, with the 5-0 league record added to the screenshot. The match records are as follows:

Match 1: RecklessTempest (2-1) — Izzet Wizards (Twin)
Match 2: Triicky (2-1) — Ruby Storm (Jeskai)
Match 3: TheRightStuff (2-0) — Boros Energy
Match 4: Puff-Sun (2-0) — Phoenix Dredge
Match 5: albert62 (2-0) — Jeskai Blink

The decklist is as follows:

Maindeck:
2 Arid Mesa
2 Artist's Talent
2 Bloodstained Mire
4 Desperate Ritual
2 Elegant Parlor
2 Flame of Anor
2 Flashback
1 Gemstone Caverns
1 Grapeshot
1 Lindblum, Industrial Regency
4 Manamorphose
3 Mountain
3 Past in Flames
4 Pyretic Ritual
4 Ral, Monsoon Mage
4 Reckless Impulse
4 Ruby Medallion
1 Sacred Foundry
3 Scalding Tarn
1 Steam Vents
1 Thundering Falls
1 Valakut Awakening
2 Wish
2 Wooded Foothills
4 Wrenn's Resolve

Sideboard:
1 Empty the Warrens
2 Fire Magic
3 Flusterstorm
1 Grapeshot
2 Into the Flood Maw
2 Orim's Chant
1 Past in Flames
3 Wear // TearScreenshot of Flashback from Secrets of Strixhaven.

Flashback {R} — Instant

Target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.
110
Kevin Yap @kevinyap.ca · 20/04/2026
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.
020
Kevin Yap @kevinyap.ca · 12/04/2026
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.
110
Kevin Yap @kevinyap.ca · 28/03/2026
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
010
Kevin Yap @kevinyap.ca · 27/03/2026
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
youtube.com
RISE (ft. The Glitch Mob, Mako, and The Word Alive) | Worlds 2018 - League of Legends
YouTube video by League of Legends
100
Kevin Yap @kevinyap.ca · 21/03/2026
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!)
010
Kevin Yap @kevinyap.ca · 16/03/2026
I was legtimately stunned while watching this because I couldn't figure out why the game had ended… I thought Perdomo must've swung through the pitch and I had a memory lapse or something. Thank god we have ABS this season.
001
Kevin Yap @kevinyap.ca · 14/03/2026
Whoa, this is a virtual desktop with applications & games that lives in the browser and stores all of your documents, preferences, etc. directly in your AT Protocol repo. Such a sweet aesthetic too.
040
Kevin Yap @kevinyap.ca · 11/03/2026
In case people weren't keeping track, if the final score in the Mexico vs. Italy WBC game is 𝑥 to 𝑦 (𝑥 > 𝑦; 𝑥 ≤ 4), Team USA will be eliminated from the tournament in the group stage.
100
Kevin Yap @kevinyap.ca · 05/03/2026
Nirvanna the Band the Show the Movie was probably the best theatre-going experience I've ever had. Best to go in completely blind and just enjoy this absolute masterpiece. (It's an extra special watch for Torontonians/Canadians due to the setting, but most of the bits in the film are universal.)
000
Kevin Yap @kevinyap.ca · 03/03/2026
I didn't expect this benefit from Bluesky labels, but I think this pattern of seeing that someone on the platform plays the same game as you is super delightful — like meeting someone new in-person and realizing you have overlapping interests. Hope this catches on with other games & services!
100
Kevin Yap @kevinyap.ca · 03/03/2026
It's been a while I played @puzzmo.com, so I hadn't seen the "Champs leaderboards" until now. Basically, if you get a top score in a game, you graduate to the Champions League that has its own leaderboard, and your scores don't appear on the "general" leaderboard that everyone else sees.
110
Reposted by Kevin Yap
nolen @itseieio.bsky.social · 26/02/2026
ssh is an obscure but widely-deployed command. It stands for Secure Snake Home and was made in the 90s to securely play snake online I made a massively multiplayer backend for it with support for thousands of concurrent snake players ssh snakes.run to join!
13579190
Kevin Yap @kevinyap.ca · 21/02/2026
First day of Spring Training for the Jays, and I've finally completed chores I've been putting off for weeks. The ultimate productivity hack is SO back.
100
Kevin Yap @kevinyap.ca · 18/02/2026
Being an OSS maintainer was already a thankless job in the pre-LLM world, but I can't imagine having to navigate the reams of AI slop that hundreds of thousands of people now have access to spit out with literally zero-effort or accountability from their own end.
100
Kevin Yap @kevinyap.ca · 17/02/2026
I'm honestly confused what incentive WotC has to make this change. Wouldn't they *want* Standard to develop quicker so that people are forced to buy more cards to keep up? Unless they feel that would scare off newer players, but 6+ Standard sets per year is already accomplishing that outcome.
100
Kevin Yap @kevinyap.ca · 16/02/2026
Blue Jays fans: "Can we have Ohtani & Teo?" Atkins: "We have Ohtani & Teo at home." Ohtani & Teo at home:
100
Kevin Yap @kevinyap.ca · 08/02/2026
Went 5–3 playing in Magic Spotlight: Eclipsed today. Honestly I can't be that sad about ending with a positive record, but it does sting starting 3–0, then getting to 4–2 to 5–2 and then losing the final win-and-in. Pool was absolutely cracked, will post later. Others' were just better sometimes.
110
Kevin Yap @kevinyap.ca · 29/01/2026
Got my first Limited trophy on MTGO playing Sealed Leagues last night; many 0–5s and 1–4s initially, but slowly improving! I'm having a lot of fun grinding Lorwyn Eclipsed in preparation for the upcoming Spotlight Series. The gameplay feels really engaging with all of the mechanics in the set.
Magic Online screenshot of a Sealed decklist and overlay of the prizing from going 5–0 in a Competitive Sealed League. The decklist is as follows:

1 Evolving Wilds
5 Forest
9 Plains
2 Swamp
2 Wanderbrine Trapper
1 Goldmeadow Nomad
1 Thoughtweft Lieutenant
1 Personify
2 Wanderbrine Preacher
1 Spiral into Solitude
1 Surly Farrier
1 Feisty Spikeling
1 Adept Watershaper
1 Moonlit Lamenter
1 Crossroads Watcher
1 Reluctant Dounguard
1 High Perfect Morcant
1 Morningtide's Light
1 Liminal Hold
1 Pitiless Fists
1 Kinbinding
1 Pummeler for Hire
1 Deceit
1 Emptiness
1 Sun-Dappled Celebrant
100
Kevin Yap @kevinyap.ca · 27/01/2026
Opening treasure chests in Magic Online and selling cards to trade-bots that have their own sophisticated websites gives me so much nostalgia from doing the same thing 15 years ago with crates in Team Fortress 2.
000
Kevin Yap @kevinyap.ca · 22/01/2026
Started to play around with @leaflet.pub (thinking of writing longer-form MTG stuff there), and although the site itself doesn't currently support deleting publications, since it's built on top of ATProto, you can just delete it using a PDS browser like @pdsls.dev which was a cool experience!
130
Kevin Yap @kevinyap.ca · 10/01/2026
Got 2nd place in the Modern Challenge on MTGO tonight playing Boros Ruby Storm! Nice to finally get another Challenge top 8. R1: Boros Energy ⛈⛈ R2: Neoform ⛈⛈ R3: Ruby Storm ⛈⛈ R4: Tron ⛈⛈ R5: Living End ❌❌ R6: Mono-B Midrange ⛈❌❌ QF: Grixis Reanimator ❌⛈⛈ SF: Affinity ⛈⛈ F: Broodscale ⛈❌❌
Screenshot of the decklist from the MTGO website.

Maindeck:
2 Arid Mesa
2 Artist's Talent
2 Bloodstained Mire
4 Desperate Ritual
2 Elegant Parlor
1 Gemstone Caverns
2 Glimpse the Impossible
4 Manamorphose
3 Mountain
3 Past in Flames
4 Pyretic Ritual
4 Ral, Monsoon Mage
4 Reckless Impulse
4 Ruby Medallion
1 Sacred Foundry
3 Scalding Tarn
1 Stormscale Scion
2 Strike It Rich
1 Sunbaked Canyon
2 Valakut Awakening
2 Wish
3 Wooded Foothills
4 Wrenn's Resolve

Sideboard:
1 Empty the Warrens
1 Grapeshot
4 Orim's Chant
1 Past in Flames
3 Prismatic Ending
2 Untimely Malfunction
3 Wear/Tear
120
Kevin Yap @kevinyap.ca · 08/01/2026
It's honestly so cool that a such a huge open event is going to be happening at a venue closer via transit to me than most of the LGSes I go to for RCQs. Love seeing Canada show up for competitive gaming!
121
Kevin Yap @kevinyap.ca · 06/01/2026
Hexing Squelcher is my "wow this is *too* perfect for Ruby Storm" card of ECL that'll probably not end up actually seeing play. 1R for an anti-counterspell hatebear that itself can't be countered has gotta be something though (it's like a Spider-Punk that you can safely play T2).
Screenshot of Hexing Squelcher (https://scryfall.com/card/ecl/145/hexing-squelcher)
110
Kevin Yap @kevinyap.ca · 19/12/2025
Forgot to post about this, but @rd.7thbe.at fully launched a couple weeks ago! It's legitimately in my top 10 games of all time — the amount of creativity and musical genius that went into developing a single-button rhythm game is impossible to describe without actually playing it.
140
Kevin Yap @kevinyap.ca · 01/12/2025
First December in a literal decade where I'm not staying up to do #AdventOfCode right when new puzzles drop. It feels refreshingly… freeing? Focusing my energy towards other things right now and no global leaderboard = no pressure, but I'll still check out all the puzzles at my own pace!
130
Kevin Yap @kevinyap.ca · 23/11/2025
Running back Ruby Storm in the Modern 5K today to try to get my qualification for RC Vancouver. Made one change to the list I played yesterday (-1 Spell Pierce, +1 Untimely Malfunction anticipating seeing Belcher). Praying to play against some Blink and Energy today…
100
Kevin Yap @kevinyap.ca · 22/11/2025
It's time to play way too much Magic! Going to start a thread to summarize match results. 🧵
130
Kevin Yap @kevinyap.ca · 20/11/2025
Barring any last-minute changes tomorrow, I'm going to run this Ruby Storm list at RC Calgary this weekend! Heavily considered pure Boros, but I figure over 9+ rounds, I want to feel like I have some sort of counterplay to other combo decks to preserve my mental throughout the tournament.
Image export of a Ruby Storm Moxfield decklist. The deck is as follows:

Maindeck:
1 Arena of Glory
2 Artist's Talent
3 Bloodstained Mire
4 Desperate Ritual
1 Elegant Parlor
2 Flame of Anor
1 Gemstone Caverns
2 Glimpse the Impossible
1 Lindblum, Industrial Regency
4 Manamorphose
3 Mountain
3 Past in Flames
4 Pyretic Ritual
4 Ral, Monsoon Mage
4 Reckless Impulse
4 Ruby Medallion
2 Sacred Foundry
3 Scalding Tarn
1 Steam Vents
1 Stormscale Scion
1 Thundering Falls
1 Valakut Awakening
2 Wish
2 Wooded Foothills
4 Wrenn's Resolve

Sideboard:
2 Flusterstorm
1 Galvanic Relay
1 Grapeshot
3 Orim's Chant
1 Past in Flames
2 Phlage, Titan of Fire's Fury
3 Prismatic Ending
1 Spell Pierce
1 Untimely Malfunction
120
Kevin Yap @kevinyap.ca · 02/11/2025
welp, that was the most soul-crushing loss you could dream up. thanks for the wild ride, 2025 Blue Jays. (please hand Bo a blank cheque and patch up Springer's 37 unique injuries in the offseason)
110