[{"data":1,"prerenderedAt":2601},["ShallowReactive",2],{"blogs":3,"page-/blog/post-8":2530},[4,139,216,331,483,603,1431,1610,2374,2469],{"id":5,"title":6,"body":7,"date":129,"description":130,"extension":131,"image":132,"meta":133,"navigation":134,"path":135,"seo":136,"stem":137,"__hash__":138},"content/blog/post-10.md","The Pragmatic Programmer",{"type":8,"value":9,"toc":120},"minimark",[10,15,20,24,27,30,46,49,52,55,58,61,65,68,71,74,78,81,84,91,94,98,101,104,107,111,114,117],[11,12,14],"h1",{"id":13},"i-know-much-less-than-i-thought-i-did","I know much less than I thought I did",[16,17,19],"h2",{"id":18},"im-not-sure-what-im-doing","I'm not sure what I'm doing",[21,22,23],"p",{},"What it truly means to be a good software engineer is becoming clearer and clearer. It was always my goal to become a software engineer, but I never really considered becoming a great one.",[21,25,26],{},"I hope that makes sense to someone out there. Exposure to excellence is invaluable. I've met good engineers that can write good code and I've met bad ones that can't.",[21,28,29],{},"My preceptor/mentor is a pragmatic programmer. The classic book The Pragmatic Programmer was co-authored by Dave Thomas and Andrew Hunt, and the more I listen to it the more I cringe at the way I'd been thinking about software design.",[31,32,39,40],"div",{"className":33},[34,35,36,37,38],"flex","flex-row","justify-center","items-center","gap-8","\n    ",[41,42],"img",{"src":43,"alt":44,"style":45},"images/pragmatic-book.jpg","The Pragmatic Programmer book","max-width: 500px; border-radius: 8px; padding: 16px;",[21,47,48],{},"Pragmatism is not at all anything to do with \"good enough\" or \"best practices.\" Evan (my preceptor) is an exemplary pragmatist. He's a great teacher and mentor. He's given me responsibility and accountability over my code and designs.",[21,50,51],{},"If you're reading this Evan, thank you for everything. I'd been disappointed in myself for not being a better software engineer, but I'm seeing why that is now. A lot of my education was derailing me from writing real software.",[21,53,54],{},"To preface, I have a tendency to be a bit blameless every now and then (a gift from my father, yes I understand the irony). But even so the Computer Engineering program at the University of Alberta is missing a lot of the fundamentals of software engineering, and to an extent poorly covers the curriculum it does have. Software engineering shouldn't be a single course tacked onto the program — it should be its own discipline, distinct from electrical, not some bastardized combination of both.",[21,56,57],{},"Thanks to Evan, I'm seeing how many fundamentals of software engineering I've been missing. How to pursue excellence and really how to conduct myself as a software engineer. Crazy how as a MechE he'd pivoted to cover so much of the softE curriculum on his own despite being so much farther removed from it than I am.",[21,59,60],{},"The testing, the planning, the requirements gathering, the documentation. It'd been ridiculed by peers and previous employers as unnecessary. THEY ARE SO WRONG. GOD. EVERYTHING IS IMPORTANT.",[16,62,64],{"id":63},"no-broken-windows","No Broken Windows",[21,66,67],{},"Part of the book talks about no broken windows. That means if a building is abandoned, it generally holds the test of time until someone breaks a window. Then people see the flaws, people see the lack of care, and the building becomes overrun with haste.",[21,69,70],{},"It's insidiously infectious, and I'd seen it first hand at my previous internship. AI slop code is exactly the same idea, it's the equivalent of boarding up a broken window. Temporary fixes that only preserve the illusion of care.",[21,72,73],{},"I owe Dave Thomas and Andrew Hunt for whatever direction my career takes going forward. Software is a language — there's no reason to use it other than to communicate with other people as well as the machine.",[16,75,77],{"id":76},"im-not-a-good-programmer","I'm not a good programmer",[21,79,80],{},"I'd thought I was for a while. I tend to miss instances of evaluation. I'm starting to realize how many times I'd missed the mark, how I'd fallen short of expectations silently due to my own ignorance. I abandoned my own competencies, only to use AI as a crutch.",[21,82,83],{},"I'd been given the luxury of an employer to write code for and learn from, why have I been throwing away all that investment I'd been putting into myself and career?",[31,85,39,87],{"className":86},[34,35,36,37,38],[41,88],{"src":89,"alt":90,"style":45},"/im-an-idiot.jpg","I'm an idiot",[21,92,93],{},"I've much to read, much more to build, and much more to practice before I'd consider myself a good engineer.",[16,95,97],{"id":96},"reading-for-depth-vs-breadth","Reading for depth vs breadth",[21,99,100],{},"Part of the book addresses this. I thought it was only good to cover breadth; I considered it sharpening the axe. But the book says that long form content is the only way to truly develop depth, and that's something I'd lacked and wanted to learn from this internship. I'm glad this book spelled it out for me so explicitly. (sorry evan I need things dumbed down for me sometimes)",[21,102,103],{},"I'm embarrassed to admit it but I think there were opportunities to build depth at my previous internship as well, I just don't think I realized it until after I'd already fallen short of expectations. Attitude-wise, I thought being a jack of all trades was the smartest way to stay employable as a developer.",[21,105,106],{},"That's why I thought I had it figured out — and why I was wrong.",[16,108,110],{"id":109},"one-last-thing-i-thought-was-important","One last thing I thought was important",[21,112,113],{},"This is something I'd been searching for the answer to for a while. I didn't truly understand how you can control another developer's use of your code, bound it clearly enough that they need to use it properly. The revelation has been that software is just communication, and the language itself isn't designed to enforce that, it's designed to be communicated as written.",[21,115,116],{},"I'm not just talking about writing code that's easy to read. I'm talking about the fact that there is nothing that can prevent someone from ignoring your code. You can force it, but you shouldn't unless necessary. It's part of that beautiful garden approach — you build something open enough to invite people in, not something fenced off to force them into using it correctly.",[21,118,119],{},"Software engineering is a language intended to be communicated, not enforced. So the best thing you can strive to be, at the end of the day, is a strong communicator: write code that is easy to read, easy to write, and easy to maintain, and when all else fails, at the very least well documented.",{"title":121,"searchDepth":122,"depth":122,"links":123},"",2,[124,125,126,127,128],{"id":18,"depth":122,"text":19},{"id":63,"depth":122,"text":64},{"id":76,"depth":122,"text":77},{"id":96,"depth":122,"text":97},{"id":109,"depth":122,"text":110},"2026-09-12","some reflections on gained insights and mistakes","md",null,{},true,"/blog/post-10",{"title":6,"description":130},"blog/post-10","-LX9rN38K-3skTztABPzEEwSo5vcsvwCoMPiHuU2w0Y",{"id":140,"title":141,"body":142,"date":209,"description":210,"extension":131,"image":132,"meta":211,"navigation":134,"path":212,"seo":213,"stem":214,"__hash__":215},"content/blog/post-9.md","Imposter Syndrome Revisited",{"type":8,"value":143,"toc":201},[144,148,151,154,157,160,164,167,170,173,177,180,183,186,190,193,198],[11,145,147],{"id":146},"im-hitting-a-new-wall","I'm hitting a new wall",[21,149,150],{},"You always hear about this wall. Tutorial hell is the most common example. Then framework hell, then platform hell, then tooling hell. But I'm hitting a new wall. I think I've explored enough of the development space to decide on a realistic specialization.",[21,152,153],{},"I thought I wanted infrastructure/platform engineering. I thought I wanted that endless yaml reading and writing. But the last month at this new internship has changed that for me. I'm being mentored by someone who REALLY knows their stuff. A proper senior. Someone who ships quality software quickly.",[21,155,156],{},"Until now I've been a get-it-done-and-move-on kind of developer. I'd get the minimum viable product done, then move on and revisit later only if needed. Evan (my mentor) has shown me the other side of that: studying design patterns, clean code, DDD best practices, CQRS.",[21,158,159],{},"All of this modelling solved so many problem spaces for me on the backend side — there's always some trap to fall into (too much clean code, dont-repeat-yourselfing into a mess, linting to a fault, chasing 100% test coverage for reliability), and I'd never found a groove to develop in, which is probably why devops felt more consistent to me: declarative, and without opinion.",[16,161,163],{"id":162},"devops-sre-swe","devops? SRE? SWE?",[21,165,166],{},"Now I'm not so sure what I want. I feel like I need to be modelling problems more often. I need to design things I use, and I need to be more organized and considerate of responsibility and long-term patterns. I'm setting my head on fire every day at work in some new way of thinking. I feel entrenched in this new way of thinking, almost unable to go back to breathing in my old one — it's just so much better.",[21,168,169],{},"It feels like no matter what I do, I'm learning and growing every day at the office. I want to be a better backend engineer. I think I might consider more backendy positions going forward.",[21,171,172],{},"Also I really like working with nerdy people. I liked construction shop talk, I miss that crude humor. But nerding out is als pretty sweet.",[16,174,176],{"id":175},"the-new-direction","The new direction",[21,178,179],{},"I think I might just want to be a backend engineer with a bit of specialization in infrastructure/platform engineering. I want to deploy more applications, not just design the pipelines for them. I think I'd miss out on half the deliciousness of the pie that is being a software engineer if I settled after the first appealing career I stumbled across.",[21,181,182],{},"Backend engineering is significantly more well-rounded than I'd thought. I like the idea that I can differentiate myself as a backend engineer by the decisions and designs I make.",[21,184,185],{},"I'd like to let go of the clever=bad instinct I somehow picked up along the way. I want to design fast, and I want to design well, and I want to develop that sense of better judgement, not just good judgement.",[16,187,189],{"id":188},"today-im-finally-an-imposter","Today I'm finally an imposter",[21,191,192],{},"My code is shit. More importantly, I been whiping my ass all my life, so I know how to clean a pair of butt cheeks when necessary. My assless chaps have the means to become assfull chaps. I have the means to improve the code.",[194,195,197],"h3",{"id":196},"i-found-my-career-starting-line","I found my career starting line.",[21,199,200],{},"Realistically I do still really enjoy devops/infrastructure engineering. But I feel like an imposter for the first time in a long time. So much to learn, so much to improve on, so many new ways to grow. It's awesome.",{"title":121,"searchDepth":122,"depth":122,"links":202},[203,204,205],{"id":162,"depth":122,"text":163},{"id":175,"depth":122,"text":176},{"id":188,"depth":122,"text":189,"children":206},[207],{"id":196,"depth":208,"text":197},3,"2026-08-16","I'm hitting a new wall. I'm at a career crossroads.",{},"/blog/post-9",{"title":141,"description":210},"blog/post-9","ICVzIPZNnXL890u2aiMcJzTGXBrseytT-fHiRCKIxZw",{"id":217,"title":218,"body":219,"date":324,"description":325,"extension":131,"image":132,"meta":326,"navigation":134,"path":327,"seo":328,"stem":329,"__hash__":330},"content/blog/post-8.md","Lemons and Lemonade",{"type":8,"value":220,"toc":312},[221,225,229,232,236,239,242,245,249,252,255,258,262,265,269,273,276,279,283,286,289,293,296,299,302,306,309],[11,222,224],{"id":223},"when-life-gives-you-lemons-make-lemonade","When Life Gives You Lemons, Make Lemonade",[16,226,228],{"id":227},"i-stumbled-my-way-into-a-fantastic-internship","I stumbled my way into a fantastic internship",[21,230,231],{},"I wasn't expecting to find anything after HiFinance didn't pan out. They were ready to give me an offer, but they ended up relocating to Toronto and could only offer a 4-month internship. Massively disappointing. I lost out on guaranteed Kubernetes experience and a chance to work with Next.js on the frontend.",[16,233,235],{"id":234},"then-life-threw-me-a-curveball","Then life threw me a curveball",[21,237,238],{},"At the eleventh hour, after the university sent out a forgiveness email waiving the work term due to economic conditions, I landed a single internship interview. I wasn't expecting it to go as well as it did, maybe because of how absurd the timing was, coming so soon after I'd resumed applications following my big break (the \"big break\" being a month of moping about the other internship falling through). But the interview went well.",[21,240,241],{},"I talked through my experience, including the e-commerce platform I'd been building for my sister's small business. I've been at the company about a month now, and I can see exactly why I got the internship. It lines up almost perfectly with what I was already doing on my own, and Evan scouted me and matched my experience to the role better than I could have.",[21,243,244],{},"Suffice to say, I was offered the internship.",[16,246,248],{"id":247},"what-im-learning","What I'm learning",[21,250,251],{},"I'm learning exactly why I kept running into problems with my personal projects. I'm learning what it means to actually speak the language of software engineering, mostly by relearning the ancient art of hand-typed code and memorizing syntax I used to lean on tools for. My gap was in modeling responsibility: I understood private/protected/static ownership implicitly, but I'd never modeled solutions using them in a way that let the language actually work for me.",[21,253,254],{},"This internship has already been incredibly valuable, mostly because I'm learning how rough my own code actually is. I'm finding all the code smells I used to miss completely: duplication, misallocated responsibility, doing too much, god objects, all of it. I can smell the smelly code now.",[21,256,257],{},"A lot of what I used to dismiss as minor, I can now see are organizational issues. Most of what I was missing was organizational. That's exactly why I'd been craving an internship or real work experience on a larger codebase. Maintainable code teaches you far more than anything you can pick up on your own. The expectation that code be written to last comes with a whole layer of design and engineering I hadn't been exposed to.",[16,259,261],{"id":260},"im-going-to-be-a-better-developer","I'm going to be a better developer",[21,263,264],{},"I'm going to be a better developer. A better engineer. I'm finally starting to speak the language properly, and it's hard to overstate how valuable this internship has already been.",[16,266,268],{"id":267},"the-downsides","The downsides",[194,270,272],{"id":271},"there-are-no-free-lunches","There are no free lunches",[21,274,275],{},"There are a few downsides. One is that I'm working on a virtual workstation running on a Ryzen EPYC CPU. Plenty of RAM, but the single-core performance is painfully slow. Running the .NET backend with hot reload, it would sometimes take up to 5 seconds to navigate between files after saving a change: the backend would detect the change, hot-reload the server (slowly), and then the LSP diagnostics would rerender. I have no idea why VS Code is so much slower than Neovim for navigation (it's got to be some kind of second-class citizen somewhere in the loading hierarchy), but it was becoming genuinely unusable at times.",[21,277,278],{},"I'm trying not to make too much of a fuss about it. Realistically it's slowing me down a fair amount waiting for things to recompile between changes. I imagine the senior-engineer instinct here is to just write it right the first time, but I'd rather make mistakes as quickly and often as possible.",[194,280,282],{"id":281},"vs-code-vs-neovim-my-beloved","VS Code vs. Neovim (my beloved)",[21,284,285],{},"It's been a nice change of pace, honestly. Not having to hunt through years of configs, GitHub READMEs, and open issues just to get the basics working. What probably would have taken me a month to configure in Neovim took two days to replicate in VS Code. I'd almost considered switching over full time.",[21,287,288],{},"But I'm not going to. Going back to doing things my way, it's so much faster. I can't stand how slow VS Code gets. I don't know if it's the work machine or just too many buffers open, but by Friday it was getting genuinely frustrating: save a change, wait 5 seconds for the linter to rerender, then switch files. That turns a 5-minute fix into an hour, fast.",[194,290,292],{"id":291},"the-other-downsides","The other downsides",[21,294,295],{},"It's a Windows-everything environment: Azure Blobs, MSSQL, Azurite, Azure DevOps, and .NET Core. ASP.NET Core has actually been great to work with; it's close enough to Java that I really enjoy it. I like object-oriented languages, and I'd guess a big part of the 2016 .NET rewrite was chasing feature parity with Spring Boot, which it's actually gotten quite close to.",[21,297,298],{},"The other downside is working with a real IT team for permissions and security. Minimum-access policies mean no access to the Ubuntu apt repo, no access to Anthropic's site on the machine, and no copy-pasting between the virtual workstation and my local machine. Insane, but understandable. It's why I've given up on running Neovim instead of VS Code. I can't even reach Anthropic directly. I have to go through GitHub Copilot to interface with Claude, since that's the route with a liability agreement already in place.",[21,300,301],{},"That's the real reason I gave up on Neovim, at least for now. There's no realistic way I'd get to a usable setup by having IT vet every individual installation dependency one at a time. If a single one failed a background check, the whole setup falls apart. Which is a shame, but it's probably good for me to know how to work in more than one editor. In hindsight, learning how to configure plain Vim into a workable IDE would have been a much easier sell to IT than a full Neovim config.",[194,303,305],{"id":304},"none-of-that-really-matters","None of that really matters",[21,307,308],{},"I've already learned how to write real code, and honestly, none of the rest matters much next to that. I'm starting to think like an actual developer. I could always model a problem well enough to get an LLM to implement it for me, but I'd never developed the extra layer on top: the sense of taste, the instinct for what's clean. I'm not saying I have none of that. I'm saying there are ingredients and recipes I'd been using that turned out to be a lot messier than I realized.",[21,310,311],{},"I'm looking forward to learning a lot more. I'll do a dedicated post on how I actually landed this internship soon. It's been a long gap between entries.",{"title":121,"searchDepth":122,"depth":122,"links":313},[314,315,316,317,318],{"id":227,"depth":122,"text":228},{"id":234,"depth":122,"text":235},{"id":247,"depth":122,"text":248},{"id":260,"depth":122,"text":261},{"id":267,"depth":122,"text":268,"children":319},[320,321,322,323],{"id":271,"depth":208,"text":272},{"id":281,"depth":208,"text":282},{"id":291,"depth":208,"text":292},{"id":304,"depth":208,"text":305},"2026-07-26","How a fallen-through offer turned into a better internship, and what I'm learning about writing real software",{},"/blog/post-8",{"title":218,"description":325},"blog/post-8","7HjTBi9RkMXdWLZoHjwqIDrDeTw9z6PuFl3SKutWBs0",{"id":332,"title":333,"body":334,"date":476,"description":477,"extension":131,"image":132,"meta":478,"navigation":134,"path":479,"seo":480,"stem":481,"__hash__":482},"content/blog/post-7.md","Take Home Exams",{"type":8,"value":335,"toc":464},[336,340,343,346,349,356,360,363,366,369,373,376,380,383,386,389,393,396,399,402,405,409,412,415,419,422,425,429,432,435,438,442,445,448,451,455],[11,337,339],{"id":338},"my-first-attempt-at-a-take-home-exam","My first attempt at a take home exam",[21,341,342],{},"To preface — I was late on this application entirely. At the University of Alberta there's a co-op job board that posts listings for students to apply for. I had been watching this one for a while. The company felt more focused as a later-stage startup than my previous internship, and they already seemed to have a stronger university presence and a larger existing customer base.",[21,344,345],{},"I won't get too deep into detail about them, but they are AI-oriented and didn't require a technical interview. They did, however, have a take home exam to complete.",[21,347,348],{},"I missed the deadline while finishing up my resume the night before the cut-off — entirely my fault. But when I checked their online posting, it was still open, so I emailed the hiring manager Mike directly. He was very friendly and understanding, and actually said it was better for visibility that I had reached out. It would be fine to complete the exam a bit later.",[21,350,351,355],{},[352,353,354],"strong",{},"Pro tip:"," don't be afraid to email hiring managers directly. The worst they can say is no.",[16,357,359],{"id":358},"the-take-home-exam","The take home exam",[21,361,362],{},"It was a Next.js and FastAPI codebase. The task was to implement an information page for individual clients, with the ability to add notes and create new clients. When I reached out over email, Mike dropped a hint to go above and beyond — to be thoughtful of the user experience, not just throw AI at the problem, and to actually read through the code first.",[21,364,365],{},"This gave me a lot of creative freedom. I took more time to plan and read through everything carefully, which revealed that the codebase was using Mantine for styling. I really wanted to rewrite it in Tailwind so I could layer in shadcn and deliver a polished table dashboard, but part of the requirements was to match and follow existing patterns in the codebase.",[21,367,368],{},"That constraint turned out to be a good thing. It pushed me to focus on the features themselves and gave me a chance to practice SCSS outside of Tailwind.",[194,370,372],{"id":371},"a-side-note-on-tailwind","A side note on Tailwind",[21,374,375],{},"I'm finding more and more that Tailwind doesn't properly detect image properties. Starting to appreciate what people mean by the leaky abstraction problem.",[16,377,379],{"id":378},"my-implementation","My implementation",[21,381,382],{},"At my last internship, I always wanted to design my own autocomplete engine for text input fields. It never felt like something I could justify prioritizing on the agile board — it wasn't a bug or immediately important, and it was outside my experience at the time.",[21,384,385],{},"But this assignment said to have fun with it, so I went for it. It turned out really clean and taught me a lot about generating suggestions on the fly.",[21,387,388],{},"My previous internship already had a citation reference generator schema in place, so I never got to implement one from scratch. Here I also built suggested follow-ups for clients based on previous comments, with inline highlighted suggestions. Both features ended up being way simpler than I expected, and I learned a lot just from getting them working. The suggestion states had plenty of time to generate and only really needed to update between note uploads, so there was plenty of room to iterate without things breaking.",[16,390,392],{"id":391},"how-it-turned-out","How it turned out",[21,394,395],{},"It took about 10 hours to get everything working cleanly within their existing codebase conventions — folder structure, environment import patterns, migration files, all of it.",[21,397,398],{},"The autocomplete approach is straightforward: set up a listener for a pause in typing, then after a set delay, send a prompt containing the context, user background, and output formatting instructions. I found an Instructor module that handled things cleanly without being too heavy-handed, which worked really well.",[21,400,401],{},"Inline ghost text wasn't realistic in the time I had, so I went with a tooltip suggestion with a tab-complete annotation instead. The context was clean, Claude Haiku was fast enough to keep it feeling responsive, and the global summary context made the suggestions actually useful alongside the suggested actions I also implemented.",[21,403,404],{},"Those suggested interactions involved a longer async process: after a note was saved to the database, an AI-generated client summary was created and three recommended actions were generated — each with a reference to the note ID it was based on and the suggestion itself. Both ran asynchronously, which kept things snappy on the frontend.",[16,406,408],{"id":407},"result","Result",[21,410,411],{},"It worked really well. I got completely absorbed in it and spent way more time than I probably should have — but even if they don't love having to review all that code, I genuinely want to incorporate more AI into my projects going forward. It was surprisingly simple to actually pull off.",[21,413,414],{},"I honestly want to fork the repo and keep working on it. Realistically I shouldn't, and should stay focused on practicing the basics. But the urge is there.",[16,416,418],{"id":417},"the-marketplace","The marketplace",[21,420,421],{},"I took a short break from the frontend to focus strictly on the backend. Something I keep noticing: any shortcut I take implementation-wise, I dread having to return to later. I'm not sure what to call this effect, but it's real.",[21,423,424],{},"For some form elements I let AI generate and style them instead of doing it myself, and now I don't want to touch them. It's an odd reluctance — not that the code is wrong, just that it doesn't feel like mine. I'm much slower when I implement things myself, but I also never avoid going back to it.",[16,426,428],{"id":427},"but-heres-the-thing","But here's the thing",[21,430,431],{},"I learn so much more when I write the code myself. I almost want to disable Claude Code's ability to write any code at all. There are muscles I want to keep flexing, and I want the brain workout. I crave it.",[21,433,434],{},"There's also been this almost forgotten feeling of reading AI output and just not liking the implementation despite it being technically correct. AI has no style.",[21,436,437],{},"I ran into this today while trying to configure image handling. I asked Claude what my options were, even though I was already leaning toward mounting the files in a shared directory. It told me the images wouldn't persist because of Docker — but that's not really right. They wouldn't persist because they weren't tracked in version control, and there's no deployment method yet, so Docker wasn't even the relevant constraint. It was mimicking reasoning, not actually doing it. Easy to forget sometimes.",[16,439,441],{"id":440},"options-for-image-handling","Options for image handling",[21,443,444],{},"I'm planning on self-hosting this thing, partly to keep costs as low as possible for my sister's business — ideally zero overhead for her. I could store images locally on the server, but even I don't love that solution.",[21,446,447],{},"There's real value in keeping both the front and backend stateless: better portability, easier maintenance, fewer long-term TODOs to track. It also gives me a chance to actually set up a content delivery network for images, which I haven't done before.",[21,449,450],{},"The real decision is whether to keep an S3 bucket close to where I host and serve it through the Next.js server, or go client-side. Given the scale, routing through Next.js is probably the more sensible option — no need to manage whatever bucket is geographically closest to the user at any given time.",[16,452,454],{"id":453},"designing-infrastructure-just-butters-my-eggroll","Designing infrastructure just butters my eggroll",[31,456,39,458,463],{"className":457},[34,35,36,37,38],[41,459],{"src":460,"alt":461,"style":462},"images/butters-my-eggroll.png","egg","max-width: 500px; corner-radius: 8px; padding: 16px;"," ",{"title":121,"searchDepth":122,"depth":122,"links":465},[466,469,470,471,472,473,474,475],{"id":358,"depth":122,"text":359,"children":467},[468],{"id":371,"depth":208,"text":372},{"id":378,"depth":122,"text":379},{"id":391,"depth":122,"text":392},{"id":407,"depth":122,"text":408},{"id":417,"depth":122,"text":418},{"id":427,"depth":122,"text":428},{"id":440,"depth":122,"text":441},{"id":453,"depth":122,"text":454},"2026-02-24","I go over the take home exam I received from the HiFinance team",{},"/blog/post-7",{"title":333,"description":477},"blog/post-7","xpNM2alnrDmUYN0UwtFdSdyhBMCsjiV9r8Ooc4spgHc",{"id":484,"title":485,"body":486,"date":596,"description":597,"extension":131,"image":132,"meta":598,"navigation":134,"path":599,"seo":600,"stem":601,"__hash__":602},"content/blog/post-6.md","Imposter Syndrome",{"type":8,"value":487,"toc":588},[488,492,495,498,501,505,508,511,514,517,521,524,527,530,534,537,540,544,547,550,553,556,559,562,566,569,572,575,579,582,585],[11,489,491],{"id":490},"what-does-imposter-syndrome-mean","What does Imposter Syndrome mean?",[21,493,494],{},"My short answer: it's a real, justifiable anxiety about your sense of security in your career. Not paranoia, not low self-esteem. Just a rational response to knowing your position isn't guaranteed.",[21,496,497],{},"During the tech gold rush, which we no longer reside in, I think people felt this more acutely than it deserved. The market was so forgiving that a junior developer with basic skills could land an incredible role. Knowing that, of course you'd wonder if you actually earned your seat. But that era is over, and the feeling has taken on a different character. It's less about luck and more about whether you can compete.",[21,499,500],{},"Strangely, imposter syndrome is not something I've felt much, which is odd compared to most people I know. I've been thinking about why today, partly because some co-op anxiety forced the question. I've watched plenty of developers online talk about copy-pasting from Stack Overflow and feeling hollow about it, and I think that's what drives the feeling for most people. If you know you're cutting corners, you know you're faking it.",[16,502,504],{"id":503},"when-it-finally-hit","When it finally hit",[21,506,507],{},"That immunity wore off recently, though not because of my internship. The internship was genuinely valuable — I'll come back to that. The problem was what came after it. I went a full semester without writing much code at all, and by the time I started looking for work again, the atrophy was obvious. I'd worked with PostgreSQL and Redis nearly every day at that job, but operating within an existing system is different from building one. I understood the surface, not the structure, and a semester of inactivity made that gap impossible to ignore.",[21,509,510],{},"I barely touched up my resume despite having real things to add, not out of laziness but out of a paralysis about claiming credit for work I wasn't sure I fully understood.",[21,512,513],{},"The job market didn't help. Knowing that three other people would take your spot if you slipped makes it hard to feel secure. That's really all imposter syndrome is: a rational anxiety about replaceability. The walls aren't imaginary. They are closing in, for everyone. The question is just what you're doing about it.",[21,515,516],{},"If the answer is nothing, of course you'd feel like a fraud.",[16,518,520],{"id":519},"why-i-felt-immune-for-so-long","Why I felt immune for so long",[21,522,523],{},"What kept me grounded wasn't skill. It was identity. I started my Computer Engineering degree in 2023 without having written a single line of production code. By most definitions, I had no business being confident. But I'd been messing around with computers since I was a kid, and that gave me a sense of belonging in the space that my actual skill level didn't yet justify.",[21,525,526],{},"I remember being around 12 and accidentally hitting F11 on a webpage, landing in the developer tools. I started modifying the HTML on people's Facebook profiles and screenshotting it to pretend I'd hacked their accounts. I was a little malicious, but I was also, technically, writing HTML. That fascination, the thrill of understanding something others couldn't figure out, stuck with me. I think it planted a stronger sense of direction than anything I later did in school.",[21,528,529],{},"So when imposter syndrome is described as feeling like you don't belong, I never quite recognized myself in that. I always felt like I belonged here. I just didn't always have the work to prove it.",[16,531,533],{"id":532},"why-the-break-last-semester","Why the break last semester",[21,535,536],{},"The honest reason I lost momentum is that I was dieting aggressively while trying to keep my grades up. Attempting both at the same time burned through every cognitive reserve I had, and my passion for coding went with it for a few months. Cutting 50lbs in six months is a serious metabolic undertaking. It taxes your mental capacity in ways that aren't obvious until you're on the other side of it.",[21,538,539],{},"I was lucky to have university as a buffer. I wasn't employed and my grades held, so I had room to recover. But if you're considering something similar: don't, unless you have a bigger safety net than I did. There's a reason people joke about the freshman fifteen. Your brain needs fuel.",[16,541,543],{"id":542},"building-as-the-antidote","Building as the antidote",[21,545,546],{},"The fix has been straightforward: build something real.",[21,548,549],{},"I've been working on PrintMarket, a full ecommerce site I'm building for my sister. She's been dealing with an injured leg and the reduced activity that comes with it, so the hope is that a platform for her business gives her something productive to focus on. If I can build something genuinely useful for someone I care about, that feels like a real reason to have this degree. It's also been the most clarifying thing I've done as a developer. Building end to end forces you to confront gaps in your understanding quickly and honestly. I've shipped plenty of projects before, but they were mostly exploratory. I'd never intentionally held myself to a production quality bar until now. Two months ago I was genuinely an imposter with respect to full stack development, regardless of what my resume said. Now I can see the shape of what I didn't know, which means I can actually close it.",[21,551,552],{},"The tech stack has been part of what makes it so rewarding. On the frontend I'm using Next.js with TypeScript. Working with a type-safe language changed how I write software. It slows you down in the short term and forces precision you'd otherwise skip, but it produces noticeably better code. On the backend I'm using Java and Spring Boot, which introduced me to a set of design patterns I hadn't worked with before: controllers for HTTP, JPA for repository transactions, service modules for business logic. What surprised me is how cleanly the design philosophies of both sides map onto each other. Learning them in parallel gave me a structural understanding of full stack development I don't think I'd have gotten any other way.",[21,554,555],{},"Implementing proper authentication has been another highlight. Setting up OAuth with Google and Apple sign-in required understanding the full auth flow end to end, which is the kind of thing that's easy to hand off to a library without ever really grasping. The same goes for Stripe payment webhooks. Wiring up webhook listeners, validating signatures, and handling asynchronous payment events taught me more about event-driven design in practice than I'd picked up from any amount of reading. These are the kinds of problems you only encounter when you're building something that actually needs to work.",[21,557,558],{},"Properly implementing SSR and CSR has also been a revelation. Being able to choose the rendering strategy at the component level rather than making a blanket decision for the whole app is the kind of flexibility that's hard to appreciate until you actually need it. I honestly don't know why you'd build a modern frontend any other way.",[21,560,561],{},"I feel like a builder again. My first internship boss used that word when he described why he hired me, and I think he was right. That quality had just gone dormant for a while. Even earlier, when I worked construction, I noticed that getting absorbed in the tooling was always a reliable sign that I was genuinely engaged with the work. That same feeling is back.",[16,563,565],{"id":564},"the-cure","The cure",[21,567,568],{},"I think what I'm doing now is the cure. Building again has given me a certainty about my direction that isn't easily shaken. I have clear goals, genuine interest in the work, and a track record of finding my way back when I lose it. That's enough.",[21,570,571],{},"There will be setbacks. The job market is difficult, the field moves fast, and I'm still junior by most measures. But as long as I don't stop building, I think I'll be okay.",[21,573,574],{},"Plus it's tech. Trump can't nuke the global economy for that much longer... can he?",[16,576,578],{"id":577},"one-more-thing","One more thing",[21,580,581],{},"I want to be clear about something: my internship taught me an enormous amount. I learned how to ship production code, how teams actually coordinate on a codebase, how to work within real constraints, and how to push through problems that don't have a clean answer. Those aren't small things. Before it, I'd quietly avoid things like asynchronous redis worker jobs or WebSocket connections and stick to what I already knew. By the end, I wasn't doing that anymore.",[21,583,584],{},"What it also gave me, maybe more than anything, was the confidence that I could build anything if I needed to. There was no secret ingredient. The engineers I worked with were experienced because they had shipped a lot, not because they had access to knowledge I didn't. The gap between junior and senior is mostly just volume of hard problems worked through. They'll outpace you in almost every way, but they're still learning too.",[21,586,587],{},"That realization has carried over into everything since. I can now pick up an unfamiliar framework and make real design decisions with it from day one. The framework is just a checklist of requirements. The thinking underneath it is the same, and the internship is a big part of why I believe that.",{"title":121,"searchDepth":122,"depth":122,"links":589},[590,591,592,593,594,595],{"id":503,"depth":122,"text":504},{"id":519,"depth":122,"text":520},{"id":532,"depth":122,"text":533},{"id":542,"depth":122,"text":543},{"id":564,"depth":122,"text":565},{"id":577,"depth":122,"text":578},"2026-02-22","I explore for myself what it means to be a fraud",{},"/blog/post-6",{"title":485,"description":597},"blog/post-6","RsKpQkwAIYbl0wgA_xQKnZnuVCtpCTKN1jsETQO5-KE",{"id":604,"title":605,"body":606,"date":1424,"description":1425,"extension":131,"image":132,"meta":1426,"navigation":134,"path":1427,"seo":1428,"stem":1429,"__hash__":1430},"content/blog/post-5.md","Time to consider a new linux distro",{"type":8,"value":607,"toc":1408},[608,612,616,619,622,625,628,632,635,638,642,645,648,652,655,658,661,673,676,679,683,686,689,692,695,699,702,705,708,712,715,718,722,725,728,738,746,750,753,757,1404],[11,609,611],{"id":610},"avoiding-productivity-time-sinks","Avoiding Productivity Time Sinks",[16,613,615],{"id":614},"why-now","Why now?",[21,617,618],{},"I'm enjoying manually, artisanally written code. Writing directly in my editor, leaning on my LSP rather than AI autocompletions, feels mentally freeing. I feel significantly less tied down when making design decisions. I'm gaining fluency in the language and understanding more through the passive absorption of just writing out the syntax.",[21,620,621],{},"I'm ashamed to admit I never fully understood the arrow function before. Why it existed, why it was always nested in function declarations. But I'm starting to literally think differently just by typing it out. It's weird that reading code doesn't really teach you the language. Working this way also helps me debug configurations sooner. If my LSP doesn't detect something, I sort it out immediately. I can sense when something is amiss because my editor is tracking these things for me.",[21,623,624],{},"As I enjoy this artisanal craft more and appreciate simplicity and the overall design process, I can feel it drawing me in again. I'm eager to implement something new. I know this is the case because instead of having some movie or TV show playing in the background while I game, I'm keeping my editor open and programming between breaks.",[21,626,627],{},"I've heard this is a popular sentiment among other developers. Video games are a prime distraction. It's not uncommon to remove the possibility of gaming from the equation entirely. It's a powerful and seemingly universally understood phenomenon. Gaming slows growth. I have much more growing to do, and I have this feeling that this is a move in the right direction.",[16,629,631],{"id":630},"the-hidden-costs","The Hidden Costs",[21,633,634],{},"I started learning to program with AI a few years ago when GPT would spit out bits of code you could copy paste that were relatively close to Stack Overflow solutions. I saw the writing on the wall that this was going to be a useful tool, and since I love to learn the craft by learning the tools, I added it to my workflow.",[21,636,637],{},"In doing so it opened a new door that isn't unlike the video games door. It feels completely separate from my direction as a developer. They're strangely similar in that they both feel like an escape hatch. Struggling with an error message? Just copy paste it and get out quickly. Messing around with something too long? Break the friction and ask the AI.",[16,639,641],{"id":640},"claude-codes-gotcha","Claude Code's Gotcha",[21,643,644],{},"There's another hidden cost I didn't realize until recently. With Claude Code, you don't communicate the surrounding context yourself. You don't need to mentally describe environment conditions, folder locations, or pathing. It checks those things for you. The NEXTAUTH_URL variable is a perfect example. I didn't even know it existed. I got so far away from the documentation that I didn't realize my redirect URI was dependent on this variable. I'm a bit ashamed to admit that.",[21,646,647],{},"There's little benefit to lying to myself about it. I should have known that existed. Another symptom of relying on AI too much. I should be closer to the documentation.",[16,649,651],{"id":650},"metrics-for-progress","Metrics for Progress",[21,653,654],{},"One thing I've noticed about when I'm truly in a flow state is that I have many documentation pages open at the end of the session. My browser is literally a mess of links and dashboards to clean up. When it isn't a mess, I usually don't feel nearly as accomplished at the end of the day. I don't feel like I personally did much.",[21,656,657],{},"Another metric I want to track is how happy I am with the product I'm building. The less AI, the better I feel towards my product. I feel pride when I work on something, so I just want to work on it more. I feel that sense of ownership when something turns out well. My dashboard for my most recent project is incredibly clean and I'm really happy with it. I find myself looking at it in my spare time just to admire it. Same goes for my database. I'll just run SQL queries to look at the data structures I've built.",[21,659,660],{},"To summarize: when I have a browser mess and revisit my project often, I know I've moved in the right direction.",[31,662,39,664,39,669],{"className":663},[34,35,36,37,38],[41,665],{"src":666,"alt":667,"style":668},"images/admin-panel.png","Ecommercy Admin ","max-width: 600px; corder-radius 8px",[41,670],{"src":671,"alt":672,"style":668},"images/admin-item-panel.png","Ecommercy Admin Item Creation pal I've been working on",[21,674,675],{},"Theres aren't complete dashboards as they are filled with dummy data. But it helps me to know when something is complete to know to incrementally to switch between tasks. AI is great for dummy data. I find myself just staring at these knowing I'm able to just slap this into existence. This project has been insanely rewarding to work on. I just finished wrapper routers on the frontend and the backend. I can now automatically protect any routes I create on the application. Everything looks aboslutely beautiful. Springboot is an amazing service. The backend and frontend truly are complete domains in an of themselves both obviously have their own significant ranges of complexity.",[21,677,678],{},"Its been wird to see how much I've been enjoying both. for context this is going to be a surprise website for my sister to be able to ship her products for her business (should she choose to use it).",[16,680,682],{"id":681},"todos-as-a-tool","TODOs as a Tool",[21,684,685],{},"This feels like a whole new world. It always bugged me to run into multiple issues at once. Say your DB route isn't fully configured with business logic but the HTTP route is fully tested and working. You want to make sure the frontend design would work for your use case so you quickly test things, but you don't want to forget to implement the business logic later.",[21,687,688],{},"Enter TODOs. The solution for this ADHD-adjacent problem. There are LSPs that can track your TODOs. You can jump to them in a list to see all the bits of code you need to revisit. It's so convenient when your head is full of different things you need to do but other things need precedence. They reduce that jumping-around anxiety so much. They reduce that in-the-moment paralyzing anxiety when something gets really overwhelming. This feels like a good escape button for that.",[21,690,691],{},"It's mostly about peace of mind. It feels disproportionately valuable to offload that mental compute in the moment. Say I'm building a backend route and I know I want to support image URLs but I just want to create the DB object first. I finish the HTTP route and slap a TODO in the function: \"remember to finish imageUrl field\". Then it exists in the codebase indefinitely. When I jump to it with the TODO LSP, I immediately remember the context, why I left it there, and what's left to do. I can divert to finishing that task.",[21,693,694],{},"It's so, so good.",[16,696,698],{"id":697},"the-hunt-for-a-new-distro","The Hunt for a New Distro",[21,700,701],{},"I'm currently using Pop!_OS on my main desktop. I bought a fancy GPU that's nearing the end of its life. I wanted to make as much use of it as I could before starting work, but that's becoming shortsighted now with the other issues I'm feeling.",[21,703,704],{},"I'm considering Arch-like distros. I know I said a few blog posts ago that I wouldn't because it's a productivity time sink. But it appears to have the benefit of being just annoying enough with Nvidia drivers that I might avoid the prospect of Linux gaming altogether.",[21,706,707],{},"I'm leaning towards three options: Ubuntu for the server experience, Omarchy for the opinionated minimalist defaults, and raw Arch. Ubuntu probably seems the best but more research needs to be done. I don't want another configuration time sink and want to simulate working development environments as closely as possible.",[16,709,711],{"id":710},"resistance-as-a-tool","Resistance as a Tool",[21,713,714],{},"Resistance is something I've learned I have control over. In the past few years it's been my cheat code for growing as a person. I see the value in that absolutely. Being strategic with it isn't something I see people do very often.",[21,716,717],{},"I get why kicking back and taking it easy is sometimes necessary, and it's tough to know when you have opportunities to do so. But you're either growing or dying. You either grow or shrivel, and I'd like to think I'm not at the tail end of my growth curve yet. I feel like I have much more I'd like to accomplish. Thus today I realistically consider removing video games altogether from my life.",[16,719,721],{"id":720},"cool-side-note","Cool Side Note",[21,723,724],{},"I configured a dev-docs plugin to hopefully support my development journey with staying closer to the documentation. Holy crap its better than google. I always wondered how the leetcode wizards figured their stuff out. I think I know now how they got to where they were.",[21,726,727],{},"It's always crazy to me to me how many different ways there are to learning web development. There are ways to download this documentation locally completely offline. It's amazing to be indexed",[194,729,731],{"id":730},"dev-docs-neovim-plugin",[732,733,737],"a",{"href":734,"rel":735},"https://github.com/luckasRanarison/nvim-devdocs",[736],"nofollow","Dev Docs Neovim Plugin",[194,739,741],{"id":740},"dev-docs-weblink",[732,742,745],{"href":743,"rel":744},"https://devdocs.io/",[736],"Dev-Docs Weblink",[16,747,749],{"id":748},"its-too-damn-clean-no-internet-required","Its Too Damn Clean. No internet required.",[21,751,752],{},"All this documentation fuzzy searchable with a keyboard shortcut! I had no idea the root documentation was so explicit and well made.",[194,754,756],{"id":755},"using-arrow-functions","Using arrow functions",[758,759,763],"pre",{"className":760,"code":761,"language":762,"meta":121,"style":121},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// An empty arrow function returns undefined\nconst empty = () => {};\n\n(() => \"foobar\")();\n// Returns \"foobar\"\n// (this is an Immediately Invoked Function Expression)\n\nconst simple = (a) => (a > 15 ? 15 : a);\nsimple(16); // 15\nsimple(10); // 10\n\nconst max = (a, b) => (a > b ? a : b);\n\n// Easy array filtering, mapping, etc.\nconst arr = [5, 6, 13, 0, 1, 18, 23];\n\nconst sum = arr.reduce((a, b) => a + b);\n// 66\n\nconst even = arr.filter((v) => v % 2 === 0);\n// [6, 0, 18]\n\nconst double = arr.map((v) => v * 2);\n// [10, 12, 26, 0, 2, 36, 46]\n\n// More concise promise chains\npromise\n  .then((a) => {\n    // …\n  })\n  .then((b) => {\n    // …\n  });\n\n// Arrow functions without parameters\nsetTimeout(() => {\n  console.log(\"I happen sooner\");\n  setTimeout(() => {\n    // deeper code\n    console.log(\"I happen later\");\n  }, 1);\n}, 1);\n\n","js",[764,765,766,775,798,803,830,836,842,847,891,911,928,933,978,983,989,1040,1045,1087,1093,1098,1144,1150,1155,1193,1199,1204,1210,1216,1238,1244,1253,1273,1278,1287,1292,1298,1312,1337,1351,1357,1380,1392],"code",{"__ignoreMap":121},[767,768,771],"span",{"class":769,"line":770},"line",1,[767,772,774],{"class":773},"sHwdD","// An empty arrow function returns undefined\n",[767,776,777,781,785,789,792,795],{"class":769,"line":122},[767,778,780],{"class":779},"spNyl","const",[767,782,784],{"class":783},"sTEyZ"," empty ",[767,786,788],{"class":787},"sMK4o","=",[767,790,791],{"class":787}," ()",[767,793,794],{"class":779}," =>",[767,796,797],{"class":787}," {};\n",[767,799,800],{"class":769,"line":208},[767,801,802],{"emptyLinePlaceholder":134},"\n",[767,804,806,809,812,814,817,821,824,827],{"class":769,"line":805},4,[767,807,808],{"class":783},"(",[767,810,811],{"class":787},"()",[767,813,794],{"class":779},[767,815,816],{"class":787}," \"",[767,818,820],{"class":819},"sfazB","foobar",[767,822,823],{"class":787},"\"",[767,825,826],{"class":783},")()",[767,828,829],{"class":787},";\n",[767,831,833],{"class":769,"line":832},5,[767,834,835],{"class":773},"// Returns \"foobar\"\n",[767,837,839],{"class":769,"line":838},6,[767,840,841],{"class":773},"// (this is an Immediately Invoked Function Expression)\n",[767,843,845],{"class":769,"line":844},7,[767,846,802],{"emptyLinePlaceholder":134},[767,848,850,852,855,857,860,863,866,868,871,874,878,881,883,886,889],{"class":769,"line":849},8,[767,851,780],{"class":779},[767,853,854],{"class":783}," simple ",[767,856,788],{"class":787},[767,858,859],{"class":787}," (",[767,861,732],{"class":862},"sHdIc",[767,864,865],{"class":787},")",[767,867,794],{"class":779},[767,869,870],{"class":783}," (a ",[767,872,873],{"class":787},">",[767,875,877],{"class":876},"sbssI"," 15",[767,879,880],{"class":787}," ?",[767,882,877],{"class":876},[767,884,885],{"class":787}," :",[767,887,888],{"class":783}," a)",[767,890,829],{"class":787},[767,892,894,898,900,903,905,908],{"class":769,"line":893},9,[767,895,897],{"class":896},"s2Zo4","simple",[767,899,808],{"class":783},[767,901,902],{"class":876},"16",[767,904,865],{"class":783},[767,906,907],{"class":787},";",[767,909,910],{"class":773}," // 15\n",[767,912,914,916,918,921,923,925],{"class":769,"line":913},10,[767,915,897],{"class":896},[767,917,808],{"class":783},[767,919,920],{"class":876},"10",[767,922,865],{"class":783},[767,924,907],{"class":787},[767,926,927],{"class":773}," // 10\n",[767,929,931],{"class":769,"line":930},11,[767,932,802],{"emptyLinePlaceholder":134},[767,934,936,938,941,943,945,947,950,953,955,957,959,961,964,967,970,973,976],{"class":769,"line":935},12,[767,937,780],{"class":779},[767,939,940],{"class":783}," max ",[767,942,788],{"class":787},[767,944,859],{"class":787},[767,946,732],{"class":862},[767,948,949],{"class":787},",",[767,951,952],{"class":862}," b",[767,954,865],{"class":787},[767,956,794],{"class":779},[767,958,870],{"class":783},[767,960,873],{"class":787},[767,962,963],{"class":783}," b ",[767,965,966],{"class":787},"?",[767,968,969],{"class":783}," a ",[767,971,972],{"class":787},":",[767,974,975],{"class":783}," b)",[767,977,829],{"class":787},[767,979,981],{"class":769,"line":980},13,[767,982,802],{"emptyLinePlaceholder":134},[767,984,986],{"class":769,"line":985},14,[767,987,988],{"class":773},"// Easy array filtering, mapping, etc.\n",[767,990,992,994,997,999,1002,1005,1007,1010,1012,1015,1017,1020,1022,1025,1027,1030,1032,1035,1038],{"class":769,"line":991},15,[767,993,780],{"class":779},[767,995,996],{"class":783}," arr ",[767,998,788],{"class":787},[767,1000,1001],{"class":783}," [",[767,1003,1004],{"class":876},"5",[767,1006,949],{"class":787},[767,1008,1009],{"class":876}," 6",[767,1011,949],{"class":787},[767,1013,1014],{"class":876}," 13",[767,1016,949],{"class":787},[767,1018,1019],{"class":876}," 0",[767,1021,949],{"class":787},[767,1023,1024],{"class":876}," 1",[767,1026,949],{"class":787},[767,1028,1029],{"class":876}," 18",[767,1031,949],{"class":787},[767,1033,1034],{"class":876}," 23",[767,1036,1037],{"class":783},"]",[767,1039,829],{"class":787},[767,1041,1043],{"class":769,"line":1042},16,[767,1044,802],{"emptyLinePlaceholder":134},[767,1046,1048,1050,1053,1055,1058,1061,1064,1066,1068,1070,1072,1074,1076,1078,1080,1083,1085],{"class":769,"line":1047},17,[767,1049,780],{"class":779},[767,1051,1052],{"class":783}," sum ",[767,1054,788],{"class":787},[767,1056,1057],{"class":783}," arr",[767,1059,1060],{"class":787},".",[767,1062,1063],{"class":896},"reduce",[767,1065,808],{"class":783},[767,1067,808],{"class":787},[767,1069,732],{"class":862},[767,1071,949],{"class":787},[767,1073,952],{"class":862},[767,1075,865],{"class":787},[767,1077,794],{"class":779},[767,1079,969],{"class":783},[767,1081,1082],{"class":787},"+",[767,1084,975],{"class":783},[767,1086,829],{"class":787},[767,1088,1090],{"class":769,"line":1089},18,[767,1091,1092],{"class":773},"// 66\n",[767,1094,1096],{"class":769,"line":1095},19,[767,1097,802],{"emptyLinePlaceholder":134},[767,1099,1101,1103,1106,1108,1110,1112,1115,1117,1119,1122,1124,1126,1129,1132,1135,1138,1140,1142],{"class":769,"line":1100},20,[767,1102,780],{"class":779},[767,1104,1105],{"class":783}," even ",[767,1107,788],{"class":787},[767,1109,1057],{"class":783},[767,1111,1060],{"class":787},[767,1113,1114],{"class":896},"filter",[767,1116,808],{"class":783},[767,1118,808],{"class":787},[767,1120,1121],{"class":862},"v",[767,1123,865],{"class":787},[767,1125,794],{"class":779},[767,1127,1128],{"class":783}," v ",[767,1130,1131],{"class":787},"%",[767,1133,1134],{"class":876}," 2",[767,1136,1137],{"class":787}," ===",[767,1139,1019],{"class":876},[767,1141,865],{"class":783},[767,1143,829],{"class":787},[767,1145,1147],{"class":769,"line":1146},21,[767,1148,1149],{"class":773},"// [6, 0, 18]\n",[767,1151,1153],{"class":769,"line":1152},22,[767,1154,802],{"emptyLinePlaceholder":134},[767,1156,1158,1160,1163,1165,1167,1169,1172,1174,1176,1178,1180,1182,1184,1187,1189,1191],{"class":769,"line":1157},23,[767,1159,780],{"class":779},[767,1161,1162],{"class":783}," double ",[767,1164,788],{"class":787},[767,1166,1057],{"class":783},[767,1168,1060],{"class":787},[767,1170,1171],{"class":896},"map",[767,1173,808],{"class":783},[767,1175,808],{"class":787},[767,1177,1121],{"class":862},[767,1179,865],{"class":787},[767,1181,794],{"class":779},[767,1183,1128],{"class":783},[767,1185,1186],{"class":787},"*",[767,1188,1134],{"class":876},[767,1190,865],{"class":783},[767,1192,829],{"class":787},[767,1194,1196],{"class":769,"line":1195},24,[767,1197,1198],{"class":773},"// [10, 12, 26, 0, 2, 36, 46]\n",[767,1200,1202],{"class":769,"line":1201},25,[767,1203,802],{"emptyLinePlaceholder":134},[767,1205,1207],{"class":769,"line":1206},26,[767,1208,1209],{"class":773},"// More concise promise chains\n",[767,1211,1213],{"class":769,"line":1212},27,[767,1214,1215],{"class":783},"promise\n",[767,1217,1219,1222,1225,1227,1229,1231,1233,1235],{"class":769,"line":1218},28,[767,1220,1221],{"class":787},"  .",[767,1223,1224],{"class":896},"then",[767,1226,808],{"class":783},[767,1228,808],{"class":787},[767,1230,732],{"class":862},[767,1232,865],{"class":787},[767,1234,794],{"class":779},[767,1236,1237],{"class":787}," {\n",[767,1239,1241],{"class":769,"line":1240},29,[767,1242,1243],{"class":773},"    // …\n",[767,1245,1247,1250],{"class":769,"line":1246},30,[767,1248,1249],{"class":787},"  }",[767,1251,1252],{"class":783},")\n",[767,1254,1256,1258,1260,1262,1264,1267,1269,1271],{"class":769,"line":1255},31,[767,1257,1221],{"class":787},[767,1259,1224],{"class":896},[767,1261,808],{"class":783},[767,1263,808],{"class":787},[767,1265,1266],{"class":862},"b",[767,1268,865],{"class":787},[767,1270,794],{"class":779},[767,1272,1237],{"class":787},[767,1274,1276],{"class":769,"line":1275},32,[767,1277,1243],{"class":773},[767,1279,1281,1283,1285],{"class":769,"line":1280},33,[767,1282,1249],{"class":787},[767,1284,865],{"class":783},[767,1286,829],{"class":787},[767,1288,1290],{"class":769,"line":1289},34,[767,1291,802],{"emptyLinePlaceholder":134},[767,1293,1295],{"class":769,"line":1294},35,[767,1296,1297],{"class":773},"// Arrow functions without parameters\n",[767,1299,1301,1304,1306,1308,1310],{"class":769,"line":1300},36,[767,1302,1303],{"class":896},"setTimeout",[767,1305,808],{"class":783},[767,1307,811],{"class":787},[767,1309,794],{"class":779},[767,1311,1237],{"class":787},[767,1313,1315,1318,1320,1323,1326,1328,1331,1333,1335],{"class":769,"line":1314},37,[767,1316,1317],{"class":783},"  console",[767,1319,1060],{"class":787},[767,1321,1322],{"class":896},"log",[767,1324,808],{"class":1325},"swJcz",[767,1327,823],{"class":787},[767,1329,1330],{"class":819},"I happen sooner",[767,1332,823],{"class":787},[767,1334,865],{"class":1325},[767,1336,829],{"class":787},[767,1338,1340,1343,1345,1347,1349],{"class":769,"line":1339},38,[767,1341,1342],{"class":896},"  setTimeout",[767,1344,808],{"class":1325},[767,1346,811],{"class":787},[767,1348,794],{"class":779},[767,1350,1237],{"class":787},[767,1352,1354],{"class":769,"line":1353},39,[767,1355,1356],{"class":773},"    // deeper code\n",[767,1358,1360,1363,1365,1367,1369,1371,1374,1376,1378],{"class":769,"line":1359},40,[767,1361,1362],{"class":783},"    console",[767,1364,1060],{"class":787},[767,1366,1322],{"class":896},[767,1368,808],{"class":1325},[767,1370,823],{"class":787},[767,1372,1373],{"class":819},"I happen later",[767,1375,823],{"class":787},[767,1377,865],{"class":1325},[767,1379,829],{"class":787},[767,1381,1383,1386,1388,1390],{"class":769,"line":1382},41,[767,1384,1385],{"class":787},"  },",[767,1387,1024],{"class":876},[767,1389,865],{"class":1325},[767,1391,829],{"class":787},[767,1393,1395,1398,1400,1402],{"class":769,"line":1394},42,[767,1396,1397],{"class":787},"},",[767,1399,1024],{"class":876},[767,1401,865],{"class":783},[767,1403,829],{"class":787},[1405,1406,1407],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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":121,"searchDepth":122,"depth":122,"links":1409},[1410,1411,1412,1413,1414,1415,1416,1417,1421],{"id":614,"depth":122,"text":615},{"id":630,"depth":122,"text":631},{"id":640,"depth":122,"text":641},{"id":650,"depth":122,"text":651},{"id":681,"depth":122,"text":682},{"id":697,"depth":122,"text":698},{"id":710,"depth":122,"text":711},{"id":720,"depth":122,"text":721,"children":1418},[1419,1420],{"id":730,"depth":208,"text":737},{"id":740,"depth":208,"text":745},{"id":748,"depth":122,"text":749,"children":1422},[1423],{"id":755,"depth":208,"text":756},"2026-02-19","I'm exploring new options for productivity focused distros. Video games are proving a bit too distracting.",{},"/blog/post-5",{"title":605,"description":1425},"blog/post-5","2LBp52VJ3nmCQkuYNGO75vugs-j6C-ePOtrGcczDsas",{"id":1432,"title":1433,"body":1434,"date":1603,"description":1604,"extension":131,"image":132,"meta":1605,"navigation":134,"path":1606,"seo":1607,"stem":1608,"__hash__":1609},"content/blog/post-4.md","My choice in Editor",{"type":8,"value":1435,"toc":1593},[1436,1440,1444,1447,1450,1454,1457,1460,1463,1466,1469,1473,1476,1479,1482,1486,1489,1492,1495,1498,1502,1544,1547,1550,1553,1557,1560,1563,1567,1575,1578,1581,1584,1587,1590],[11,1437,1439],{"id":1438},"is-neovim-truly-enough-for-professional-development","Is Neovim truly enough for professional development?",[16,1441,1443],{"id":1442},"why-neovim","Why Neovim?",[21,1445,1446],{},"I have ADHD. I may have jumped the gun a little early into my development journey. I did some research and came across Neovim. People swore it made you faster somehow. I really liked the idea of being closer to the root of development (i.e. the terminal). Everything was customizably minimal to exactly what you need and no more. It was an extremely long term investment I'm still glad I made.",[21,1448,1449],{},"It also gamified my development. Every challenge was an opportunity to level up my skills. Making my git integration more seamless, my LSP navigations more complete, finding a new yazi file manager plugin to speed up terminal operations, wrapping REST requests faster. Everything is a game. You can level up and make anything faster and that idea still appeals to me.",[16,1451,1453],{"id":1452},"where-it-started-to-crack","Where it started to crack",[21,1455,1456],{},"I had my first internship recently. I was given the freedom to use whatever IDE I wanted which was amazing but it came at an unforeseen cost.",[21,1458,1459],{},"I didn't realize how open to mentorship my boss really was. I expected to just be shoved in a closet spamming boilerplate code and doing menial labour. But my boss wanted to be my mentor. I didn't see it as a possibility with how busy he was. I just wanted to be fast and reliable so he didn't have to stall or wait on my behalf.",[21,1461,1462],{},"He actually wanted to help me grow as a developer. He was willing to slow down for my sake just to make sure I learned things properly. It didn't register until way late into the internship. I was so busy trying to get faster I didn't realize I should have focused on being easier to mentor.",[21,1464,1465],{},"My choice in editor got in the way of that. Every debugging issue, every obscure task like global find and replace, was always different for me. I'd have to drop out of the meeting, build the solution or configure it, then rejoin hours later once it's ready. I started avoiding one-on-ones so I could keep my workflow and not have to answer for its shortcomings.",[21,1467,1468],{},"That experience is what inspired this stress test.",[16,1470,1472],{"id":1471},"the-real-problem","The real problem",[21,1474,1475],{},"Neovim is a strong editor. I've proven my capabilities with it. But the issues surrounding the open source environment have bubbled to the surface one too many times.",[21,1477,1478],{},"I know Java. I've worked in the language often in my classes. But I avoid building projects with it due to Neovim's limited support. There are obviously better choices for Java development like JetBrains IntelliJ or Eclipse.",[21,1480,1481],{},"The writing has been on the wall for a while now. Its stink is all over r/neovim if you just read around. A lot of developers use it as an IDE but they're in very specific roles. It gives me the \"I use Arch BTW\" vibes of editor choices. I'd rather not lose the employment race before starting.",[16,1483,1485],{"id":1484},"the-stress-test","The stress test",[21,1487,1488],{},"So here's the deal. I'm building a Spring Boot backend for an ecommerce app for my sister. If Neovim cannot handle this basic real world project, I need to start diverging and learning something else.",[21,1490,1491],{},"If it's not as flexible as I was hoping then the quirks of open source aren't worth the trouble. It would be time to simplify my configurations to a more vim-like setup. If Neovim cannot handle this backend then it's going to continue eating into valuable time that could have been better spent just building and gaining experience. I'm a fan of exponential development and if it cannot do Java then it is not exponential.",[21,1493,1494],{},"I was ready to migrate completely to a new IDE. JetBrains, VSCode, whatever it took. I was not going to make my past mistakes again.",[1496,1497],"hr",{},[16,1499,1501],{"id":1500},"the-results","The results",[758,1503,1507],{"className":1504,"code":1505,"language":1506,"meta":121,"style":121},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","return {\n    'nvim-java/nvim-java',\n    config = function()\n        require('java').setup()\n        vim.lsp.enable('jdtls')\n    end,\n}\n","lua",[764,1508,1509,1514,1519,1524,1529,1534,1539],{"__ignoreMap":121},[767,1510,1511],{"class":769,"line":770},[767,1512,1513],{},"return {\n",[767,1515,1516],{"class":769,"line":122},[767,1517,1518],{},"    'nvim-java/nvim-java',\n",[767,1520,1521],{"class":769,"line":208},[767,1522,1523],{},"    config = function()\n",[767,1525,1526],{"class":769,"line":805},[767,1527,1528],{},"        require('java').setup()\n",[767,1530,1531],{"class":769,"line":832},[767,1532,1533],{},"        vim.lsp.enable('jdtls')\n",[767,1535,1536],{"class":769,"line":838},[767,1537,1538],{},"    end,\n",[767,1540,1541],{"class":769,"line":844},[767,1542,1543],{},"}\n",[21,1545,1546],{},"That is all it took. I was worried for literally nothing.",[21,1548,1549],{},"Beautiful autocompletions. Snippet completions. Everything I would ever need for Java development. The nvim-java plugin just works with Maven. It sees the entire project directory structure automatically. Nothing needed to be configured by me like with nvim-jdtls.",[21,1551,1552],{},"This works even better than Django's backend. Autocompletions for that backend never worked for anything. It was always a mess of guessing import paths and methods until you saved the file. I never want to work without a typesafe backend ever again.",[194,1554,1556],{"id":1555},"hello-spring-boot","Hello Spring Boot",[21,1558,1559],{},"The project structures just make sense. The way things are divided up. Tables are already mapped from class objects to table structures. Django's ORM was impossible to get a field autocompletion annotation out of. It just works in Java. I could cry.",[21,1561,1562],{},"Where have you been all my life. The dependency management. The everything. It's so clean. Even the JDTLS code actions work. You can still generate constructors, getters, setters. It's too clean.",[194,1564,1566],{"id":1565},"so-all-is-extremely-well","So All is extremely well",[31,1568,39,1570],{"className":1569},[34,35,36,37,38],[41,1571],{"src":1572,"alt":1573,"style":1574},"images/no-ragrets.png","No ragrets","max-width: 500px; corder-radius 8px",[21,1576,1577],{},"If anything its improving some neovim configurations I hadn't correctly configured due to working with languages with worse lsp autocompletions. The default springboot jdlt configuration is so clean it's letting me debug configurations I've been raw dogging for years without knowing was incorrectly configured. like my treesitter plugin was overriding my snacks.nvim plugin for go to definition. Sometimes on occasion it just wouldnt work so I'd restart but with java it was so clean I could actually pinpoint it with the lsp error messages. The verbosity and completeness of everything is so GOOD.",[21,1579,1580],{},"Very happy to be working with this backend. It's a very welcome change of pace from an ever revolving door of changes from my experience with the faster iteration languages. There are just so many gotchas with the freedom of python and javascript its so easy to make a mess and not ever find out theres patterns you could follow that are better. I'm learning that I really enjoy the opinionated nature of java. its specific language implementation details and the syntax I was taught seems so irrelevent to the actual language as a whole. The design patterns I can see are where it really does shine. It feels more mature. it feels clean. I don't know how else to describe it.",[21,1582,1583],{},"I honestly just feel like the way it enforces encapsulation of everything is teaching me to better refactor code that otherwise wouldnt be possible in python. It's teaching me hey be thoughtful of when you create something. where are you going to put it? why are you making it? what are its responsibilities?",[21,1585,1586],{},"with python it just felt like make it work. Move on.",[21,1588,1589],{},"I am very glad to have decided to work with this backend specifically. I was right in my earlier post about being worried about backend implementations. I do enjoy working from the backend. I just didnt like the freedom that python enabled for the backend. I'm glad that I'm actually enjoying designing the backend.",[1405,1591,1592],{},"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":121,"searchDepth":122,"depth":122,"links":1594},[1595,1596,1597,1598,1599],{"id":1442,"depth":122,"text":1443},{"id":1452,"depth":122,"text":1453},{"id":1471,"depth":122,"text":1472},{"id":1484,"depth":122,"text":1485},{"id":1500,"depth":122,"text":1501,"children":1600},[1601,1602],{"id":1555,"depth":208,"text":1556},{"id":1565,"depth":208,"text":1566},"2026-01-17","This is an overdue career stress test for my past choices in development direction.",{},"/blog/post-4",{"title":1433,"description":1604},"blog/post-4","LjxyQwm9A7BhAoWuOYLllm3Y51Y0ksdtfTEbWqLH42g",{"id":1611,"title":1612,"body":1613,"date":2367,"description":2368,"extension":131,"image":132,"meta":2369,"navigation":134,"path":2370,"seo":2371,"stem":2372,"__hash__":2373},"content/blog/post-3.md","How I built this blog system",{"type":8,"value":1614,"toc":2353},[1615,1618,1622,1625,1629,1640,1964,1968,1975,2202,2206,2209,2269,2273,2280,2284,2291,2295,2299,2302,2305,2308,2311,2314,2317,2320,2324,2327,2330,2333,2336,2340,2343,2347,2350],[11,1616,1612],{"id":1617},"how-i-built-this-blog-system",[16,1619,1621],{"id":1620},"the-problem","The problem",[21,1623,1624],{},"I had blog links hardcoded everywhere. The nav menu, the homepage, the blog listing page. Every time I added a new post I'd have to update all of them manually. That gets old fast.",[16,1626,1628],{"id":1627},"composables-are-nice","Composables are nice",[21,1630,1631,1632,1635,1636,1639],{},"I made a composable at ",[764,1633,1634],{},"composables/useBlogs.ts"," that queries all blog posts from the content directory and sorts them by date. Now anything that needs blog data just calls ",[764,1637,1638],{},"useBlogs()"," and it's always up to date.",[758,1641,1645],{"className":1642,"code":1643,"language":1644,"meta":121,"style":121},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export const useBlogs = async () => {\n  const { data: blogs } = await useAsyncData('blogs', async () => {\n    const posts = await queryCollection('content')\n      .where('path', 'LIKE', '/blog/%')\n      .all()\n\n    return [...posts].sort((a, b) => {\n      const dateA = a.date ? new Date(a.date).getTime() : 0\n      const dateB = b.date ? new Date(b.date).getTime() : 0\n      return dateB - dateA\n    })\n  })\n\n  return blogs\n}\n","ts",[764,1646,1647,1670,1718,1744,1782,1792,1796,1832,1881,1922,1935,1942,1948,1952,1960],{"__ignoreMap":121},[767,1648,1649,1653,1656,1659,1661,1664,1666,1668],{"class":769,"line":770},[767,1650,1652],{"class":1651},"s7zQu","export",[767,1654,1655],{"class":779}," const",[767,1657,1658],{"class":783}," useBlogs ",[767,1660,788],{"class":787},[767,1662,1663],{"class":779}," async",[767,1665,791],{"class":787},[767,1667,794],{"class":779},[767,1669,1237],{"class":787},[767,1671,1672,1675,1678,1681,1683,1686,1689,1692,1695,1698,1700,1703,1706,1708,1710,1712,1714,1716],{"class":769,"line":122},[767,1673,1674],{"class":779},"  const",[767,1676,1677],{"class":787}," {",[767,1679,1680],{"class":1325}," data",[767,1682,972],{"class":787},[767,1684,1685],{"class":783}," blogs",[767,1687,1688],{"class":787}," }",[767,1690,1691],{"class":787}," =",[767,1693,1694],{"class":1651}," await",[767,1696,1697],{"class":896}," useAsyncData",[767,1699,808],{"class":1325},[767,1701,1702],{"class":787},"'",[767,1704,1705],{"class":819},"blogs",[767,1707,1702],{"class":787},[767,1709,949],{"class":787},[767,1711,1663],{"class":779},[767,1713,791],{"class":787},[767,1715,794],{"class":779},[767,1717,1237],{"class":787},[767,1719,1720,1723,1726,1728,1730,1733,1735,1737,1740,1742],{"class":769,"line":208},[767,1721,1722],{"class":779},"    const",[767,1724,1725],{"class":783}," posts",[767,1727,1691],{"class":787},[767,1729,1694],{"class":1651},[767,1731,1732],{"class":896}," queryCollection",[767,1734,808],{"class":1325},[767,1736,1702],{"class":787},[767,1738,1739],{"class":819},"content",[767,1741,1702],{"class":787},[767,1743,1252],{"class":1325},[767,1745,1746,1749,1752,1754,1756,1759,1761,1763,1766,1769,1771,1773,1775,1778,1780],{"class":769,"line":805},[767,1747,1748],{"class":787},"      .",[767,1750,1751],{"class":896},"where",[767,1753,808],{"class":1325},[767,1755,1702],{"class":787},[767,1757,1758],{"class":819},"path",[767,1760,1702],{"class":787},[767,1762,949],{"class":787},[767,1764,1765],{"class":787}," '",[767,1767,1768],{"class":819},"LIKE",[767,1770,1702],{"class":787},[767,1772,949],{"class":787},[767,1774,1765],{"class":787},[767,1776,1777],{"class":819},"/blog/%",[767,1779,1702],{"class":787},[767,1781,1252],{"class":1325},[767,1783,1784,1786,1789],{"class":769,"line":832},[767,1785,1748],{"class":787},[767,1787,1788],{"class":896},"all",[767,1790,1791],{"class":1325},"()\n",[767,1793,1794],{"class":769,"line":838},[767,1795,802],{"emptyLinePlaceholder":134},[767,1797,1798,1801,1803,1806,1809,1811,1813,1816,1818,1820,1822,1824,1826,1828,1830],{"class":769,"line":844},[767,1799,1800],{"class":1651},"    return",[767,1802,1001],{"class":1325},[767,1804,1805],{"class":787},"...",[767,1807,1808],{"class":783},"posts",[767,1810,1037],{"class":1325},[767,1812,1060],{"class":787},[767,1814,1815],{"class":896},"sort",[767,1817,808],{"class":1325},[767,1819,808],{"class":787},[767,1821,732],{"class":862},[767,1823,949],{"class":787},[767,1825,952],{"class":862},[767,1827,865],{"class":787},[767,1829,794],{"class":779},[767,1831,1237],{"class":787},[767,1833,1834,1837,1840,1842,1845,1847,1850,1852,1855,1858,1860,1862,1864,1866,1868,1870,1873,1876,1878],{"class":769,"line":849},[767,1835,1836],{"class":779},"      const",[767,1838,1839],{"class":783}," dateA",[767,1841,1691],{"class":787},[767,1843,1844],{"class":783}," a",[767,1846,1060],{"class":787},[767,1848,1849],{"class":783},"date",[767,1851,880],{"class":787},[767,1853,1854],{"class":787}," new",[767,1856,1857],{"class":896}," Date",[767,1859,808],{"class":1325},[767,1861,732],{"class":783},[767,1863,1060],{"class":787},[767,1865,1849],{"class":783},[767,1867,865],{"class":1325},[767,1869,1060],{"class":787},[767,1871,1872],{"class":896},"getTime",[767,1874,1875],{"class":1325},"() ",[767,1877,972],{"class":787},[767,1879,1880],{"class":876}," 0\n",[767,1882,1883,1885,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920],{"class":769,"line":893},[767,1884,1836],{"class":779},[767,1886,1887],{"class":783}," dateB",[767,1889,1691],{"class":787},[767,1891,952],{"class":783},[767,1893,1060],{"class":787},[767,1895,1849],{"class":783},[767,1897,880],{"class":787},[767,1899,1854],{"class":787},[767,1901,1857],{"class":896},[767,1903,808],{"class":1325},[767,1905,1266],{"class":783},[767,1907,1060],{"class":787},[767,1909,1849],{"class":783},[767,1911,865],{"class":1325},[767,1913,1060],{"class":787},[767,1915,1872],{"class":896},[767,1917,1875],{"class":1325},[767,1919,972],{"class":787},[767,1921,1880],{"class":876},[767,1923,1924,1927,1929,1932],{"class":769,"line":913},[767,1925,1926],{"class":1651},"      return",[767,1928,1887],{"class":783},[767,1930,1931],{"class":787}," -",[767,1933,1934],{"class":783}," dateA\n",[767,1936,1937,1940],{"class":769,"line":930},[767,1938,1939],{"class":787},"    }",[767,1941,1252],{"class":1325},[767,1943,1944,1946],{"class":769,"line":935},[767,1945,1249],{"class":787},[767,1947,1252],{"class":1325},[767,1949,1950],{"class":769,"line":980},[767,1951,802],{"emptyLinePlaceholder":134},[767,1953,1954,1957],{"class":769,"line":985},[767,1955,1956],{"class":1651},"  return",[767,1958,1959],{"class":783}," blogs\n",[767,1961,1962],{"class":769,"line":991},[767,1963,1543],{"class":787},[16,1965,1967],{"id":1966},"nuxt-content-v3-gotcha","Nuxt Content v3 gotcha",[21,1969,1970,1971,1974],{},"Spent a while confused why my dates weren't showing up. Turns out Nuxt Content v3 needs you to define custom frontmatter fields in ",[764,1972,1973],{},"content.config.ts",". Otherwise it just ignores them.",[758,1976,1978],{"className":1642,"code":1977,"language":1644,"meta":121,"style":121},"import { defineContentConfig, defineCollection, z } from '@nuxt/content'\n\nexport default defineContentConfig({\n  collections: {\n    content: defineCollection({\n      type: 'page',\n      source: '**',\n      schema: z.object({\n        date: z.string().optional(),\n        image: z.string().optional(),\n        description: z.string().optional(),\n      })\n    }),\n  },\n})\n",[764,1979,1980,2013,2017,2031,2040,2053,2070,2086,2104,2129,2152,2175,2182,2190,2195],{"__ignoreMap":121},[767,1981,1982,1985,1987,1990,1992,1995,1997,2000,2002,2005,2007,2010],{"class":769,"line":770},[767,1983,1984],{"class":1651},"import",[767,1986,1677],{"class":787},[767,1988,1989],{"class":783}," defineContentConfig",[767,1991,949],{"class":787},[767,1993,1994],{"class":783}," defineCollection",[767,1996,949],{"class":787},[767,1998,1999],{"class":783}," z",[767,2001,1688],{"class":787},[767,2003,2004],{"class":1651}," from",[767,2006,1765],{"class":787},[767,2008,2009],{"class":819},"@nuxt/content",[767,2011,2012],{"class":787},"'\n",[767,2014,2015],{"class":769,"line":122},[767,2016,802],{"emptyLinePlaceholder":134},[767,2018,2019,2021,2024,2026,2028],{"class":769,"line":208},[767,2020,1652],{"class":1651},[767,2022,2023],{"class":1651}," default",[767,2025,1989],{"class":896},[767,2027,808],{"class":783},[767,2029,2030],{"class":787},"{\n",[767,2032,2033,2036,2038],{"class":769,"line":805},[767,2034,2035],{"class":1325},"  collections",[767,2037,972],{"class":787},[767,2039,1237],{"class":787},[767,2041,2042,2045,2047,2049,2051],{"class":769,"line":832},[767,2043,2044],{"class":1325},"    content",[767,2046,972],{"class":787},[767,2048,1994],{"class":896},[767,2050,808],{"class":783},[767,2052,2030],{"class":787},[767,2054,2055,2058,2060,2062,2065,2067],{"class":769,"line":838},[767,2056,2057],{"class":1325},"      type",[767,2059,972],{"class":787},[767,2061,1765],{"class":787},[767,2063,2064],{"class":819},"page",[767,2066,1702],{"class":787},[767,2068,2069],{"class":787},",\n",[767,2071,2072,2075,2077,2079,2082,2084],{"class":769,"line":844},[767,2073,2074],{"class":1325},"      source",[767,2076,972],{"class":787},[767,2078,1765],{"class":787},[767,2080,2081],{"class":819},"**",[767,2083,1702],{"class":787},[767,2085,2069],{"class":787},[767,2087,2088,2091,2093,2095,2097,2100,2102],{"class":769,"line":849},[767,2089,2090],{"class":1325},"      schema",[767,2092,972],{"class":787},[767,2094,1999],{"class":783},[767,2096,1060],{"class":787},[767,2098,2099],{"class":896},"object",[767,2101,808],{"class":783},[767,2103,2030],{"class":787},[767,2105,2106,2109,2111,2113,2115,2118,2120,2122,2125,2127],{"class":769,"line":893},[767,2107,2108],{"class":1325},"        date",[767,2110,972],{"class":787},[767,2112,1999],{"class":783},[767,2114,1060],{"class":787},[767,2116,2117],{"class":896},"string",[767,2119,811],{"class":783},[767,2121,1060],{"class":787},[767,2123,2124],{"class":896},"optional",[767,2126,811],{"class":783},[767,2128,2069],{"class":787},[767,2130,2131,2134,2136,2138,2140,2142,2144,2146,2148,2150],{"class":769,"line":913},[767,2132,2133],{"class":1325},"        image",[767,2135,972],{"class":787},[767,2137,1999],{"class":783},[767,2139,1060],{"class":787},[767,2141,2117],{"class":896},[767,2143,811],{"class":783},[767,2145,1060],{"class":787},[767,2147,2124],{"class":896},[767,2149,811],{"class":783},[767,2151,2069],{"class":787},[767,2153,2154,2157,2159,2161,2163,2165,2167,2169,2171,2173],{"class":769,"line":930},[767,2155,2156],{"class":1325},"        description",[767,2158,972],{"class":787},[767,2160,1999],{"class":783},[767,2162,1060],{"class":787},[767,2164,2117],{"class":896},[767,2166,811],{"class":783},[767,2168,1060],{"class":787},[767,2170,2124],{"class":896},[767,2172,811],{"class":783},[767,2174,2069],{"class":787},[767,2176,2177,2180],{"class":769,"line":935},[767,2178,2179],{"class":787},"      }",[767,2181,1252],{"class":783},[767,2183,2184,2186,2188],{"class":769,"line":980},[767,2185,1939],{"class":787},[767,2187,865],{"class":783},[767,2189,2069],{"class":787},[767,2191,2192],{"class":769,"line":985},[767,2193,2194],{"class":787},"  },\n",[767,2196,2197,2200],{"class":769,"line":991},[767,2198,2199],{"class":787},"}",[767,2201,1252],{"class":783},[16,2203,2205],{"id":2204},"placeholder-images","Placeholder images",[21,2207,2208],{},"I didn't want to make images for every post so I used Picsum. You can give it a seed and it returns a random but consistent image. I just use the blog path as the seed so the same post always gets the same image.",[758,2210,2212],{"className":1642,"code":2211,"language":1644,"meta":121,"style":121},"`https://picsum.photos/seed/${blog.path.replace(/\\//g, '-')}/800/400`\n",[764,2213,2214],{"__ignoreMap":121},[767,2215,2216,2219,2222,2225,2228,2230,2232,2234,2237,2239,2242,2245,2247,2250,2252,2254,2257,2259,2261,2263,2266],{"class":769,"line":770},[767,2217,2218],{"class":787},"`",[767,2220,2221],{"class":819},"https://picsum.photos/seed/",[767,2223,2224],{"class":787},"${",[767,2226,2227],{"class":783},"blog",[767,2229,1060],{"class":787},[767,2231,1758],{"class":783},[767,2233,1060],{"class":787},[767,2235,2236],{"class":896},"replace",[767,2238,808],{"class":783},[767,2240,2241],{"class":787},"/",[767,2243,2244],{"class":783},"\\/",[767,2246,2241],{"class":787},[767,2248,2249],{"class":876},"g",[767,2251,949],{"class":787},[767,2253,1765],{"class":787},[767,2255,2256],{"class":819},"-",[767,2258,1702],{"class":787},[767,2260,865],{"class":783},[767,2262,2199],{"class":787},[767,2264,2265],{"class":819},"/800/400",[767,2267,2268],{"class":787},"`\n",[16,2270,2272],{"id":2271},"blog-specific-pages","Blog specific pages",[21,2274,2275,2276,2279],{},"Made ",[764,2277,2278],{},"pages/blog/[...slug].vue"," just for blog posts. It has the author section at the bottom and a table of contents on the side. Other pages use the generic catch-all route.",[16,2281,2283],{"id":2282},"what-i-learned","What I learned",[21,2285,2286,2287,2290],{},"Nuxt Content v3 requires schema definitions for custom frontmatter. Composables are auto-imported in Nuxt which is nice. Use ",[764,2288,2289],{},"YYYY-MM-DD"," date formats for reliable sorting.",[16,2292,2294],{"id":2293},"rant-begins-here","Rant Begins Here",[194,2296,2298],{"id":2297},"why-am-i-loving-this-so-much","Why am I loving this so much?",[21,2300,2301],{},"I didn't realize that my Supermaven plugin wasn't working. I thought I just had really bad autocompletion suggestions, but about 4 hours in I realized it wasn't working at all. I've really enjoyed building with well-made documentation.",[21,2303,2304],{},"Early on I was burned by poorly written documentation in my developer journey. I went through an 8-month tech internship at a startup that heavily used AI, and it taught me to almost never read through documentation. I've since avoided documentation and defaulted to the LLM's interpretation of it. I've since learned that even with all the context of my codebase and the raw documentation, LLMs will still make bad design decisions.",[21,2306,2307],{},"They make good decisions and have tonnes of value in development, I really do see that. But recently my anxiety surrounding writing code has been nagging at me. One, it's moved me away from the most rewarding parts of coding. Two, it's removed some higher-level skill development opportunities from me. I wish I focused more on writing maintainable code. I wish I refactored code myself more. I wish I manually learned the pain of removing large chunks of code. I wish I better understood the value of well-written code sooner.",[21,2309,2310],{},"I would have maybe done more with my previous internship if I had felt more capable in my own abilities to navigate away from the expertise of the LLM. I have lots of ground to cover again, I can see that. I'm glad I really did give it as much of a chance as I did in my approach towards learning. I have no regrets that I tried to learn this way. Not knowing if I were to be left behind was worth knowing.",[21,2312,2313],{},"It definitely wasn't all doom and gloom. It was good to get up to that 80% understanding much faster in a very broad sense. It also let me do a lot of early career traversal in finding which parts of software development I really enjoyed. I'm glad I bothered with deploying my own applications.",[21,2315,2316],{},"I do think my journey with LLMs in development has reached its limits and I need to limit my reliance on them going forward for the benefit of my own sanity. I think there are parts of software development I can learn to love that I'm potentially missing, like more backend development. I think there's more room for me to grow there. I know I enjoy frontend and devops work right now, but I think there's ground to tread in the backend I'd like to explore on my own this time.",[21,2318,2319],{},"Still need to add actual comments at some point. Maybe tags too.",[194,2321,2323],{"id":2322},"im-not-anti-ai","I'm not anti-AI",[21,2325,2326],{},"I'm anti the messaging around those encouraging the collapsing economy. Yes, we all volunteer our training data and it makes all of our lives easier, and that's a sacrifice I think a lot of us are willing to make. I think it's fundamentally shortsighted though. It's not possible to become as amazing as it is without obfuscating the value of quality data. I don't think LLMs would be possible without some inherent intellectual property theft. I think LLMs at their core are just stolen data that cannot be traced back to its original source. In the same way Ubers can't be regulated as taxi drivers. Yes it's a billion dollar industry, but also it's never made money. Google already exists. Sure it's being driven into the ground right now with this bizarre push for bulldozer penny-pinching, but it's solving an almost already solved problem.",[21,2328,2329],{},"LLMs only solve problems we have already solved. Any value they bring to the world isn't as inherently absolute as the technology it runs on. The inherent non-deterministic nature destroys its own value. I just don't see a world that could benefit much more from LLMs than making trivial things less trivial.",[21,2331,2332],{},"Essays weren't worth all that much to begin with. Homework was always trivialized. Education was collapsing for reasons unrelated to LLMs.",[21,2334,2335],{},"A good LLM is only good at doing what the world is already good at doing. It feels like a weak filler that makes a mess of good things. Any industry it supports is fundamentally less stable than it otherwise would have been, whether good or bad.",[194,2337,2339],{"id":2338},"summary","Summary",[21,2341,2342],{},"I really enjoyed the process of working as closely as I have with documentation for this project. It's a muscle I'd like to grow once again. Also, I hope I never have to work with documentation without working examples ever again.",[194,2344,2346],{"id":2345},"ai-business-idea","AI Business Idea",[21,2348,2349],{},"AI-generated template scripts. Plug and play documentation generation scripts. Yes, LLMs are good at documentation. Most documentation is limited by use cases and the creativity of the developer using it. Abstract examples increase adoption, and developers love it. Why not bring better documentation to the world through AI?",[1405,2351,2352],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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":121,"searchDepth":122,"depth":122,"links":2354},[2355,2356,2357,2358,2359,2360,2361],{"id":1620,"depth":122,"text":1621},{"id":1627,"depth":122,"text":1628},{"id":1966,"depth":122,"text":1967},{"id":2204,"depth":122,"text":2205},{"id":2271,"depth":122,"text":2272},{"id":2282,"depth":122,"text":2283},{"id":2293,"depth":122,"text":2294,"children":2362},[2363,2364,2365,2366],{"id":2297,"depth":208,"text":2298},{"id":2322,"depth":208,"text":2323},{"id":2338,"depth":208,"text":2339},{"id":2345,"depth":208,"text":2346},"2026-01-08","Setting up dynamic navigation and sorting with Nuxt Content.",{},"/blog/post-3",{"title":1612,"description":2368},"blog/post-3","odkGXVdtmZUyJwlZJTCMqIWVARcNmSVasDPbvT2Nggw",{"id":2375,"title":2376,"body":2377,"date":2462,"description":2463,"extension":131,"image":132,"meta":2464,"navigation":134,"path":2465,"seo":2466,"stem":2467,"__hash__":2468},"content/blog/post-2.md","Why I Bought Old Dell PowerEdge R720s (Knowing Nothing About Them)",{"type":8,"value":2378,"toc":2453},[2379,2383,2387,2390,2394,2397,2400,2404,2407,2410,2413,2417,2426,2430,2433,2437,2440,2443,2446,2450],[11,2380,2382],{"id":2381},"my-perilous-journey-into-self-hosting","My Perilous journey into self hosting",[16,2384,2386],{"id":2385},"why-am-i-doing-this","Why am I doing this?",[21,2388,2389],{},"I'm cheap and curious. I was spending $70 CAD per month just on the EKS control plane. Not the nodes, not the storage, not the load balancers. Just the control plane sitting there existing. So I bought a couple old Dell PowerEdge R720s off eBay without knowing anything about server management.",[16,2391,2393],{"id":2392},"the-learning-curve","The learning curve",[21,2395,2396],{},"I downloaded Proxmox VE not really knowing what a hypervisor was. Grabbed a handful of ISOs (Ubuntu Server, Debian, TrueNAS) figuring I'd learn by breaking things. Thats usually how it goes for me.",[21,2398,2399],{},"The first problem? I bought an SSD optical drive caddy to replace the DVD drive for faster boot times. It got lost in the mail. So now I'm booting off a hard drive and these things take forever to POST. We're talking minutes. BIOS checks, RAID controller stuff, iDRAC doing whatever iDRAC does. I could make coffee waiting for the login screen.",[16,2401,2403],{"id":2402},"current-state","Current state",[21,2405,2406],{},"Because of the slow boot times I'm holding off on major configuration. Doesn't make sense to set up complex networking when every reboot costs me five minutes of staring at a Dell logo.",[21,2408,2409],{},"I've downloaded the .iso for Arch, Ubuntu, Kali, and run them all through proxmox. I've measure the power draw with 4 small form factor front bay hdd drives to be at most 160Watts. The servers come with built in power management thats instanely convenient. I'm enjoying how terminal heavy everything is on this side of development.",[21,2411,2412],{},"Once the replacement SSD caddy arrives I'll clone the boot drive and actually configure the RAID array properly. Maybe figure out what all those iDRAC options do.",[16,2414,2416],{"id":2415},"the-plan","The plan",[21,2418,2419,2420,2425],{},"I want to run Kubernetes but don't need it running all the time. The plan is to use ",[732,2421,2424],{"href":2422,"rel":2423},"https://keda.sh/",[736],"KEDA"," to spin clusters up and down based on traffic. Zero traffic? Zero nodes. Someone hits the site? Spin up, serve, spin down. Combined with iDRAC power management the servers could sleep when idle.",[16,2427,2429],{"id":2428},"is-it-actually-cheaper","Is it actually cheaper?",[21,2431,2432],{},"Power draw for 2 nodes running is already around $20 CAD/month. So the savings aren't in electricity. They're in compute. For $20/month in power I get dual Xeon E5s, 128GB+ of ECC RAM, and enough drive bays to hoard data forever. Try getting that on AWS for $20.",[16,2434,2436],{"id":2435},"upcoming-decision-time","Upcoming decision time",[21,2438,2439],{},"Do I move away from my beloved neovim? I find I wast more time building my configuration that I do designing software. the most I can say I benefit is the grit in debugging community developed plugins. They can be absolutely terrible and everyone has their own way of doing things bu they still have value. I want to learn to contribute to open source more because of working with this stuff but alas the big question...",[21,2441,2442],{},"is it worth it? I'm thinking about moving to vim. I've made a disgusting custom configuration that is difficult to maintain. I think the direction of neovim being wholey custom to a developer is shooting itself in the foot a bit. It's like the Arch of linux. you can say you know lots more about computers/editors but in reality are you more productive because of it? I don't really know. I might be better served with raw vim. I see its still more popular than regular neovim so I'm questioning where I move to in the future. I'm seeing the value of single mindedness and simplicity. Well developed software should be built in mind of others and maintainability I often dont see with neovim plugins. but then again I may still not be contributing enough to open source to have a valid opinion in that arena.",[21,2444,2445],{},"for future reference, I doubt I'll ever touch arch and risk the productivity sink of trying to mess around with that.",[16,2447,2449],{"id":2448},"ghist","ghist?",[21,2451,2452],{},"yes I'm going to look into simplifying from neovim to vim. Still figuring things out but thats the fun part I guess.",{"title":121,"searchDepth":122,"depth":122,"links":2454},[2455,2456,2457,2458,2459,2460,2461],{"id":2385,"depth":122,"text":2386},{"id":2392,"depth":122,"text":2393},{"id":2402,"depth":122,"text":2403},{"id":2415,"depth":122,"text":2416},{"id":2428,"depth":122,"text":2429},{"id":2435,"depth":122,"text":2436},{"id":2448,"depth":122,"text":2449},"2026-01-07","Power draw alone is $20/month for 2 nodes. The savings are in compute, not electricity.",{},"/blog/post-2",{"title":2376,"description":2463},"blog/post-2","zLM03Efdb2TJaAG6THgCzUU-bqm82x4ScDhHy-nCPSU",{"id":2470,"title":2471,"body":2472,"date":2523,"description":2524,"extension":131,"image":132,"meta":2525,"navigation":134,"path":2526,"seo":2527,"stem":2528,"__hash__":2529},"content/blog/post-1.md","My First Blog Post",{"type":8,"value":2473,"toc":2516},[2474,2478,2482,2485,2489,2492,2496,2499,2503,2506,2509,2513],[11,2475,2477],{"id":2476},"this-is-the-first-blog","This is the first blog",[16,2479,2481],{"id":2480},"why-am-i-doing-this-at-all-you-ask","Why am I doing this at all you ask?",[21,2483,2484],{},"For the love of the craft of course. I'm a student on a student budget. I found myself recently getting anxious thinking about how reliant I'm become on Claude code. I personally am enjoying working with it less and less everyday. I mostly learned it so I could build anything I ever needed to but its at a several costs I never forsaw.",[16,2486,2488],{"id":2487},"im-avoiding-things-with-resistance","I'm avoiding things with resistance",[21,2490,2491],{},"This isn't really a great example because it is pretty well known, I've just been asking newbie dumb questions, but nonetheless my journey through working with a page of documentation next to me and just an editor without any autocompletions has been nice. I've found a lot of enjoyment in a using a well made library NuxtUI. it was like my dive into lazygit. on top of making things easier for me it also taught me more about the different things that are even possible to be built. j   f",[16,2493,2495],{"id":2494},"i-should-reduce-reliance-on-ai","I should reduce reliance on AI",[21,2497,2498],{},"I'm a student thats never touched a line of code say 3 years ago. I have lot's of gaps that get filled very quickly. I regret avoiding python earlier. I learned so much more about what is possible with those higher level languages and trying to build everything from scratch myself. it made me not enjoy programming as much on top of fearing complexity to an extent. but moving towards higher level languages showed me significantly more about maintainability of code and complexity management skills I otherwise thought was inevitable in the low langauges.",[16,2500,2502],{"id":2501},"plans-to-remedy","Plans to remedy?",[21,2504,2505],{},"Leetcoding! building more applications! and being more focused per project. I'm learning to not start with a stack in mind unless it's necessary. It kind of teaches you bad practices if you try and force something you've never used before to do somehting you thought it would be good for. I've found that more often than not I'm wrong about my usecase and frankenstein my way into a working product I hate. I've learned trying to avoid the footgun is a good way to waste time. Might be good for legacy code practice. but I think for long term systems design practice (the thing I actually want to get into) it would serve me better to think conservatively.",[21,2507,2508],{},"Less code is more :) it also makes it less daunting to revisit my old code.",[16,2510,2512],{"id":2511},"future","Future?",[21,2514,2515],{},"I hope that I have a long fullfilling career developing software. I believe it's always been for me. I'm glad I took the steps to pivot careers when I did to pursue a childish dream :)",{"title":121,"searchDepth":122,"depth":122,"links":2517},[2518,2519,2520,2521,2522],{"id":2480,"depth":122,"text":2481},{"id":2487,"depth":122,"text":2488},{"id":2494,"depth":122,"text":2495},{"id":2501,"depth":122,"text":2502},{"id":2511,"depth":122,"text":2512},"2026-01-03","An introduction to my blog and what I'll be writing about.",{},"/blog/post-1",{"title":2471,"description":2524},"blog/post-1","qNAlYMpvmvIKw1lYjxfAbeJ_hVbivAzHZouf3yS__20",{"id":217,"title":218,"body":2531,"date":324,"description":325,"extension":131,"image":132,"meta":2599,"navigation":134,"path":327,"seo":2600,"stem":329,"__hash__":330},{"type":8,"value":2532,"toc":2587},[2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585],[11,2534,224],{"id":223},[16,2536,228],{"id":227},[21,2538,231],{},[16,2540,235],{"id":234},[21,2542,238],{},[21,2544,241],{},[21,2546,244],{},[16,2548,248],{"id":247},[21,2550,251],{},[21,2552,254],{},[21,2554,257],{},[16,2556,261],{"id":260},[21,2558,264],{},[16,2560,268],{"id":267},[194,2562,272],{"id":271},[21,2564,275],{},[21,2566,278],{},[194,2568,282],{"id":281},[21,2570,285],{},[21,2572,288],{},[194,2574,292],{"id":291},[21,2576,295],{},[21,2578,298],{},[21,2580,301],{},[194,2582,305],{"id":304},[21,2584,308],{},[21,2586,311],{},{"title":121,"searchDepth":122,"depth":122,"links":2588},[2589,2590,2591,2592,2593],{"id":227,"depth":122,"text":228},{"id":234,"depth":122,"text":235},{"id":247,"depth":122,"text":248},{"id":260,"depth":122,"text":261},{"id":267,"depth":122,"text":268,"children":2594},[2595,2596,2597,2598],{"id":271,"depth":208,"text":272},{"id":281,"depth":208,"text":282},{"id":291,"depth":208,"text":292},{"id":304,"depth":208,"text":305},{},{"title":218,"description":325},1789258547877]