[{"data":1,"prerenderedAt":373},["ShallowReactive",2],{"navigation":3,"blog-page":47,"blogs":57},[4,22],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Blog","\u002Fblog","blog",[9,13,17],{"title":10,"path":11,"stem":12},"Anki Baby Steps","\u002Fblog\u002Fanki-baby-steps","blog\u002Fanki-baby-steps",{"title":14,"path":15,"stem":16},"GSoC 2026: a Hopeful Rejection","\u002Fblog\u002Fgsoc-2026-a-hopeful-rejection","blog\u002Fgsoc-2026-a-hopeful-rejection",{"title":18,"path":19,"stem":20},"Play vs Prove: CFU comparison","\u002Fblog\u002Fplay-vs-prove-cfu-comparison","blog\u002Fplay-vs-prove-cfu-comparison",false,{"title":23,"path":24,"stem":25,"children":26,"page":21},"Work","\u002Fwork","work",[27,31,35,39,43],{"title":28,"path":29,"stem":30},"D-Map Cache","\u002Fwork\u002Fdmap-cache","work\u002Fdmap-cache",{"title":32,"path":33,"stem":34},"Edge Relax","\u002Fwork\u002Fedge-relax","work\u002Fedge-relax",{"title":36,"path":37,"stem":38},"Focal Grid","\u002Fwork\u002Ffocal-grid","work\u002Ffocal-grid",{"title":40,"path":41,"stem":42},"Pico Router","\u002Fwork\u002Fpico-router","work\u002Fpico-router",{"title":44,"path":45,"stem":46},"Valhalla","\u002Fwork\u002Fvalhalla","work\u002Fvalhalla",{"id":48,"title":49,"body":50,"description":51,"extension":52,"links":50,"meta":53,"navigation":54,"path":6,"seo":55,"stem":7,"__hash__":56},"pages\u002Fblog.yml","Latest Articles",null,"Some of my thoughts on development and the tech industry more general.","yml",{},true,{"title":49,"description":51},"PsBDvROmjTQUvIb3pez2OwCbARCigkiAz9H9AFFNzB0",[58,85,179],{"id":59,"title":18,"author":50,"badge":60,"body":61,"date":77,"description":78,"extension":79,"image":80,"meta":81,"minRead":82,"navigation":54,"path":19,"seo":83,"stem":20,"__hash__":84},"blog\u002Fblog\u002Fplay-vs-prove-cfu-comparison.md","Hardware Acceleration",{"type":62,"value":63,"toc":73},"minimark",[64,69],[65,66,68],"h4",{"id":67},"tldr","TL;DR",[70,71,72],"p",{},"...",{"title":74,"searchDepth":75,"depth":75,"links":76},"",2,[],"2026-08-02","An in-depth head-to-head analysis of two","md","\u002Fcontent\u002Fplay-vs-prove-banner.png",{},7,{"title":18,"description":78},"3aGxfsFpa74yFPfQcoi0ktSyntSZWMXvVrBUlRzcnhM",{"id":86,"title":10,"author":50,"badge":87,"body":88,"date":172,"description":173,"extension":79,"image":174,"meta":175,"minRead":176,"navigation":54,"path":11,"seo":177,"stem":12,"__hash__":178},"blog\u002Fblog\u002Fanki-baby-steps.md","Japanese Study",{"type":62,"value":89,"toc":166},[90,92,95,99,112,117,120,124,127,131,140,147,150,156,159,163],[65,91,68],{"id":67},[70,93,94],{},"I've started using Anki for a month straight to build up my Japanese vocabulary. Being relatively new to Spaced Repetition System (SRS) based learning, I found the experience quite surprising. What originally felt like looking at abstract hieroglyphs quickly turned into a daily habit, allowing me to learn about 300 words from scratch.",[65,96,98],{"id":97},"helpful-definition","Helpful Definition",[100,101,102],"blockquote",{},[70,103,104,105],{},"\"Anki is a free and open-source flashcard program. It uses techniques from cognitive science such as active recall testing and spaced repetition to aid the user in memorization.\" — ",[106,107,111],"a",{"href":108,"rel":109},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAnki",[110],"nofollow","wikipedia.com",[113,114,116],"h2",{"id":115},"wait-youre-learning-japanese","Wait, You're Learning Japanese?",[70,118,119],{},"You heard correctly. I'm currently taking a stab at the Japanese language. It all has to do with some reflection I had regarding my future progression as a person and an engineer. Being a (mostly) autodidact in programming, I've experienced both upsides and downsides to my unorthodox path. Without getting into too much detail, I've set my sights on pursuing graduate research in Japan. This, paired with my longstanding interest in the country, has pushed me to embark on this new language learning journey.",[113,121,123],{"id":122},"why-anki","Why Anki?",[70,125,126],{},"I feel like my inclination towards Anki as my preferred SRS platform is not very unique. Especially among Japanese learners (and even more so for those interested in the JATT learning approach), Anki feels more like a rite of passage than anything else. With such a huge mountain of unknown language structures ahead of you, it only feels natural to start with learning the basics through flashcards. Of course, its FOSS nature also attracted me very much. Who knows, if I find any egregious bugs I might end up submitting a PR someday.",[113,128,130],{"id":129},"the-results","The Results",[70,132,133,134,139],{},"And now for the million-dollar question: how much did I learn in my one month of continuous Anki use? Before I answer, I'd like to share some details around my approach. For anyone interested, I picked the Kaishi 1.5k core deck as my starter deck, which contains 1,500 of the most common Japanese words, with each card containing an example sentence using the word. I started off with 10 new cards a day (as per the recommendation of the YouTuber ",[106,135,138],{"href":136,"rel":137},"https:\u002F\u002Fwww.youtube.com\u002F@Livakivi",[110],"Livakivi","). That felt waaay too easy at the time, so I bumped it up to 20 new cards. Shortly after, I understood the concept of review piling, and suddenly I had to lower it again to 10 new cards. Luckily, I could keep up this pace until the end of the month, occasionally oscillating between 9 and 11 daily new cards. Eventually, my reviews got really comfy, so I've been trying to increase my daily new cards to 14, making my daily total reviews about 120 (about 50 minutes a day).",[70,141,142],{},[143,144],"img",{"alt":145,"src":146},"Anki Screenshot of Reviews Stats","content\u002Fanki-screenshot-1.png",[70,148,149],{},"Above you can see a clear picture of how all my totals grew throughout the month. Funnily enough, my daily time spent actually resembles more of a bell curve. As I got more comfortable reviewing old cards, I started taking drastically less time to review the same number of cards every day.",[70,151,152],{},[143,153],{"alt":154,"src":155},"Anki Screenshot of Cards Stats","content\u002Fanki-screenshot-2.png",[70,157,158],{},"In this breakdown, you can see my total cards learned amounts to 335! Not too bad in my opinion. At this point, I still struggle to understand even the most basic audio and text fragments of Japanese. However, I can now noticeably intuit the general structures of sentences, and once in a while (when I'm lucky enough), I hear a sentence containing mostly familiar vocabulary, allowing me to understand it fully. Moreover, I really enjoyed learning straight away with kanji. Having picked up hiragana and katakana shortly before starting Anki, I now pick up kanji radicals here and there, making learning new words slightly easier.",[113,160,162],{"id":161},"future-goals-aspirations","Future Goals & Aspirations",[70,164,165],{},"If my projections are correct and I can keep up this pace, I will finish this core deck in late October. Until then, I'll supplement my grammar study with my copy of the Genki I textbook and immersion whenever possible. I'm very eager to try sentence mining; however, I'll have to be patient until I have a stronger comprehension base before such an approach will be effective. I'll definitely try to drop another article if and when I finish the entire Kaishi 1.5k deck!",{"title":74,"searchDepth":75,"depth":75,"links":167},[168,169,170,171],{"id":115,"depth":75,"text":116},{"id":122,"depth":75,"text":123},{"id":129,"depth":75,"text":130},{"id":161,"depth":75,"text":162},"2026-07-17","After knowing about Anki and SRS for a while I decided to give it a try for my study of Japanese. These are my experience after my first month of daily use.","https:\u002F\u002Fus1.discourse-cdn.com\u002Fflex002\u002Fuploads\u002Fanki2\u002Foriginal\u002F3X\u002Fa\u002F9\u002Fa916db752275f53e75be467f7a972e8c70fec9a2.png",{},4,{"title":10,"description":173},"vdtEsKS1-V-L4ON7sY8j5DcUj9i3-BlUaDP0avub4h0",{"id":180,"title":14,"author":50,"badge":181,"body":182,"date":367,"description":368,"extension":79,"image":369,"meta":370,"minRead":176,"navigation":54,"path":15,"seo":371,"stem":16,"__hash__":372},"blog\u002Fblog\u002Fgsoc-2026-a-hopeful-rejection.md","OpenStreetMap",{"type":62,"value":183,"toc":360},[184,186,192,194,204,208,225,229,243,246,249,253,256,264,272,275,285,289,292,302,305,308,314,317,320,325,334,338,347,350,357],[65,185,68],{"id":67},[70,187,188,189,191],{},"I was rejected for GSoC 2026 after months of preparation. The disappointment was tough, but the entire experience integrated me into open-source culture. My prep work involved building a deep understanding of routing engine mechanics and systems engineering principles, giving me the necessary foundation to start my own FOSS project, ",[106,190,40],{"href":41},".",[65,193,98],{"id":97},[100,195,196],{},[70,197,198,199],{},"\"Google Summer of Code is a global, online program focused on bringing new contributors into open source software development. GSoC Contributors work with an open source organization on a 12+ week programming project under the guidance of mentors.\" — ",[106,200,203],{"href":201,"rel":202},"https:\u002F\u002Fsummerofcode.withgoogle.com\u002F",[110],"summerofcode.withgoogle.com",[113,205,207],{"id":206},"how-it-started","How It Started",[70,209,210,211,216,217,219,220,224],{},"In late 2025, I happened to discover Google Summer of Code while watching a ",[106,212,215],{"href":213,"rel":214},"https:\u002F\u002Fwww.youtube.com\u002F@Green-Code",[110],"Green Code"," video. It caught my eye due to its \"meritocratic\" appeal (very attractive for any self-taught engineer), and let's be honest, the fact that it was backed by Google also had something to do with it :-). Being in the midst of my work on ",[106,218,36],{"href":37}," and just being introduced to the world of GIS technology, I looked through the org list to find a project that could fit me. I ended up landing on ",[106,221,181],{"href":222,"rel":223},"https:\u002F\u002Fwiki.openstreetmap.org\u002F",[110]," thanks to the sheer variety of prominent GIS projects they maintain. I checked the proposed projects page on the official wiki only to find out there was just one project up for grabs at the time. Remembering that \"the early bird gets the worm,\" I scanned the repo and contacted the mentor to share my interest in the project.",[113,226,228],{"id":227},"the-prep-phase","The Prep Phase",[70,230,231,232,237,238,242],{},"My preparations kicked off by exploring target repo (",[106,233,236],{"href":234,"rel":235},"https:\u002F\u002Fgithub.com\u002Fsosm\u002Ftemporary-road-closures",[110],"closure.osm.ch",") more thoroughly. In short, the project consists of a monorepo including a Next.js frontend and a FastAPI backend. As expected, the frontend handles the web UI while the Python backend handles most of the business logic. The main goal of closure.osm.ch is to expose a new routing API that community-sources and aggregates public closure data. At the time, it only featured a landing page plus a \"closure-aware\" routing demo. With the main mentor stated goal being integration with one or more dynamic routing engines, I took a look at what engine was currently being used for the demo. It turned out to be ",[106,239,44],{"href":240,"rel":241},"https:\u002F\u002Fgithub.com\u002Fvalhalla\u002Fvalhalla",[110],", making my very next step exploring and understanding that repository in order to propose an optimal integration.",[70,244,245],{},"Valhalla, being an enormous decade-plus C++ codebase, was especially challenging to wrap my head around. It was designed with strict OOP principles in mind, which on one hand made it easier for me to focus on studying individual aspects of the system, while on the other hand the countless levels of abstraction and polymorphism made my head spin. Luckily for me, the core maintainer team numbers only four people, making discussions with far-reaching system consequences much easier. I have to give a big thanks to this very team for not only hearing out my (at times naive) ideas but also those of all the other participants equally, without a show of favoritism.",[70,247,248],{},"I'd like to mention that open-source software took a bit of adjusting for me. It was quite intimidating, and I was self-conscious about not fitting in and seeming too much like a clueless noob (maybe something worth delving into in another blog post). In fact, this very feeling of fear made me delve into documentation for hours, scour subreddits, and quintuple-check every message and contribution before sending.",[113,250,252],{"id":251},"pre-submission-contributions","Pre-submission Contributions",[70,254,255],{},"As clearly stated by the GSoC and OSM guidelines, contributions to the projects one applies to are obligatory for consideration. Knowing this, I set out to deliver my first-ever PRs to both closures.osm.ch and Valhalla.",[70,257,258,259,263],{},"To summarize, my ",[106,260,262],{"href":261},"\u002Fwork\u002Fvalhalla#docker-version-logging","main merged PR"," for Valhalla added version logging during the startup of the official Docker image. Besides that, I spent some time helping with issue triage and technical discussions surrounding vector tiles and the live traffic subsystem.",[70,265,266,267,271],{},"On the closures.osm.ch side, I fixed Docker compatibility issues, integrated ",[268,269,270],"code",{},"vitest"," together with an initial unit test suite, improved backend build reliability, and reported a handful of architectural issues I encountered while studying the codebase.",[70,273,274],{},"Lastly, I wanted to experience the OpenStreetMap ecosystem from the perspective of a data contributor as well. To that end, I made a handful of map edits around both Barcelona and Nijmegen, getting familiar with the editing workflow and the review process along the way.",[100,276,277],{},[70,278,279,280,284],{},"If you're interested in seeing a compilation of all my contributions, feel free to check out my ",[106,281,283],{"href":282},"#full-propsal-anchor","full GSoC proposal"," below.",[113,286,288],{"id":287},"summary-of-the-proposal","Summary of the Proposal",[70,290,291],{},"I'll try to keep the breakdown of the proposal short, as you can view the entire submitted document below.",[70,293,294,295,298,299,301],{},"In a nutshell, I identified a handful of problems with the current closure-aware routing approach that were keeping it from being production-ready. Supposedly due to its \"demo\" nature, I encountered a few spots with a very unclear separation of concerns. Firstly, the entire routing logic was located in the Next.js frontend, defeating the purpose of the REST API as the project's focal point. It basically just sent a routing request to a remote Valhalla instance with the ",[268,296,297],{},"exclude_locations"," parameter filled with closures fetched from the accompanying PostGIS database. ",[268,300,297],{}," is limited to 50 location points max, which is way too little for any serious trip, and uses closest-point map matching, leading to unreliable routing accuracy. Moreover, the OpenLR module was built from scratch but was not compliant with the actual open standard.",[70,303,304],{},"The main considerations for the solution were to have a system that could provide native-like integration with routing engines while staying engine-agnostic, adding as little runtime overhead as possible, and integrating seamlessly with the existing closures.osm.ch infrastructure.",[70,306,307],{},"The solution I came up with was the addition of a new sidecar service called Closure Sync. Its design is best illustrated by the diagram below:",[70,309,310],{},[143,311],{"alt":312,"src":313},"Closure Sync Architecture Diagram","content\u002Fclosure-sync-diagram.png",[70,315,316],{},"As you can see, Closure Sync represents an independent service that is meant to be placed in the same host environment as the routing engine. It utilizes a Live Traffic overlay provided by many routing engines, which offers an API to change edge costs dynamically at runtime. In essence, the service polls a remote closures.osm.ch instance every couple of minutes to fetch live data and transforms the fetched data into a readable traffic overlay format, where all closed edges are assigned an infinite cost, effectively closing them.",[70,318,319],{},"I planned to initially write Closure Sync in Python to comply with a realistic milestone-based schedule. However, after a successful PoC, the service would ideally be rewritten in a compiled language to increase native performance and ship as a single binary.",[70,321,322],{},[106,323],{"id":324},"full-propsal-anchor",[326,327,331],"card",{"target":328,"title":329,"to":330},"_blank","PDF","\u002Fcontent\u002FGSoC-proposal.pdf",[70,332,333],{},"Click Here To View The Full Proposal",[113,335,337],{"id":336},"moving-on","Moving On",[70,339,340,341,346],{},"As suggested by the title of this post, my proposal was unfortunately rejected. It really wasn't the rejection itself that disappointed me, but rather some of the details surrounding it. Prior to submitting my proposal, I had publicly asked for some feedback in the ",[106,342,345],{"href":343,"rel":344},"https:\u002F\u002Fgithub.com\u002Fvalhalla\u002Fvalhalla\u002Fdiscussions\u002F5944",[110],"Valhalla discussion on GitHub",". I shortly afterward found out that asking for feedback like that is not really in accordance with the \"GSoC mentality,\" but the maintainers were still patient with me and engaged thoroughly. The point is that a couple of days after the conclusion of the discussion (still a few days before the deadline), another GSoC-aspiring commenter joined, name-dropping the mentor and thanking them because some of his doubts had been answered. Thinking little of it, I moved on with my preparations.",[70,348,349],{},"After getting rejected, I naturally wanted to know what the winning picks were. To my surprise, I found the same commenter presenting a rework of closures.osm.ch that included a \"sidecar service called Closure Sync.\" This is not meant as an exposé of this particular participant. I publicly shared my idea, so it's only natural that he used it in his own preparation, and I did not see his project, so it is not my place to judge it. It did, however, make the rejection sting more. On top of that, I was slightly put off by the follow-up contact with the mentor when asking for feedback and clarity surrounding the situation.",[70,351,352,353,356],{},"That being said, I in no way regret the time I put in. I knew from the start that the majority of proposals never see the light of day. In exploring Valhalla, I've developed a deep appreciation for routing technology, and I'm determined to grow my status as a trusted contributor to the project (more contributions in ",[106,354,355],{"href":45},"works","). Moreover, I learned from scratch what it means to create open-source software. It deeply resonated with my principles, and I'm looking forward to finding more cool projects to help out on.",[70,358,359],{},"While working on the GSoC proposal, I also deepened my knowledge of embedded systems, leaving me with an itch to do more impactful work on a real project. In essence, that's where the idea for Pico Router was born. Having gained the fundamental knowledge of how one of the most powerful and impactful routing engines works on the inside, I started looking for MCU-compatible alternatives. Sadly (or luckily), no one has yet tried to take on the challenge in a FOSS format, clearing the way for this new adventure!",{"title":74,"searchDepth":75,"depth":75,"links":361},[362,363,364,365,366],{"id":206,"depth":75,"text":207},{"id":227,"depth":75,"text":228},{"id":251,"depth":75,"text":252},{"id":287,"depth":75,"text":288},{"id":336,"depth":75,"text":337},"2026-05-19","A detailed breakdown of my personal experience applying to 2026 edition of Google Summer of Code.","https:\u002F\u002Fwww.collabora.com\u002Fassets\u002Fimages\u002Fblog\u002FGSoC-2020b.png",{},{"title":14,"description":368},"iuIb9ROvOJpGEGp3KaVicXHp4sK8ZsuqDEReqqyu6Z0",1786205226165]