[{"data":1,"prerenderedAt":645},["ShallowReactive",2],{"navigation":3,"blog-page":43,"blog":53},[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},"Pico Router Changes Directions","\u002Fblog\u002Fpico-router-changes-directions","blog\u002Fpico-router-changes-directions",false,{"title":23,"path":24,"stem":25,"children":26,"page":21},"Work","\u002Fwork","work",[27,31,35,39],{"title":28,"path":29,"stem":30},"D-Map Cache","\u002Fwork\u002Fdmap-cache","work\u002Fdmap-cache",{"title":32,"path":33,"stem":34},"Focal Grid","\u002Fwork\u002Ffocal-grid","work\u002Ffocal-grid",{"title":36,"path":37,"stem":38},"Pico Router","\u002Fwork\u002Fpico-router","work\u002Fpico-router",{"title":40,"path":41,"stem":42},"Valhalla","\u002Fwork\u002Fvalhalla","work\u002Fvalhalla",{"id":44,"title":45,"body":46,"description":47,"extension":48,"links":46,"meta":49,"navigation":50,"path":6,"seo":51,"stem":7,"__hash__":52},"pages\u002Fblog.yml","Latest Articles",null,"Some of my thoughts on development and the tech industry more general.","yml",{},true,{"title":45,"description":47},"PsBDvROmjTQUvIb3pez2OwCbARCigkiAz9H9AFFNzB0",[54,358,448],{"id":55,"title":18,"author":46,"badge":36,"body":56,"date":350,"description":351,"draft":21,"extension":352,"image":353,"meta":354,"minRead":355,"navigation":50,"path":19,"seo":356,"stem":20,"__hash__":357},"blog\u002Fblog\u002Fpico-router-changes-directions.md",{"type":57,"value":58,"toc":336},"minimark",[59,64,68,73,76,79,83,86,116,129,133,136,140,143,147,155,159,162,214,217,274,277,281,284,287,291,294,300,303,322,326,329,332],[60,61,63],"h3",{"id":62},"tldr","TL;DR",[65,66,67],"p",{},"Pico Router is narrowing its focus from an ambitious all-in-one disaster-relief firmware project into a reusable embedded C++ routing library. Rather than building custom hardware integrations and tooling, development will prioritize a clean routing abstraction with bounded, predictable memory usage. Near-term work will focus on cache-aware graph storage and scalable tiled map access, potentially borrowing ideas from software-managed caches and spatial partitioning explored in related projects, while keeping disaster relief as one possible application.",[69,70,72],"h2",{"id":71},"the-original-vision","The Original Vision",[65,74,75],{},"Pico Router was started under ambitious conditions with ambitious goals in mind. The pitch from the very start was to build a fully-fledged autonomous offline routing systems for disaster relief purposes. This included all the bells and whistles. My plan was to not only embed a routing engine on an MCU, but also support all kinds of peripherals and tooling (IMU, OLED display, GPS processing).",[65,77,78],{},"As you can probably infer by my tone, I bit off more than I could chew. That's all right though. I had originally homed in on a very particular use case in order to make all the initial planning of the project slightly easier. Besides, disaster relief is something I genuinely care about. However, what was also true was that Pico Router was my first \"big\" embedded firmware undertaking, making it easy for me to underestimate the scale of what I proposed. In the end, I didn't set out to solve every imaginable problem in the world of embedded routing engines. My goal was rather to offer a novel solution for a specific hardware target and hopefully learn lots along the way. In that respect, I think I'm well on my way to achieving my objectives.",[69,80,82],{"id":81},"where-is-pico-router-today","Where Is Pico Router Today?",[65,84,85],{},"Today, Pico Router is at version 0.1.0 with most of basic functionality in place. Here's a quick overview of implemented features:",[87,88,89,93,96,104,107,110,113],"ul",{},[90,91,92],"li",{},"Fixed-size graph representation for nodes and weighted edges",[90,94,95],{},"A* pathfinding with Euclidean-distance heuristics",[90,97,98,99,103],{},"Conversion of OSM data into binary graph files (",[100,101,102],"code",{},"osm-convert",")",[90,105,106],{},"Raspberry Pi Pico 2 firmware target with UART output",[90,108,109],{},"Basic GitHub Actions CI",[90,111,112],{},"Devcontainer-based development environment",[90,114,115],{},"GoogleTest unit tests for paths and routing behavior",[117,118,119,122],"callout",{},[65,120,121],{},"Pico Router's current terminal banner",[65,123,124],{},[125,126],"img",{"alt":127,"src":128},"Pico Router Terminal Demo Banner","\u002Fcontent\u002Fpico-router-blog-photo-1.jpeg",[60,130,132],{"id":131},"so-whats-the-problem","So what's the problem?",[65,134,135],{},"The major problem here is scope creep. I derive a lot of satisfaction by doing stuff manually at this abstraction level. Nevertheless, I quickly tied my hands with emulation platforms, custom benchmarking, IO interfaces, etc. This helped me learn that there's a major difference between making a multi-versatile system and \"just making things work\".",[69,137,139],{"id":138},"what-exactly-is-changing","What Exactly Is Changing?",[65,141,142],{},"The main direction change boils down to the project going deeper and narrower rather than the current, wider approach. I want to move away from writing custom firmware for an all-in-one device in favor of a clean abstraction around the edge routing only. In essence, this means Pico Router is going from a full firmware solution to a third-party library.",[60,144,146],{"id":145},"does-that-mean-that-the-disaster-relief-use-case-is-being-left-behind","Does that mean that the disaster relief use case is being left behind?",[65,148,149,150,154],{},"Not necessarily. Perhaps the most effective thing to do is letting other developers decide themselves how embedded routing is best applied within their system, whether that's disaster relief or anything else for that matter. The key is that the fundamental promise remains: ",[151,152,153],"strong",{},"bounded, predictable memory usage",".",[60,156,158],{"id":157},"what-abstraction-level-are-you-going-for","What abstraction level are you going for?",[65,160,161],{},"Especially at first I'd like to keep things as straightforward as possible. Ideally I'd start off with something like:",[163,164,169],"pre",{"className":165,"code":166,"language":167,"meta":168,"style":168},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","RouteResultObject pico_router::get_route(uint32_t start_node, uint32_t goal_node);\n","cpp","",[100,170,171],{"__ignoreMap":168},[172,173,176,180,183,187,191,194,198,202,205,208,211],"span",{"class":174,"line":175},"line",1,[172,177,179],{"class":178},"sBMFI","RouteResultObject",[172,181,182],{"class":178}," pico_router",[172,184,186],{"class":185},"sMK4o","::",[172,188,190],{"class":189},"s2Zo4","get_route",[172,192,193],{"class":185},"(",[172,195,197],{"class":196},"spNyl","uint32_t",[172,199,201],{"class":200},"sHdIc"," start_node",[172,203,204],{"class":185},",",[172,206,207],{"class":196}," uint32_t",[172,209,210],{"class":200}," goal_node",[172,212,213],{"class":185},");\n",[65,215,216],{},"Of course, the actual API will likely become somewhat more involved than that. A route request may need to specify the graph or routing context and the returned result will need to communicate more than simply a list of nodes. At a minimum, I'd expect something resembling:",[163,218,220],{"className":165,"code":219,"language":167,"meta":168,"style":168},"struct RouteResult {\n  RouteStatus status;\n  Path path;\n  uint32_t total_cost;\n};\n",[100,221,222,233,246,257,268],{"__ignoreMap":168},[172,223,224,227,230],{"class":174,"line":175},[172,225,226],{"class":196},"struct",[172,228,229],{"class":178}," RouteResult",[172,231,232],{"class":185}," {\n",[172,234,236,239,243],{"class":174,"line":235},2,[172,237,238],{"class":178},"  RouteStatus",[172,240,242],{"class":241},"sTEyZ"," status",[172,244,245],{"class":185},";\n",[172,247,249,252,255],{"class":174,"line":248},3,[172,250,251],{"class":178},"  Path",[172,253,254],{"class":241}," path",[172,256,245],{"class":185},[172,258,260,263,266],{"class":174,"line":259},4,[172,261,262],{"class":196},"  uint32_t",[172,264,265],{"class":241}," total_cost",[172,267,245],{"class":185},[172,269,271],{"class":174,"line":270},5,[172,272,273],{"class":185},"};\n",[65,275,276],{},"The important point however is that the caller shouldn't need to know how the route was calculated.",[60,278,280],{"id":279},"how-will-pico-router-integrate-as-a-third-party-dependency","How will Pico Router integrate as a third-party dependency?",[65,282,283],{},"The goal is to make Pico Router be easily available where embedded developers can conveniently access it. I'd honestly like to once again not go overboard and make it initially accessible as a standalone C++ library through a CMake install. Later I could start releasing pre-bundled binaries if there's any need for that.",[65,285,286],{},"Another thing that does look attractive is releasing Pico Router with a dedicated Zephyr thread to make RTOS usage smoother. Once again though, I think time will tell on this one.",[60,288,290],{"id":289},"what-features-will-need-to-change","What features will need to change?",[65,292,293],{},"Fortunately, not too many of the existing features will need to be outright removed or change significantly. The current progress covers only the most fundamental parts of the system. Still, the short and long term roadmap does change more drastically. Where I was quite intent on getting a hands-on demo as soon as possible not too long ago, the focus now shifts towards creating a foundational stability to build on.",[65,295,296,297,299],{},"In the short-term I'll drop most work on ",[100,298,102],{}," and focus on optimising the graph representation for cache aware accessing. Moreover, doing some 'back of a napkin' calculations it became clear to me that even extremely compressed graph representations will quickly fill a micro-controller's flash storage. I'd therefore also be interested in experimenting with a tiled graph structure to allow for bigger sized maps using partial accessing.",[65,301,302],{},"Following this logic, I see an opportunity to perhaps make some kind of software based tile cache to fetch larger graph chunks into RAM from SD storage before being accessed by the CPU.",[117,304,305,316],{},[65,306,307,308,103],{},"Example of tiled graph hiearchy (",[309,310,315],"a",{"href":311,"rel":312,"target":314},"https:\u002F\u002Fnextcloud.osgeo.org\u002Fs\u002F2P4dfmn5D4xZCno?dir=undefined&path=%2FLumbardhi%2F28.06&openfile=6610351",[313],"nofollow","_blank","source",[65,317,318],{},[125,319],{"alt":320,"src":321},"Tiled Map Germany","\u002Fcontent\u002Fpico-router-blog-gif-1.gif",[69,323,325],{"id":324},"future-projection","Future Projection",[65,327,328],{},"All in all, Pico Router is still evolving and changing and I'm positive about where it's heading. I have deliberately not yet pushed for a formal community introduction of the project seeing as everything is still quite raw. Hopefully by the end of this year I can release an alpha to get some much needed feedback.",[65,330,331],{},"Nonetheless, I'll continue writing on here regarding interesting Pico Router developments.",[333,334,335],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":168,"searchDepth":235,"depth":235,"links":337},[338,339,340,343,349],{"id":62,"depth":248,"text":63},{"id":71,"depth":235,"text":72},{"id":81,"depth":235,"text":82,"children":341},[342],{"id":131,"depth":248,"text":132},{"id":138,"depth":235,"text":139,"children":344},[345,346,347,348],{"id":145,"depth":248,"text":146},{"id":157,"depth":248,"text":158},{"id":279,"depth":248,"text":280},{"id":289,"depth":248,"text":290},{"id":324,"depth":235,"text":325},"2026-08-23","The Pico Router project is narrowing its focus and turning into a third-party C++ routing library for constrained embbed hardware targets.","md","\u002Fcontent\u002Fblog-banner-1.jpeg",{},6,{"title":18,"description":351},"sSzGSrN2b2eer58Zue-Epsl52RZ1BScupFppy6YQXbI",{"id":359,"title":10,"author":46,"badge":360,"body":361,"date":442,"description":443,"draft":21,"extension":352,"image":444,"meta":445,"minRead":259,"navigation":50,"path":11,"seo":446,"stem":12,"__hash__":447},"blog\u002Fblog\u002Fanki-baby-steps.md","Japanese Study",{"type":57,"value":362,"toc":436},[363,366,369,373,384,388,391,395,398,402,411,417,420,426,429,433],[364,365,63],"h4",{"id":62},[65,367,368],{},"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.",[364,370,372],{"id":371},"helpful-definition","Helpful Definition",[374,375,376],"blockquote",{},[65,377,378,379],{},"\"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.\" — ",[309,380,383],{"href":381,"rel":382},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAnki",[313],"wikipedia.com",[69,385,387],{"id":386},"wait-youre-learning-japanese","Wait, You're Learning Japanese?",[65,389,390],{},"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.",[69,392,394],{"id":393},"why-anki","Why Anki?",[65,396,397],{},"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.",[69,399,401],{"id":400},"the-results","The Results",[65,403,404,405,410],{},"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 ",[309,406,409],{"href":407,"rel":408},"https:\u002F\u002Fwww.youtube.com\u002F@Livakivi",[313],"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).",[65,412,413],{},[125,414],{"alt":415,"src":416},"Anki Screenshot of Reviews Stats","content\u002Fanki-screenshot-1.png",[65,418,419],{},"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.",[65,421,422],{},[125,423],{"alt":424,"src":425},"Anki Screenshot of Cards Stats","content\u002Fanki-screenshot-2.png",[65,427,428],{},"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.",[69,430,432],{"id":431},"future-goals-aspirations","Future Goals & Aspirations",[65,434,435],{},"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":168,"searchDepth":235,"depth":235,"links":437},[438,439,440,441],{"id":386,"depth":235,"text":387},{"id":393,"depth":235,"text":394},{"id":400,"depth":235,"text":401},{"id":431,"depth":235,"text":432},"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.","\u002Fcontent\u002Fanki-baby-steps-banner.jpeg",{},{"title":10,"description":443},"AAXibFmlwSub2VpH0pr4CaCQJZwlMCNFaQ-W3fbUDQ0",{"id":449,"title":14,"author":46,"badge":450,"body":451,"date":639,"description":640,"draft":21,"extension":352,"image":641,"meta":642,"minRead":270,"navigation":50,"path":15,"seo":643,"stem":16,"__hash__":644},"blog\u002Fblog\u002Fgsoc-2026-a-hopeful-rejection.md","OpenStreetMap",{"type":57,"value":452,"toc":632},[453,455,460,462,472,476,493,497,511,514,517,521,524,532,539,542,552,556,559,569,572,575,581,584,587,592,603,607,616,619,626],[364,454,63],{"id":62},[65,456,457,458,154],{},"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, ",[309,459,36],{"href":37},[364,461,372],{"id":371},[374,463,464],{},[65,465,466,467],{},"\"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.\" — ",[309,468,471],{"href":469,"rel":470},"https:\u002F\u002Fsummerofcode.withgoogle.com\u002F",[313],"summerofcode.withgoogle.com",[69,473,475],{"id":474},"how-it-started","How It Started",[65,477,478,479,484,485,487,488,492],{},"In late 2025, I happened to discover Google Summer of Code while watching a ",[309,480,483],{"href":481,"rel":482},"https:\u002F\u002Fwww.youtube.com\u002F@Green-Code",[313],"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 ",[309,486,32],{"href":33}," 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 ",[309,489,450],{"href":490,"rel":491},"https:\u002F\u002Fwiki.openstreetmap.org\u002F",[313]," 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.",[69,494,496],{"id":495},"the-prep-phase","The Prep Phase",[65,498,499,500,505,506,510],{},"My preparations kicked off by exploring target repo (",[309,501,504],{"href":502,"rel":503},"https:\u002F\u002Fgithub.com\u002Fsosm\u002Ftemporary-road-closures",[313],"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 ",[309,507,40],{"href":508,"rel":509},"https:\u002F\u002Fgithub.com\u002Fvalhalla\u002Fvalhalla",[313],", making my very next step exploring and understanding that repository in order to propose an optimal integration.",[65,512,513],{},"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.",[65,515,516],{},"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.",[69,518,520],{"id":519},"pre-submission-contributions","Pre-submission Contributions",[65,522,523],{},"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.",[65,525,526,527,531],{},"To summarize, my ",[309,528,530],{"href":529},"\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.",[65,533,534,535,538],{},"On the closures.osm.ch side, I fixed Docker compatibility issues, integrated ",[100,536,537],{},"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.",[65,540,541],{},"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.",[374,543,544],{},[65,545,546,547,551],{},"If you're interested in seeing a compilation of all my contributions, feel free to check out my ",[309,548,550],{"href":549},"#full-propsal-anchor","full GSoC proposal"," below.",[69,553,555],{"id":554},"summary-of-the-proposal","Summary of the Proposal",[65,557,558],{},"I'll try to keep the breakdown of the proposal short, as you can view the entire submitted document below.",[65,560,561,562,565,566,568],{},"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 ",[100,563,564],{},"exclude_locations"," parameter filled with closures fetched from the accompanying PostGIS database. ",[100,567,564],{}," 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.",[65,570,571],{},"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.",[65,573,574],{},"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:",[65,576,577],{},[125,578],{"alt":579,"src":580},"Closure Sync Architecture Diagram","content\u002Fclosure-sync-diagram.png",[65,582,583],{},"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.",[65,585,586],{},"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.",[65,588,589],{},[309,590],{"id":591},"full-propsal-anchor",[593,594,600],"card",{"dataUmamiEvent":595,"dataUmamiEventFile":596,"icon":597,"target":314,"title":598,"to":599},"file-download","gsoc-proposal.pdf","basil:document-solid","PDF","\u002Fcontent\u002Fgsoc-proposal.pdf",[65,601,602],{},"Click Here To View The Full Proposal",[69,604,606],{"id":605},"moving-on","Moving On",[65,608,609,610,615],{},"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 ",[309,611,614],{"href":612,"rel":613},"https:\u002F\u002Fgithub.com\u002Fvalhalla\u002Fvalhalla\u002Fdiscussions\u002F5944",[313],"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.",[65,617,618],{},"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.",[65,620,621,622,625],{},"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 ",[309,623,624],{"href":41},"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.",[65,627,628,629,631],{},"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 ",[309,630,36],{"href":37}," 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":168,"searchDepth":235,"depth":235,"links":633},[634,635,636,637,638],{"id":474,"depth":235,"text":475},{"id":495,"depth":235,"text":496},{"id":519,"depth":235,"text":520},{"id":554,"depth":235,"text":555},{"id":605,"depth":235,"text":606},"2026-05-19","A detailed breakdown of my personal experience applying to 2026 edition of Google Summer of Code.","\u002Fcontent\u002Fgsoc-banner.jpeg",{},{"title":14,"description":640},"pjcTALr_QGoVohVSkmHDon6CscU6-vtQjK7fI-gsjkE",1789678542077]