Kevin Yap

@kevinyap.ca

Software engineer at @relay.app. Previously: Google, Riot Games, and MLSE Digital Labs. I made @zeal.gg and @surveil.land, and post about code, games, and baseball. kevinyap.ca 🇨🇦

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!

surveil.land@surveil.land · 5d ago

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!

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.

Keegan Matheson@keeganmatheson.bsky.social · last wk.

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

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

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@surveil.land · last mo.

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.

Screenshot of the new event detail view on surveil.land (specifically for https://surveil.land/e/4KcDJSrR).

It shows the name of the event ("Legacy 1k") in the header of the modal, and the details below it. This event is a 1K and the Legacy format, happening on Saturday, July 11 at 10am (in 2 weeks).

The store is "Face to Face Games - Toronto" at 1398 Danforth Ave, Toronto, ON, M4J 1M9, Canada.

The modal has buttons at the bottom to open it in the Event Locator site, copy the deeplink, and add it to calendar / star it.

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)

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

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.

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.

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

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

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

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.

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.

shri@shrikhalpada.dev · 4mo ago

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...

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.

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

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.

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.)

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!

Orta Therox@orta.io · 5mo ago

Shipping today: @puzzmo.com has integrated support for @bsky.app The site/app have follower syncing, and a labeler so that you can spot new Puzzmo folks when browsing Bluesky posts www.puzzmo.com/bluesky blog.puzzmo.com/posts/2026/0...

Bluesky follower syncing on Puzzmo.com illustrated

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.