[{"categories":["Tech"],"content":"Over the last year or so, I&rsquo;ve spent a crazy amount of time with coding agents. Tried all sorts of harnesses and models. Learned a lot of lessons, but one thing really stuck: using AI well means thinking like a tech lead.\nWhat Does a Tech Lead Actually Do? Think about how a tech lead works. They&rsquo;re not sitting there writing code all day. Their job is deciding what work needs doing, how to do it, and when. They delegate and set standards.\nPeople keep asking if AI is going to take their dev jobs. And yeah, if all you bring to the table is typing code, that&rsquo;s an issue. But here&rsquo;s the thing. You now have employees that are dirt cheap and work faster than ever. It&rsquo;s no longer quick you can pump out code, it&rsquo;s about how well you direct the work.\nThere&rsquo;s this joke that tech leads sometimes can&rsquo;t write code that well. In the age of AI, it&rsquo;s probably true that AI can write better code than you. Lean into that. Your job becomes architecture and quality control.\nRules and Standards are King If you&rsquo;ve managed developers, you know clear standards are the difference between a codebase you can work with and a total disaster. Same deal with AI.\nYou need style guides. Explicit ones. Things you like, things you don&rsquo;t. Patterns to avoid. How you want PRs structured. All of it written down.\nBetter to be over descriptive than under. AI doesn&rsquo;t get offended by too much context. Tell it your conventions upfront. File structure preferences, naming conventions, testing requirements, how you handle errors. The more constraints you give it, the better the output. Have a standards file somewhere in your repo.\nPlanning is Key Biggest mistake I see? Jumping straight into coding. You wouldn&rsquo;t do that with a team of devs. Don&rsquo;t do it with AI either.\nMake a plan. Then another one. I use voice chat for this and it&rsquo;s incredible for discussing ideas back and forth. Don&rsquo;t stop refining until it&rsquo;s solid. Ask yourself a few times: what am I missing? You can even ask you coding agent to identify any gaps.\nOnce the plan is good, let the agent rip through it. Do all the thinking upfront. Plan down to what files to touch and what tests to write. Imagine you&rsquo;re the lead architect planning a big migration. It&rsquo;s the same thing.\nSimplicity is Essential Complexity kills. I spent way too much time messing with AI agent frameworks. Nah. Listen to Jake Van Clief. He came up with ICM. The whole idea is folders instead of frameworks.\nNumbered folders are your stages. Markdown files are your prompts. One agent reads the right files at the right time. That&rsquo;s it. You don&rsquo;t need a multi-agent system. You need a file tree.\nVan Clief says configure the factory, not the product. Set your rules up once. Then just run it.\nKeep it simple. The framework is a folder.\nYou&rsquo;re the Lead Now The devs who thrive won&rsquo;t be the best coders. They&rsquo;ll be the ones who best direct the code that gets written. Tech lead isn&rsquo;t a role you grow into after years anymore. It&rsquo;s the mindset you need right now.\n","date":"2026-05-11T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/ai\/ai-tech-lead\/","readingTime":3,"summary":"<p>Over the last year or so, I&rsquo;ve spent a crazy amount of time with coding agents. Tried all sorts of harnesses and models. Learned a lot of lessons, but one thing really stuck: using AI well means thinking like a tech lead.<\/p>\n<h2 id=\"what-does-a-tech-lead-actually-do\">What Does a Tech Lead Actually Do?<\/h2>\n<p>Think about how a tech lead works. They&rsquo;re not sitting there writing code all day. Their job is deciding what work needs doing, how to do it, and when. They delegate and set standards.<\/p>","tags":["AI","Coding Agents","LLM"],"title":"AI Makes You Think Like a Tech Lead"},{"categories":["Tech"],"content":"This morning I spent a few hours debugging an issue where Neovim would throw errors every time I opened a Markdown file with code blocks. The error message was:\nattempt to call method &#39;range&#39; (a nil value) Markdown in nvim is essential to my workflow, so I had to figure the issues out!\nThe Problem The error message wasn&rsquo;t particularly helpful at first glance. &ldquo;attempt to call method &lsquo;range&rsquo; (a nil value)&rdquo; doesn&rsquo;t exactly tell you where to look. But after some digging, I realized this was breaking my render-markdown.nvim plugin.\nNote:\nIf you&rsquo;re having similar issues, the error might be hiding in your :messages buffer.\nRoot Cause After some research, here&rsquo;s what I found:\nNeovim 0.12 was released a few weeks ago with major changes to its treesitter API. For those who don&rsquo;t know, treesitter is what handles syntax highlighting in Neovim. It&rsquo;s what makes your code look pretty.\nThe issue was that nvim-treesitter, the main treesitter plugin, has two versions:\nmaster branch - for Neovim 0.11 (now archived) main branch - rewritten for Neovim 0.12 (new) It seems like there was some major drama in the discussions on the treesitter repo around this time causing the split.\nPlease be grateful and kind to opensource contributors. They dedicate their time towards so you can have free software.\nOur system was still using the old master branch, which isn&rsquo;t compatible with Neovim 0.12.\nThe Fix The fix was simple once I understood the issue. I updated nvim-treesitter to use the main branch, updated the configuration to use the new API (slightly different syntax), and then updated the parsers via :TSUpdate.\nNote:\nAlways check your plugin versions when upgrading Neovim major versions. The lazy.nvim branch parameter can save you a lot of headache.\nWhen using Neovim 0.12, you need to specify branch = &ldquo;main&rdquo; in your plugin configuration:\nreturn { &#34;nvim-treesitter\/nvim-treesitter&#34;, branch = &#34;main&#34;, -- This is critical for Neovim 0.12! build = &#34;:TSUpdate&#34;, lazy = false, config = function() require(&#34;nvim-treesitter&#34;).setup({...}) end } Key Takeaway The maintainers made a complete rewrite with a different API. This caught me off guard because in my experience, plugin updates are usually backward compatible. But with major Neovim releases, sometimes they aren&rsquo;t.\nEverything is now working:\nNo more errors on Markdown files with code blocks render-markdown.nvim is fully functional All treesitter highlighting works as expected The lesson here is to always double-check your plugin configurations when upgrading your tools. Sometimes the old reliable stuff just doesn&rsquo;t work anymore.\n","date":"2026-04-05T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/tech\/fixing-markdown-rendering-neovim\/","readingTime":2,"summary":"<p>This morning I spent a few hours debugging an issue where Neovim would throw errors every time I opened a Markdown file with code blocks. The error message was:<\/p>\n<pre tabindex=\"0\"><code>attempt to call method &#39;range&#39; (a nil value)\n<\/code><\/pre><p>Markdown in nvim is essential to my workflow, so I had to figure the issues out!<\/p>\n<h2 id=\"the-problem\">The Problem<\/h2>\n<p>The error message wasn&rsquo;t particularly helpful at first glance. &ldquo;attempt to call method &lsquo;range&rsquo; (a nil value)&rdquo; doesn&rsquo;t exactly tell you where to look. But after some digging, I realized this was breaking my render-markdown.nvim plugin.<\/p>","tags":["Neovim","Debugging","Treesitter"],"title":"Markdown Rendering Issue in Neovim"},{"categories":["Culture"],"content":"Metamorphosis is a fascinating study into human nature. Our protagonist Gregor wakes up transformed into an insect and the novel details his family life after the fact, exploring the question of whether our relationships can ever be truly selfless.\nNote:\nI encourage you to read the book before this codex entry. I will be divulging major plot points (and it&rsquo;s a short read anyways)!\nDo human beings only form relationships based on mutual gain? Over the course of the book, we see how Gregor&rsquo;s family relationships unravel as they care for him in his new, incomprehensible, state. Although his parents are initially too shocked with his transformation to even face him, his sister takes the effort to help him as best she can. She cares for her brother. Not only does she try to discover what food his new form will accept, but she takes responsibility for looking after her brother when no one else can. But she becomes resentful of this position. Even though Gregor is internally grateful for her service, he is not capable of expressing his gratitude. Without this feedback, it seems the duty of helping a family member becomes a thankless burden, which everyone becomes annoyed with. They are performing a service out of respect to his former position, not for him now&hellip; It&rsquo;s interesting to explore the idea that maybe if Gregor was able to express his gratitude, his family would provide his care with joy.\nI also think that the family would be more accepting of their position if the outside world could comprehend their situation. Imagine if Gregor was simply paralysed rather than being transformed. Although I can imagine that the family might eventually grow tired of their duties, it&rsquo;s more difficult to see them wanting to cast him out of the house. When someone is paralysed, people are sympathetic, come to visit, and assist when they can. The fact that Gregor&rsquo;s condition needs to be kept a secret puts additional stress on the family. Perhaps love is not the only emotion which families draw upon to care for the sick, but also the social shame that would come with neglecting a family member in need.\nHuman beings are inherently accepting of their own, and put lightly, cautious of outsiders. As soon as we stop relating to something, we are able to treat it as subhuman. A shift occurs during the last few pages of the novel. As soon as the family stops referring to Gregor by his name, deciding just to call him &ldquo;it&rdquo;, they start making plans to remove him from the home. Even though this change in language was probably unconscious on the part of the family, it demonstrates this dehumanising effect perfectly. We see this in war and news coverage all the time, where there are often bids to show the opposing side as savages, rather than complex human beings, whose motives might be just as valid as our own. We shield ourselves from the moral complexities of harming or shunning our fellow man by taking away their humanity.\nThe family is saved from the difficulty of outing Gregor by his death. What stood out for me was the immediate and immense relief they felt after his demise. They finally feel like they can move onto a new life. You might feel this is selfish of them, to be happy at the death of a member, but it&rsquo;s still an understandable reaction. They have become overworked and depressed, caring for someone they know will not get better, and cannot even express themselves. I have heard of similar feelings from people who have looked after disabled children for example. There lives have become so consumed in the care of another that it feels like a prison. It&rsquo;s a terrible situation to find oneself in, but it does prove the point that relationships are only maintained if they are aligned with the lifestyle that one wishes to live. Some people have a greater capacity for care than others, and might be able to look after Gregor better than his family did. I believe this is because they are happy to do so, or feel very strongly that it&rsquo;s their duty. I am lucky to know some such people. If one is living a life they hate, be it always looking after another, or even something like living with a spouse they resent, it&rsquo;s clear to see that relief is a natural emotion that would arise once the situation comes to a close.\nMy final thought on the novel was that nothing surprising happened. I mean this as the biggest compliment to the author. Kafka was able to present human emotions and reactions in a way that&rsquo;s not only logical and believable, but scarily relatable. It holds a dark mirror in front of us and asks: \"Would you do any different?\"\n","date":"2026-03-25T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/culture\/books\/metamorphosis\/","readingTime":4,"summary":"<p>Metamorphosis is a fascinating study into human nature. Our protagonist Gregor wakes up transformed into an insect and the novel details his family life after the fact, exploring the question of whether our relationships can ever be truly selfless.<\/p>\n<p>Note:<\/p>\n<blockquote>\n<p>I encourage you to read the book before this codex entry. I will be divulging major plot points (and it&rsquo;s a short read anyways)!<\/p>\n<\/blockquote>\n<p>Do human beings only form relationships based on mutual gain? Over the course of the book, we see how Gregor&rsquo;s family relationships unravel as they care for him in his new, incomprehensible, state. Although his parents are initially too shocked with his transformation to even face him, his sister takes the effort to help him as best she can. She cares for her brother. Not only does she try to discover what food his new form will accept, but she takes responsibility for looking after her brother when no one else can. But she becomes resentful of this position. Even though Gregor is internally grateful for her service, he is not capable of expressing his gratitude. Without this feedback, it seems the duty of helping a family member becomes a thankless burden, which everyone becomes annoyed with. They are performing a service out of respect to his former position, not for him now&hellip; It&rsquo;s interesting to explore the idea that maybe if Gregor was able to express his gratitude, his family would provide his care with joy.<\/p>","tags":["Books","Fiction","Classics"],"title":"Thoughts on 'Metamorphosis'"},{"categories":["Thoughts"],"content":"When travelling across India, I caught the bug for riding. On returning to the UK, I managed to get my full license. I decided not to renew the insurance on my car, leaning fully into the biker lifestyle. Here are some of the ways owning a bike affected my life.\nMy trusty metal steed\nI Ride Much More Owning a car in Central London is not fun. It&rsquo;s difficult to park anywhere, you have to spend money just for driving in the city, and you are 100% going to get stuck in traffic. Because of these reasons, I just didn&rsquo;t use my car. It ended up being more expensive and inconvenient to get to most of the places I go to.\nHaving a bike has changed all of this. For London, it&rsquo;s a dream. There are no congestion charges for bikes, so I no longer have to work around the awkward hours the charge is in place. That, coupled with abundant and free\/extremely cheap parking means my wallet is a lot happier, and I feel confident that I will find a space no matter where I go.\nAnother huge plus is the ability to filter. Honestly, where before I would spend 80% of time sitting in traffic, now it&rsquo;s about 30%, and even that 30% is fun, weaving through traffic. Riding is also just straight up more fun than driving (at least compared to my car). The feeling of the road and all the freedom it gives is unbeatable. All of these reasons combined mean that I ride more, visit more places, and have more fun. I&rsquo;m more willing to travel to place a little further than I normally would, which makes me more mobile in general. I enjoy a lot more of the city this way!\nMechanical Skill My bike is pretty old, and I&rsquo;m talking like 26 years old here. I wanted to get something that I could understand and fix completely myself if needed, with no extra frills. When I got the bike, it ran fine, but I didn&rsquo;t trust the previous owner had kept everything in tip-top shape. So, I did a complete servicing.\nAir filter, oil filter, new tyres, new chain, carbs cleaned and tuned, exhaust repairs, electronics, the works. Apart from the engine, I pretty much touched every part of the bike. Now when I hit the road, I have confidence that the bike is in great shape, but also the confidence that I can fix mostly any issues that could occur.\nWhat was once a machine of mystery became something I understood, and it changed my outlook in general. If you spend a bit of time reading and working on something, you can learn to understand it, and gain some new skills in the process. Whenever I am faced with something unfamiliar, I always remember how I learned about my bike, which gives me the assurance that I can learn to do anything if I apply myself.\nMental Strength Riding a bike is much more difficult than driving a car. Apart from the obvious aspects of balance, comfort, and road safety, there is one bigger obstacle, the weather.\nIt&rsquo;s easier to commit to a bike only life if you live in a warm, dry country. Not in the UK. Even if it seems sunny, sometimes in the time it takes to sit on your bike, it&rsquo;s a storm out there.\nBut, I don&rsquo;t have a choice. I don&rsquo;t have access to my car. Raining? Still gotta go. Cold? Still gotta go. At first it was difficult, I got my bike in the winter, so my first few months were cold, but I got used to it. I understood what I needed to keep warm, and didn&rsquo;t let the weather affect my plans. If you have the right gear, riding in the rain is actually quite refreshing!\nCars are warm, and in all weather the driving experience is pretty much the same. Still, I&rsquo;d honestly rather be wet and cold on a bike than stuck in traffic in a car!\nP.S Car drivers look out for your fellow road users, our lives depend on it!\n","date":"2026-02-13T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/thoughts\/lifechanging-bike\/","readingTime":4,"summary":"<p>When travelling across India, I caught the bug for riding. On returning to the UK, I managed to get my full license. I decided not to renew the insurance on my car, leaning fully into the biker lifestyle. Here are some of the ways owning a bike affected my life.<\/p>\n<p><img loading=\"lazy\" src=\"\/bike.webp\">\n<p class=\"caption\">My trusty metal steed<\/p><\/p>\n<h2 id=\"i-ride-much-more\">I Ride Much More<\/h2>\n<p><span class=\"eagle-font\">Owning a car in Central London is not fun.<\/span> It&rsquo;s difficult to park anywhere, you have to spend money just for driving in the city, and you are 100% going to get stuck in traffic. Because of these reasons, I just didn&rsquo;t use my car. It ended up being more expensive and inconvenient to get to most of the places I go to.<\/p>","tags":["Lifestyle","Learning","Motorcycles"],"title":"How a Motorcyle Changed My Life"},{"categories":["Travel"],"content":"Soon enough, I&rsquo;ll embark on a journey. I have had a dream of becoming a digital nomad for a few years, so I have committed to making it happen. I&rsquo;ve got just under a year until I actually leave my home country and start on this new journey. I wanted to have some time to adjust and prepare for such a massive lifestyle change. By the time I leave, I would have been out of traditional employment for just over a year and a half.\nI&rsquo;m currently just approaching the halfway mark. Having had some time, I wanted to write about some things that have really helped me transition into a remote lifestyle.\nFiguring Out Finances Of course, this comes at the top of the list. It&rsquo;s no good flying halfway across the world just to end up flat broke in some dingy hostel halfway across the world! Finding work that I am in control of has been the single biggest shift I have made. Nowadays, there are so many online platforms that pay you by the hour, with zero minimum commitment and no upper limit. This is the dream. Although job security is often non-existent with such platforms, they make up for it in flexibility. Want to have a 2 week long action packed adventure? Go for it! Need a bit of extra money for your flight to your next destination? Just work a few more hours. As long as you save, and have a nice cushion to fall back on just in case, this is a great opportunity. It&rsquo;s desirable to have multiple sources of income too. Have a skill like web development (or really anything somebody would pay for)? Why not try to find some customers? More streams can&rsquo;t hurt! One of the main reasons I wanted to have such a long transition period was to find out how I could actually make money without a normal job. I&rsquo;m happy to report it&rsquo;s definitely possible. It&rsquo;s been a while for me now, and I'm still here!\nA Portable Setup To be able to work from anywhere, I need to be able to focus anywhere, and for that, I need to be comfortable anywhere. I wanted a remote setup that had to tick a few boxes. Firstly, I wanted the setup to be as minimal as possible. This means no extra keyboard or mouse (not that I use a mouse anyways), just my laptop. I bought and external monitor and a small stand for it. I use the screens in a vertical layout, which keeps my neck position neutral while allowing me to use my laptop&rsquo;s keyboard. It works great. Another big issue is power. Even if you have a great charging block (I managed to get one with universal sockets and 165W charging), sometimes you just don&rsquo;t have access to a socket! I got a massive Anker portable charger which can charge my MacBook 1.5x times. This way I can get a whole days work done without a socket, really great in a pinch. Because of these things, I can squeeze in a couple of hours no matter where I am!\nFinally, Practice It&rsquo;s all well and good having a nice setup, but you need to be able to use it. Even though I have not left the UK yet, I am taking the time to practice working in different places. Coffee shops, public libraries, and even some unexpected places like art galleries. If you keep your eyes open, you can find lots of suitable places no matter where you are. Now, I feel comfortable scouting a location, setting up and locking in anywhere I am.\nBecause of these proactive steps, I feel super confident in my ability to work on the road, the first, and arguably most important step of being a digital nomad!\n","date":"2026-02-05T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/thoughts\/nomad-prep\/","readingTime":3,"summary":"<p>Soon enough, I&rsquo;ll embark on a journey. I have had a dream of becoming a digital nomad for a few years, so I have committed to making it happen. I&rsquo;ve got just under a year until I actually leave my home country and start on this new journey. I wanted to have some time to adjust and prepare for such a massive lifestyle change. By the time I leave, I would have been out of traditional employment for just over a year and a half.<\/p>","tags":["Lifestyle","Productivity","Digital Nomad"],"title":"Preparing for a Nomadic Life"},{"categories":["Thoughts"],"content":"Although working for yourself has a myriad of benefits, there is a large hurdle that one must overcome to avoid wasting such an amazing opportunity: lack of structure. When you work a regular job, you have to show up at the same time everyday. Your routine becomes forced upon you, but nonetheless, you have a routine.\nBut when you start taking your own path, such restrictions don&rsquo;t exist. You can book client meetings at any time you like, start work at 4am or 4pm, and can work intermittently throughout the day. As long as you are making enough to satisfy your income requirements and goals, you can work 1 hour a day or 20. Here are some difficulties I have had with managing this new lifestyle and some insight into how I manage this.\nThe Issues One thing that I noticed is initially, and intermittently afterwards, I fell into the exact same routine as when working a corporate job. One of the things I disliked most about corporate life was that after work, everything would be so busy. Activities like bouldering are much less enjoyable to me when you have to wait in line for the route you are projecting. It has to be this way, because the only time most people can enjoy such activities is past 5pm. But even though I had the option to go when it was less busy, I was still stuck in the same routine as everyone else. We are creatures of habit, and I realised I had to consciously break this habit.\nAnother issue is working too much. Although it is very important to work as hard as you can, it&rsquo;s easy to fall into the trap of just working all the time. When you work for yourself, you care about the work a great deal more, and are more motivated to get things done. When working a corporate job, you can of course work just as hard, but there is a natural wind up and wind down to the day. Your peers arrive and leave, which helps to control the amount you work. When you don&rsquo;t have such a structure to control the amount you work, overwork is a very real possibility.\nSome Solutions So what are some ways we can change this?\nForce yourself to work at different hours. For example, some days I have adopted an extended lunch approach. Instead of taking the regular one hour lunch break, I take 3, and then make up the rest of the time by working earlier in the morning, or later into the evening. Not only does this break up your day, leaving you more refreshed for your post-work lunch sessions, but you now have some extra time in the day to visit that gallery, or the shop that always closes at 5pm, without sacrificing productivity!\nI have also taken an adaptive approach to the total hours worked in the day. Let&rsquo;s say that one day, I&rsquo;m really on a roll. I&rsquo;m getting a lot done, in the zone. On days like this, you don&rsquo;t want to stop working until the day is up. So, take advantage of that! Work as much as you want. Then the next day, you can work a couple hours less. Spend that time experiencing life. Meet a friend for a coffee, take a longer run than usual, whatever you like. Some days, the stars just don&rsquo;t align and you can&rsquo;t get anything done. After giving it a fair crack, it&rsquo;s okay to come back later after taking a break. Then, you can make up for this time another day. By aligning yourself with the natural flow of your work, you actually get more done, and avoid working for the sake of working, which is unproductive. I have found that my capacity for work has increased, as well as the quality.\nAnother great approach is to say yes to things you would have had to say no to before. Maybe someone you know is graduating or a friend has just had a surgery and needs a bit of looking after. Your new flexible schedule allows you to take these opportunities, so say yes! You can always make up the time by working on the weekend or a few extra hours into the night. This forces you to switch things up, which helps you break the standard routine.\nFinally, a word on goal setting. It&rsquo;s really important to set two sets of goals, work goals and non-work goals. Non-work goals are important because they enrich your life outside of work. For me, these goals are centred around fitness, music, relationships, travel, reading, and another other thing that captures my interest at that moment in time (right now it&rsquo;s chess!). These give you a reason to utilise the flexible time you have available. Conversely, it&rsquo;s important to set work goals so you don&rsquo;t spend all your time in leisure! These goals should be ambitious, challenging and helpful to your mission. With these sets of goals, you have a great compass to guide you to the life you want to lead.\nNote:\nFor me, to achieve my goals, it&rsquo;s necessary that I am working most of the time but for you, that might not be the case! Set the goals and work hours that help you reach your personal goals! Sometimes the biggest barrier in our lives is the ones that we put for ourselves, and even if our circumstances change, if we don&rsquo;t change ourselves, we risk minimising your potential. You are your own worst enemy but also your biggest ally, utilise the opportunity you have!\nflavour\n","date":"2026-01-20T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/thoughts\/living-free\/","readingTime":5,"summary":"<p>Although working for yourself has a myriad of benefits, there is a large hurdle that one must overcome to avoid wasting such an amazing opportunity: lack of structure. When you work a regular job, you have to show up at the same time everyday. Your routine becomes forced upon you, but nonetheless, you have a routine.<\/p>\n<p>But when you start taking your own path, such restrictions don&rsquo;t exist. You can book client meetings at any time you like, start work at 4am or 4pm, and can work intermittently throughout the day. As long as you are making enough to satisfy your income requirements and goals, you can work 1 hour a day or 20. Here are some difficulties I have had with managing this new lifestyle and some insight into how I manage this.<\/p>","tags":["Lifestyle","Productivity","Freedom"],"title":"Structuring a Free Life"},{"categories":["Culture"],"content":"Even though I had seen the movie as a kid, The Shining only existed in my memories as a few flashes of unintelligible panic and fear. Now, as an adult, I had the opportunity to see the film in the type of venue it deserves, an IMAX screening. This movie had such a profound effect on me and my peers, and although the vague memory of the film is now fully fleshed out, the emotions underneath remain the same.\nYou don&rsquo;t know what&rsquo;s behind the door, and probably shouldn&rsquo;t check!\nNote:\nI won&rsquo;t go into details of the plot points as it&rsquo;s been covered elsewhere many times before. Instead I&rsquo;ll talk about some of the things that were standout aspects to me, and some reflections into my life.\nFirstly, the music. Never before have I been so struck by how much a soundtrack can change the mood of a film as in this film. The initial shot of unidentified car driving through the hills would be a beautiful and scenic scene in any other context, but the ominous and anxiety inducing piece that plays over it makes it feel quiet the opposite. The film is full of scenes like this, where normality is seemingly flipped around through sound. I took an important lesson from this, framing is everything. The same situation and seem wildly different depending on how you choose to approach it, so we must be mindful to not bring an overarching sense of negativity to our daily lives.\nI like the theme of entrapment that the movie explores. Of course, the most obvious example of this is the family being stuck in the Overlook, but each character is trapped in their own way. Jack is trapped by his work, growing increasingly frustrated with his lack of productivity in writing his novel as time goes on. Even with all the space and time in the world, he still can&rsquo;t get anything done. He chooses to lashes out at his family in anger, taking his emotions out on them, even though he knows deep down the fault lies with himself. The famous reveal where we learn Jack has been writing the same sentence over and over for pages, is quite shocking. To me, it seems as if he was just mechanically &ldquo;working&rdquo; to prove to Wendy, or himself, that he was being productive, while his mind idled and went slowly mad, being a cause of his insanity, rather than a symptom of it. Sometimes we catch ourselves acting similarly, working for the sake of working, not producing anything and being bitter about our output. It&rsquo;s important to have focus and a plan when attempting tasks in our lives, otherwise we risk falling astray.\nWendy is trapped in her own way, albeit in a more direct way than Jack. She could potentially leave the hotel when things start to turn, but doing so would mean making a definitive statement about her failing marriage. It&rsquo;s not as simple as stepping out of the house or staying at a friends place for a night - she knows that walking away would likely cause irreparable damage. So she endures as much as she can until Jack&rsquo;s descent into madness becomes too dangerous to ignore. There&rsquo;s a haunting sense of fear and helplessness in her eyes as she realizes the man her husband has become, or maybe always was. It&rsquo;s a lesson in trusting your gut and making decisions before you are forced to take them. Taking control of the situation and act.\nAlthough the supernatural elements of the movie make for an amazing viewing experience, I think the story would have unfolded the same even without them. They simply exaggerated the human emotions of the characters in the film are already feeling: anger, fear, suffocation, frustration, sadness and hate. It&rsquo;s a cautionary tale about the dangers of unchecked emotions, living up to the iconic status it has garnered over the years. A must watch.\n","date":"2026-01-15T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/culture\/movies\/the-shining\/","readingTime":4,"summary":"<p>Even though I had seen the movie as a kid, <span class=\"eagle-font\">The Shining<\/span> only existed in my memories as a\nfew flashes of unintelligible panic and fear. Now, as an adult, I had the opportunity to see the film in the type of venue it deserves, an IMAX screening. This movie had such a profound effect on me and my peers, and although the vague\nmemory of the film is now fully fleshed out, the emotions underneath remain the same.<\/p>","tags":["Movies","Fiction","Humans"],"title":"Thoughts on 'The Shining'"},{"categories":["Tech"],"content":"There is seemingly and endless stream of AI models to choose from. Not only is the choice overwhelming, but I was constantly left with the thought that I&rsquo;m missing out on some super model that would make me more efficient, but as someone with inertia to change when it comes to certain things, I had put off experimenting. But, I eventually did run some test. I defined 4 of my main coding styles , and tried to find the best models for each.\nThe categories are:\nDaily Driver Super Fast Smart Reasoning Let&rsquo;s see which models performed best!\nNote:\nI am using opencode as my AI tool of choice, and all testing has been performed in that enviroment. Your mileage may vary!\nDaily Driver - Qwen3Coder\/BigPickle For something to be a daily driver, it needs to be relatively cheap to run, fast, and capable. It should be able to complete moderately complex tasks in a more vibey style. &ldquo;Hey make sure that the carousel image doesn&rsquo;t go out of bounds on mobile and that when I click it, it opens the product page&rdquo; is a good example. It&rsquo;s not too complex of a task but still requires so understanding of the codebase to implement. The model should be able to interpret my vague prompt, so that there is little friction between thought and code.\nThere are two models that really shine for me in this category. Qwen3 Coder 480B is not only cheap, but is able to implement such features pretty fast and relatively bug free. It can perform several of these tasks in a row before having to reset the context window.\nAnother great model is BigPickle. Currently with opencode it&rsquo;s free. This was my workhorse before I decided to switch to Qwen3. It performs almost as well as Qwen3, but I have noticed it hallucinates more and gets stuck in loops more. It sometimes disrespects the existing code for example, creating lots of duplicate CSS classes, but hey, it&rsquo;s free! If you pay attention to what the model is doing, Big Pickle is a great place to start.\nSpeed - Grok Code Fast 1 Sometimes you don&rsquo;t want to have to wait for a model to think and the execute. When doing very small changes (which you are too lazy to do yourself) such as styling or rearranging UI elements, or asking small questions about the code, it feels good to get instant replies so you can move quickly. For this, Grok Code Fast 1 is the champion.\nIt&rsquo;s blazing fast, and is great when you want to test out little things quickly. It does have trouble when the context window gets too large or you ask too complex of a task from it. Keep it simple, and this is a great little runner.\nSmart - Gemini 3 Pro Sometimes your daily driver just doesn&rsquo;t cut it. It makes a mess of a feature you are trying to implement, can&rsquo;t grasp the requirements, or doesn&rsquo;t really understand the codebase. This is when you need to pull out the heavy hitters. Many people would turn to Claude in this instance, but it can be quite expensive. I much prefer Gemini 3 Pro.\nI have found that it&rsquo;s reasoning skills are top tier and it does a great job of implementing those more difficult features. Although you&rsquo;d want to keep the context window below 200k tokens to pay the cheaper rate, it&rsquo;s total context window limit is 1M tokens, so you can keep it standby as your codebase expert.\nAnother huge benefit it has is vision. You can show a screenshot of your code which is amazing for fronted debugging. But sometimes even such a great model has issues with those deep rooted bugs.\nReasoning - Kimi K2 Thinking What is the difference between the smart model and the reasoning? Time to think.\nKimi K2 is really like a detective which you employ when you have a really nasty bug, race condition or memory leak which other models don&rsquo;t catch. Caveat, it&rsquo;s slow, but that&rsquo;s not a bad thing in this context. It will spend time deeply thinking about the problem you have presented it with, reading the code and debating different solutions which are usually very thoughtful and something you might never have found.\nSometimes the trail goes cold, and you&rsquo;ll be upset you sat there for 10 minutes for nothing, but it&rsquo;s worth it for the potential upside.\nThe Model Matters Your choice of model directly impacts your workflow. Just like members on a dev team have certain quirks, strengths and weaknesses, so do AI models and to be a effective modern programmer you must be able to choose the right model for the job.\n","date":"2026-01-04T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/ai\/the-right-model\/","readingTime":4,"summary":"<p>There is seemingly and endless stream of AI models to choose from. Not only is the choice overwhelming, but I was constantly left with the thought that I&rsquo;m missing out on some super model that would make me more efficient, but as someone with inertia to change when it comes to certain things, I had put off experimenting. But, I eventually did run some test. I defined 4 of my main coding styles , and tried to find the best models for each.<\/p>","tags":["AI","Coding Agents","LLM"],"title":"The Right Model"},{"categories":["Thoughts"],"content":"Today, there are many ways to achieve the same goal. When writing code, for example, one can use a fully equipped IDE like IntelliJ, something super lightweight like Vim, or, if you are really mad, Notepad++. You could dedicate hundreds or thousands of hours switching between different tools, experimenting and starting from scratch every time, and still not find something that really works for you. I believe that a true craftsman of any discipline needs to invest in their tools. Here are a few reasons why.\nNote:\nI will focus more on software engineering tools, but these ideas apply to any discipline. If you are interested, I have built my own nvim, tmux and system configuration, including window management, which you can check out on GitHub.\nYou May Never Find a Match As I alluded to, I have spent a long time switching between tools, but nothing really stuck for me. Sometimes, a tool was just so complex from the outset that I would get overwhelmed and start another tirade against &ldquo;bloat&rdquo;. It seemed like these complex tools had all the things I didn&rsquo;t need but nothing of what would actually make me productive. I am sure that in a lot of situations, what I wanted to do was absolutely possible, but it wasn&rsquo;t easy for me to find out how. I could locate a solution with a bit of digging online, but I wasn&rsquo;t a big fan of having to consult other sources when I wanted to make a seemingly simple change.\nI was so opposed to sinking time into learning how to use these external tools that I just neglected to. My workflow was slow, and interacting with my machine felt sluggish. If you ever see a true master at work, everything looks effortless. They act as quickly as they think. I realised that no matter how much time I invested into learning someone else&rsquo;s tool, I would never get to that level, and that I would always have to deal with an extra layer of thought.\nI needed something more flexible. So, I decided to create my own things.\nBreaking Free Now, investing in building your own tools is not a trivial process. I knew it would take time, and planned accordingly, but it still took longer. I worked on nothing else for a solid month. While you may think this is overkill (and in some ways I agree), I managed to build such a strong base for myself. I got to understand the tools I was using deeply, because I built them myself. Now, changes become simple, and things are moulded to me.\nIt took a while for me to break out of searching for the most &ldquo;optimal way&rdquo; to do things according to what others suggest. I would keep searching &ldquo;what&rsquo;s the best way to do X&rdquo;, but eventually I realised that the best way to do things was the way I felt was best for me, and that&rsquo;s when I truly broke free.\nThe greatest benefit I experienced was more drive to complete the work I was doing. I genuinely enjoyed using these tools, and work became more about the doing rather than the how to do. This meant I could work longer, harder, and at a higher quality than I ever could before.\nYou learn by doing By building your own tools, you also develop a greater understanding of the underlying work itself. Why faced with certain situation in which I wanted my tools to perform a certain action, I needed to understand how to go from the situation to the action. Or, when I found my tools breaking, I needed to understand why this happened. By understanding these questions, I learned how my tools were being used at a deeper level. Instead of just thinking about how I was holding my chisel, I started to think about how my chisel was interacting with the marble beneath it, which all leads towards better craftsmanship.\nThe Downsides Now, there are some downsides to building your own tools. The first and most obvious one is the effort required in the first place. It can be daunting when there are so many needs and things you need to implement but with no idea of how to get started. Just take it slow; there is no rush. Crafting tools takes a long time, and the fact that you get to start from nothing is actually a great benefit.\nIt&rsquo;s also easy to get whipped up by the so-called shiny object syndrome. Once you start making tweaks, you might end up spending a few hours engaged in a pursuit that doesn&rsquo;t bring you a lot of value. Before you sit down to work, spend some time thinking about exactly what you want your tool to do and how to achieve that functionality during your next work session.\nBe warned, once you have created tools that work for you, it&rsquo;s very difficult to go back to the old ways. Everything else you use just feels inefficient, and you end up making a lot of mistakes. It&rsquo;s important to be able to find ways of moving your tools around, so that no matter where you go, you&rsquo;ll have access to them. Make sure you invest some time in exploring the portability of your tools.\nA Better Path Forward Building tools for myself has been the greatest return on investment in recent memory. I now have things that are suited precisely to my needs, and that will change and grow as I do. Break free from using things that were made for the average craftsman and build something exceptional for yourself.\n","date":"2025-12-15T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/thoughts\/the-importance-of-having-your-own-tools\/","readingTime":5,"summary":"<p>Today, there are many ways to achieve the same goal. When writing code, for example, one can use a fully equipped IDE like IntelliJ, something super lightweight like Vim, or, if you are really mad, Notepad++. You could\ndedicate hundreds or thousands of hours switching between different tools, experimenting and starting from scratch every time, and still not find something that really works for you. I believe that a true\ncraftsman of any discipline needs to invest in their tools. Here are a few reasons why.<\/p>","tags":["vim","tmux","Philosophy"],"title":"The Importance of Having Your Own Tools"},{"categories":["Tech"],"content":"AI has democratised writing code. Pretty much anyone can pull up ChatGPT or Claude and build basic apps and websites. What people fail to realise is that writing code is just a small part of being a developer. Indeed, in most software engineer roles, writing code is one of the things you spend the least time on! While AI now means anyone can write code, there is fundamental software development knowledge still missing, and you don&rsquo;t know what you don&rsquo;t know.\nBuilding functional apps at speed is difficult, but there are ways you can make it easier for yourself so that you can go from idea to demo as quickly as possible. Let&rsquo;s go over some problematic patterns and find better approaches.\nDeveloping at Speed The Pattern:\nA Vibe Coder uses AI tools only in the browser, so the agent does not have access to local files. This means repetitive copying and pasting into browser windows, which is annoying and slow. The agent also cannot see anything outside of the code you copy and paste into it.\nHaving an agent that directly interacts with your system is such a massive improvement to your development workflow. Finally, the agent can act on its own rather than just telling you what to do. Writing and editing are now so much faster, and when the agent gives you just a small snippet of code, you don&rsquo;t have to struggle to figure out where it&rsquo;s supposed to go.\nThe agent now sees all files in your project, which is a massive boon when the task at hand becomes sufficiently complex. This solves the issue of the agent making changes in a vacuum, with no idea about how the code will be used or in what context. The changes made will be more likely integrate with other pieces of your project. The agent can now also evaluate not only the correctness of code, but the architecture of the entire project, leading to improvements in speed, readability, modularity and complexity. It now even has the power to reorganise your projects for you.\nA local agent is much better at debugging, now that it can actually run commands on your machine. It can read logs, helping you find those tricky bugs. Its investigative powers also increase by magnitudes. When having issues with deploying my applications, I have literally told an agent, &ldquo;You have permission to connect to my cloud server and investigate as you wish&rdquo; (of course, not giving him permission to actually change stuff), and the results have been startlingly good. Agents are able to comb through data and spot typical failure patterns that might be unknown to you so quickly.\nBut how do you get access to these types of tools? First things first, you must be using an IDE, like VSCode, to develop your code (or Vim if you are feeling adventurous!). An IDE is simply a tool to edit code, which comes with a lot of helpful functionality, such as highlighting syntax errors and auto-formatting. You can install AI plugins for VSCode, like OpenAI&rsquo;s Agent or Microsoft&rsquo;s Copilot. Any agent you think of probably has a plugin for every major IDE. If you prefer a separate interface, check out Claude Code. I prefer to develop from the terminal, so opencode is my AI tool of choice.\nOf course, the caveat of this approach is it&rsquo;s main advantage; The agent has the power to change things at their whim. I often find that a good approach is to tell the agent explicitly not to edit things, to create a plan before making changes, and to always ask for permission before every change. A lot of interfaces have a way to change between &lsquo;plan&rsquo; and &lsquo;build&rsquo; modes, so make use of this as much as you can.\nStill, it&rsquo;s risky to let an agent run loose in your codebase, which is why it&rsquo;s so important to have a way to undo changes if things get a little too crazy!\nSaving Your Progress The Pattern:\nYour project is going great, you have reached a significant milestone, and you are happy with the current result. You ask for a change, but the result isn&rsquo;t what you need, so you ask the agent to tweak and tweak but the result is still poor. You ask the agent to undo all recent changes, but it doesn&rsquo;t do it well. Everything that was working doesn&rsquo;t work anymore! Now you are really in a mess, and can&rsquo;t resolve the situation, so you throw the whole project out and start again.\nYou have learn how to save your progress. If not, }you are doomed to take your code down rabbit holes you may never recover from. The way to do this is using Git.\nGit is synonymous with software development; indeed, there are probably very few mainstream development practices that do not use it. It&rsquo;s really the bread and butter for which the majority of code is propped up by. There are so many great Git tutorials just a Google search away so I&rsquo;ll just focus on the &lsquo;why&rsquo; in this article. In its simplest form, Git is a version control tool. This means you can manually save exactly how your project is at a point in time, which is known as making a commit. The best thing about this is that all changes are tracked. You can see the history of changes, and if you name each commit well, you&rsquo;ll be able to quickly understand exactly what each commit changed. With each commit, you can also see exactly what code modifications were made. You can now also rollback to any previous version of the code, should you not like the direction the project has gone in. Found a recent commit broke something? Just roll back to the previous one!\nGit is also very powerful because it lets you develop on &lsquo;branches&rsquo;. Let&rsquo;s say you want to develop a feature that might take a good chunk of work. You can create a new branch, which essentially is a new &rsquo;track&rsquo;. All changes on that branch do not affect anything in the main branch, and once you have finished the feature, you can simply merge the feature branch into the main branch. This frees you from worrying about messing up your project when experimenting, and you are also not forced to finish a feature in a single sitting. You can keep the working version of your app intact until the new feature is ready to go.\nOf course, effective use of Git requires that you save your work frequently. Every small change should be saved so that it&rsquo;s easy to rollback without losing a lot of work, and bugs will be easier to track down. In software development, we praise atomicity. Tasks should be broken down into small chunks, and using git in this way, with every commit being just a single small change, keeps things moving and keeps overhead low. If you know which commit introduced a bug, and that commit only changed a couple of lines rather than hundreds, you just made your life a lot easier.\nTracking What The Agent Has Changed The Pattern:\nYour agent makes a change that edits some unrelated code, but you don&rsquo;t know exactly what and where! If only there was a way to see changes.\nSomething you get for free with Git is something called a &lsquo;Git diff&rsquo;. Not only can you compare exactly what changed from commit to commit, but also, before you decide to commit, you can see the current unsaved changes.\nAn example of a Git diff\nAs you can see in the above image, it&rsquo;s very easy to see what changed in this commit (green for additions and red for removals). This is powerful because you can see the exact changes the agent has made and verify them for yourselves, without having to manually compare two versions of the file!\nKeeping on Track The Pattern:\nYou spend a lot of time working on your app, but it is not progressing at the rate you would like. You often find yourself spending a lot of time on features that don&rsquo;t really matter, and finding that you don&rsquo;t know what to prioritise.\nAgile development is a methodology that prioritises flexibility and delivering value in short bursts, and Kanban Boards are one of it&rsquo;s defining features. A Kanban board is a way to track tasks. Essentially, every major task needs to be broken down into small chunks (in line with the atomicity mindset we mentioned above). Once this is done, you can create a &lsquo;card&rsquo; for each task. The position of a card on the board indicates its status. Initially, all cards start out in the &rsquo;to-do&rsquo; column. Once you start work on a task, it moves into the &lsquo;in progress&rsquo; column. When the task is finished, you can move it into the &lsquo;done&rsquo; column. There can be more sections if your processes need to be more complex, but this is enough to start with. Tracking tasks like this gives you a good snapshot of the current state of the project.\nA Kanban board showing some example tasks.\nBursts of work are broken down into time periods known as &lsquo;sprints&rsquo;. The length of a sprint is variable, but is usually a week or two. Before starting a sprint, you have to decide what the key tasks are that you wish to accomplish during this time. Select the tasks that align with this sprint objective and place them into the to-do section, and get to work! Now your workflow is observable, guided and time-bounded, leading to more focused work and better results. Stick to the tasks you selected at the start of the sprint as much as possible. At the end of the sprint, you can reflect on your progress, giving you insight into planning the next sprint.\nHopefully, this will help you avoid the &ldquo;shiny-object syndrome&rdquo;, staying focused on what matters the most for your project. You can use platforms like Trello to create Kanban boards\nNow you have made great progress on your app, and are ready to show the world, but what now?\nGetting It Out There The pattern:\nYou have finally created your app and want to share it with the world. What do you do now?\nThere is a common joke amongst budding software developers saying their project is available at &rsquo;localhost&rsquo;! Just because your project is running on your machine, it doesn&rsquo;t mean anybody can access it. There are so many ways to host your project, but the easiest way for a beginner is probably to use a service like Render. I won&rsquo;t dwell on this for too long, as their documentation is very good and the positive outcome is obvious!\nGo Forth! Hopefully you now understand how to better leverage AI tools to build your application. Code is just one aspect, but your workflow and development principles are just as important for rapidly creating applications that provide value. Go forth and get building!\n","date":"2025-12-06T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/ai\/ai-dev-skills\/","readingTime":9,"summary":"<p>AI has democratised writing code. Pretty much anyone can pull up ChatGPT or Claude and build basic apps and\nwebsites. What people fail to realise is that <span class=\"eagle-font\">writing code is just a small part of being a developer.<\/span> Indeed, in most software engineer roles, writing code is one of the things you spend\nthe least time on! While AI now means anyone can write code, there is fundamental software development knowledge still missing, and\nyou don&rsquo;t know what you don&rsquo;t know.<\/p>","tags":["AI","AI Agents","DevOps"],"title":"The Missing Skills of Vibe Coders"},{"categories":["Culture"],"content":"Some of my favourite moments from this year are directly because of &lsquo;The Alchemist&rsquo; by Paulo Coelho. Not only did I find the novel thoughtful and inspiring, but it truly gave me better perspective on the world around me, what I want from my life, and the person I want to be. Although the text itself on the surface is straightforward, for me, it triggered emotions that I hope to capture in my writing.\nNote:\nI encourage you to read the book before this codex entry. I will be divulging major plot points.\nThe quest is the goal\nThe story follows a young man named Santiago. He lives as a shepherd, and although he is content with his current life, he hears a whisper that something much greater awaits him. After hearing this, he tries to shake the feeling that he could be doing something better with his life, but it sticks in his mind. \"You could be more...\". So, he sets out on a quest to discover his true purpose in life. There are many setbacks along the way, but he stays steadfast, and eventually, he finds what he is looking for.\nSantiago did not initially become a shepherd by chance. He chose to become one against the wishes of his parents because he wanted to travel. He wanted to see the world for all that it is, and longed for the freedom that a life on the road can give. As mentioned, he was content with this life, but he had become comfortable.\nComfort is the death of growth, and especially at a younger age, you want to stay uncomfortable so you don&rsquo;t get stuck. Although Santiago had chosen a more difficult life than some, he had still stopped growing. While he may still learn more about his flock, the land, or himself, in the macro, there is nothing more for him to take from this role. But also, why move on? Goals are meant to be achieved and reset. True growth is in the pursuit of the goal, rather than the result. In some ways, the quest is the goal.\nI felt very comfortable in my life. Indeed, I was similar to Santiago in the way I was in a career I chose for myself. And then the time started to fly. Before I knew it, two years were almost up. That was terrifying. I realised that if I don&rsquo;t do something about this now, I might never get out of this situation. I saw a lot of myself in Santiago as we both believed in our hearts that we could do more with our lives.\nOne concept from the book that really resonated with me is that as you start to follow the path towards your dream, things will fall into place to help you get there. I have observed this myself. As I try to go a different way, the world has placed opportunity at my feet, almost as if it were trying to help me. A perfect example is being recommended this book after deciding to try to work towards my dream, and having my choice affirmed and supported. While it is true that the universe takes no special effort when it comes to me, the fact that I want to walk this path makes me inherently more open to opportunity than when walking a path I don&rsquo;t want to. Maybe the same amount of opportunities arise no matter what, but we ignore most of them when we would rather be doing something else. Subconsciously, I guess we don&rsquo;t want to progress on paths we are not keen to walk due to the fear of not being able to come back.\nThere is another point in the story where Santiago ends up losing all his money, the first major setback. This is when it is the easiest to give up. When you are coming from a state of comfort and relative abundance, having nothing seems extra cruel. &ldquo;If I had just stayed where I was, I would be much happier right now!&rdquo; When walking a new path, it&rsquo;s natural to compare it to your previous one. But you must remember, while it is true that in the short term your situation might be much worse, you have to think of the long term and whether it&rsquo;s worth not trying. Will you be happy in 20 years and think, &ldquo;I&rsquo;m glad I didn&rsquo;t take that risk&rdquo;? Probably not. The cost is too great. The cost of never following your dreams is priceless.\nBut no matter what your dream is, you will someday achieve it. Then the comfort sets in again, and the process repeats. You always become the shepherd. Maybe the true essence of life is realising that you can achieve what you want, so you will always want something more. Therefore, you must learn to love the path you are on. It&rsquo;s difficult to enjoy the journey, especially if you are not working towards something you value, so my philosophy on life is now to follow the dreams I am most excited about and enjoy the journey as much as possible.\nOne of the big tragedies of life is that most people won&rsquo;t ever try to follow their true dreams. They often follow the safe route, and indeed, to them it seems like the only route. I can understand that those who come from difficult backgrounds or have massive responsibilities might not be able to make such steps, but the real loss is when people who could take the chance simply don&rsquo;t. I was one of those people until very recently. I hope that when I look back, I see that my life was always in pursuit of my dream.\n","date":"2025-12-04T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/culture\/books\/the-alchemist\/","readingTime":5,"summary":"<p>Some of my favourite moments from this year are directly because of &lsquo;The Alchemist&rsquo; by Paulo Coelho. Not only did I\nfind the novel thoughtful and inspiring, but it truly gave me better perspective on the world around me, what\nI want from my life, and the person I want to be. Although the text itself on the surface is straightforward, for\nme, it triggered emotions that I hope to capture in my writing.<\/p>","tags":["Books","Fiction","Inspiration"],"title":"Thoughts on 'The Alchemist'"},{"categories":["Tech"],"content":"The skeleton of my VPS setup is Nginx. It takes a collection of websites and applications, each with its own way of deployment and brings them under a single umbrella. This is useful if you have multiple projects you wish to host, but do not want the headache of remembering where each one is hosted and managing them individually. Not only does using Nginx save a lot of time and energy, but it&rsquo;s also a very safe solution. Let me walk you through how and why I set this up.\nNote:\nIf you are interested in learning more about the setup of my VPS Aether, check out this post. To see some code in action, see my gateway service on GitHub.\nNginx: Reverse Proxy Wizardry Nginx first emerged as a web server, with the purpose of delivering your website&rsquo;s files to external clients. In this original role, it is the digital courier. Without it, the client&rsquo;s attempts are unable to acquire the necessary components to render your site.\nBut it does not have to be just one website. In this case, you might want to set up Nginx as a reverse proxy.. A reverse proxy is a server that acts as an intermediary between a user and one or more backend servers. What this means in practice is when you connect to a machine on the internet, Nginx acts as the gatekeeper. To get to your websites or applications, all traffic must pass through it. It&rsquo;s able to put certain restrictions and control the connection flow.\nFor example, imagine I have two websites, blog.com and webapplication.com. I might want to host these websites on the same computer, so I will make them resolve to the IP of that computer using DNS, for example 143.243.12.32. Now, when you type in either blog.com or webapplication.com, you will be routed to 143.243.12.32, and hit the Nginx instance. Now, based on which site you were trying to access, Nginx will serve you the correct files, or route you to the port on which the web application is running, for example 143.243.12.32:8080. There are numerous benefits to this.\nWhy Do This? Ease of Configuration From the above example, we can see how configuration becomes much easier. Without Nginx acting as a reverse proxy, we would have a much more complicated DNS setup. Instead of the target in the DNS console being just the IP address of the machine we are serving from, we would have to configure the port as well, which makes setup more fragile and tedious. If the port ever changes, we would also have to update our DNS records, which can lead to clients getting routed to an invalid gateway if we are still within the TTL window.\nNow, it&rsquo;s so easy to add another service. All I have to do is create a new DNS record that points to my VPS, and add a new handler for that route in the main Nginx config. For example, mail.sumeetsaini.com routes to my Mailcow instance, vulkan.sumeetsaini.com is my own personal API, sumeetsaini.com is my personal website, and arcanecodex.dev is this blog. This is all managed by nginx, and it&rsquo;s so simple to modify the routing to extend it as I please.\nSecurity Instead of having all the above services available directly on the web, for outsiders, there is only a single point they can connect to. So, instead of having security measures for every single service, causing duplication of config and also increasing the attack surface, I can focus on having a single, hardened entry point. This provides better security, as attackers have only one way to enter my citadel. I can introduce rate limiting, block malicious IPs, and filter requests before they reach my applications. If I want to have certain API endpoints only accessible from my website, for example, I can add the following Nginx config:\nadd_header Access-Control-Allow-Origin &#34;https:\/\/sumeetsaini.com&#34; always; Instead of wildcard *, I&rsquo;m explicitly allowing only my domain, preventing other websites from making requests to my backend.\nSSL certificates are important to establis a recognized and trusted web presence, but the management of these certificates on a per-domain basis can quickly become a tedious. By centralizing this process, Nginx handles all SSL termination, managing the issuance, renewal, and serving of certificates from a single, organized place for all the domains I wish to cover.\nPerformance Nginx has a couple of performance boosting capabilities. When Nginx serves static content, it caches its responses, so that if another client requests the same information, it can serve them the cached files, improving response times. It can also perform load balancing. If one service becomes very popular, I can create a duplicate instance of it in the backend, and Nginx will handle routing evenly across both instances.\nFinally, centralised logging provides unified access logs and monitoring for all services behind the proxy. Instead of having to meticulously trawl through each service&rsquo;s log to find issues, I can see them all and filter accordingly. This has saved me a lot of time when trying to debug issues.\nConclusion The reverse proxy architecture provided by Nginx transforms a chaotic collection of applications into a streamlined digital citadel, with a single, well-defended gate. No longer do you have to have web server config scattered around, and struggle to make changes, manage port conflicts and tedious DNS records. Your web presence is now unified, empowering you in this digital landscape.\nAre you ready to weave this magic into your own infrastructure?\n","date":"2025-11-26T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/aether\/nginx-aether\/","readingTime":5,"summary":"<p>The skeleton of my VPS setup is Nginx. It takes a collection of websites and applications, each with its own\nway of deployment and brings them under a single umbrella. This is useful if you have multiple projects you\nwish to host, but do not want the headache of remembering where each one is hosted and managing them individually. Not only does using Nginx save a lot of time and energy, but it&rsquo;s also a very safe solution. Let me\nwalk you through how and why I set this up.<\/p>","tags":["Docker","Hosting","Web"],"title":"Building Aether: Nginx Reverse Proxy"},{"categories":[],"content":"The Arcane Codex Compiled Texts for the Modern Mage Magic has changed . What was once a practice hidden in dusty tomes is now open and available to all. The medium has evolved too, as technology now allows us to wield power once thought impossible. Computer commands are like spells after all.\nThe modern mage should study two kinds of magic, the logic of machines and the wonder of the world. They are a master of technology, and able to make it perform their wishes, but remembers to stay grounded in reality. After all, what point does mastery of the digital domain have if one looses touch with their humanity?\nThis Codex is a chronicle of experiments, thoughts, and experiences. Some entries are technical, others are personal, and some stand to explore the world we live in. I hope you can learn something new, or gain some inspiration.\nOpen a page, and read what\u2019s been compiled.\nThe Codex is ever-growing, as all good knowledge should.\n\u2014 The Arcane Dev, Sumeet Saini\nKeeper of the Codex\n","date":"2025-11-21T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/about\/","readingTime":1,"summary":"<h1 id=\"the-arcane-codex\">The Arcane Codex<\/h1>\n<h3 id=\"compiled-texts-for-the-modern-mage\"><em>Compiled Texts for the Modern Mage<\/em><\/h3>\n<p><span class=\"eagle-font\"> Magic has changed <\/span>. What was once a practice hidden in dusty tomes is now open and available to all. The\nmedium has evolved too, as technology now allows us to wield power once thought impossible. Computer commands are like spells after all.<\/p>\n<p>The modern mage should study two kinds of magic, the logic of machines and the wonder of the world. They\nare a master of technology, and able to make it perform their wishes, but remembers to stay grounded in\nreality. After all, what point does mastery of the digital domain have if one looses touch with their\nhumanity?<\/p>","tags":[],"title":"About"},{"categories":["Tech"],"content":"It is often told that every serious developer should have their own space on the web. A space to express themselves, share their learning and host all their personal projects.\nI felt that I was lacking a digital form of expression, so I decided to embark on a journey. I built Aether. This is a framework for hosting my personal website, this blog, an email service and my own API.\nIn order to have maximum control, I decided to build this infrastructure myself. I learned a lot along the way, and this post details the philosophy and high-level implementation details.\nNote:\nThis post is an overview of the project, and will be updated to link to future posts, which will dive deeper into further aspects of the project.\nWhy Build Your Own Infrastructure? Having the freedom to set up your services as you wish is the main advantage of this do-it-yourself approach. Full control is important because it lets you endlessly tweak things to your liking without being beholden to the options given by third-party solutions.\nYou also build a foundation of projects to come. I wanted a contact form on my website that would send an email of the details to my inbox, and I was able to implement this. Should I want more options, like let&rsquo;s say to create a To-Do list item to reply to the email whenever I receive a new contact message, I could do so. I am in control, and I can make things exactly as I see fit, no compromises.\nI have found that having my own digital infrastructure makes me more creative and productive. Just as you can imagine, having a blog makes you feel like writing more, and having your own digital infrastructure makes you want to create more in general. As James Clear says in Atomic Habits \"Reducing the friction associated with good behaviours makes them easier to perform...\"\nAnother benefit is cost. If you build your own infrastructure, you only need to pay for access to a VPS (which costs around $7 a month in my case).\nOne cannot overlook learning. Often, developers are far removed from the technology they actually work on. That can be good as it allows for hyper-specialisation, but the internet and APIs are what the whole world runs on, so it&rsquo;s important to know how it actually all ties together, and what better way than to contribute to that infrastructure yourself. The Arcane Codex philosophy emphasises mastery and knowledge of your tools.\nAether: Architecture Overview There are a few services that constitute Aether:\nThis Blog: Powered by Hugo Personal Website: A place to share some things about me and links to what I&rsquo;m currently working on. Built using Three.js Mailcow: Used for hosting a private mail server. Vulkan: Personal API, with built-in mail handling, and service monitoring for the other services. More details about these components will be added in the future, so you can read more.\nAll of these modules are then tied together by Nginx.\nNginx: Reverse Proxy Instead of having these services on publicly exposed ports, they are running on an internal network, and Nginx has been set up as a reverse proxy. What this means in practice is that external connections hit a single port on my VPS, which is managed by Nginx. It then acts as the gatekeeper, routing the connection to the correct services. This makes it much easier to configure the networking for all services in one place and allows for the quick addition of new services.\nNote:\nIf traffic ever gets too large on these sites, this approach might need some additional consideration. Although Nginx does have load-balancing built in, I am unsure if it would be sufficient for the large scale. Food for thought.\nEdit:\nTo read more about the Nginx setup, check out this blog post\nThe Development\/Deployment Lifecycle It was very important to me to have as efficient and automated a deployment cycle as possible. I experimented with various approaches to manually deploying on the VPS, but ran into two main issues.\nUsing scripts was fragile and error-prone There was a disconnect between the production and dev environments. Having a unified setup was tricky. Because of these reasons, I decided to use Docker.\nUnified Under Docker Dockerising the services in the project was a great step in the right direction. Firstly, the use of docker-compose-prod.yml and docker-compose-dev.yml files makes it very easy to contain all environment-specific configuration in a single location, meaning that the actual code for each service could remain the same in prod and dev. All that would need to change is the Docker file being used to spin up the containers. I could then also have a Aether as an overarching container\/service manager as well as injecting finer-grained container management for each service.\nDocker also allowed me to use the fantastic GitHub package services, along with GitHub Actions.\nGitHub Packages and Actions: Automated Deployment GitHub Packages is a service that allows for the building and hosting of Docker containers. This, combined with GitHub Actions allows for a very powerful pipeline. Whenever new code is pushed, GitHub actions are triggered in the Aether repo. Firstly, the containers for each service are built and hosted on GitHub, and then another action will update the containers used on the VPS. No code is actually being stored on the VPS, just the updated Docker container. The containers are then restarted on the VPS.\nCode deployments are fast and efficient. There is almost no downtime when pushing out new changes, and all deployments are also declarative, which means it is always reproducible.\nClosing Remarks Aether isn\u2019t just infrastructure. It\u2019s a foundation for things to come and a place where I can experiment, share and build without restrictions. The tools are tuned to me.\nI see now why it is told that every developer should have a corner of the web they truly own, not someone else\u2019s terms. I hope I have inspired you to do the same. The world could do with a bit more expression.\n","date":"2025-11-21T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/aether\/building-aether\/","readingTime":5,"summary":"<p>It is often told that every serious developer should have their own space on the web. A space to express\nthemselves, share their learning and host all their personal projects.<\/p>\n<p>I felt that I was lacking a digital form of expression, so I decided to embark on a journey. I built <span class=\"eagle-font\">Aether<\/span>. This is a framework for hosting my personal website, this blog, an email service and my own API.<\/p>\n<p>In order to have maximum control, I decided to build this infrastructure myself. I learned a lot along the way, and this post details the philosophy and high-level implementation details.<\/p>","tags":["Docker","CI\/CD","Hosting","Web"],"title":"Building Aether: Hosting a Personal Corner of the Internet"},{"categories":["Thoughts"],"content":"After leaving my corporate job to re-centre and decide in which direction to take my life, I travelled around for a few months. I had picked up a freelancing gig, and while I was in the Caribbean, working on the balcony of my villa, surrounded by sun, trees and sea, I thought: Why can't I do this all the time?\nMy office for a few weeks\nI remembered a dream I had while backpacking across India in 2023. To travel and work at the same time. At first, the idea seemed ludicrous, but as I met more people doing the same, and saw that most of my work as a software engineer didn&rsquo;t require in-person interactions, the idea became more feasible.\nWhen I finished that India trip, I went straight into a corporate job. The work was fun, and I learned a lot. I became focused, fell into a routine, and the time started to fly. I was noticing how quickly things were moving, and I met many people who told me they wished they had taken more risks when they were young. Once I left my job, I had full intentions of going back to traditional employment after travelling for a few months. I was preparing for interviews as well as freelancing, so I didn&rsquo;t have to dip into my savings. But then I had the realisation that I wanted to keep travelling. If I wanted to live the lifestyle I had always dreamed of, now was the time to give it a shot.\nSo, my perspective shifted. How can I keep this flexibility going? The freelancing was great, but still not as self-directed as I would like. I am striving to find some income that is fully controlled and directed by me, which I am still hunting for at the time of writing. But no matter the situation, I am dedicated to making my dream come true.\nMore recently, I have still been in London. My rental contract runs out in June, so I still have the better part of a year to make the most of the city. I love art and history, and now that my work is flexible, I have time to visit a gallery for a couple of hours in the day, and work a few extra hours in the early morning or night. I have more time to spend with my family and friends, also. Recently, a friend of mine came to visit from abroad for a few days, and I was able to work around his schedule, which was such a rewarding feeling. I thought: flexibility is the most valuable thing to me.\nIt is easy to think of flexibility as just the absence of any responsibility, but that is not the case. Being flexible doesn&rsquo;t mean you have to be broke, either. To me, flexibility is the ability to do the things that matter the most to me, be it investing in myself, mastering my craft, spending time with loved ones or travelling the world. Things in life are rarely free, and to be truly flexible, one must have the means. When the time comes to settle down, I must also have the ability to support myself and my family, too. The middle road does exist. To make money without the rigidity of traditional corporate life, but to still have the means for later in life, is possible.\nThe world we live in is full of things to see, do and learn, and what drives me the most is to experience as much of it as possible. The road is long, but I am always excited to see where it takes me.\n","date":"2025-11-20T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/thoughts\/flexibility\/","readingTime":3,"summary":"<p>After leaving my corporate job to re-centre and decide in which direction to take my life, I travelled around\nfor a few months. I had picked up a freelancing gig, and while I was in the Caribbean, working on the balcony of my villa, surrounded by sun, trees and sea, I thought: <span class=\"eagle-font\">Why can't I do this all the time?<\/span><\/p>\n<p><img loading=\"lazy\" src=\"\/balcony-view.webp\">\n<p class=\"caption\">My office for a few weeks<\/p><\/p>\n<p>I remembered a dream I had while backpacking across India in 2023. To travel and work at the same time. At first, the idea seemed ludicrous, but as I met more people doing the same, and saw that most of my work as a software engineer didn&rsquo;t require in-person interactions, the idea became more feasible.<\/p>","tags":["Lifestyle","Nomad","Travel"],"title":"The Path to a More Flexible Life"},{"categories":["Tech"],"content":"Although the availability of LLMs has made our lives easier, they are still very limited. They only have the ability to take some input text and spit out something that resembles human intelligence. They live in a void and have no power outside of the current and immediate interaction you have with them. But this is changing.\nAI agents are the next step forward. An agent can be thought of as more alive than a mere LLM. They can remember, create and follow better plans, and act on the world around them.\nIn Google&rsquo;s AI Agents course, one principle stood out amongst the rest: Agentic systems are only as good as their architecture.\nLet&rsquo;s take a look at the anatomy of a well-constructed multi-agent system, mostly in the context of Google&rsquo;s Agent Development Kit (ADK).\n(If you are interested in seeing detailed notes and code examples from the course, check out this Github repo.\nThe Body LLMs are, in some ways, limitless. They can fill any conceptual role in a conversation and report on how they would solve any problem (even if they cannot conduct their plan). But with so much potential comes issues. LLMs get confused, make things up, and don&rsquo;t do what you ask them to. Sometimes simple instructions get ignored, which leads to frustration. Although agents give LLMs abilities, one of their main benefits is the constraints they put on the LLMs. By carefully defining the type of agent and its role, we pigeonhole the LLM, which makes it perform better at its specific task. Much like Marshall McLuhan said \"Where the whole man is involved, there is no work. Work begins with the division of labour\".\nTo achieve this division of labour, however, agents need to be able to interact with other agents. This can be done with sub-agents or the A2A protocol (which we will talk about later). A sub-agent is simply used by another agent to complete a task, but there are multiple ways to use them, depending on the type of agent. Google&rsquo;s ADK allows for the definition of a few types of agents.\nTypes of Agents Sequential Agents: Sequential agents use sub-agents in a specific order, for example, first a research agent, a summary agent and an editor agent. The process is baked into the agent itself Parallel Agents: These can run multiple sub-agents simultaneously. Multiple research agents, for example, don&rsquo;t need to run sequentially as their tasks are not dependent on each other Loop Agents: Loop agents, as the name suggests, run sub-agents in a loop. You could have a writer and an editor The agent runs in a loop until the editor agent is satisfied with the quality of the writer&rsquo;s output. But how do these agents interact with the world, or indeed other agents?\nThe Hands In order to actually create change, agents have two main methods at their disposal.\nFirstly, tools. Tools can be thought of as concrete, deterministic actions, essentially function calls. They can be custom-defined for the agent, but it&rsquo;s also possible to use existing tools as well. Think of database interactions, web search, or even editing local files. This is all done via the Model Context Protocol (MCP).\nAgents can also use other agents as tools. When describing the use of sub-agents above, this is essentially using another agent as a tool. These other agents may be defined locally, but could also be external or remote. To make sure that agents can communicate with each other, regardless of platform or framework, the Agent2Agent (A2A) protocol was created.\nA2A The A2A protocol is a standard for inter-agent communication. In this system, every agent has an agent card, which can be thought of as a business card, containing the agent&rsquo;s information and interaction details.\npublic_agent_card = AgentCard( name=&#39;Hello World Agent&#39;, description=&#39;Just a hello world agent&#39;, url=&#39;http:\/\/localhost:9999\/&#39;, version=&#39;1.0.0&#39;, default_input_modes=[&#39;text&#39;], default_output_modes=[&#39;text&#39;], skills=[google-search], ) Other agents can ingest this card, and when in a multi-agent system, they can discover, understand and interact with their peers.\nA note on safety:\nIf an agent is authorised to use other agents and tools to achieve its goals, it needs to be some kind of safety mechanisms involved so that the agent does not go rogue and make very expensive decisions. This can be done by putting explicit limits on the tools themselves, so agents are unable to cause too much damage, forcing the agent to communicate with a human for specific tool calls (Human in the Loop, HITL), or have the agent first create a detailed plan and then get another LLM to check it (known as the LLM as a judge pattern)\nThe Mind: Context and Memory Giving an agent a task, a role, and an idea of the available tools are all components of the agents context. This information is stuffed into a context window, which is essentially the only immediate information fed to the LLM at runtime. Every time you send a message to an agent, the context is passed into it. Without context, LLM would be in their default state, being stateless.\nThis introduces a challenge. While it might seem tempting to put any new information into the context window, in practice, we must be more nuanced. If a context window is too large, we often see two negative reactions. One is that LLM calls become more and more expensive, as we are feeding more tokens into the LLM on every call. The other is known as context rot.\nContext Rot It has been observed that as the context window increases in size, the LLM&rsquo;s performance degrades. If the context window contains so much information, how does the LLM know what is more important? Vital details could get buried in the context window, which could cause the agent to fail on simple tasks. On the flip side, the chance of context poisoning increases (when a piece of bad information is picked up on and disproportionately affects the LLM). The model can show a bias for information at the beginning or end of the context, and hallucinations also seem to increase as the context window gets larger. To combat this, the art of context engineering is employed.\nContext Engineering There are a few techniques to ensure that context is managed correctly. It is inefficient to store every single interaction between user and agent in the context window after, let&rsquo;s say, 10 messages. As long as the LLM remembers the gist of the conversation and a few key details; the user will have the same experience. The current context can be passed to another agent, who will summarise the conversation to date. This would apply to all tool calls, inputs, outputs and interaction with other agents, keeping the context window concise while retaining the important information.\nAnother technique is to utilise a permanent, searchable memory. If just using context to remember conversations, everything needs to be included. If, however, there is a fixed location (like an SQL database) in which key interactions or information are stored, the agent can then look up information as it requires it. In the correct terminology, sessions are the current conversation and memory is this out-of-context lookup. Another key benefit of memory is that it persists between sessions, so core information will be stored indefinitely.\nThe Oversight: Observability The final key pillar of a robust agentic system is observability. In traditional software engineering, if code passes tests, then you can be confident that the code will always perform well (as long as the tests are well written, of course). This is not the case with agents. An agent can pass all tests but then fail when re-running them. This is because agents are non-deterministic. Although our architecture can lead to more determinism (like defining the order of sub-agent usage), we need to be able to see exactly what the agent is doing and why.\nThis is where the OpenTelemetry framework can assist. We get three key insights into the agent when using this.\nTraces: seeing the LLM&rsquo;s chain of reasoning and action to trace its steps Metrics: quantitative measures of the system&rsquo;s performance (latency, cost, etc.) Logs: a record of specific events, useful for seeing prompts and responses Now, if an agent makes an incorrect decision, we can see why it decided to do so, which is truly invaluable information. The agent can now be tweaked with precision rather than with blind adjustments.\nFinal Thoughts With these key principles understood, one can now create truly intelligent systems. We have equipped what was simply an isolated LLM with the ability to act in the world with rationality and independence. The key lesson remains: architecture is fundamental to these systems&rsquo; performance. Now, we can start to move beyond simple prompts.\nThe future of AI looks bright for those who can grasp and implement these teachings.\n","date":"2025-11-15T00:00:00Z","permalink":"https:\/\/arcanecodex.dev\/posts\/ai\/the-anatomy-of-ai-agents\/","readingTime":7,"summary":"<p>Although the availability of LLMs has made our lives easier, they are still very limited. They only have the\nability to take some input text and spit out something that resembles human intelligence. They live in a\nvoid and have no power outside of the current and immediate interaction you have with them. But this is\nchanging.<\/p>\n<p>AI agents are the next step forward. An agent can be thought of as more <span class=\"eagle-font\">alive<\/span> than a\nmere LLM. They can remember, create and follow better plans, and act on the world around them.<\/p>","tags":["AI","AI Agents","LLM"],"title":"The Anatomy of AI Agents"}]