Kevin Yap

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

250 followers797 following415 posts

Played a couple of Riftbound Pre-Rifts last weekend to finally learn the game. The turnout was so high; events had completely sold out stores that I didn't even know existed in downtown Toronto.

View full thread

I think the big allure of Riftbound is the tournament support at smaller levels, and not just in terms of the insane prizing at Regionals due to metal cards, but how many events fire in general. One LGS here just ran a 5K with a stream… we don't even get local 1Ks for Magic.

Played a couple of Riftbound Pre-Rifts last weekend to finally learn the game. The turnout was so high; events had completely sold out stores that I didn't even know existed in downtown Toronto.

Overall had a good time, but don't know how enjoyable it would have been if I didn't come from Magic and already read up on most of the rules (the crowd was friendly but seemed less patient than what I experienced when I was attending Magic prereleases).

It also made me really appreciate just how brilliant Limited MTG is. Pre-Rift seemed really volatile based on what seeded legend you happened to roll, and if you had *any* removal in your colours or a strong unit (even more so than Sealed in MTG).

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.

Toronto Blue Jays@bluejaysbot.bsky.social

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

View full thread

Incidentally, I was using the free Wi-Fi at an art gallery when I got the alert about stale event refreshes, and when I went to check the site, nothing would load for me, leading me to momentarily believe all of Cloudflare Pages was somehow down.

Turns out being on the Wi-Fi was causing all requests to the site to hang due to the .land TLD — accessing it through the pages.dev subdomain worked fine. Apparently public networks sometimes just blanket block non-traditional TLDs out of fear of malware/phishing.

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

Of course, since this happened while I was on vacation, I decided to just do the risk-free fix of "subscribing to the paid tier for a month until I can get back to a computer and actually deploy proper changes".

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

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

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

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.

Play Magic@playmagic.com

The Modern metagame for #PTMSH features some reliable standbys alongside new emerging strategies and some sweet tech! Check out what's in store on magic.gg: magic.gg/news/pro-tou...

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!) 🧵

Games Done Quick@gamesdonequick.com

Pushing Balatro to naneinf. @adef.bsky.social was not messing around in this run! #SGDQ2026

View full thread

The guts to do this run unseeded in a marathon setting, and then ending up meeting the win condition on literally the last possible ante *while* reasoning out the line in real time (the Serpent boss blind serving as substitute Cryptids) demonstrated such mastery over the game.

You could also really tell how stressed and focused adef was at points in the run where it seemed like it was destined to fail, but the rapport and knowledge between him and the couch made for such a dramatic and entertaining watch. You couldn't have scripted (nor seeded!) a better run for GDQ.

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!) 🧵

Games Done Quick@gamesdonequick.com

Pushing Balatro to naneinf. @adef.bsky.social was not messing around in this run! #SGDQ2026

I was familiar with Balatro but didn't know about naneinf runs before watching this, and there are so many interesting deckbuilder + roguelike concepts showcased, like transitioning from an econ build into your late-game scoring build, and needing to play to your outs on the fly.

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

View full thread

As expected, it's basically the worst card to top-deck late-game, but it makes early setup turns (when you still have 3+ cards in hand) feel nearly inevitable. It also digs for removal under High Noon and similar cards way more efficiently than your impulse draws.

Looks like another Storm player made top 4! I have to think more about how to sideboard with Hex Magic, though. Previously the decision was easy (swap flex-slot cards with sideboard cards), but the issue with Hex Magic is that you want to keep enough of them in your deck to chain them together.

Robert Taylor 🔥@fireshoes.bsky.social

Modern Challenge Top 8 decklists for Sunday morning, June 28 (62 players) #mtg #mtgModern Grixis Reanimator gets the win! 👁️🏆 Izzet Prowess placed 2nd 🥋 Ruby Storm in 3rd and 6th ⛈️⛈️ Boros Energy finished 4th and 7th 😾😾 Simic Ritual takes 5th 👁️ Simic Sewer Grinding Station gets 8th ⚙️

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

