[{"data":1,"prerenderedAt":4393},["ShallowReactive",2],{"posts-all":3},[4,484,894,1354,1619,1845],{"id":5,"title":6,"body":7,"date":472,"description":473,"extension":474,"meta":475,"navigation":477,"path":478,"seo":479,"stem":480,"tag":481,"ttr":482,"__hash__":483},"writing\u002Fwritings\u002Fwe-need-to-slow-down.md","We Need to Slow Down",{"type":8,"value":9,"toc":456},"minimark",[10,14,17,20,23,26,29,32,37,40,43,59,62,65,68,71,73,77,80,93,96,99,102,107,110,113,127,130,133,136,139,142,146,149,152,155,166,169,172,175,177,181,184,187,190,193,196,199,207,210,213,216,219,236,239,242,244,248,251,260,263,275,278,281,284,287,289,293,296,308,311,314,317,320,323,326,329,332,334,338,341,344,358,361,364,367,370,373,376,378,382,385,394,397,400,403,406,409,412,415,417,420,423,426,429,432,435,438,441,444,447,450,453],[11,12,13],"p",{},"I am not against AI.",[11,15,16],{},"Let me start there — clearly.",[11,18,19],{},"Artificial intelligence is one of the most powerful tools ever created. It is accelerating medicine, research, accessibility, and creative work. In programming, it can explain complex concepts in seconds, scaffold boilerplate, suggest optimizations, and help developers break through mental blocks.",[11,21,22],{},"AI is not the enemy.",[11,24,25],{},"What concerns me is something else.",[11,27,28],{},"What concerns me is vibe coding.",[30,31],"hr",{},[33,34,36],"h2",{"id":35},"the-difference-between-using-ai-and-replacing-yourself","The Difference Between Using AI and Replacing Yourself",[11,38,39],{},"There is a meaningful distinction between leveraging AI and outsourcing your thinking to it.",[11,41,42],{},"Using AI to:",[44,45,46,50,53,56],"ul",{},[47,48,49],"li",{},"Look up an unfamiliar pattern,",[47,51,52],{},"Generate a helper function,",[47,54,55],{},"Explain a compiler error,",[47,57,58],{},"Or suggest alternative implementations —",[11,60,61],{},"That’s assistance.\nThat’s augmentation.",[11,63,64],{},"But asking it to generate entire architectures, entire features, entire products — and then shipping them without deeply understanding them — that’s something else.",[11,66,67],{},"That’s not acceleration.\nThat’s abdication.",[11,69,70],{},"And the consequences are subtle at first.",[30,72],{},[33,74,76],{"id":75},"the-illusion-of-speed","The Illusion of Speed",[11,78,79],{},"Vibe coding feels fast.",[11,81,82,83,86,87,89,90,92],{},"You prompt. ",[84,85],"br",{},"\nIt fills. ",[84,88],{},"\nYou tweak. ",[84,91],{},"\nYou ship.",[11,94,95],{},"The app runs. The UI renders. The API responds. It feels productive.",[11,97,98],{},"But fully vibe-coded programs almost never turn out as robust and secure as they need to be.",[11,100,101],{},"And that creates two very real problems.",[103,104,106],"h3",{"id":105},"_1-security-becomes-accidental","1. Security Becomes Accidental",[11,108,109],{},"Security is not something that emerges from luck.",[11,111,112],{},"It comes from careful design:",[44,114,115,118,121,124],{},[47,116,117],{},"Where is state stored?",[47,119,120],{},"How is data validated?",[47,122,123],{},"What assumptions are being made?",[47,125,126],{},"Where can this break under stress?",[11,128,129],{},"When you don’t consciously design those things, you don’t own them.",[11,131,132],{},"And if you don’t own them, you can’t defend them.",[11,134,135],{},"The more layers of generated abstraction you pile on without comprehension, the more your application becomes a black box — even to you.",[11,137,138],{},"That’s not innovation.",[11,140,141],{},"That’s roulette.",[103,143,145],{"id":144},"_2-maintenance-becomes-a-nightmare","2. Maintenance Becomes a Nightmare",[11,147,148],{},"At some point, something breaks.",[11,150,151],{},"It always does.",[11,153,154],{},"And now you’re facing a codebase you didn’t truly design:",[44,156,157,160,163],{},[47,158,159],{},"Patterns you didn’t choose.",[47,161,162],{},"Dependencies you didn’t evaluate.",[47,164,165],{},"Architectural decisions you didn’t consciously make.",[11,167,168],{},"You must reverse-engineer your own product.",[11,170,171],{},"Fixing these systems often becomes harder and more error-prone than designing them properly from scratch. Every modification feels like pulling on a thread in a sweater — you’re not sure what will unravel.",[11,173,174],{},"Speed at the beginning becomes friction at the end.",[30,176],{},[33,178,180],{"id":179},"what-were-actually-losing","What We’re Actually Losing",[11,182,183],{},"But the technical risks are not even the saddest part.",[11,185,186],{},"The saddest part is what we’re losing culturally.",[11,188,189],{},"Older software had character.",[11,191,192],{},"Not because it was objectively better.",[11,194,195],{},"But because it was designed by people who were thinking deeply.",[11,197,198],{},"Look at early applications from companies like Winamp, Nullsoft’s chaotic masterpiece. It wasn’t just a media player — it had personality. Skins. Weird visualizers. Experimental UI decisions.",[11,200,201,202,206],{},"Or early versions of Apple software under Steve Jobs — polarizing, opinionated, deliberate. You could feel that someone cared obsessively about how it ",[203,204,205],"em",{},"felt",", not just that it worked.",[11,208,209],{},"Even early indie software — small utilities written by a single developer — had quirks. Sometimes ugly. Sometimes imperfect. But distinct.",[11,211,212],{},"Now?",[11,214,215],{},"Open ten new productivity apps.",[11,217,218],{},"They:",[44,220,221,224,227,230,233],{},[47,222,223],{},"Use the same component libraries.",[47,225,226],{},"Follow the same SaaS template.",[47,228,229],{},"Have the same onboarding flow.",[47,231,232],{},"Use the same pastel gradients.",[47,234,235],{},"Use the same hero section layout.",[11,237,238],{},"Different logo. Same soul.",[11,240,241],{},"It feels like innovation has been flattened into aesthetic conformity.",[30,243],{},[33,245,247],{"id":246},"the-illusion-of-innovation","The Illusion of Innovation",[11,249,250],{},"What’s happening today is strange.",[11,252,253,254,256,257,259],{},"Someone has a genuinely good idea. ",[84,255],{},"\nSomething interesting. ",[84,258],{},"\nSomething novel.",[11,261,262],{},"But instead of carefully designing a product that expresses that idea uniquely, they take the shortest path to implementation.",[11,264,265,266,268,269,271,272,274],{},"AI scaffolds the backend. ",[84,267],{},"\nAI generates the frontend. ",[84,270],{},"\nAI writes the landing page copy. ",[84,273],{},"\nAI designs the logo.",[11,276,277],{},"And the result works.",[11,279,280],{},"But it feels like every other app launched that week.",[11,282,283],{},"We’ve optimized for speed so aggressively that we’ve sacrificed distinctiveness.",[11,285,286],{},"When everything is generated from the same statistical patterns, everything starts to feel statistically average.",[30,288],{},[33,290,292],{"id":291},"the-beauty-of-thinking","The Beauty of Thinking",[11,294,295],{},"There is something deeply beautiful about wrestling with a problem.",[11,297,298,299,301,302,304,305,307],{},"About modeling your data structures from scratch. ",[84,300],{},"\nAbout choosing an architecture intentionally. ",[84,303],{},"\nAbout rejecting an abstraction because it doesn’t feel right. ",[84,306],{},"\nAbout spending hours simplifying something that technically already works.",[11,309,310],{},"That friction is not inefficiency.",[11,312,313],{},"It is craftsmanship.",[11,315,316],{},"It is where intuition forms.",[11,318,319],{},"It is where taste develops.",[11,321,322],{},"It is where you become more than someone who “assembles code.”",[11,324,325],{},"Vibe coding short-circuits that process.",[11,327,328],{},"The generate → patch → regenerate → ship loop removes the cognitive tension that creates growth.",[11,330,331],{},"And without tension, there is no strength.",[30,333],{},[33,335,337],{"id":336},"ai-as-a-tool-not-a-substitute","AI as a Tool, Not a Substitute",[11,339,340],{},"AI should help you find what you’re looking for faster.",[11,342,343],{},"It should:",[44,345,346,349,352,355],{},[47,347,348],{},"Reduce search friction.",[47,350,351],{},"Provide reference implementations.",[47,353,354],{},"Fill in mechanical boilerplate.",[47,356,357],{},"Teach you patterns you don’t yet know.",[11,359,360],{},"Using it to generate a function you don’t know how to write — that’s fine.",[11,362,363],{},"Using it to understand a concept faster — that’s powerful.",[11,365,366],{},"But when the whole system is just… generated… and barely understood by its creator, something fundamental is missing.",[11,368,369],{},"Ownership.",[11,371,372],{},"When you write something, truly write it, you carry its logic in your head. You know why decisions were made. You know where it can break.",[11,374,375],{},"That confidence cannot be prompted into existence.",[30,377],{},[33,379,381],{"id":380},"everyone-is-in-a-hurry","Everyone Is in a Hurry",[11,383,384],{},"We are addicted to shipping.",[11,386,387,388,390,391,393],{},"Shipping fast. ",[84,389],{},"\nShipping MVP. ",[84,392],{},"\nShipping before someone else does.",[11,395,396],{},"But we rarely ask: what are we shipping into the world?",[11,398,399],{},"A temporary demo?",[11,401,402],{},"Or something designed with care?",[11,404,405],{},"Slowing down does not mean rejecting progress.",[11,407,408],{},"It means respecting complexity.",[11,410,411],{},"It means choosing depth over velocity.",[11,413,414],{},"It means valuing long-term understanding over short-term output.",[30,416],{},[33,418,6],{"id":419},"we-need-to-slow-down",[11,421,422],{},"Not because AI is bad.",[11,424,425],{},"Not because speed is evil.",[11,427,428],{},"But because quality requires thought.",[11,430,431],{},"Because security requires intention.",[11,433,434],{},"Because innovation requires courage.",[11,436,437],{},"Because character requires time.",[11,439,440],{},"The developers who truly understand their systems will always outgrow those who merely prompt them into existence.",[11,442,443],{},"We don’t need fewer tools.",[11,445,446],{},"We need more responsibility.",[11,448,449],{},"We need more taste.",[11,451,452],{},"We need more craftsmanship.",[11,454,455],{},"We need to slow down.",{"title":457,"searchDepth":458,"depth":459,"links":460},"",2,3,[461,462,466,467,468,469,470,471],{"id":35,"depth":458,"text":36},{"id":75,"depth":458,"text":76,"children":463},[464,465],{"id":105,"depth":459,"text":106},{"id":144,"depth":459,"text":145},{"id":179,"depth":458,"text":180},{"id":246,"depth":458,"text":247},{"id":291,"depth":458,"text":292},{"id":336,"depth":458,"text":337},{"id":380,"depth":458,"text":381},{"id":419,"depth":458,"text":6},"2026-02-27","Whatever happened to the craft?","md",{"author":476},"Hassan Qasemi",true,"\u002Fwritings\u002Fwe-need-to-slow-down",{"title":6,"description":473},"writings\u002Fwe-need-to-slow-down","Development","8 min read","RgWkdrebCiQC3z-9tANZ07KUaJeEfEPKo05tiOOtEwM",{"id":485,"title":486,"body":487,"date":885,"description":886,"extension":474,"meta":887,"navigation":477,"path":888,"seo":889,"stem":890,"tag":891,"ttr":892,"__hash__":893},"writing\u002Fwritings\u002Ffrom-cloudflare-to-vercel.md","Why I Moved My Blog from Cloudflare to Vercel",{"type":8,"value":488,"toc":876},[489,492,495,498,506,509,511,515,518,521,524,527,534,548,551,553,557,564,567,578,581,584,601,612,615,617,621,627,630,641,644,647,672,679,741,744,753,756,758,762,765,768,779,786,789,791,795,801,804,807,810,813,815,819,822,831,834,841,843,847,850,857,866,869,872],[11,490,491],{},"For a long time, my blog lived on Cloudflare.",[11,493,494],{},"It was fast, globally distributed, inexpensive, and reliable. In many ways, it was exactly what you would want for a static or hybrid site. And for a while, it did its job well.",[11,496,497],{},"Yet recently, I moved the entire site to Vercel.",[11,499,500,501,505],{},"This post isn’t a comparison of benchmarks, edge latency, or pricing tiers. It’s a reflection on ",[502,503,504],"strong",{},"developer experience",", tooling alignment, and the cumulative weight of small frictions — especially when working with Nuxt.",[11,507,508],{},"Sometimes, infrastructure decisions are less about raw capability and more about how invisible they become over time.",[30,510],{},[33,512,514],{"id":513},"cloudflare-was-solid-just-not-invisible","Cloudflare Was Solid — Just Not Invisible",[11,516,517],{},"To be clear: Cloudflare wasn’t broken.",[11,519,520],{},"Pages, Workers, and the surrounding ecosystem are impressive. The edge-first model, the control you get over caching and routing, and the pricing structure are genuinely compelling. If you enjoy tuning infrastructure and understanding exactly how your app executes at the edge, Cloudflare is a strong choice.",[11,522,523],{},"My blog never had uptime issues. Builds worked. Performance was good.",[11,525,526],{},"But despite all that, Cloudflare never fully disappeared into the background.",[11,528,529,530,533],{},"There was always ",[203,531,532],{},"something"," to think about:",[44,535,536,539,542,545],{},[47,537,538],{},"Edge runtime differences",[47,540,541],{},"Platform-specific APIs",[47,543,544],{},"Small mismatches between local development and production",[47,546,547],{},"Nuxt features that worked, but felt slightly constrained or indirect",[11,549,550],{},"None of these were blockers. But they added friction to something that is supposed to be simple: writing and publishing.",[30,552],{},[33,554,556],{"id":555},"nuxt-feels-at-home-on-vercel","Nuxt Feels “At Home” on Vercel",[11,558,559,560,563],{},"One of the biggest factors in the move was how naturally ",[502,561,562],{},"Nuxt fits into Vercel’s mental model",".",[11,565,566],{},"Nuxt already assumes:",[44,568,569,572,575],{},[47,570,571],{},"A clear separation between server and client code",[47,573,574],{},"Predictable deployment targets",[47,576,577],{},"Opinionated defaults for SSR, SSG, and hybrid rendering",[11,579,580],{},"On Vercel, those assumptions line up almost perfectly.",[11,582,583],{},"The deployment process is boring in the best way:",[44,585,586,589,592,595,598],{},[47,587,588],{},"Push to Git",[47,590,591],{},"Automatic preview deployment",[47,593,594],{},"Production behaves exactly like preview",[47,596,597],{},"Logs are clear and accessible",[47,599,600],{},"Environment variables work as expected, without edge-specific surprises",[11,602,603,604,607,608,611],{},"I didn’t have to think about ",[203,605,606],{},"where"," my code runs. I could just think about ",[203,609,610],{},"what"," it does.",[11,613,614],{},"That alignment matters more than I expected.",[30,616],{},[33,618,620],{"id":619},"adding-vercel-analytics-to-a-nuxt-project","Adding Vercel Analytics to a Nuxt Project",[11,622,623,624,563],{},"One very tangible reason for the move was ",[502,625,626],{},"Vercel Analytics",[11,628,629],{},"I don’t want complex dashboards or third-party scripts on a personal blog. I want basic answers:",[44,631,632,635,638],{},[47,633,634],{},"Are people reading?",[47,636,637],{},"Which pages get attention?",[47,639,640],{},"Did something break after a deploy?",[11,642,643],{},"With Vercel, enabling analytics in Nuxt is almost boringly simple.",[11,645,646],{},"Install the module:",[648,649,653],"pre",{"className":650,"code":651,"language":652,"meta":457,"style":457},"language-bash shiki shiki-themes gruvbox-light-hard gruvbox-dark-hard gruvbox-dark-hard","npm install @vercel\u002Fanalytics\n","bash",[654,655,656],"code",{"__ignoreMap":457},[657,658,661,665,669],"span",{"class":659,"line":660},"line",1,[657,662,664],{"class":663},"sXcZX","npm",[657,666,668],{"class":667},"snxCs"," install",[657,670,671],{"class":667}," @vercel\u002Fanalytics\n",[11,673,674,675,678],{},"Then enable it in ",[654,676,677],{},"nuxt.config.ts",":",[648,680,684],{"className":681,"code":682,"filename":677,"language":683,"meta":457,"style":457},"language-ts shiki shiki-themes gruvbox-light-hard gruvbox-dark-hard gruvbox-dark-hard","export default defineNuxtConfig({\n    modules: [\"@vercel\u002Fanalytics\u002Fnuxt\"],\n});\n","ts",[654,685,686,706,730],{"__ignoreMap":457},[657,687,688,692,695,698,702],{"class":659,"line":660},[657,689,691],{"class":690},"sA8KM","export",[657,693,694],{"class":690}," default",[657,696,697],{"class":663}," defineNuxtConfig",[657,699,701],{"class":700},"s2xuh","(",[657,703,705],{"class":704},"swc6o","{\n",[657,707,708,711,713,716,719,722,724,727],{"class":659,"line":458},[657,709,710],{"class":700},"    modules",[657,712,678],{"class":704},[657,714,715],{"class":700}," [",[657,717,718],{"class":704},"\"",[657,720,721],{"class":667},"@vercel\u002Fanalytics\u002Fnuxt",[657,723,718],{"class":704},[657,725,726],{"class":700},"]",[657,728,729],{"class":704},",\n",[657,731,732,735,738],{"class":659,"line":459},[657,733,734],{"class":704},"}",[657,736,737],{"class":700},")",[657,739,740],{"class":704},";\n",[11,742,743],{},"That’s it.",[11,745,746,747,749,750,752],{},"No scripts to manage. ",[84,748],{},"\nNo consent popups. ",[84,751],{},"\nNo external dashboards to configure.",[11,754,755],{},"The analytics are privacy-friendly, integrated into the platform, and scoped exactly to what I need — nothing more.",[30,757],{},[33,759,761],{"id":760},"fewer-platform-specific-workarounds","Fewer Platform-Specific Workarounds",[11,763,764],{},"Another quiet benefit of the move was the reduction in platform-specific conditionals.",[11,766,767],{},"On Cloudflare, certain things required extra care:",[44,769,770,773,776],{},[47,771,772],{},"Edge runtime limitations leaking into server logic",[47,774,775],{},"Nuxt features that worked, but needed adjustments",[47,777,778],{},"APIs that behaved slightly differently depending on context",[11,780,781,782,785],{},"Again, none of this was catastrophic. But it meant thinking about the platform ",[203,783,784],{},"while"," building features.",[11,787,788],{},"On Vercel, I find myself writing more “plain Nuxt” code. The platform mostly stays out of the way, and that lowers cognitive load — especially for a solo project.",[30,790],{},[33,792,794],{"id":793},"opinionated-defaults-are-a-feature","Opinionated Defaults Are a Feature",[11,796,797,798,800],{},"Cloudflare gives you power. ",[84,799],{},"\nVercel gives you defaults.",[11,802,803],{},"At this stage, I value defaults more.",[11,805,806],{},"Routing, headers, caching behavior, previews, and framework integrations are all handled in a way that feels intentionally boring. There are fewer knobs to turn, but also fewer ways to surprise yourself.",[11,808,809],{},"For a personal site, that trade-off makes sense.",[11,811,812],{},"I don’t want infrastructure to be a creative decision.",[30,814],{},[33,816,818],{"id":817},"this-wasnt-about-speed-or-scale","This Wasn’t About Speed or Scale",[11,820,821],{},"It’s worth saying explicitly: this move wasn’t about performance.",[11,823,824,825,827,828,830],{},"Both Cloudflare and Vercel are fast. ",[84,826],{},"\nBoth scale far beyond what this site will ever need. ",[84,829],{},"\nBoth are reliable.",[11,832,833],{},"If you’re optimizing for edge control, Cloudflare might still be the better choice.",[11,835,836,837,840],{},"This move was about ",[502,838,839],{},"comfort",", predictability, and flow.",[30,842],{},[33,844,846],{"id":845},"choosing-the-platform-that-disappears","Choosing the Platform That Disappears",[11,848,849],{},"At this point, my blog isn’t an experiment. It’s a place to write, publish, and occasionally rethink ideas. The infrastructure should fade into the background.",[11,851,852,853,856],{},"Vercel does that better ",[203,854,855],{},"for me"," — especially when paired with Nuxt.",[11,858,859,860,862,863,865],{},"That doesn’t make it universally better. ",[84,861],{},"\nIt doesn’t invalidate Cloudflare. ",[84,864],{},"\nAnd it doesn’t mean I won’t move again someday.",[11,867,868],{},"It just means that right now, the trade-offs align with how I want to work.",[11,870,871],{},"And sometimes, that’s the most honest reason to move anything.",[873,874,875],"style",{},"html pre.shiki code .sXcZX, html code.shiki .sXcZX{--shiki-light:#B57614;--shiki-default:#FABD2F;--shiki-dark:#FABD2F}html pre.shiki code .snxCs, html code.shiki .snxCs{--shiki-light:#79740E;--shiki-default:#B8BB26;--shiki-dark:#B8BB26}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 .sA8KM, html code.shiki .sA8KM{--shiki-light:#9D0006;--shiki-default:#FB4934;--shiki-dark:#FB4934}html pre.shiki code .s2xuh, html code.shiki .s2xuh{--shiki-light:#3C3836;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}html pre.shiki code .swc6o, html code.shiki .swc6o{--shiki-light:#7C6F64;--shiki-default:#A89984;--shiki-dark:#A89984}",{"title":457,"searchDepth":458,"depth":459,"links":877},[878,879,880,881,882,883,884],{"id":513,"depth":458,"text":514},{"id":555,"depth":458,"text":556},{"id":619,"depth":458,"text":620},{"id":760,"depth":458,"text":761},{"id":793,"depth":458,"text":794},{"id":817,"depth":458,"text":818},{"id":845,"depth":458,"text":846},"2026-02-15","not for performance, but for better flow, simpler analytics, and a smoother developer experience.",{"author":476},"\u002Fwritings\u002Ffrom-cloudflare-to-vercel",{"title":486,"description":886},"writings\u002Ffrom-cloudflare-to-vercel","Developer Experience","6 min read","LbiMKrDWpcemWcT6rWWk_uAG4cIOI-F_VSrH0czaEeo",{"id":895,"title":896,"body":897,"date":1346,"description":1347,"extension":474,"meta":1348,"navigation":477,"path":1349,"seo":1350,"stem":1351,"tag":481,"ttr":1352,"__hash__":1353},"writing\u002Fwritings\u002Fnuxt-content-slash-issue.md","How to Fix the Trailing Slash Issue in Nuxt Content",{"type":8,"value":898,"toc":1341},[899,903,909,916,919,927,937,944,964,967,970,974,1001,1015,1293,1296,1325,1329,1332,1335,1338],[33,900,902],{"id":901},"the-problem","The problem",[11,904,905,906,908],{},"I really enjoy using Nuxt Content. It’s simple, intuitive, and easy to manage — everything has a clear place and structure.",[84,907],{},"\nHowever, I ran into a strange issue that I can’t quite tell is a bug or just an unfortunate edge case.",[11,910,911,912,915],{},"Nuxt is responsible for handling routes, and each Nuxt Content file is automatically mapped to a route when everything is set up correctly. The problem appears when a trailing slash (",[654,913,914],{},"\u002F",") is added to the URL.",[11,917,918],{},"When that happens, things start to break:",[44,920,921,924],{},[47,922,923],{},"Sometimes a 404 page is shown",[47,925,926],{},"Other times the page renders, but data fetching silently fails and nothing shows up",[11,928,929,930,936],{},"This isn’t specific to my setup. I checked ",[931,932,933],"a",{"href":933,"rel":934},"https:\u002F\u002Fwww.hrcd.fr",[935],"nofollow"," (a site I’ve taken a lot of inspiration from), and it exhibits the same behavior. Unfortunately, I couldn’t find many other real-world examples to test against, so this investigation is a bit limited.",[11,938,939,940,943],{},"What ",[203,941,942],{},"is"," clear is that this issue doesn’t seem to be deployment-specific. I was able to reproduce it:",[44,945,946,949,957],{},[47,947,948],{},"When generating the site locally",[47,950,951,952],{},"When deploying to ",[931,953,956],{"href":954,"rel":955},"https:\u002F\u002Fpages.cloudflare.com",[935],"Cloudflare Pages",[47,958,951,959],{},[931,960,963],{"href":961,"rel":962},"https:\u002F\u002Fvercel.com\u002Fhome",[935],"Vercel",[11,965,966],{},"(The hrcd.fr site is also hosted on Vercel.)",[11,968,969],{},"For what it’s worth, the fix described below works reliably on Cloudflare Pages. I didn’t bother re-testing it on Vercel and simply deployed my site on Cloudflare.",[33,971,973],{"id":972},"the-fix","The fix",[11,975,976,977,985,986,988,989,991,992,995,996,737],{},"The simplest and most reliable solution is to add a ",[502,978,979,980],{},"global ",[931,981,984],{"href":982,"rel":983},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fmiddleware",[935],"route middleware"," that normalizes URLs by removing trailing slashes.",[84,987],{},"\nIf a route ends with ",[654,990,914],{},", we permanently redirect it to the same path ",[203,993,994],{},"without"," the slash. (",[931,997,1000],{"href":998,"rel":999},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMiddleware",[935],"What's a middleware?",[11,1002,1003,1004,1007,1008,1011,1012,678],{},"In your Nuxt project, create a ",[654,1005,1006],{},"middleware"," directory inside the ",[654,1009,1010],{},"app"," directory (if it doesn’t already exist), then add a file called ",[654,1013,1014],{},"trailingSlash.global.ts",[648,1016,1018],{"className":681,"code":1017,"filename":1014,"language":683,"meta":457,"style":457},"export default defineNuxtRouteMiddleware((to) => {\n    \u002F\u002F ignore root and anything that's just \"\u002F\"\n    if (to.path === \"\u002F\" || to.path === \"\") return;\n\n    \u002F\u002F if it ends with \"\u002F\" and isn't just \"\u002F\"\n    if (to.path.endsWith(\"\u002F\")) {\n        const newPath = to.path.slice(0, -1) || \"\u002F\";\n        return navigateTo(\n            { path: newPath, query: to.query, hash: to.hash },\n            { redirectCode: 301 }, \u002F\u002F permanent redirect\n        );\n    }\n});\n",[654,1019,1020,1046,1052,1101,1107,1113,1144,1195,1207,1251,1270,1278,1284],{"__ignoreMap":457},[657,1021,1022,1024,1026,1029,1031,1033,1037,1039,1043],{"class":659,"line":660},[657,1023,691],{"class":690},[657,1025,694],{"class":690},[657,1027,1028],{"class":663}," defineNuxtRouteMiddleware",[657,1030,701],{"class":700},[657,1032,701],{"class":704},[657,1034,1036],{"class":1035},"sgL72","to",[657,1038,737],{"class":704},[657,1040,1042],{"class":1041},"sTCDi"," =>",[657,1044,1045],{"class":704}," {\n",[657,1047,1048],{"class":659,"line":458},[657,1049,1051],{"class":1050},"sIIdi","    \u002F\u002F ignore root and anything that's just \"\u002F\"\n",[657,1053,1054,1057,1060,1062,1064,1067,1071,1074,1076,1078,1081,1084,1086,1088,1090,1093,1096,1099],{"class":659,"line":459},[657,1055,1056],{"class":690},"    if",[657,1058,1059],{"class":700}," (",[657,1061,1036],{"class":1035},[657,1063,563],{"class":704},[657,1065,1066],{"class":1035},"path",[657,1068,1070],{"class":1069},"sHSTz"," ===",[657,1072,1073],{"class":704}," \"",[657,1075,914],{"class":667},[657,1077,718],{"class":704},[657,1079,1080],{"class":690}," ||",[657,1082,1083],{"class":1035}," to",[657,1085,563],{"class":704},[657,1087,1066],{"class":1035},[657,1089,1070],{"class":1069},[657,1091,1092],{"class":704}," \"\"",[657,1094,1095],{"class":700},") ",[657,1097,1098],{"class":690},"return",[657,1100,740],{"class":704},[657,1102,1104],{"class":659,"line":1103},4,[657,1105,1106],{"emptyLinePlaceholder":477},"\n",[657,1108,1110],{"class":659,"line":1109},5,[657,1111,1112],{"class":1050},"    \u002F\u002F if it ends with \"\u002F\" and isn't just \"\u002F\"\n",[657,1114,1116,1118,1120,1122,1124,1126,1128,1131,1133,1135,1137,1139,1142],{"class":659,"line":1115},6,[657,1117,1056],{"class":690},[657,1119,1059],{"class":700},[657,1121,1036],{"class":1035},[657,1123,563],{"class":704},[657,1125,1066],{"class":1035},[657,1127,563],{"class":704},[657,1129,1130],{"class":663},"endsWith",[657,1132,701],{"class":700},[657,1134,718],{"class":704},[657,1136,914],{"class":667},[657,1138,718],{"class":704},[657,1140,1141],{"class":700},")) ",[657,1143,705],{"class":704},[657,1145,1147,1150,1153,1156,1158,1160,1162,1164,1167,1169,1173,1176,1179,1182,1184,1187,1189,1191,1193],{"class":659,"line":1146},7,[657,1148,1149],{"class":1041},"        const",[657,1151,1152],{"class":1035}," newPath",[657,1154,1155],{"class":1069}," =",[657,1157,1083],{"class":1035},[657,1159,563],{"class":704},[657,1161,1066],{"class":1035},[657,1163,563],{"class":704},[657,1165,1166],{"class":663},"slice",[657,1168,701],{"class":700},[657,1170,1172],{"class":1171},"sYNTs","0",[657,1174,1175],{"class":704},",",[657,1177,1178],{"class":1069}," -",[657,1180,1181],{"class":1171},"1",[657,1183,1095],{"class":700},[657,1185,1186],{"class":690},"||",[657,1188,1073],{"class":704},[657,1190,914],{"class":667},[657,1192,718],{"class":704},[657,1194,740],{"class":704},[657,1196,1198,1201,1204],{"class":659,"line":1197},8,[657,1199,1200],{"class":690},"        return",[657,1202,1203],{"class":663}," navigateTo",[657,1205,1206],{"class":700},"(\n",[657,1208,1210,1213,1216,1218,1220,1222,1225,1227,1229,1231,1234,1236,1239,1241,1243,1245,1248],{"class":659,"line":1209},9,[657,1211,1212],{"class":704},"            {",[657,1214,1215],{"class":700}," path",[657,1217,678],{"class":704},[657,1219,1152],{"class":1035},[657,1221,1175],{"class":704},[657,1223,1224],{"class":700}," query",[657,1226,678],{"class":704},[657,1228,1083],{"class":1035},[657,1230,563],{"class":704},[657,1232,1233],{"class":1035},"query",[657,1235,1175],{"class":704},[657,1237,1238],{"class":700}," hash",[657,1240,678],{"class":704},[657,1242,1083],{"class":1035},[657,1244,563],{"class":704},[657,1246,1247],{"class":1035},"hash",[657,1249,1250],{"class":704}," },\n",[657,1252,1254,1256,1259,1261,1264,1267],{"class":659,"line":1253},10,[657,1255,1212],{"class":704},[657,1257,1258],{"class":700}," redirectCode",[657,1260,678],{"class":704},[657,1262,1263],{"class":1171}," 301",[657,1265,1266],{"class":704}," },",[657,1268,1269],{"class":1050}," \u002F\u002F permanent redirect\n",[657,1271,1273,1276],{"class":659,"line":1272},11,[657,1274,1275],{"class":700},"        )",[657,1277,740],{"class":704},[657,1279,1281],{"class":659,"line":1280},12,[657,1282,1283],{"class":704},"    }\n",[657,1285,1287,1289,1291],{"class":659,"line":1286},13,[657,1288,734],{"class":704},[657,1290,737],{"class":700},[657,1292,740],{"class":704},[11,1294,1295],{},"This middleware:",[44,1297,1298,1304,1311,1314],{},[47,1299,1300,1301,1303],{},"Leaves the root route (",[654,1302,914],{},") untouched",[47,1305,1306,1307,1310],{},"Only redirects paths that ",[203,1308,1309],{},"end"," with a trailing slash",[47,1312,1313],{},"Preserves query parameters and hashes",[47,1315,1316,1317,1324],{},"Uses a ",[502,1318,1319],{},[931,1320,1323],{"href":1321,"rel":1322},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FStatus\u002F301",[935],"301 (Permanent Redirect)",", which tells browsers and search engines that the canonical URL no longer includes the trailing slash",[33,1326,1328],{"id":1327},"final-words","Final words",[11,1330,1331],{},"This isn’t the most elegant solution, and ideally Nuxt Content (or Nuxt’s routing layer) would handle this more gracefully out of the box. Still, until that happens, a small global middleware like this is an effective and low-maintenance workaround.",[11,1333,1334],{},"If your Nuxt Content pages randomly break, fail to fetch data, or show 404s depending on whether a trailing slash is present, normalizing routes early is a good defensive move — especially for statically generated sites where consistency matters.",[11,1336,1337],{},"Hopefully this saves someone else a few hours of confusion.",[873,1339,1340],{},"html pre.shiki code .sA8KM, html code.shiki .sA8KM{--shiki-light:#9D0006;--shiki-default:#FB4934;--shiki-dark:#FB4934}html pre.shiki code .sXcZX, html code.shiki .sXcZX{--shiki-light:#B57614;--shiki-default:#FABD2F;--shiki-dark:#FABD2F}html pre.shiki code .s2xuh, html code.shiki .s2xuh{--shiki-light:#3C3836;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}html pre.shiki code .swc6o, html code.shiki .swc6o{--shiki-light:#7C6F64;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .sgL72, html code.shiki .sgL72{--shiki-light:#076678;--shiki-default:#83A598;--shiki-dark:#83A598}html pre.shiki code .sTCDi, html code.shiki .sTCDi{--shiki-light:#AF3A03;--shiki-default:#FE8019;--shiki-dark:#FE8019}html pre.shiki code .sIIdi, html code.shiki .sIIdi{--shiki-light:#928374;--shiki-light-font-style:italic;--shiki-default:#928374;--shiki-default-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic}html pre.shiki code .sHSTz, html code.shiki .sHSTz{--shiki-light:#427B58;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}html pre.shiki code .snxCs, html code.shiki .snxCs{--shiki-light:#79740E;--shiki-default:#B8BB26;--shiki-dark:#B8BB26}html pre.shiki code .sYNTs, html code.shiki .sYNTs{--shiki-light:#8F3F71;--shiki-default:#D3869B;--shiki-dark:#D3869B}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);}",{"title":457,"searchDepth":458,"depth":459,"links":1342},[1343,1344,1345],{"id":901,"depth":458,"text":902},{"id":972,"depth":458,"text":973},{"id":1327,"depth":458,"text":1328},"2025-12-31","A weird routing issue with Nuxt Content URLs — and a practical fix",{"author":476},"\u002Fwritings\u002Fnuxt-content-slash-issue",{"title":896,"description":1347},"writings\u002Fnuxt-content-slash-issue","3 min read","raUKr3sH0PndZmgimUPRDBbAOSXjRJ_qEijbbl3WUpk",{"id":1355,"title":1356,"body":1357,"date":1611,"description":1612,"extension":474,"meta":1613,"navigation":477,"path":1614,"seo":1615,"stem":1616,"tag":481,"ttr":1617,"__hash__":1618},"writing\u002Fwritings\u002Fwhy-i-made-nuch.md","I turned a small script into an app",{"type":8,"value":1358,"toc":1602},[1359,1363,1378,1381,1384,1388,1394,1397,1413,1416,1419,1422,1429,1432,1436,1439,1452,1458,1461,1464,1468,1471,1482,1485,1488,1491,1494,1498,1501,1504,1511,1518,1521,1528,1532,1539,1542,1549,1560,1575,1579,1582,1585,1599],[33,1360,1362],{"id":1361},"a-small-recap","A small recap",[11,1364,1365,1366,1370,1371,1374,1375],{},"I've ",[931,1367,1369],{"href":1368},"\u002Fwritings\u002Froad-to-here","already"," talked about how I struggled with choosing the right stack for this site. I know, I know — it ",[203,1372,1373],{},"really"," shouldn’t be that hard. But I’m a difficult man. And I’m also a firm believer in the idea that ",[203,1376,1377],{},"“a little over‑engineering is good for your soul.”",[11,1379,1380],{},"Still, life doesn’t always allow for that luxury. Sometimes, you just have to take the high road.",[11,1382,1383],{},"In this case, that high road turned out to be Nuxt Content.",[33,1385,1387],{"id":1386},"getting-started-with-content","Getting started with Content",[1389,1390,1391],"blockquote",{},[11,1392,1393],{},"“Nuxt Content is a module for Nuxt that provides a simple way to manage content for your application. It allows developers to write their content in Markdown, YAML, or JSON files and then query and display it in their application.”",[11,1395,1396],{},"That’s their official description, and I didn’t want to butcher it.",[11,1398,1399,1400,1403,1404,1403,1409,1412],{},"My first thought was something along the lines of: ",[203,1401,1402],{},"“I’m a Nuxt developer, I"," ",[203,1405,1406],{},[502,1407,1408],{},"usually",[203,1410,1411],{},"like simple solutions… and wait, Markdown?”"," — yeah, that was basically a no‑brainer.",[11,1414,1415],{},"So I got to work.",[11,1417,1418],{},"I added the module, set up the config file and collections, and started testing.",[11,1420,1421],{},"It was an absolute breeze. It picked up the files instantly and rendered them beautifully. With a few small tweaks and customizations, it started to look exactly the way I wanted.",[11,1423,1424,1425,1428],{},"It was ",[203,1426,1427],{},"almost"," everything I needed.",[11,1430,1431],{},"Almost.",[33,1433,1435],{"id":1434},"the-new-kinda-dilemma","The new (kinda) dilemma",[11,1437,1438],{},"From what I could tell, there are two main ways to add files to Nuxt Content collections:",[1440,1441,1442,1449],"ol",{},[47,1443,1444,1445,1448],{},"Manually placing files inside the ",[654,1446,1447],{},"content"," directory",[47,1450,1451],{},"Linking an external repository to a collection",[11,1453,1454,1455],{},"Naturally, my brain went: ",[203,1456,1457],{},"“Alright… where’s the challenge?”",[11,1459,1460],{},"I didn’t want to use an external repository — I already have my own archives, and GitHub just isn’t where I keep this kind of stuff. Manually moving files every time also felt tedious and error‑prone.",[11,1462,1463],{},"So, once again, I got to work.",[33,1465,1467],{"id":1466},"the-script","The script",[11,1469,1470],{},"When it comes to simple automation, scripts are usually the first thing that comes to mind. So I wrote one that handled the basics:",[1440,1472,1473,1476,1479],{},[47,1474,1475],{},"Copy the given file into the correct collection directory",[47,1477,1478],{},"Copy any corresponding images",[47,1480,1481],{},"Stage the changes, commit them, and push the site’s repository to trigger a new build",[11,1483,1484],{},"It worked. It did exactly what it was supposed to do.",[11,1486,1487],{},"But it was fragile.",[11,1489,1490],{},"The destination paths were hard‑coded. Adding or editing a collection meant editing the script itself. There were no safety checks, no proper error handling — if something went wrong halfway through, manual cleanup was the only option.",[11,1492,1493],{},"I liked the simplicity, but I didn’t trust it. It felt like something that could (and eventually would) break at the worst possible moment.",[33,1495,1497],{"id":1496},"the-app","The app",[11,1499,1500],{},"That’s when I decided to turn the script into a proper CLI tool.",[11,1502,1503],{},"Doing so would make it easier to extend, safer to use, and far more pleasant to maintain. More importantly, it would allow me to handle errors properly — and even roll back changes when necessary.",[11,1505,1506,1510],{},[931,1507,1509],{"href":1508},"\u002Fwritings\u002Fmy-aoc-experience","Unsurprisingly",", I chose Rust.",[11,1512,1513,1514,1517],{},"There were a few reasons for that. First, I genuinely wanted to ",[203,1515,1516],{},"work"," with Rust — not just toy examples, but something real. Second, I’d already solved a bunch of problems with it during Advent of Code, and I actually enjoyed the experience. Sure, it has its quirks, but those quirks force you to think more deliberately — and I like that.",[11,1519,1520],{},"Funny enough, I initially tried building this in Go. But after Advent of Code, something shifted. Despite all the time I’ve spent with Go, my brain just… stopped thinking in it.",[11,1522,1523,1524,1527],{},"Rust didn’t just help my thinking — it ",[203,1525,1526],{},"changed"," it.",[33,1529,1531],{"id":1530},"and-so-nuch-was-born","And so… NUCH was born",[11,1533,1534,1535,1538],{},"NUCH (short for ",[502,1536,1537],{},"NUxt Content Handler",") is what came out the other side.",[11,1540,1541],{},"It’s a simple, interactive CLI tool that does everything I needed — and then some.",[11,1543,1544,1545,1548],{},"It relies on a straightforward ",[654,1546,1547],{},"toml"," configuration file to understand where things live and where they should go. From there, you just tell it what you want.",[11,1550,1551,1552,1555,1556,1559],{},"Right now, it supports two commands: ",[654,1553,1554],{},"publish"," and ",[654,1557,1558],{},"delete",". Maybe more will come in the future — we’ll see.",[11,1561,1562,1563,1568,1569,1574],{},"I won’t dive into the internal details here. Those are covered properly in the ",[931,1564,1567],{"href":1565,"rel":1566},"https:\u002F\u002Fnuch.vercel.app",[935],"documentation",". The source code is also available on ",[931,1570,1573],{"href":1571,"rel":1572},"https:\u002F\u002Fgithub.com\u002Frivethorn\u002Fnuch",[935],"GitHub",", and contributions are more than welcome.",[33,1576,1578],{"id":1577},"epilogue","Epilogue",[11,1580,1581],{},"Like most tools, this one exists simply to make my life a little easier.",[11,1583,1584],{},"If it manages to do the same for you, then it’s already done its job.",[11,1586,1587,1588,1593,1594,1598],{},"If you’re a Nuxt developer — or just curious — I’d love to hear your ",[931,1589,1592],{"href":1590,"rel":1591},"https:\u002F\u002Fgithub.com\u002Frivethorn\u002Fnuch\u002Fissues\u002Fnew",[935],"suggestions"," or ",[931,1595,1597],{"href":1596},"mailto:hassanak813@outlook.com","general thoughts"," about NUCH.",[11,1600,1601],{},"Merry Christmas, and happy holidays 🎄",{"title":457,"searchDepth":458,"depth":459,"links":1603},[1604,1605,1606,1607,1608,1609,1610],{"id":1361,"depth":458,"text":1362},{"id":1386,"depth":458,"text":1387},{"id":1434,"depth":458,"text":1435},{"id":1466,"depth":458,"text":1467},{"id":1496,"depth":458,"text":1497},{"id":1530,"depth":458,"text":1531},{"id":1577,"depth":458,"text":1578},"2025-12-28","A small automation script slowly grew into a proper CLI app, and it ended up becoming NUCH — a Nuxt Content helper I actually enjoy using.",{"author":476},"\u002Fwritings\u002Fwhy-i-made-nuch",{"title":1356,"description":1612},"writings\u002Fwhy-i-made-nuch","5 min read","-TeJB80c3UvmgoheLNXHdhSzGBRUjEcE2lgFSrdFJNo",{"id":1620,"title":1621,"body":1622,"date":1838,"description":1839,"extension":474,"meta":1840,"navigation":477,"path":1368,"seo":1841,"stem":1842,"tag":481,"ttr":1843,"__hash__":1844},"writing\u002Fwritings\u002Froad-to-here.md","I wanted to use Supabase as the backend for this site",{"type":8,"value":1623,"toc":1832},[1624,1628,1635,1638,1644,1663,1666,1672,1675,1716,1719,1726,1729,1732,1736,1739,1742,1756,1759,1762,1765,1769,1772,1775,1778,1781,1788,1791,1794,1799,1802,1805,1808,1812,1819,1826,1829],[33,1625,1627],{"id":1626},"over-engineer-the-world","Over-engineer the World!",[11,1629,1630,1631,1634],{},"The first thing that came to mind when I decided to start this site was: ",[203,1632,1633],{},"\"I’m not going to build a static site.\""," I knew a static setup was probably the right choice for a project like this, but I simply didn’t want to go that route.",[11,1636,1637],{},"It felt too bland for my taste.",[11,1639,1640,1643],{},[203,1641,1642],{},"\"Why would I use an SSG like every other sane human being? I want to over‑engineer my stack—otherwise, what’s the point of living? Live dangerously. Live on the edge.\""," That sort of thing.",[11,1645,1646,1647,1652,1653,1658,1659,1662],{},"I was already using ",[931,1648,1651],{"href":1649,"rel":1650},"https:\u002F\u002Fwww.markdownguide.org\u002F",[935],"Markdown"," with ",[931,1654,1657],{"href":1655,"rel":1656},"https:\u002F\u002Fobsidian.md\u002F",[935],"Obsidian"," for note‑taking, so I was very familiar with it. It’s also a joy to write in, so I ",[502,1660,1661],{},"obviously"," wanted to keep using it for blogging.",[11,1664,1665],{},"So I got to work. I chose Nuxt for the frontend simply because it’s a framework I somewhat know and genuinely enjoy working with. Then I jumped onto Supabase.",[11,1667,1668,1669,1671],{},"I’d had a tiny bit of experience with Supabase before. I knew it was a BaaS (Backend‑as‑a‑Service), meaning it was supposed to make backend work much easier. I knew it had solid documentation, and I knew it was cool to use. (It ",[203,1670,942],{}," cool to use, right?)",[11,1673,1674],{},"My thought process went something like this:",[44,1676,1677,1690,1703],{},[47,1678,1679,1682],{},[502,1680,1681],{},"On Supabase:",[1440,1683,1684,1687],{},[47,1685,1686],{},"Create a storage bucket for Markdown files.",[47,1688,1689],{},"Create a database table to store blog metadata—things like slugs and tags.",[47,1691,1692,1695],{},[502,1693,1694],{},"With Nuxt:",[1440,1696,1697,1700],{},[47,1698,1699],{},"Build the frontend and connect it to Supabase.",[47,1701,1702],{},"Fetch Markdown files from Supabase and render them on demand. (Nuxt has excellent tooling for rendering Markdown.)",[47,1704,1705,1708],{},[502,1706,1707],{},"For writing blogs:",[1440,1709,1710,1713],{},[47,1711,1712],{},"Upload the Markdown file to the Supabase storage bucket.",[47,1714,1715],{},"Add a metadata row to the database...",[11,1717,1718],{},"Wait.\nWhat?",[11,1720,1721,1722,1725],{},"You’re telling me I have to add or remove every blog post by logging into Supabase and doing it ",[502,1723,1724],{},"manually, every single time","?",[11,1727,1728],{},"Nope.",[11,1730,1731],{},"I’m making an app for that.",[33,1733,1735],{"id":1734},"enter-hermes-md","Enter… hermes-md",[11,1737,1738],{},"There was no way I was letting go of the absolute overkill of a stack I had chosen.",[11,1740,1741],{},"No. Absolutely not.",[11,1743,1744,1745,1750,1751,563],{},"Instead, I built a small CLI tool called ",[931,1746,1749],{"href":1747,"rel":1748},"https:\u002F\u002Fgithub.com\u002Frivethorn\u002Fhermes-md",[935],"hermes-md",". I initially tried writing it in Rust—let’s just say it didn’t go well. So I switched to TypeScript and used Supabase’s official ",[931,1752,1755],{"href":1753,"rel":1754},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Freference\u002Fjavascript",[935],"client library",[11,1757,1758],{},"And it turned out okay.",[11,1760,1761],{},"You give the tool your file, it extracts the metadata from the top, uploads the Markdown file to storage, and inserts the metadata into the database—all with a single command.",[11,1763,1764],{},"Nice.",[33,1766,1768],{"id":1767},"time-for-some-action","Time for some action",[11,1770,1771],{},"Once everything was wired together, it was time to test.",[11,1773,1774],{},"I didn’t even deploy the site. I was running it locally, but in a production‑like environment.",[11,1776,1777],{},"I had high hopes.",[11,1779,1780],{},"They were completely crushed.",[11,1782,1783,1784,1787],{},"The data‑fetching was sloppy. You could say ",[203,1785,1786],{},"“skill issue,”"," and I’d agree—if I hadn’t already made sure the app only requested data when it actually needed to. I spent two full days analyzing the problem and trying to fix it.",[11,1789,1790],{},"It didn’t help.",[11,1792,1793],{},"Things improved, sure, but not nearly enough. This wasn’t how it was supposed to behave. You don’t expect to stare at a loading indicator for a full second while a blog post is fetched from a storage bucket and rendered.",[1795,1796,1798],"h5",{"id":1797},"so-i-started-digging-deeper","So I started digging deeper.",[11,1800,1801],{},"Most developer blogs I visited—both from people I knew and people I didn’t—were built with SSGs.",[11,1803,1804],{},"Every template I looked at—Next.js, Nuxt, Astro—used some form of static generation.",[11,1806,1807],{},"That’s when it hit me.",[33,1809,1811],{"id":1810},"i-got-humbled","I got humbled",[11,1813,1814,1815,1818],{},"I finally made peace with the fact that not ",[502,1816,1817],{},"everything"," needs to be over‑engineered. Sure, pushing your limits is fun, and it helps you grow as a developer.",[11,1820,1821,1822,1825],{},"But when ",[502,1823,1824],{},"everyone"," is using a tool that has repeatedly proven itself, the problems will eventually catch up to you if you insist on swimming against the current.",[11,1827,1828],{},"As for what I did next—well, that’s a story for another time.",[11,1830,1831],{},"See you soon.",{"title":457,"searchDepth":458,"depth":459,"links":1833},[1834,1835,1836,1837],{"id":1626,"depth":458,"text":1627},{"id":1734,"depth":458,"text":1735},{"id":1767,"depth":458,"text":1768},{"id":1810,"depth":458,"text":1811},"2025-12-22","I was wrong",{"author":476},{"title":1621,"description":1839},"writings\u002Froad-to-here","4 min read","B9EKWS4kcDAhrclsJjH_oDrV1Fb9iQfPJrhDwIyC4u0",{"id":1846,"title":1847,"body":1848,"date":4385,"description":4386,"extension":474,"meta":4387,"navigation":477,"path":1508,"seo":4388,"stem":4389,"tag":4390,"ttr":4391,"__hash__":4392},"writing\u002Fwritings\u002Fmy-aoc-experience.md","How Python made me feel like an idiot, and how Rust came to the rescue",{"type":8,"value":1849,"toc":4379},[1850,1854,1857,1869,1873,1879,1902,1913,1916,2431,2434,2440,2632,2635,2799,2802,2808,2812,2842,2856,2863,3269,3272,3281,3284,3984,3987,3990,4344,4350,4354,4360,4363,4366,4369,4376],[33,1851,1853],{"id":1852},"how-it-started","How it started",[11,1855,1856],{},"After a long time, I finally decided to try tackling Advent of Code. It seemed like I've known it forever, but never really taken the time to get close to it, befriend it. Well, better late than never. So I got on and went to create the project, but wait. Which language do I use?",[11,1858,1859,1860,1862,1863,1865,1866,1868],{},"I guess some background info would be nice right about now.",[84,1861],{},"\nI started learning programming about four years ago, and I dipped my toe in almost every language and framework I came across; C#, JS and TS, C, C++, Go, Python, Kotlin, Swift, V, Odin, Zig, Rust, Dart, Flutter, React, Vue.JS, Gin, Django, Flask, WinUI, WinRT, Jetpack Compose, SwiftUI, you get the idea.",[84,1864],{},"\nI tried way too many things and if you ask me... it was a big mistake, kinda. But that's a topic for another time. Suffice to say, it can easily turn into a \"jack of all trades, master of none\" situation.",[84,1867],{},"\nI've mostly done Flutter development, and I also spent a lot of time with C# on Windows and Go and Python for web dev and little tiny CLIs here and there.",[33,1870,1872],{"id":1871},"python-is-simple-they-said","Python is simple, they said...",[11,1874,1875,1876,1878],{},"So, going in I thought: \"I'll use Python to get the language out of the way and just focus on problem solving.\"",[84,1877],{},"\nWell, it didn't last long.",[11,1880,1881,1882,1885,1886,1889,1890,1892,1893,1895,1896,1898,1899,1901],{},"The first few days didn't seem ",[502,1883,1884],{},"that"," difficult. Sure, there were a few hiccups here and there, but nothing too unmanageable. Of course, I didn't know the ",[203,1887,1888],{},"how","s, I mostly tried to understand the ",[203,1891,610],{},"s, and then search my way through.",[84,1894],{},"\nYears of simple mobile and web development with no proper teacher or mentor can do that to you.",[84,1897],{},"\nBut it's not something to be ashamed of.",[84,1900],{},"\nI didn't have proper exposure to the \"outside world\", and I was learning. I was having fun doing that, until Python did its thing.",[11,1903,1904,1905,1908,1909,1912],{},"I have to say though, this is ",[203,1906,1907],{},"my"," problem with Python. It makes ",[203,1910,1911],{},"me"," feel like an idiot. From what I’ve seen, people do extraordinary things with the language and its features. Skill issue you said? Yeah, it could be.",[11,1914,1915],{},"My problem came when I tried to write a function, and using my Dart\u002FC# brain I would come up with something along the lines of:",[648,1917,1922],{"className":1918,"code":1919,"filename":1920,"language":1921,"meta":457,"style":457},"language-python shiki shiki-themes gruvbox-light-hard gruvbox-dark-hard gruvbox-dark-hard","lines: list[str] = read_lines(\"input.txt\")\n\nfor line_index in range(0, len(lines)):\n    line: str = lines[line_index]\n\n    prefix: str = line[0 : len(line) - 1]\n    indexed_prefix = list(enumerate(prefix))\n\n    max_prefix_entry = max(\n        indexed_prefix,\n        key=lambda entry: entry[1]\n    )\n\n    first_index: int = max_prefix_entry[0]\n\n    suffix_start: int = first_index + 1\n    suffix: str = line[suffix_start : len(line)]\n    indexed_suffix = list(enumerate(suffix))\n\n    max_suffix_entry = max(\n        indexed_suffix,\n        key=lambda entry: entry[1]\n    )\n\n    second_index: int = max_suffix_entry[0] + suffix_start\n\n    first_char: str = line[first_index]\n    second_char: str = line[second_index]\n\n    combined_value: str = first_char + second_char\n    value: int = int(combined_value)\n\n    total = total + value\n","snippet_1.py","python",[654,1923,1924,1959,1963,1994,2017,2021,2057,2080,2084,2096,2103,2126,2131,2135,2157,2162,2183,2213,2234,2239,2251,2259,2280,2285,2290,2317,2322,2343,2364,2369,2389,2410,2415],{"__ignoreMap":457},[657,1925,1926,1929,1931,1934,1937,1940,1942,1944,1947,1949,1951,1954,1956],{"class":659,"line":660},[657,1927,1928],{"class":700},"lines",[657,1930,678],{"class":704},[657,1932,1933],{"class":700}," list",[657,1935,1936],{"class":704},"[",[657,1938,1939],{"class":663},"str",[657,1941,726],{"class":704},[657,1943,1155],{"class":1069},[657,1945,1946],{"class":1035}," read_lines",[657,1948,701],{"class":704},[657,1950,718],{"class":704},[657,1952,1953],{"class":667},"input.txt",[657,1955,718],{"class":704},[657,1957,1958],{"class":704},")\n",[657,1960,1961],{"class":659,"line":458},[657,1962,1106],{"emptyLinePlaceholder":477},[657,1964,1965,1968,1971,1974,1977,1979,1981,1983,1986,1988,1991],{"class":659,"line":459},[657,1966,1967],{"class":690},"for",[657,1969,1970],{"class":700}," line_index ",[657,1972,1973],{"class":690},"in",[657,1975,1976],{"class":1041}," range",[657,1978,701],{"class":704},[657,1980,1172],{"class":1171},[657,1982,1175],{"class":704},[657,1984,1985],{"class":1041}," len",[657,1987,701],{"class":704},[657,1989,1928],{"class":1990},"sfJtd",[657,1992,1993],{"class":704},")):\n",[657,1995,1996,1999,2001,2004,2006,2009,2011,2014],{"class":659,"line":1103},[657,1997,1998],{"class":700},"    line",[657,2000,678],{"class":704},[657,2002,2003],{"class":663}," str",[657,2005,1155],{"class":1069},[657,2007,2008],{"class":700}," lines",[657,2010,1936],{"class":704},[657,2012,2013],{"class":700},"line_index",[657,2015,2016],{"class":704},"]\n",[657,2018,2019],{"class":659,"line":1109},[657,2020,1106],{"emptyLinePlaceholder":477},[657,2022,2023,2026,2028,2030,2032,2035,2037,2039,2042,2044,2046,2048,2050,2052,2055],{"class":659,"line":1115},[657,2024,2025],{"class":700},"    prefix",[657,2027,678],{"class":704},[657,2029,2003],{"class":663},[657,2031,1155],{"class":1069},[657,2033,2034],{"class":700}," line",[657,2036,1936],{"class":704},[657,2038,1172],{"class":1171},[657,2040,2041],{"class":704}," :",[657,2043,1985],{"class":1041},[657,2045,701],{"class":704},[657,2047,659],{"class":1990},[657,2049,737],{"class":704},[657,2051,1178],{"class":1069},[657,2053,2054],{"class":1171}," 1",[657,2056,2016],{"class":704},[657,2058,2059,2062,2065,2067,2069,2072,2074,2077],{"class":659,"line":1146},[657,2060,2061],{"class":700},"    indexed_prefix ",[657,2063,2064],{"class":1069},"=",[657,2066,1933],{"class":663},[657,2068,701],{"class":704},[657,2070,2071],{"class":1041},"enumerate",[657,2073,701],{"class":704},[657,2075,2076],{"class":1990},"prefix",[657,2078,2079],{"class":704},"))\n",[657,2081,2082],{"class":659,"line":1197},[657,2083,1106],{"emptyLinePlaceholder":477},[657,2085,2086,2089,2091,2094],{"class":659,"line":1209},[657,2087,2088],{"class":700},"    max_prefix_entry ",[657,2090,2064],{"class":1069},[657,2092,2093],{"class":1041}," max",[657,2095,1206],{"class":704},[657,2097,2098,2101],{"class":659,"line":1253},[657,2099,2100],{"class":1990},"        indexed_prefix",[657,2102,729],{"class":704},[657,2104,2105,2108,2110,2113,2116,2118,2120,2122,2124],{"class":659,"line":1272},[657,2106,2107],{"class":1035},"        key",[657,2109,2064],{"class":1069},[657,2111,2112],{"class":1041},"lambda",[657,2114,2115],{"class":1035}," entry",[657,2117,678],{"class":704},[657,2119,2115],{"class":1990},[657,2121,1936],{"class":704},[657,2123,1181],{"class":1171},[657,2125,2016],{"class":704},[657,2127,2128],{"class":659,"line":1280},[657,2129,2130],{"class":704},"    )\n",[657,2132,2133],{"class":659,"line":1286},[657,2134,1106],{"emptyLinePlaceholder":477},[657,2136,2138,2141,2143,2146,2148,2151,2153,2155],{"class":659,"line":2137},14,[657,2139,2140],{"class":700},"    first_index",[657,2142,678],{"class":704},[657,2144,2145],{"class":663}," int",[657,2147,1155],{"class":1069},[657,2149,2150],{"class":700}," max_prefix_entry",[657,2152,1936],{"class":704},[657,2154,1172],{"class":1171},[657,2156,2016],{"class":704},[657,2158,2160],{"class":659,"line":2159},15,[657,2161,1106],{"emptyLinePlaceholder":477},[657,2163,2165,2168,2170,2172,2174,2177,2180],{"class":659,"line":2164},16,[657,2166,2167],{"class":700},"    suffix_start",[657,2169,678],{"class":704},[657,2171,2145],{"class":663},[657,2173,1155],{"class":1069},[657,2175,2176],{"class":700}," first_index ",[657,2178,2179],{"class":1069},"+",[657,2181,2182],{"class":1171}," 1\n",[657,2184,2186,2189,2191,2193,2195,2197,2199,2202,2204,2206,2208,2210],{"class":659,"line":2185},17,[657,2187,2188],{"class":700},"    suffix",[657,2190,678],{"class":704},[657,2192,2003],{"class":663},[657,2194,1155],{"class":1069},[657,2196,2034],{"class":700},[657,2198,1936],{"class":704},[657,2200,2201],{"class":700},"suffix_start ",[657,2203,678],{"class":704},[657,2205,1985],{"class":1041},[657,2207,701],{"class":704},[657,2209,659],{"class":1990},[657,2211,2212],{"class":704},")]\n",[657,2214,2216,2219,2221,2223,2225,2227,2229,2232],{"class":659,"line":2215},18,[657,2217,2218],{"class":700},"    indexed_suffix ",[657,2220,2064],{"class":1069},[657,2222,1933],{"class":663},[657,2224,701],{"class":704},[657,2226,2071],{"class":1041},[657,2228,701],{"class":704},[657,2230,2231],{"class":1990},"suffix",[657,2233,2079],{"class":704},[657,2235,2237],{"class":659,"line":2236},19,[657,2238,1106],{"emptyLinePlaceholder":477},[657,2240,2242,2245,2247,2249],{"class":659,"line":2241},20,[657,2243,2244],{"class":700},"    max_suffix_entry ",[657,2246,2064],{"class":1069},[657,2248,2093],{"class":1041},[657,2250,1206],{"class":704},[657,2252,2254,2257],{"class":659,"line":2253},21,[657,2255,2256],{"class":1990},"        indexed_suffix",[657,2258,729],{"class":704},[657,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278],{"class":659,"line":2261},22,[657,2263,2107],{"class":1035},[657,2265,2064],{"class":1069},[657,2267,2112],{"class":1041},[657,2269,2115],{"class":1035},[657,2271,678],{"class":704},[657,2273,2115],{"class":1990},[657,2275,1936],{"class":704},[657,2277,1181],{"class":1171},[657,2279,2016],{"class":704},[657,2281,2283],{"class":659,"line":2282},23,[657,2284,2130],{"class":704},[657,2286,2288],{"class":659,"line":2287},24,[657,2289,1106],{"emptyLinePlaceholder":477},[657,2291,2293,2296,2298,2300,2302,2305,2307,2309,2311,2314],{"class":659,"line":2292},25,[657,2294,2295],{"class":700},"    second_index",[657,2297,678],{"class":704},[657,2299,2145],{"class":663},[657,2301,1155],{"class":1069},[657,2303,2304],{"class":700}," max_suffix_entry",[657,2306,1936],{"class":704},[657,2308,1172],{"class":1171},[657,2310,726],{"class":704},[657,2312,2313],{"class":1069}," +",[657,2315,2316],{"class":700}," suffix_start\n",[657,2318,2320],{"class":659,"line":2319},26,[657,2321,1106],{"emptyLinePlaceholder":477},[657,2323,2325,2328,2330,2332,2334,2336,2338,2341],{"class":659,"line":2324},27,[657,2326,2327],{"class":700},"    first_char",[657,2329,678],{"class":704},[657,2331,2003],{"class":663},[657,2333,1155],{"class":1069},[657,2335,2034],{"class":700},[657,2337,1936],{"class":704},[657,2339,2340],{"class":700},"first_index",[657,2342,2016],{"class":704},[657,2344,2346,2349,2351,2353,2355,2357,2359,2362],{"class":659,"line":2345},28,[657,2347,2348],{"class":700},"    second_char",[657,2350,678],{"class":704},[657,2352,2003],{"class":663},[657,2354,1155],{"class":1069},[657,2356,2034],{"class":700},[657,2358,1936],{"class":704},[657,2360,2361],{"class":700},"second_index",[657,2363,2016],{"class":704},[657,2365,2367],{"class":659,"line":2366},29,[657,2368,1106],{"emptyLinePlaceholder":477},[657,2370,2372,2375,2377,2379,2381,2384,2386],{"class":659,"line":2371},30,[657,2373,2374],{"class":700},"    combined_value",[657,2376,678],{"class":704},[657,2378,2003],{"class":663},[657,2380,1155],{"class":1069},[657,2382,2383],{"class":700}," first_char ",[657,2385,2179],{"class":1069},[657,2387,2388],{"class":700}," second_char\n",[657,2390,2392,2395,2397,2399,2401,2403,2405,2408],{"class":659,"line":2391},31,[657,2393,2394],{"class":700},"    value",[657,2396,678],{"class":704},[657,2398,2145],{"class":663},[657,2400,1155],{"class":1069},[657,2402,2145],{"class":663},[657,2404,701],{"class":704},[657,2406,2407],{"class":1990},"combined_value",[657,2409,1958],{"class":704},[657,2411,2413],{"class":659,"line":2412},32,[657,2414,1106],{"emptyLinePlaceholder":477},[657,2416,2418,2421,2423,2426,2428],{"class":659,"line":2417},33,[657,2419,2420],{"class":700},"    total ",[657,2422,2064],{"class":1069},[657,2424,2425],{"class":700}," total ",[657,2427,2179],{"class":1069},[657,2429,2430],{"class":700}," value\n",[11,2432,2433],{},"I mean, it works, but it feels clumsy and heavier than it should.",[11,2435,2436,2437,2439],{},"Well I searched and looked and tried to make it more \"correct\", more \"Pythonic\".",[84,2438],{},"\nI tried AI, I looked at other people's codes, and I kept seeing these weird soup of characters in a bowl, things like:",[648,2441,2444],{"className":1918,"code":2442,"filename":2443,"language":1921,"meta":457,"style":457},"lines = read_lines(\"input.txt\")\n\nfor line in lines:\n    i, _ = max(enumerate(line[:-1]), key=lambda t: t[1])\n    j, _ = max(enumerate(line[i + 1:]), key=lambda t: t[1])\n\n    total += int(line[i] + line[j + i + 1])\n","snippet_2.py",[654,2445,2446,2465,2469,2483,2537,2588,2592],{"__ignoreMap":457},[657,2447,2448,2451,2453,2455,2457,2459,2461,2463],{"class":659,"line":660},[657,2449,2450],{"class":700},"lines ",[657,2452,2064],{"class":1069},[657,2454,1946],{"class":1035},[657,2456,701],{"class":704},[657,2458,718],{"class":704},[657,2460,1953],{"class":667},[657,2462,718],{"class":704},[657,2464,1958],{"class":704},[657,2466,2467],{"class":659,"line":458},[657,2468,1106],{"emptyLinePlaceholder":477},[657,2470,2471,2473,2476,2478,2480],{"class":659,"line":459},[657,2472,1967],{"class":690},[657,2474,2475],{"class":700}," line ",[657,2477,1973],{"class":690},[657,2479,2008],{"class":700},[657,2481,2482],{"class":704},":\n",[657,2484,2485,2488,2490,2493,2495,2497,2499,2501,2503,2505,2508,2511,2513,2516,2519,2521,2523,2526,2528,2530,2532,2534],{"class":659,"line":1103},[657,2486,2487],{"class":700},"    i",[657,2489,1175],{"class":704},[657,2491,2492],{"class":700}," _ ",[657,2494,2064],{"class":1069},[657,2496,2093],{"class":1041},[657,2498,701],{"class":704},[657,2500,2071],{"class":1041},[657,2502,701],{"class":704},[657,2504,659],{"class":1990},[657,2506,2507],{"class":704},"[:",[657,2509,2510],{"class":1069},"-",[657,2512,1181],{"class":1171},[657,2514,2515],{"class":704},"]),",[657,2517,2518],{"class":1035}," key",[657,2520,2064],{"class":1069},[657,2522,2112],{"class":1041},[657,2524,2525],{"class":1035}," t",[657,2527,678],{"class":704},[657,2529,2525],{"class":1990},[657,2531,1936],{"class":704},[657,2533,1181],{"class":1171},[657,2535,2536],{"class":704},"])\n",[657,2538,2539,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2563,2565,2567,2570,2572,2574,2576,2578,2580,2582,2584,2586],{"class":659,"line":1109},[657,2540,2541],{"class":700},"    j",[657,2543,1175],{"class":704},[657,2545,2492],{"class":700},[657,2547,2064],{"class":1069},[657,2549,2093],{"class":1041},[657,2551,701],{"class":704},[657,2553,2071],{"class":1041},[657,2555,701],{"class":704},[657,2557,659],{"class":1990},[657,2559,1936],{"class":704},[657,2561,2562],{"class":1990},"i ",[657,2564,2179],{"class":1069},[657,2566,2054],{"class":1171},[657,2568,2569],{"class":704},":]),",[657,2571,2518],{"class":1035},[657,2573,2064],{"class":1069},[657,2575,2112],{"class":1041},[657,2577,2525],{"class":1035},[657,2579,678],{"class":704},[657,2581,2525],{"class":1990},[657,2583,1936],{"class":704},[657,2585,1181],{"class":1171},[657,2587,2536],{"class":704},[657,2589,2590],{"class":659,"line":1115},[657,2591,1106],{"emptyLinePlaceholder":477},[657,2593,2594,2596,2599,2601,2603,2605,2607,2610,2612,2614,2616,2618,2621,2623,2626,2628,2630],{"class":659,"line":1146},[657,2595,2420],{"class":700},[657,2597,2598],{"class":1069},"+=",[657,2600,2145],{"class":663},[657,2602,701],{"class":704},[657,2604,659],{"class":1990},[657,2606,1936],{"class":704},[657,2608,2609],{"class":1990},"i",[657,2611,726],{"class":704},[657,2613,2313],{"class":1069},[657,2615,2034],{"class":1990},[657,2617,1936],{"class":704},[657,2619,2620],{"class":1990},"j ",[657,2622,2179],{"class":1069},[657,2624,2625],{"class":1990}," i ",[657,2627,2179],{"class":1069},[657,2629,2054],{"class":1171},[657,2631,2536],{"class":704},[11,2633,2634],{},"Okay, granted—if I read the function docs, with a bit of staring I can almost see what's going on. And then, just when I thought I could handle what's happening, it struck again:",[648,2636,2639],{"className":1918,"code":2637,"filename":2638,"language":1921,"meta":457,"style":457},"total += sum(\n    int(\n        (m := max(enumerate(l[:-1]), key=lambda x: x[1]))[1]\n        + max(enumerate(l[m[0] + 1:]), key=lambda x: x[1])[1]\n    )\n    for l in read_lines(\"input.txt\")\n)\n","snippet_3.py",[654,2640,2641,2653,2660,2714,2769,2773,2795],{"__ignoreMap":457},[657,2642,2643,2646,2648,2651],{"class":659,"line":660},[657,2644,2645],{"class":700},"total ",[657,2647,2598],{"class":1069},[657,2649,2650],{"class":1041}," sum",[657,2652,1206],{"class":704},[657,2654,2655,2658],{"class":659,"line":458},[657,2656,2657],{"class":663},"    int",[657,2659,1206],{"class":704},[657,2661,2662,2665,2668,2671,2673,2675,2677,2679,2682,2684,2686,2688,2690,2692,2694,2696,2699,2701,2703,2705,2707,2710,2712],{"class":659,"line":459},[657,2663,2664],{"class":704},"        (",[657,2666,2667],{"class":1990},"m ",[657,2669,2670],{"class":1069},":=",[657,2672,2093],{"class":1041},[657,2674,701],{"class":704},[657,2676,2071],{"class":1041},[657,2678,701],{"class":704},[657,2680,2681],{"class":1990},"l",[657,2683,2507],{"class":704},[657,2685,2510],{"class":1069},[657,2687,1181],{"class":1171},[657,2689,2515],{"class":704},[657,2691,2518],{"class":1035},[657,2693,2064],{"class":1069},[657,2695,2112],{"class":1041},[657,2697,2698],{"class":1035}," x",[657,2700,678],{"class":704},[657,2702,2698],{"class":1990},[657,2704,1936],{"class":704},[657,2706,1181],{"class":1171},[657,2708,2709],{"class":704},"]))[",[657,2711,1181],{"class":1171},[657,2713,2016],{"class":704},[657,2715,2716,2719,2721,2723,2725,2727,2729,2731,2734,2736,2738,2740,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2765,2767],{"class":659,"line":1103},[657,2717,2718],{"class":1069},"        +",[657,2720,2093],{"class":1041},[657,2722,701],{"class":704},[657,2724,2071],{"class":1041},[657,2726,701],{"class":704},[657,2728,2681],{"class":1990},[657,2730,1936],{"class":704},[657,2732,2733],{"class":1990},"m",[657,2735,1936],{"class":704},[657,2737,1172],{"class":1171},[657,2739,726],{"class":704},[657,2741,2313],{"class":1069},[657,2743,2054],{"class":1171},[657,2745,2569],{"class":704},[657,2747,2518],{"class":1035},[657,2749,2064],{"class":1069},[657,2751,2112],{"class":1041},[657,2753,2698],{"class":1035},[657,2755,678],{"class":704},[657,2757,2698],{"class":1990},[657,2759,1936],{"class":704},[657,2761,1181],{"class":1171},[657,2763,2764],{"class":704},"])[",[657,2766,1181],{"class":1171},[657,2768,2016],{"class":704},[657,2770,2771],{"class":659,"line":1109},[657,2772,2130],{"class":704},[657,2774,2775,2778,2781,2783,2785,2787,2789,2791,2793],{"class":659,"line":1115},[657,2776,2777],{"class":690},"    for",[657,2779,2780],{"class":1990}," l ",[657,2782,1973],{"class":690},[657,2784,1946],{"class":1035},[657,2786,701],{"class":704},[657,2788,718],{"class":704},[657,2790,1953],{"class":667},[657,2792,718],{"class":704},[657,2794,1958],{"class":704},[657,2796,2797],{"class":659,"line":1146},[657,2798,1958],{"class":704},[11,2800,2801],{},"I mean, it looks cool, sure. But why would you do this to yourself? Even looking at it makes me feel pain in my spine.",[11,2803,2804,2805,2807],{},"This was when I realized:",[84,2806],{},"\nI couldn't find a middle-ground version I'm happy with. It's either too Pythonic to the extent it makes me fart under its weight, or it’s too C#-ish, that it would fart itself. That's not gonna cut it for me.",[33,2809,2811],{"id":2810},"rust-to-the-rescue","Rust to the rescue!!",[11,2813,2814,2815,2818,2819,2821,2822,563,2827,2829,2830,2835,2836,2841],{},"I was familiar with Rust for a rather long time. I just didn't take the time to ",[502,2816,2817],{},"actually"," get into it. I built a few CLIs with it, tested its waters, and it seemed fine, just not necessary at the time.",[84,2820],{},"\nI saw how Rust became \"The most-admired programming language\" ",[931,2823,2826],{"href":2824,"rel":2825},"https:\u002F\u002Fsurvey.stackoverflow.co\u002F2024\u002Ftechnology#2-programming-scripting-and-markup-languages",[935],"year after year",[84,2828],{},"\nI was also a fan of ",[931,2831,2834],{"href":2832,"rel":2833},"https:\u002F\u002Fwww.youtube.com\u002F@NoBoilerplate",[935],"No Boilerplate","'s videos, especially his ",[931,2837,2840],{"href":2838,"rel":2839},"https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PLZaoyhMXgBzoM9bfb5pyUOT3zjnaDdSEP",[935],"Rust Talks",", his hype and joy when he talks about Rust is on another level.",[11,2843,2844,2845,2847,2848,2851,2852,2855],{},"So I decided why not? I'll give it a shot. I have nothing better to do.",[84,2846],{},"\nAnd guess what? It made a bit more sense to me. Granted, I already knew about the ",[502,2849,2850],{},"Ownership"," system and the ",[502,2853,2854],{},"Borrow Checker",", so I didn't have to fight in an entirely new battle just to be able to walk.",[11,2857,2858,2859,2862],{},"What I love about Rust, in this case at least, is how it logically ",[502,2860,2861],{},"pipes"," methods, not passing them around as arguments all the time. so a fairly idiomatic Rust version of our code snippet would look something like this:",[648,2864,2869],{"className":2865,"code":2866,"filename":2867,"language":2868,"meta":457,"style":457},"language-rust shiki shiki-themes gruvbox-light-hard gruvbox-dark-hard gruvbox-dark-hard","fn extract_value(line: &str) -> i32 {\n    let chars: Vec\u003Cchar> = line.chars().collect();\n\n    let first_index = chars[..chars.len() - 1]\n        .iter()\n        .enumerate()\n        .max_by_key(|(_, c)| *c)\n        .unwrap()\n        .0;\n\n    let second = chars[first_index + 1..]\n        .iter()\n        .max()\n        .unwrap();\n\n    let first = chars[first_index];\n\n    format!(\"{}{}\", first, second)\n        .parse()\n        .unwrap()\n}\n\nfn main() {\n    let total: i32 = read_lines(\"input.txt\")\n        .map(|line| extract_value(&line))\n        .sum();\n\n    println!(\"{total}\");\n}\n","snippet_1.rs","rust",[654,2870,2871,2900,2942,2946,2977,2988,2996,3030,3039,3047,3051,3074,3082,3091,3099,3103,3121,3125,3145,3154,3162,3167,3171,3182,3207,3233,3242,3246,3265],{"__ignoreMap":457},[657,2872,2873,2876,2879,2881,2883,2885,2888,2890,2892,2895,2898],{"class":659,"line":660},[657,2874,2875],{"class":690},"fn",[657,2877,2878],{"class":663}," extract_value",[657,2880,701],{"class":704},[657,2882,659],{"class":1035},[657,2884,678],{"class":1069},[657,2886,2887],{"class":1069}," &",[657,2889,1939],{"class":663},[657,2891,737],{"class":704},[657,2893,2894],{"class":1069}," ->",[657,2896,2897],{"class":663}," i32",[657,2899,1045],{"class":704},[657,2901,2902,2905,2908,2910,2913,2916,2919,2922,2924,2926,2928,2931,2934,2936,2939],{"class":659,"line":458},[657,2903,2904],{"class":1041},"    let",[657,2906,2907],{"class":1035}," chars",[657,2909,678],{"class":1069},[657,2911,2912],{"class":663}," Vec",[657,2914,2915],{"class":704},"\u003C",[657,2917,2918],{"class":663},"char",[657,2920,2921],{"class":704},">",[657,2923,1155],{"class":1069},[657,2925,2034],{"class":1035},[657,2927,563],{"class":1069},[657,2929,2930],{"class":663},"chars",[657,2932,2933],{"class":704},"()",[657,2935,563],{"class":1069},[657,2937,2938],{"class":663},"collect",[657,2940,2941],{"class":704},"();\n",[657,2943,2944],{"class":659,"line":459},[657,2945,1106],{"emptyLinePlaceholder":477},[657,2947,2948,2950,2953,2955,2957,2959,2962,2964,2966,2969,2971,2973,2975],{"class":659,"line":1103},[657,2949,2904],{"class":1041},[657,2951,2952],{"class":1035}," first_index",[657,2954,1155],{"class":1069},[657,2956,2907],{"class":1035},[657,2958,1936],{"class":704},[657,2960,2961],{"class":1069},"..",[657,2963,2930],{"class":1035},[657,2965,563],{"class":1069},[657,2967,2968],{"class":663},"len",[657,2970,2933],{"class":704},[657,2972,1178],{"class":1069},[657,2974,2054],{"class":1171},[657,2976,2016],{"class":704},[657,2978,2979,2982,2985],{"class":659,"line":1109},[657,2980,2981],{"class":1069},"        .",[657,2983,2984],{"class":663},"iter",[657,2986,2987],{"class":704},"()\n",[657,2989,2990,2992,2994],{"class":659,"line":1115},[657,2991,2981],{"class":1069},[657,2993,2071],{"class":663},[657,2995,2987],{"class":704},[657,2997,2998,3000,3003,3005,3008,3010,3013,3015,3018,3020,3022,3025,3028],{"class":659,"line":1146},[657,2999,2981],{"class":1069},[657,3001,3002],{"class":663},"max_by_key",[657,3004,701],{"class":704},[657,3006,3007],{"class":690},"|",[657,3009,701],{"class":704},[657,3011,3012],{"class":1035},"_",[657,3014,1175],{"class":704},[657,3016,3017],{"class":1035}," c",[657,3019,737],{"class":704},[657,3021,3007],{"class":690},[657,3023,3024],{"class":1069}," *",[657,3026,3027],{"class":1035},"c",[657,3029,1958],{"class":704},[657,3031,3032,3034,3037],{"class":659,"line":1197},[657,3033,2981],{"class":1069},[657,3035,3036],{"class":663},"unwrap",[657,3038,2987],{"class":704},[657,3040,3041,3043,3045],{"class":659,"line":1209},[657,3042,2981],{"class":1069},[657,3044,1172],{"class":1171},[657,3046,740],{"class":704},[657,3048,3049],{"class":659,"line":1253},[657,3050,1106],{"emptyLinePlaceholder":477},[657,3052,3053,3055,3058,3060,3062,3064,3066,3068,3070,3072],{"class":659,"line":1272},[657,3054,2904],{"class":1041},[657,3056,3057],{"class":1035}," second",[657,3059,1155],{"class":1069},[657,3061,2907],{"class":1035},[657,3063,1936],{"class":704},[657,3065,2340],{"class":1035},[657,3067,2313],{"class":1069},[657,3069,2054],{"class":1171},[657,3071,2961],{"class":1069},[657,3073,2016],{"class":704},[657,3075,3076,3078,3080],{"class":659,"line":1280},[657,3077,2981],{"class":1069},[657,3079,2984],{"class":663},[657,3081,2987],{"class":704},[657,3083,3084,3086,3089],{"class":659,"line":1286},[657,3085,2981],{"class":1069},[657,3087,3088],{"class":663},"max",[657,3090,2987],{"class":704},[657,3092,3093,3095,3097],{"class":659,"line":2137},[657,3094,2981],{"class":1069},[657,3096,3036],{"class":663},[657,3098,2941],{"class":704},[657,3100,3101],{"class":659,"line":2159},[657,3102,1106],{"emptyLinePlaceholder":477},[657,3104,3105,3107,3110,3112,3114,3116,3118],{"class":659,"line":2164},[657,3106,2904],{"class":1041},[657,3108,3109],{"class":1035}," first",[657,3111,1155],{"class":1069},[657,3113,2907],{"class":1035},[657,3115,1936],{"class":704},[657,3117,2340],{"class":1035},[657,3119,3120],{"class":704},"];\n",[657,3122,3123],{"class":659,"line":2185},[657,3124,1106],{"emptyLinePlaceholder":477},[657,3126,3127,3130,3132,3135,3137,3139,3141,3143],{"class":659,"line":2215},[657,3128,3129],{"class":663},"    format!",[657,3131,701],{"class":704},[657,3133,3134],{"class":704},"\"{}{}\"",[657,3136,1175],{"class":704},[657,3138,3109],{"class":1035},[657,3140,1175],{"class":704},[657,3142,3057],{"class":1035},[657,3144,1958],{"class":704},[657,3146,3147,3149,3152],{"class":659,"line":2236},[657,3148,2981],{"class":1069},[657,3150,3151],{"class":663},"parse",[657,3153,2987],{"class":704},[657,3155,3156,3158,3160],{"class":659,"line":2241},[657,3157,2981],{"class":1069},[657,3159,3036],{"class":663},[657,3161,2987],{"class":704},[657,3163,3164],{"class":659,"line":2253},[657,3165,3166],{"class":704},"}\n",[657,3168,3169],{"class":659,"line":2261},[657,3170,1106],{"emptyLinePlaceholder":477},[657,3172,3173,3175,3178,3180],{"class":659,"line":2282},[657,3174,2875],{"class":690},[657,3176,3177],{"class":663}," main",[657,3179,2933],{"class":704},[657,3181,1045],{"class":704},[657,3183,3184,3186,3189,3191,3193,3195,3197,3199,3201,3203,3205],{"class":659,"line":2287},[657,3185,2904],{"class":1041},[657,3187,3188],{"class":1035}," total",[657,3190,678],{"class":1069},[657,3192,2897],{"class":663},[657,3194,1155],{"class":1069},[657,3196,1946],{"class":663},[657,3198,701],{"class":704},[657,3200,718],{"class":704},[657,3202,1953],{"class":667},[657,3204,718],{"class":704},[657,3206,1958],{"class":704},[657,3208,3209,3211,3214,3216,3218,3220,3222,3224,3226,3229,3231],{"class":659,"line":2292},[657,3210,2981],{"class":1069},[657,3212,3213],{"class":663},"map",[657,3215,701],{"class":704},[657,3217,3007],{"class":690},[657,3219,659],{"class":1035},[657,3221,3007],{"class":690},[657,3223,2878],{"class":663},[657,3225,701],{"class":704},[657,3227,3228],{"class":1069},"&",[657,3230,659],{"class":1035},[657,3232,2079],{"class":704},[657,3234,3235,3237,3240],{"class":659,"line":2319},[657,3236,2981],{"class":1069},[657,3238,3239],{"class":663},"sum",[657,3241,2941],{"class":704},[657,3243,3244],{"class":659,"line":2324},[657,3245,1106],{"emptyLinePlaceholder":477},[657,3247,3248,3251,3253,3256,3259,3262],{"class":659,"line":2345},[657,3249,3250],{"class":663},"    println!",[657,3252,701],{"class":704},[657,3254,3255],{"class":704},"\"{",[657,3257,3258],{"class":667},"total",[657,3260,3261],{"class":704},"}\"",[657,3263,3264],{"class":704},");\n",[657,3266,3267],{"class":659,"line":2366},[657,3268,3166],{"class":704},[11,3270,3271],{},"It may look a lot more intimidating to you than the Python code, well I'm sorry, probably skill issues ;)",[11,3273,3274,3275,3277,3278,3280],{},"And yes, I understand that even comparing these languages may not seem feasible. They're designed for different use cases from the ground up. What seem interesting to me though, is that Python is known to be a \"scripting language\" among other things, and I was trying to script, but it made it so... maze-like to do \"correctly\" for lack of a better word.",[84,3276],{},"\nRust didn't do that.",[84,3279],{},"\nI mean sure, it takes a longer time to get the basics of the language, it also take more lines of code and an entirely different style of coding to get the same result, but it does NOT leave everything up to me to ruin everything. It tries to help me.",[11,3282,3283],{},"Does it mean I can't ruin the code if I tried? Hell no:",[648,3285,3288],{"className":2865,"code":3286,"filename":3287,"language":2868,"meta":457,"style":457},"fn main() {\n    let lines: Vec\u003CString> = read_lines(\"input.txt\").collect();\n\n    let mut total: i32 = 0;\n\n    for line_index in 0..lines.len() {\n        let line: &String = &lines[line_index];\n\n        let characters: Vec\u003Cchar> = line.chars().collect();\n\n        let mut first_max_index: usize = 0;\n        let mut first_max_char: char = characters[0];\n\n        let mut i: usize = 0;\n        while i \u003C characters.len() - 1 {\n            let current_char: char = characters[i];\n\n            if current_char > first_max_char {\n                first_max_char = current_char;\n                first_max_index = i;\n            }\n\n            i = i + 1;\n        }\n\n        let mut second_max_index: usize = first_max_index + 1;\n        let mut second_max_char: char = characters[second_max_index];\n\n        let mut j: usize = first_max_index + 1;\n        while j \u003C characters.len() {\n            let current_char: char = characters[j];\n\n            if current_char > second_max_char {\n                second_max_char = current_char;\n                second_max_index = j;\n            }\n\n            j = j + 1;\n        }\n\n        let mut combined_string: String = String::new();\n        combined_string.push(first_max_char);\n        combined_string.push(second_max_char);\n\n        let value: i32 = combined_string.parse::\u003Ci32>().unwrap();\n\n        total = total + value;\n    }\n\n    println!(\"{}\", total);\n}\n","snippet_2.rs",[654,3289,3290,3300,3337,3341,3361,3365,3389,3414,3418,3451,3455,3475,3499,3503,3522,3546,3568,3572,3586,3597,3608,3613,3617,3632,3637,3641,3664,3688,3692,3715,3733,3754,3758,3770,3782,3794,3799,3804,3820,3825,3830,3857,3875,3891,3896,3932,3937,3953,3958,3963,3979],{"__ignoreMap":457},[657,3291,3292,3294,3296,3298],{"class":659,"line":660},[657,3293,2875],{"class":690},[657,3295,3177],{"class":663},[657,3297,2933],{"class":704},[657,3299,1045],{"class":704},[657,3301,3302,3304,3306,3308,3310,3312,3315,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335],{"class":659,"line":458},[657,3303,2904],{"class":1041},[657,3305,2008],{"class":1035},[657,3307,678],{"class":1069},[657,3309,2912],{"class":663},[657,3311,2915],{"class":704},[657,3313,3314],{"class":663},"String",[657,3316,2921],{"class":704},[657,3318,1155],{"class":1069},[657,3320,1946],{"class":663},[657,3322,701],{"class":704},[657,3324,718],{"class":704},[657,3326,1953],{"class":667},[657,3328,718],{"class":704},[657,3330,737],{"class":704},[657,3332,563],{"class":1069},[657,3334,2938],{"class":663},[657,3336,2941],{"class":704},[657,3338,3339],{"class":659,"line":459},[657,3340,1106],{"emptyLinePlaceholder":477},[657,3342,3343,3345,3348,3350,3352,3354,3356,3359],{"class":659,"line":1103},[657,3344,2904],{"class":1041},[657,3346,3347],{"class":1041}," mut",[657,3349,3188],{"class":1035},[657,3351,678],{"class":1069},[657,3353,2897],{"class":663},[657,3355,1155],{"class":1069},[657,3357,3358],{"class":1171}," 0",[657,3360,740],{"class":704},[657,3362,3363],{"class":659,"line":1109},[657,3364,1106],{"emptyLinePlaceholder":477},[657,3366,3367,3369,3372,3375,3377,3379,3381,3383,3385,3387],{"class":659,"line":1115},[657,3368,2777],{"class":690},[657,3370,3371],{"class":1035}," line_index",[657,3373,3374],{"class":690}," in",[657,3376,3358],{"class":1171},[657,3378,2961],{"class":1069},[657,3380,1928],{"class":1035},[657,3382,563],{"class":1069},[657,3384,2968],{"class":663},[657,3386,2933],{"class":704},[657,3388,1045],{"class":704},[657,3390,3391,3394,3396,3398,3400,3402,3404,3406,3408,3410,3412],{"class":659,"line":1146},[657,3392,3393],{"class":1041},"        let",[657,3395,2034],{"class":1035},[657,3397,678],{"class":1069},[657,3399,2887],{"class":1069},[657,3401,3314],{"class":663},[657,3403,1155],{"class":1069},[657,3405,2887],{"class":1069},[657,3407,1928],{"class":1035},[657,3409,1936],{"class":704},[657,3411,2013],{"class":1035},[657,3413,3120],{"class":704},[657,3415,3416],{"class":659,"line":1197},[657,3417,1106],{"emptyLinePlaceholder":477},[657,3419,3420,3422,3425,3427,3429,3431,3433,3435,3437,3439,3441,3443,3445,3447,3449],{"class":659,"line":1209},[657,3421,3393],{"class":1041},[657,3423,3424],{"class":1035}," characters",[657,3426,678],{"class":1069},[657,3428,2912],{"class":663},[657,3430,2915],{"class":704},[657,3432,2918],{"class":663},[657,3434,2921],{"class":704},[657,3436,1155],{"class":1069},[657,3438,2034],{"class":1035},[657,3440,563],{"class":1069},[657,3442,2930],{"class":663},[657,3444,2933],{"class":704},[657,3446,563],{"class":1069},[657,3448,2938],{"class":663},[657,3450,2941],{"class":704},[657,3452,3453],{"class":659,"line":1253},[657,3454,1106],{"emptyLinePlaceholder":477},[657,3456,3457,3459,3461,3464,3466,3469,3471,3473],{"class":659,"line":1272},[657,3458,3393],{"class":1041},[657,3460,3347],{"class":1041},[657,3462,3463],{"class":1035}," first_max_index",[657,3465,678],{"class":1069},[657,3467,3468],{"class":663}," usize",[657,3470,1155],{"class":1069},[657,3472,3358],{"class":1171},[657,3474,740],{"class":704},[657,3476,3477,3479,3481,3484,3486,3489,3491,3493,3495,3497],{"class":659,"line":1280},[657,3478,3393],{"class":1041},[657,3480,3347],{"class":1041},[657,3482,3483],{"class":1035}," first_max_char",[657,3485,678],{"class":1069},[657,3487,3488],{"class":663}," char",[657,3490,1155],{"class":1069},[657,3492,3424],{"class":1035},[657,3494,1936],{"class":704},[657,3496,1172],{"class":1171},[657,3498,3120],{"class":704},[657,3500,3501],{"class":659,"line":1286},[657,3502,1106],{"emptyLinePlaceholder":477},[657,3504,3505,3507,3509,3512,3514,3516,3518,3520],{"class":659,"line":2137},[657,3506,3393],{"class":1041},[657,3508,3347],{"class":1041},[657,3510,3511],{"class":1035}," i",[657,3513,678],{"class":1069},[657,3515,3468],{"class":663},[657,3517,1155],{"class":1069},[657,3519,3358],{"class":1171},[657,3521,740],{"class":704},[657,3523,3524,3527,3529,3532,3534,3536,3538,3540,3542,3544],{"class":659,"line":2159},[657,3525,3526],{"class":690},"        while",[657,3528,3511],{"class":1035},[657,3530,3531],{"class":1069}," \u003C",[657,3533,3424],{"class":1035},[657,3535,563],{"class":1069},[657,3537,2968],{"class":663},[657,3539,2933],{"class":704},[657,3541,1178],{"class":1069},[657,3543,2054],{"class":1171},[657,3545,1045],{"class":704},[657,3547,3548,3551,3554,3556,3558,3560,3562,3564,3566],{"class":659,"line":2164},[657,3549,3550],{"class":1041},"            let",[657,3552,3553],{"class":1035}," current_char",[657,3555,678],{"class":1069},[657,3557,3488],{"class":663},[657,3559,1155],{"class":1069},[657,3561,3424],{"class":1035},[657,3563,1936],{"class":704},[657,3565,2609],{"class":1035},[657,3567,3120],{"class":704},[657,3569,3570],{"class":659,"line":2185},[657,3571,1106],{"emptyLinePlaceholder":477},[657,3573,3574,3577,3579,3582,3584],{"class":659,"line":2215},[657,3575,3576],{"class":690},"            if",[657,3578,3553],{"class":1035},[657,3580,3581],{"class":1069}," >",[657,3583,3483],{"class":1035},[657,3585,1045],{"class":704},[657,3587,3588,3591,3593,3595],{"class":659,"line":2236},[657,3589,3590],{"class":1035},"                first_max_char",[657,3592,1155],{"class":1069},[657,3594,3553],{"class":1035},[657,3596,740],{"class":704},[657,3598,3599,3602,3604,3606],{"class":659,"line":2241},[657,3600,3601],{"class":1035},"                first_max_index",[657,3603,1155],{"class":1069},[657,3605,3511],{"class":1035},[657,3607,740],{"class":704},[657,3609,3610],{"class":659,"line":2253},[657,3611,3612],{"class":704},"            }\n",[657,3614,3615],{"class":659,"line":2261},[657,3616,1106],{"emptyLinePlaceholder":477},[657,3618,3619,3622,3624,3626,3628,3630],{"class":659,"line":2282},[657,3620,3621],{"class":1035},"            i",[657,3623,1155],{"class":1069},[657,3625,3511],{"class":1035},[657,3627,2313],{"class":1069},[657,3629,2054],{"class":1171},[657,3631,740],{"class":704},[657,3633,3634],{"class":659,"line":2287},[657,3635,3636],{"class":704},"        }\n",[657,3638,3639],{"class":659,"line":2292},[657,3640,1106],{"emptyLinePlaceholder":477},[657,3642,3643,3645,3647,3650,3652,3654,3656,3658,3660,3662],{"class":659,"line":2319},[657,3644,3393],{"class":1041},[657,3646,3347],{"class":1041},[657,3648,3649],{"class":1035}," second_max_index",[657,3651,678],{"class":1069},[657,3653,3468],{"class":663},[657,3655,1155],{"class":1069},[657,3657,3463],{"class":1035},[657,3659,2313],{"class":1069},[657,3661,2054],{"class":1171},[657,3663,740],{"class":704},[657,3665,3666,3668,3670,3673,3675,3677,3679,3681,3683,3686],{"class":659,"line":2324},[657,3667,3393],{"class":1041},[657,3669,3347],{"class":1041},[657,3671,3672],{"class":1035}," second_max_char",[657,3674,678],{"class":1069},[657,3676,3488],{"class":663},[657,3678,1155],{"class":1069},[657,3680,3424],{"class":1035},[657,3682,1936],{"class":704},[657,3684,3685],{"class":1035},"second_max_index",[657,3687,3120],{"class":704},[657,3689,3690],{"class":659,"line":2345},[657,3691,1106],{"emptyLinePlaceholder":477},[657,3693,3694,3696,3698,3701,3703,3705,3707,3709,3711,3713],{"class":659,"line":2366},[657,3695,3393],{"class":1041},[657,3697,3347],{"class":1041},[657,3699,3700],{"class":1035}," j",[657,3702,678],{"class":1069},[657,3704,3468],{"class":663},[657,3706,1155],{"class":1069},[657,3708,3463],{"class":1035},[657,3710,2313],{"class":1069},[657,3712,2054],{"class":1171},[657,3714,740],{"class":704},[657,3716,3717,3719,3721,3723,3725,3727,3729,3731],{"class":659,"line":2371},[657,3718,3526],{"class":690},[657,3720,3700],{"class":1035},[657,3722,3531],{"class":1069},[657,3724,3424],{"class":1035},[657,3726,563],{"class":1069},[657,3728,2968],{"class":663},[657,3730,2933],{"class":704},[657,3732,1045],{"class":704},[657,3734,3735,3737,3739,3741,3743,3745,3747,3749,3752],{"class":659,"line":2391},[657,3736,3550],{"class":1041},[657,3738,3553],{"class":1035},[657,3740,678],{"class":1069},[657,3742,3488],{"class":663},[657,3744,1155],{"class":1069},[657,3746,3424],{"class":1035},[657,3748,1936],{"class":704},[657,3750,3751],{"class":1035},"j",[657,3753,3120],{"class":704},[657,3755,3756],{"class":659,"line":2412},[657,3757,1106],{"emptyLinePlaceholder":477},[657,3759,3760,3762,3764,3766,3768],{"class":659,"line":2417},[657,3761,3576],{"class":690},[657,3763,3553],{"class":1035},[657,3765,3581],{"class":1069},[657,3767,3672],{"class":1035},[657,3769,1045],{"class":704},[657,3771,3773,3776,3778,3780],{"class":659,"line":3772},34,[657,3774,3775],{"class":1035},"                second_max_char",[657,3777,1155],{"class":1069},[657,3779,3553],{"class":1035},[657,3781,740],{"class":704},[657,3783,3785,3788,3790,3792],{"class":659,"line":3784},35,[657,3786,3787],{"class":1035},"                second_max_index",[657,3789,1155],{"class":1069},[657,3791,3700],{"class":1035},[657,3793,740],{"class":704},[657,3795,3797],{"class":659,"line":3796},36,[657,3798,3612],{"class":704},[657,3800,3802],{"class":659,"line":3801},37,[657,3803,1106],{"emptyLinePlaceholder":477},[657,3805,3807,3810,3812,3814,3816,3818],{"class":659,"line":3806},38,[657,3808,3809],{"class":1035},"            j",[657,3811,1155],{"class":1069},[657,3813,3700],{"class":1035},[657,3815,2313],{"class":1069},[657,3817,2054],{"class":1171},[657,3819,740],{"class":704},[657,3821,3823],{"class":659,"line":3822},39,[657,3824,3636],{"class":704},[657,3826,3828],{"class":659,"line":3827},40,[657,3829,1106],{"emptyLinePlaceholder":477},[657,3831,3833,3835,3837,3840,3842,3845,3847,3849,3852,3855],{"class":659,"line":3832},41,[657,3834,3393],{"class":1041},[657,3836,3347],{"class":1041},[657,3838,3839],{"class":1035}," combined_string",[657,3841,678],{"class":1069},[657,3843,3844],{"class":663}," String",[657,3846,1155],{"class":1069},[657,3848,3844],{"class":663},[657,3850,3851],{"class":1069},"::",[657,3853,3854],{"class":663},"new",[657,3856,2941],{"class":704},[657,3858,3860,3863,3865,3868,3870,3873],{"class":659,"line":3859},42,[657,3861,3862],{"class":1035},"        combined_string",[657,3864,563],{"class":1069},[657,3866,3867],{"class":663},"push",[657,3869,701],{"class":704},[657,3871,3872],{"class":1035},"first_max_char",[657,3874,3264],{"class":704},[657,3876,3878,3880,3882,3884,3886,3889],{"class":659,"line":3877},43,[657,3879,3862],{"class":1035},[657,3881,563],{"class":1069},[657,3883,3867],{"class":663},[657,3885,701],{"class":704},[657,3887,3888],{"class":1035},"second_max_char",[657,3890,3264],{"class":704},[657,3892,3894],{"class":659,"line":3893},44,[657,3895,1106],{"emptyLinePlaceholder":477},[657,3897,3899,3901,3904,3906,3908,3910,3912,3914,3916,3918,3920,3923,3926,3928,3930],{"class":659,"line":3898},45,[657,3900,3393],{"class":1041},[657,3902,3903],{"class":1035}," value",[657,3905,678],{"class":1069},[657,3907,2897],{"class":663},[657,3909,1155],{"class":1069},[657,3911,3839],{"class":1035},[657,3913,563],{"class":1069},[657,3915,3151],{"class":663},[657,3917,3851],{"class":1069},[657,3919,2915],{"class":704},[657,3921,3922],{"class":663},"i32",[657,3924,3925],{"class":704},">()",[657,3927,563],{"class":1069},[657,3929,3036],{"class":663},[657,3931,2941],{"class":704},[657,3933,3935],{"class":659,"line":3934},46,[657,3936,1106],{"emptyLinePlaceholder":477},[657,3938,3940,3943,3945,3947,3949,3951],{"class":659,"line":3939},47,[657,3941,3942],{"class":1035},"        total",[657,3944,1155],{"class":1069},[657,3946,3188],{"class":1035},[657,3948,2313],{"class":1069},[657,3950,3903],{"class":1035},[657,3952,740],{"class":704},[657,3954,3956],{"class":659,"line":3955},48,[657,3957,1283],{"class":704},[657,3959,3961],{"class":659,"line":3960},49,[657,3962,1106],{"emptyLinePlaceholder":477},[657,3964,3966,3968,3970,3973,3975,3977],{"class":659,"line":3965},50,[657,3967,3250],{"class":663},[657,3969,701],{"class":704},[657,3971,3972],{"class":704},"\"{}\"",[657,3974,1175],{"class":704},[657,3976,3188],{"class":1035},[657,3978,3264],{"class":704},[657,3980,3982],{"class":659,"line":3981},51,[657,3983,3166],{"class":704},[11,3985,3986],{},"I can do it, but the language and the compiler actively fight me over doing so.",[11,3988,3989],{},"And also yes, you can write a Rust code that's on the other end of the scale:",[648,3991,3994],{"className":2865,"code":3992,"filename":3993,"language":2868,"meta":457,"style":457},"let total: i32 = read_lines(\"input.txt\")\n    .map(|line| {\n        line.chars()\n            .enumerate()\n            .fold(None, |best, (i, c)| match best {\n                None => Some((i, c)),\n                Some((j, d)) if c > d && i + 1 \u003C line.len() => Some((i, c)),\n                _ => best,\n            })\n            .map(|(i, a)| {\n                line.chars()\n                    .skip(i + 1)\n                    .max()\n                    .map(|b| format!(\"{a}{b}\").parse::\u003Ci32>().unwrap())\n                    .unwrap()\n            })\n            .unwrap()\n    })\n    .sum();\n","snippet_3.rs",[654,3995,3996,4021,4038,4049,4058,4100,4122,4181,4192,4197,4222,4233,4251,4259,4311,4319,4323,4331,4336],{"__ignoreMap":457},[657,3997,3998,4001,4003,4005,4007,4009,4011,4013,4015,4017,4019],{"class":659,"line":660},[657,3999,4000],{"class":1041},"let",[657,4002,3188],{"class":1035},[657,4004,678],{"class":1069},[657,4006,2897],{"class":663},[657,4008,1155],{"class":1069},[657,4010,1946],{"class":663},[657,4012,701],{"class":704},[657,4014,718],{"class":704},[657,4016,1953],{"class":667},[657,4018,718],{"class":704},[657,4020,1958],{"class":704},[657,4022,4023,4026,4028,4030,4032,4034,4036],{"class":659,"line":458},[657,4024,4025],{"class":1069},"    .",[657,4027,3213],{"class":663},[657,4029,701],{"class":704},[657,4031,3007],{"class":690},[657,4033,659],{"class":1035},[657,4035,3007],{"class":690},[657,4037,1045],{"class":704},[657,4039,4040,4043,4045,4047],{"class":659,"line":459},[657,4041,4042],{"class":1035},"        line",[657,4044,563],{"class":1069},[657,4046,2930],{"class":663},[657,4048,2987],{"class":704},[657,4050,4051,4054,4056],{"class":659,"line":1103},[657,4052,4053],{"class":1069},"            .",[657,4055,2071],{"class":663},[657,4057,2987],{"class":704},[657,4059,4060,4062,4065,4067,4070,4072,4075,4078,4080,4082,4084,4086,4088,4090,4092,4095,4098],{"class":659,"line":1109},[657,4061,4053],{"class":1069},[657,4063,4064],{"class":663},"fold",[657,4066,701],{"class":704},[657,4068,4069],{"class":663},"None",[657,4071,1175],{"class":704},[657,4073,4074],{"class":690}," |",[657,4076,4077],{"class":1035},"best",[657,4079,1175],{"class":704},[657,4081,1059],{"class":704},[657,4083,2609],{"class":1035},[657,4085,1175],{"class":704},[657,4087,3017],{"class":1035},[657,4089,737],{"class":704},[657,4091,3007],{"class":690},[657,4093,4094],{"class":690}," match",[657,4096,4097],{"class":1035}," best",[657,4099,1045],{"class":704},[657,4101,4102,4105,4107,4110,4113,4115,4117,4119],{"class":659,"line":1115},[657,4103,4104],{"class":663},"                None",[657,4106,1042],{"class":1069},[657,4108,4109],{"class":663}," Some",[657,4111,4112],{"class":704},"((",[657,4114,2609],{"class":1035},[657,4116,1175],{"class":704},[657,4118,3017],{"class":1035},[657,4120,4121],{"class":704},")),\n",[657,4123,4124,4127,4129,4131,4133,4136,4139,4142,4144,4146,4148,4151,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179],{"class":659,"line":1146},[657,4125,4126],{"class":663},"                Some",[657,4128,4112],{"class":704},[657,4130,3751],{"class":1035},[657,4132,1175],{"class":704},[657,4134,4135],{"class":1035}," d",[657,4137,4138],{"class":704},"))",[657,4140,4141],{"class":690}," if",[657,4143,3017],{"class":1035},[657,4145,3581],{"class":1069},[657,4147,4135],{"class":1035},[657,4149,4150],{"class":690}," &&",[657,4152,3511],{"class":1035},[657,4154,2313],{"class":1069},[657,4156,2054],{"class":1171},[657,4158,3531],{"class":1069},[657,4160,2034],{"class":1035},[657,4162,563],{"class":1069},[657,4164,2968],{"class":663},[657,4166,2933],{"class":704},[657,4168,1042],{"class":1069},[657,4170,4109],{"class":663},[657,4172,4112],{"class":704},[657,4174,2609],{"class":1035},[657,4176,1175],{"class":704},[657,4178,3017],{"class":1035},[657,4180,4121],{"class":704},[657,4182,4183,4186,4188,4190],{"class":659,"line":1197},[657,4184,4185],{"class":1035},"                _",[657,4187,1042],{"class":1069},[657,4189,4097],{"class":1035},[657,4191,729],{"class":704},[657,4193,4194],{"class":659,"line":1209},[657,4195,4196],{"class":704},"            })\n",[657,4198,4199,4201,4203,4205,4207,4209,4211,4213,4216,4218,4220],{"class":659,"line":1253},[657,4200,4053],{"class":1069},[657,4202,3213],{"class":663},[657,4204,701],{"class":704},[657,4206,3007],{"class":690},[657,4208,701],{"class":704},[657,4210,2609],{"class":1035},[657,4212,1175],{"class":704},[657,4214,4215],{"class":1035}," a",[657,4217,737],{"class":704},[657,4219,3007],{"class":690},[657,4221,1045],{"class":704},[657,4223,4224,4227,4229,4231],{"class":659,"line":1272},[657,4225,4226],{"class":1035},"                line",[657,4228,563],{"class":1069},[657,4230,2930],{"class":663},[657,4232,2987],{"class":704},[657,4234,4235,4238,4241,4243,4245,4247,4249],{"class":659,"line":1280},[657,4236,4237],{"class":1069},"                    .",[657,4239,4240],{"class":663},"skip",[657,4242,701],{"class":704},[657,4244,2609],{"class":1035},[657,4246,2313],{"class":1069},[657,4248,2054],{"class":1171},[657,4250,1958],{"class":704},[657,4252,4253,4255,4257],{"class":659,"line":1286},[657,4254,4237],{"class":1069},[657,4256,3088],{"class":663},[657,4258,2987],{"class":704},[657,4260,4261,4263,4265,4267,4269,4272,4274,4277,4279,4281,4283,4286,4288,4290,4292,4294,4296,4298,4300,4302,4304,4306,4308],{"class":659,"line":2137},[657,4262,4237],{"class":1069},[657,4264,3213],{"class":663},[657,4266,701],{"class":704},[657,4268,3007],{"class":690},[657,4270,4271],{"class":1035},"b",[657,4273,3007],{"class":690},[657,4275,4276],{"class":663}," format!",[657,4278,701],{"class":704},[657,4280,3255],{"class":704},[657,4282,931],{"class":667},[657,4284,4285],{"class":704},"}{",[657,4287,4271],{"class":667},[657,4289,3261],{"class":704},[657,4291,737],{"class":704},[657,4293,563],{"class":1069},[657,4295,3151],{"class":663},[657,4297,3851],{"class":1069},[657,4299,2915],{"class":704},[657,4301,3922],{"class":663},[657,4303,3925],{"class":704},[657,4305,563],{"class":1069},[657,4307,3036],{"class":663},[657,4309,4310],{"class":704},"())\n",[657,4312,4313,4315,4317],{"class":659,"line":2159},[657,4314,4237],{"class":1069},[657,4316,3036],{"class":663},[657,4318,2987],{"class":704},[657,4320,4321],{"class":659,"line":2164},[657,4322,4196],{"class":704},[657,4324,4325,4327,4329],{"class":659,"line":2185},[657,4326,4053],{"class":1069},[657,4328,3036],{"class":663},[657,4330,2987],{"class":704},[657,4332,4333],{"class":659,"line":2215},[657,4334,4335],{"class":704},"    })\n",[657,4337,4338,4340,4342],{"class":659,"line":2236},[657,4339,4025],{"class":1069},[657,4341,3239],{"class":663},[657,4343,2941],{"class":704},[11,4345,4346,4347,4349],{},"This also looks gibberish to me.",[84,4348],{},"\nSee? I don't discriminate. I'm nice.",[33,4351,4353],{"id":4352},"so-what-does-it-all-mean","So, what does it all mean?",[11,4355,4356,4357],{},"Honestly? ",[203,4358,4359],{},"Nothing—and everything at the same time.",[11,4361,4362],{},"This isn’t a manifesto against Python, nor is it an attempt to crown Rust as the One True Language™. Languages are tools, and tools interact differently with different brains, backgrounds, and expectations.",[11,4364,4365],{},"Python is incredibly powerful, expressive, and productive—especially in the hands of people who think fluently in its idioms. For me, though, the gap between “works,” “idiomatic,” and “readable” felt uncomfortably wide. I often found myself choosing between code that felt verbose and foreign, or code that felt clever at the cost of clarity.",[11,4367,4368],{},"Rust, despite its steeper learning curve, gave me something I didn’t realize I was missing: constraints that guide instead of surprise. The compiler pushes back, the types tell a story, and the structure nudges me toward code I can reason about weeks later. That trade‑off—more upfront friction for long‑term clarity—is one I’ve learned to appreciate.",[11,4370,4371,4372,4375],{},"So choose your language the way you’d choose a long‑term collaborator. Understand its strengths, accept its flaws, and pay attention to how it shapes your thinking. The best language isn’t the fastest, the trendiest, or the most admired—it’s the one that helps ",[203,4373,4374],{},"you"," think clearly and enjoy the work along the way.",[873,4377,4378],{},"html pre.shiki code .s2xuh, html code.shiki .s2xuh{--shiki-light:#3C3836;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}html pre.shiki code .swc6o, html code.shiki .swc6o{--shiki-light:#7C6F64;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .sXcZX, html code.shiki .sXcZX{--shiki-light:#B57614;--shiki-default:#FABD2F;--shiki-dark:#FABD2F}html pre.shiki code .sHSTz, html code.shiki .sHSTz{--shiki-light:#427B58;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}html pre.shiki code .sgL72, html code.shiki .sgL72{--shiki-light:#076678;--shiki-default:#83A598;--shiki-dark:#83A598}html pre.shiki code .snxCs, html code.shiki .snxCs{--shiki-light:#79740E;--shiki-default:#B8BB26;--shiki-dark:#B8BB26}html pre.shiki code .sA8KM, html code.shiki .sA8KM{--shiki-light:#9D0006;--shiki-default:#FB4934;--shiki-dark:#FB4934}html pre.shiki code .sTCDi, html code.shiki .sTCDi{--shiki-light:#AF3A03;--shiki-default:#FE8019;--shiki-dark:#FE8019}html pre.shiki code .sYNTs, html code.shiki .sYNTs{--shiki-light:#8F3F71;--shiki-default:#D3869B;--shiki-dark:#D3869B}html pre.shiki code .sfJtd, html code.shiki .sfJtd{--shiki-light:#504945;--shiki-default:#D5C4A1;--shiki-dark:#D5C4A1}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);}",{"title":457,"searchDepth":458,"depth":459,"links":4380},[4381,4382,4383,4384],{"id":1852,"depth":458,"text":1853},{"id":1871,"depth":458,"text":1872},{"id":2810,"depth":458,"text":2811},{"id":4352,"depth":458,"text":4353},"2025-11-15","Exploring how two different schools of thought on programming can make a great difference in creating a unique developer experience",{},{"title":1847,"description":4386},"writings\u002Fmy-aoc-experience","Programming Languages","7 min read","rrlmVirGt0JTExm1_mQIbZL5xLiQ-tiv5toLngk-TbA",1789387126894]