View full thread

Having Hex Magic in the graveyard after playing Past in Flames also feels great, especially if you happened to also played some Manamorphoses earlier in the turn to increase your hand size even further before flashing it back.

I'm testing it by replacing Glimpse the Impossible instead of Artist's Talent since I feel keeping Glimpses makes the mana curve too high and Talent is often nice as a "less scary" 9th/10th reducer, but I'm not completely sold on that yet.

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

View full thread

Some notes on Hex Magic: Unlike your other high-cost cards like Past in Flames and Wish which you really don't want to see multiple of in your hand, multiple Hex Magics don't feel too bad since you can exile one with the other and still play it, effectively extending your hand twice.

There's a nice play pattern where you stick a Ruby Medallion on turn 2, then on turn 3, play Hex Magic before playing your third land drop and just play the land out of exile instead. That makes it a draw-5 (or draw-6 if you're OTD).

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

Lost to the same Boros Energy player in R5 and in QF. They were on 2× Mana Tithe and 3× Ranger-Captain maindeck with Sanctifier en-Vec, Drannith Magistrate, High Noon, and Wear // Tear in the sideboard (the perception is definitely that Storm has moved up a peg due to Hex Magic).

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

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.

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)

Honestly, I should have known better given that I already had to learn about Canadian postal codes and "forward sortation areas" at a previous job. I just made an incorrect assumption that the geocoding API was doing that lookup & resolution already since mine happened to work. Testing is important.

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.caBuilding a Better RCQ LocatorI built a website for finding Regional Championship Qualifiers for Magic: The Gathering that you can check out at https://surveil.land.
View full thread

There's already a couple of other similar websites that have cropped up; competition is a good thing! My goals with surveil.land were a) to have an opinionated, unobtrusive design and b) to optimize for long-term maintainability. It should also be very responsive since there's no actual backend.

I build it as a single static site powered by data blobs in a bucket which are updated regularly via a cron job. With this design, I should be able to keep it running indefinitely so long as locator.wizards.com doesn't make any upstream changes (fingers crossed).

I'm fairly certain the Ferrari Luce is just a blue Magic Mouse with four wheels. Indisputably a Jony Ive Project™.

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.

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.

Keegan Matheson@keeganmatheson.bsky.social

Addison Barger just nailed the runner at home with a 101.2-mph throw from the outfield. #BlueJays

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!

tangled.orgappview/timeline: collapse identical events #1400Group 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...

Having to upload screenshots of my changes on an external site if I wanted to embed them in the PR made me realize how much we take "free" image/video uploads on modern services for granted — I haven't had to think about dedicated image hosts at all for probably a decade or so!

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!

Flashback was an all-star. Flashed back a countered Wear // Tear to destroy Damping Sphere, used it to have 2 more opportunities to flip Ral with Galvanic Discharge on the stack, and in many other instances replayed rituals for more storm or impulses to search for enough gas to find the win.

Matchups (38 players, 6 rounds of Swiss): R1: [W] Domain Zoo (OTD) ⛈️❌⛈️ R2: [L] Jeskai Control (OTP) ❌❌ R3: [W] UR Prowess (OTD) ⛈️⛈️ R4: [W] Boros Energy (OTP) ⛈️⛈️ R5: [W] UR Prowess (OTD) ⛈️⛈️ R6: [ID into 5th seed] QF: Neoform (OTD) ❌❌

View full thread

I think a big contributor to this feeling is seeing so many atproto-based hobby projects cropping up that are clearly labours of love rather than big company initiatives — it inspires me to come up with something to build too (I'll have to make it out to an @atproto.to event sometime)!

agh whenever I self-edit a post too many times I inevitably leave in a really stupid typo; I should just type something once and then hit send 🫠

Said this before too, but it's very cool to see the ATmosphere growing steadily. Having a shared identity across sites, knowing that you own your data, and being able to introspect what's stored on your behalf feels like the "open internet dream" coming back to life.

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