Files
ghall.space/.astro/data-store.json
T
2025-12-01 20:33:54 -05:00

1 line
442 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.14.4","content-config-digest","8ff222dc93c471c0","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"site\":\"https://ghall.space\",\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{\"/posts/[...slug]\":\"/blog/[...slug]\",\"/blog\":\"/blog/page/1\"},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{\"light\":\"github-light\",\"dark\":\"github-dark\"},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[]},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false},\"legacy\":{\"collections\":false}}","blog",["Map",11,12,34,35,55,56,85,86,113,114,137,138,172,173,201,202,220,221,240,241,258,259,277,278,301,302,320,321,355,356,375,376,396,397,415,416,435,436,463,464,491,492,510,511,530,531,549,550,578,579,598,599,617,618,639,640,658,659,678,679,697,698,717,718,748,749,767,768,786,787,809,810,828,829,847,848,866,867,885,886,920,921,940,941,960,961,979,980,998,999,1017,1018,1036,1037,1055,1056,1106,1107,1138,1139,1158,1159,1177,1178,1196,1197,1215,1216,1235,1236,1254,1255,1273,1274,1294,1295],"2022/creating-a-dating-profile-with-ai",{"id":11,"data":13,"body":19,"filePath":20,"assetImports":21,"digest":23,"rendered":24},{"title":14,"pubDate":15,"tags":16},"Creating a Dating Profile With AI",["Date","2022-12-10T00:00:00.000Z"],[17,18],"Life","Tech","Ive been single for a few years now, and I havent had a whole lot of success in the dating game. Im very introverted and socially anxious, so dating apps seemed like the way to go for me. Sadly, Ive not had a lot of success, and since Covid it seems like the dating scene has only got worse. Ive been feeling pretty down about it, but I decided to have a little fun and let an AI help me assemble a brand new profile.\n\nMy goal is to, for an entire week, use my AI generated dating profile. That means my bio and prompts would be written by an AI and all my photos would be selected by an AI. Finally, as long as it doesnt end in disaster, all my opening messages will be generated by an AIall further responses will be written by me, because otherwise what would be the point?\n\nI decided to use [OpenAI](https://openai.com/) for the written portion, and [Everypixel](https://aesthetics.everypixel.com/) to select the pictures. For the dating app itself, the most important ingredient in this experiment, I decided to go with [Hinge](https://hinge.co/), mainly because I've never used it before.\n\nI decided against using AI generated images because, even though Im letting an AI create a dating profile for me, I want it to be somewhat genuine. Also Im not looking to catfish anybody with this image I generated just to see how good AI could make me look:\n\n![An AI-generated portrait of me](src/assets/blog/my-ai-portrait.jpg)\n\nOriginally this was going to be one post Id write over the course of a week, but as I was writing I decided I should split it into 2 parts: Part 1, this part, about setting up the dating profile, and part 2, coming at the end of the experiment, about the experience and how it went.\n\nMy first step was to sign up for Hinge. I went through the sign up process, and got to photos. Hinge requires 6 photos to create a profile, so it was Everypixels time to shine! I collected up 42 photos from the last few years—I wasnt aiming for 42 but, as thats the answer to life, the universe, and everything, I decided to take it as a good omen—and proceeded to feed them through this AI (which I have no doubt added to some collection of images to train machine learning algorithms. Your welcome for the coming robot apocalypse!).\n\nMy first photo didnt go over very well, with a whopping 0.9% chance of being awesome. Oh well, 41 more pictures to go. After going through the first 5 photos, not a single one scored more than 8%. Thats when I noticed I could get more info about the result, and found this gem: “Surprised by the result? This service doesn't measure the coolness or beauty of a person or any object in a photo.”\n\nSo really all I learned was that my selfies and family photos are garbage. Good to know.\n\nI had to go back to the drawing board. I came across [AttractivenessTest.com](http://AttractivenessTest.com) which admittedly seems more dubious than Everypixel, but sometimes we gotta make sacrifices. Anyways, it seemed to go pretty well, but there was one photo I had to disqualify because the AI kept zeroing in on someone else's face, and 3 that it absolutely refused to process, most likely because it couldn't zero in on my face.\n\nAs I ran through the photos, I sorted them into folders based on the rating they got, from 1 to 10. I dont mean to brag, but I got a couple 7s. The problem though was I had 12 6s, so I couldnt simply combine these 2 categories so I decided to go back to our old friend Everypixel to pick the top 4 best photos of the ones rated 6. Within a few minutes I had my top 4, ranging from a 1.5% chance to 50% chance to be awesome. Quite a range, and not extremely encouraging but thats the bed Ive made for myself.\n\nInteresting note: what I consider the 2 best pictures of me with animals made it through the process and made it to the top 6.\n\nNext up was selecting and answering prompts. While not remotely AI, I decided it best to use a random number generator to help me select which prompts the AI should answer.\n\nThis is where I ran into my first major roadblock. Through the magic of random numbers, for the first prompt I landed on, “Give me travel tips for…” The AI, predictably, gave me some admittedly useful travel tips, but Im not sure that was in the spirit of the prompt. I decided it best to remove the random factor and hand-select 3 prompts I think the AI might be able to handle.\n\nMy first selection was, “The hallmark of a good relationship is…” Boy did it deliver!\n\n> The hallmark of a good relationship is trust, respect, and open communication. When two people are in a relationship, they should be able to have honest and meaningful conversations, with enough understanding, patience, and empathy to make sure that both perspectives can be heard. A good relationship should also be based on mutual respect, with each person being able to express themselves and their feelings without feeling judged or belittled. Lastly, having a strong foundation of trust and honesty is essential for a healthy and fulfilling relationship.\n\nSadly, it was a little long but with a little bit of trimming I got it to fit into the 220-character limit.\n\nNext up I picked, “The key to my heart is…” To which the AI responded, weirdly in context with the previous prompt, with the following:\n\n> No single \"key\" can unlock a person's heart. The best way forward is to build a relationship based on the qualities mentioned above.\n\nFinally, I picked, “My best dad joke.” The AI did not disappoint.\n\n> Q: What did the sea say to the beach?\n>\n> A: Nothing, it just waved!\n\nWhen I was experimenting with OpenAI initially, I had it prepare a short bio. Unfortunately, it seems that Hinge doesnt have a field for a bio, but here it is anyway, for posterity.\n\n> I'm an introverted geek who loves all things tech, sci-fi, and fantasy. I enjoy staying inside watching movies, playing video games, and reading comics. I'm looking for someone who shares my interests and is up for some exciting nerd-related activities. I'm a reliable and loyal person who loves to make people laugh. I'm also an animal lover and I like to spend time with cats and dogs. If you think we could be a great match, let's get to know each other better!\n\nSo, how well will this work? Will AI turn my love life around? Or will this backfire spectacularly? Nobody knows! But Ill be sure to follow up in part 2. 🙂","src/content/blog/2022/creating-a-dating-profile-with-ai.md",[22],"src/assets/blog/my-ai-portrait.jpg","58022db62b352a8b",{"html":25,"metadata":26},"\u003Cp>Ive been single for a few years now, and I havent had a whole lot of success in the dating game. Im very introverted and socially anxious, so dating apps seemed like the way to go for me. Sadly, Ive not had a lot of success, and since Covid it seems like the dating scene has only got worse. Ive been feeling pretty down about it, but I decided to have a little fun and let an AI help me assemble a brand new profile.\u003C/p>\n\u003Cp>My goal is to, for an entire week, use my AI generated dating profile. That means my bio and prompts would be written by an AI and all my photos would be selected by an AI. Finally, as long as it doesnt end in disaster, all my opening messages will be generated by an AIall further responses will be written by me, because otherwise what would be the point?\u003C/p>\n\u003Cp>I decided to use \u003Ca href=\"https://openai.com/\">OpenAI\u003C/a> for the written portion, and \u003Ca href=\"https://aesthetics.everypixel.com/\">Everypixel\u003C/a> to select the pictures. For the dating app itself, the most important ingredient in this experiment, I decided to go with \u003Ca href=\"https://hinge.co/\">Hinge\u003C/a>, mainly because Ive never used it before.\u003C/p>\n\u003Cp>I decided against using AI generated images because, even though Im letting an AI create a dating profile for me, I want it to be somewhat genuine. Also Im not looking to catfish anybody with this image I generated just to see how good AI could make me look:\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/my-ai-portrait.jpg","alt":"An AI-generated portrait of me","index":0}\">\u003C/p>\n\u003Cp>Originally this was going to be one post Id write over the course of a week, but as I was writing I decided I should split it into 2 parts: Part 1, this part, about setting up the dating profile, and part 2, coming at the end of the experiment, about the experience and how it went.\u003C/p>\n\u003Cp>My first step was to sign up for Hinge. I went through the sign up process, and got to photos. Hinge requires 6 photos to create a profile, so it was Everypixels time to shine! I collected up 42 photos from the last few years—I wasnt aiming for 42 but, as thats the answer to life, the universe, and everything, I decided to take it as a good omen—and proceeded to feed them through this AI (which I have no doubt added to some collection of images to train machine learning algorithms. Your welcome for the coming robot apocalypse!).\u003C/p>\n\u003Cp>My first photo didnt go over very well, with a whopping 0.9% chance of being awesome. Oh well, 41 more pictures to go. After going through the first 5 photos, not a single one scored more than 8%. Thats when I noticed I could get more info about the result, and found this gem: “Surprised by the result? This service doesnt measure the coolness or beauty of a person or any object in a photo.”\u003C/p>\n\u003Cp>So really all I learned was that my selfies and family photos are garbage. Good to know.\u003C/p>\n\u003Cp>I had to go back to the drawing board. I came across \u003Ca href=\"http://AttractivenessTest.com\">AttractivenessTest.com\u003C/a> which admittedly seems more dubious than Everypixel, but sometimes we gotta make sacrifices. Anyways, it seemed to go pretty well, but there was one photo I had to disqualify because the AI kept zeroing in on someone elses face, and 3 that it absolutely refused to process, most likely because it couldnt zero in on my face.\u003C/p>\n\u003Cp>As I ran through the photos, I sorted them into folders based on the rating they got, from 1 to 10. I dont mean to brag, but I got a couple 7s. The problem though was I had 12 6s, so I couldnt simply combine these 2 categories so I decided to go back to our old friend Everypixel to pick the top 4 best photos of the ones rated 6. Within a few minutes I had my top 4, ranging from a 1.5% chance to 50% chance to be awesome. Quite a range, and not extremely encouraging but thats the bed Ive made for myself.\u003C/p>\n\u003Cp>Interesting note: what I consider the 2 best pictures of me with animals made it through the process and made it to the top 6.\u003C/p>\n\u003Cp>Next up was selecting and answering prompts. While not remotely AI, I decided it best to use a random number generator to help me select which prompts the AI should answer.\u003C/p>\n\u003Cp>This is where I ran into my first major roadblock. Through the magic of random numbers, for the first prompt I landed on, “Give me travel tips for…” The AI, predictably, gave me some admittedly useful travel tips, but Im not sure that was in the spirit of the prompt. I decided it best to remove the random factor and hand-select 3 prompts I think the AI might be able to handle.\u003C/p>\n\u003Cp>My first selection was, “The hallmark of a good relationship is…” Boy did it deliver!\u003C/p>\n\u003Cblockquote>\n\u003Cp>The hallmark of a good relationship is trust, respect, and open communication. When two people are in a relationship, they should be able to have honest and meaningful conversations, with enough understanding, patience, and empathy to make sure that both perspectives can be heard. A good relationship should also be based on mutual respect, with each person being able to express themselves and their feelings without feeling judged or belittled. Lastly, having a strong foundation of trust and honesty is essential for a healthy and fulfilling relationship.\u003C/p>\n\u003C/blockquote>\n\u003Cp>Sadly, it was a little long but with a little bit of trimming I got it to fit into the 220-character limit.\u003C/p>\n\u003Cp>Next up I picked, “The key to my heart is…” To which the AI responded, weirdly in context with the previous prompt, with the following:\u003C/p>\n\u003Cblockquote>\n\u003Cp>No single “key” can unlock a persons heart. The best way forward is to build a relationship based on the qualities mentioned above.\u003C/p>\n\u003C/blockquote>\n\u003Cp>Finally, I picked, “My best dad joke.” The AI did not disappoint.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Q: What did the sea say to the beach?\u003C/p>\n\u003Cp>A: Nothing, it just waved!\u003C/p>\n\u003C/blockquote>\n\u003Cp>When I was experimenting with OpenAI initially, I had it prepare a short bio. Unfortunately, it seems that Hinge doesnt have a field for a bio, but here it is anyway, for posterity.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Im an introverted geek who loves all things tech, sci-fi, and fantasy. I enjoy staying inside watching movies, playing video games, and reading comics. Im looking for someone who shares my interests and is up for some exciting nerd-related activities. Im a reliable and loyal person who loves to make people laugh. Im also an animal lover and I like to spend time with cats and dogs. If you think we could be a great match, lets get to know each other better!\u003C/p>\n\u003C/blockquote>\n\u003Cp>So, how well will this work? Will AI turn my love life around? Or will this backfire spectacularly? Nobody knows! But Ill be sure to follow up in part 2. 🙂\u003C/p>",{"headings":27,"localImagePaths":28,"remoteImagePaths":29,"frontmatter":30,"imagePaths":33},[],[22],[],{"title":14,"pubDate":31,"tags":32},"2022-12-10",[17,18],[22],"2022/ask-the-darn-question",{"id":34,"data":36,"body":42,"filePath":43,"digest":44,"rendered":45},{"title":37,"pubDate":38,"tags":39},"Ask The Darn Question!",["Date","2022-11-05T00:00:00.000Z"],[40,41],"Web Dev","Mental Health","One of the areas I struggle with when it comes to working in a professional web development environment is asking questions. Whether its a problem Im stuck on, or something about the codebase I dont quite understand, Im more likely to end up banging my head against the wall trying to find the answers myself than reach out and ask someone a question.\n\nIts not out of pride, at least I dont think it is. Its more about insecurity. Im afraid asking for help will somehow reveal to the more experienced devs that I actually have no idea what Im doing. I will expose myself as a fraud who doesnt know the first thing about development, and I dont deserve to get paid for it.\n\nOf course, logically speaking, this is not true. Its a story told with a combination of imposter syndrome, an anxiety disorder, and a copious amount of logical fallacies. Im not a fraud, Im just inexperienced. I can write code, and it may not be the best code ever written but it generally works, and theres room for me to improve.\n\nAll this to say, its ok to ask for help when you need it. Im writing that as a reminder to myself as much as to you, the reader. No one person has all the answers, and in development there are a multitude of ways to solve a given problem. Consider this: youre more competent than you give yourself credit for, but maybe you just need a fresh perspective.\n\nI had couple eye-opening experiences this week at work.\n\nFirstly, I was running into an issue where a particular set of values wasnt getting passed through correctly in our beta environment even though everything was working perfectly when I tested locally on my machine. I was stumped. My boss took a look and suggested I get the values I needed from somewhere else. It worked like a charm! In retrospect, it seemed like the obvious solution, but its easy to get so caught up in looking at a problem in a particular way that you lose sight of other perspectives. In this case, it wasnt that I didnt understand what I was doing, I just needed another perspective.\n\nSecondly, earlier in the week I was struggling with trying to track down a particular issue in AWS. I couldnt find the log I was looking for, and I was completely perplexed. I asked a co-worker, and he asked me if anyone showed me our naming convention for our serverless functions and how to navigate them in AWS. I said no, so he took about 10-15 minutes to show me the ropes. It was something I couldnt have known, Id had zero AWS experience before this job and Im still in the process of getting to grips with our massive codebase. Nobody had taught me what I needed to know, and I had been too nervous to ask, so I just flat out didnt know.\n\nSo, if theres one thing I hope we all can take away from this its that, if were truly stuck on something, theres more harm in not asking questions. There will always be something you dont know, and there will always be another way of looking at a problem youre facing. As long as youre not asking for help as a first resort, and youre putting in the effort to try and solve the problem yourself, then just ask the darn question!\n\nAnd if youre ever feeling any doubt, come back and read this post. I know I will.\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/ask-the-darn-question.md","4cb275af5430623a",{"html":46,"metadata":47},"\u003Cp>One of the areas I struggle with when it comes to working in a professional web development environment is asking questions. Whether its a problem Im stuck on, or something about the codebase I dont quite understand, Im more likely to end up banging my head against the wall trying to find the answers myself than reach out and ask someone a question.\u003C/p>\n\u003Cp>Its not out of pride, at least I dont think it is. Its more about insecurity. Im afraid asking for help will somehow reveal to the more experienced devs that I actually have no idea what Im doing. I will expose myself as a fraud who doesnt know the first thing about development, and I dont deserve to get paid for it.\u003C/p>\n\u003Cp>Of course, logically speaking, this is not true. Its a story told with a combination of imposter syndrome, an anxiety disorder, and a copious amount of logical fallacies. Im not a fraud, Im just inexperienced. I can write code, and it may not be the best code ever written but it generally works, and theres room for me to improve.\u003C/p>\n\u003Cp>All this to say, its ok to ask for help when you need it. Im writing that as a reminder to myself as much as to you, the reader. No one person has all the answers, and in development there are a multitude of ways to solve a given problem. Consider this: youre more competent than you give yourself credit for, but maybe you just need a fresh perspective.\u003C/p>\n\u003Cp>I had couple eye-opening experiences this week at work.\u003C/p>\n\u003Cp>Firstly, I was running into an issue where a particular set of values wasnt getting passed through correctly in our beta environment even though everything was working perfectly when I tested locally on my machine. I was stumped. My boss took a look and suggested I get the values I needed from somewhere else. It worked like a charm! In retrospect, it seemed like the obvious solution, but its easy to get so caught up in looking at a problem in a particular way that you lose sight of other perspectives. In this case, it wasnt that I didnt understand what I was doing, I just needed another perspective.\u003C/p>\n\u003Cp>Secondly, earlier in the week I was struggling with trying to track down a particular issue in AWS. I couldnt find the log I was looking for, and I was completely perplexed. I asked a co-worker, and he asked me if anyone showed me our naming convention for our serverless functions and how to navigate them in AWS. I said no, so he took about 10-15 minutes to show me the ropes. It was something I couldnt have known, Id had zero AWS experience before this job and Im still in the process of getting to grips with our massive codebase. Nobody had taught me what I needed to know, and I had been too nervous to ask, so I just flat out didnt know.\u003C/p>\n\u003Cp>So, if theres one thing I hope we all can take away from this its that, if were truly stuck on something, theres more harm in not asking questions. There will always be something you dont know, and there will always be another way of looking at a problem youre facing. As long as youre not asking for help as a first resort, and youre putting in the effort to try and solve the problem yourself, then just ask the darn question!\u003C/p>\n\u003Cp>And if youre ever feeling any doubt, come back and read this post. I know I will.\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":48,"localImagePaths":49,"remoteImagePaths":50,"frontmatter":51,"imagePaths":54},[],[],[],{"title":37,"pubDate":52,"tags":53},"2022-11-05",[40,41],[],"2022/building-ghalldev-30",{"id":55,"data":57,"body":62,"filePath":63,"digest":64,"rendered":65},{"title":58,"pubDate":59,"tags":60},"Building ghall.dev 3.0",["Date","2022-10-16T00:00:00.000Z"],[40,61],"Making Stuff","Welcome to my brand new website, the 3rd iteration of ghall.dev! For the last year-and-a-half this has simply been home to my portfolio, but for a while now Ive wanted to expand from a simple, single-page site to a multi-page site with a blog (which you are of course reading right now).\n\nIn the previous version of this site, I coded myself into a corner. I did a lot of little things I thought were cool, but maybe werent the best ideas design-wise, and put things together in such a way that I couldnt simply tweak things very easily. One of the lessons I took from the experience of building and maintaining that site was to keep things simple, and not try to be too flashy for the sake of being flashy.\n\nAnother lesson I took was to plan ahead for any changes. I didnt really think about wanting to start a blog until after the site was up, and if I had made things a little easier by planning for future changes it probably wouldnt have taken a “nuke-and-pave” to cleanly integrate a blog.\n\nIm also a much better developer than I was when I built version 2. Not saying Im amazing, Ive only been at this since late 2020 after all, but Ive learned a lot about coding, and organizing code in a way that makes sense. Of course, a year from now Ill be wondering what the heck I was thinking when I originally wrote the code for this site.\n\nAnyway, the first step to any project like this is deciding on the tech stack. As this is a solo project, being my personal site and all, I had a bit of leeway to experiment with different pieces of that puzzle, but I decided on the following:\n\n### Front-end Framework: Next.js\n\nIm a relative newcomer to Next.js, as Ive only been using it for about 2 months now. But the learning curve was really low coming from React, and I was able to pick it up pretty quickly when I started my current job.\n\nI prefer it to straight React in a few ways, one of the biggest being how easy it is to set up a multi-page site like this. While its definitely possible in React, Next.js makes it painfully simple. It was a no-brainer, and it got me rolling so fast I was able to built this website in a matter of days.\n\n[Check out Next.js](https://nextjs.org/)\n\nFor styling, I went with good old Tailwind, which I also used on the previous iteration of my site. Im a very visual person, and Tailwind makes it so easy for me to just built the designs I have in my head.\n\n[Check out Tailwind](https://tailwindcss.com/)\n\n### Headless CMS: Cosmic\n\nOn the previous iteration of my website, I had built a rudimentary CMS in the command line using M3O for a database, which I then served to the front-end through a small API I built. It was slow and clunky, but it was good enough for periodically updating my portfolio. But, when M3O changed their pricing model, this system became economically infeasible, so I switched to essentially hardcoding my portoflio into my sourcecode, which was something I wanted to avoid. Also, it made the fact I was building my front-end in React a little silly since I had eliminated the one bit of dynamic content on my website. But it was serving its purpose, so I left it.\n\nFor this new iteration, since I wanted to not only go back to managing my portfolio on the back-end, but also build a blog, I knew the best thing to do was to find a pre-packaged solution so I could spend more time focusing on my strengths.\n\n[Check out Cosmic](https://www.cosmicjs.com/)\n\n### Final Notes\n\nThere are a couple little Node packages Ive used to make things a little easier, such as [date-fns](https://date-fns.org/), [react-jsx-parser](https://github.com/TroyAlford/react-jsx-parser), and [Framer Motion](https://www.framer.com/motion/). I particularly had fun with Framer Motion, but I ended up really toning down some of the animations.\n\nAlso, I ended up using the ever-popular VS Code as my text editor instead of my usual go-to, [Nova](https://nova.app/). I started using VS Code again for the first time since early 2021 because of work, and I quickly got spoiled by a lot of the autocomplete features, expecially automatic imports. There will definitly be a breakdown of my thoughts about VS Code vs Nova at some point in the future.\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/building-ghalldev-30.md","e613db37e72d2ffe",{"html":66,"metadata":67},"\u003Cp>Welcome to my brand new website, the 3rd iteration of ghall.dev! For the last year-and-a-half this has simply been home to my portfolio, but for a while now Ive wanted to expand from a simple, single-page site to a multi-page site with a blog (which you are of course reading right now).\u003C/p>\n\u003Cp>In the previous version of this site, I coded myself into a corner. I did a lot of little things I thought were cool, but maybe werent the best ideas design-wise, and put things together in such a way that I couldnt simply tweak things very easily. One of the lessons I took from the experience of building and maintaining that site was to keep things simple, and not try to be too flashy for the sake of being flashy.\u003C/p>\n\u003Cp>Another lesson I took was to plan ahead for any changes. I didnt really think about wanting to start a blog until after the site was up, and if I had made things a little easier by planning for future changes it probably wouldnt have taken a “nuke-and-pave” to cleanly integrate a blog.\u003C/p>\n\u003Cp>Im also a much better developer than I was when I built version 2. Not saying Im amazing, Ive only been at this since late 2020 after all, but Ive learned a lot about coding, and organizing code in a way that makes sense. Of course, a year from now Ill be wondering what the heck I was thinking when I originally wrote the code for this site.\u003C/p>\n\u003Cp>Anyway, the first step to any project like this is deciding on the tech stack. As this is a solo project, being my personal site and all, I had a bit of leeway to experiment with different pieces of that puzzle, but I decided on the following:\u003C/p>\n\u003Ch3 id=\"front-end-framework-nextjs\">Front-end Framework: Next.js\u003C/h3>\n\u003Cp>Im a relative newcomer to Next.js, as Ive only been using it for about 2 months now. But the learning curve was really low coming from React, and I was able to pick it up pretty quickly when I started my current job.\u003C/p>\n\u003Cp>I prefer it to straight React in a few ways, one of the biggest being how easy it is to set up a multi-page site like this. While its definitely possible in React, Next.js makes it painfully simple. It was a no-brainer, and it got me rolling so fast I was able to built this website in a matter of days.\u003C/p>\n\u003Cp>\u003Ca href=\"https://nextjs.org/\">Check out Next.js\u003C/a>\u003C/p>\n\u003Cp>For styling, I went with good old Tailwind, which I also used on the previous iteration of my site. Im a very visual person, and Tailwind makes it so easy for me to just built the designs I have in my head.\u003C/p>\n\u003Cp>\u003Ca href=\"https://tailwindcss.com/\">Check out Tailwind\u003C/a>\u003C/p>\n\u003Ch3 id=\"headless-cms-cosmic\">Headless CMS: Cosmic\u003C/h3>\n\u003Cp>On the previous iteration of my website, I had built a rudimentary CMS in the command line using M3O for a database, which I then served to the front-end through a small API I built. It was slow and clunky, but it was good enough for periodically updating my portfolio. But, when M3O changed their pricing model, this system became economically infeasible, so I switched to essentially hardcoding my portoflio into my sourcecode, which was something I wanted to avoid. Also, it made the fact I was building my front-end in React a little silly since I had eliminated the one bit of dynamic content on my website. But it was serving its purpose, so I left it.\u003C/p>\n\u003Cp>For this new iteration, since I wanted to not only go back to managing my portfolio on the back-end, but also build a blog, I knew the best thing to do was to find a pre-packaged solution so I could spend more time focusing on my strengths.\u003C/p>\n\u003Cp>\u003Ca href=\"https://www.cosmicjs.com/\">Check out Cosmic\u003C/a>\u003C/p>\n\u003Ch3 id=\"final-notes\">Final Notes\u003C/h3>\n\u003Cp>There are a couple little Node packages Ive used to make things a little easier, such as \u003Ca href=\"https://date-fns.org/\">date-fns\u003C/a>, \u003Ca href=\"https://github.com/TroyAlford/react-jsx-parser\">react-jsx-parser\u003C/a>, and \u003Ca href=\"https://www.framer.com/motion/\">Framer Motion\u003C/a>. I particularly had fun with Framer Motion, but I ended up really toning down some of the animations.\u003C/p>\n\u003Cp>Also, I ended up using the ever-popular VS Code as my text editor instead of my usual go-to, \u003Ca href=\"https://nova.app/\">Nova\u003C/a>. I started using VS Code again for the first time since early 2021 because of work, and I quickly got spoiled by a lot of the autocomplete features, expecially automatic imports. There will definitly be a breakdown of my thoughts about VS Code vs Nova at some point in the future.\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":68,"localImagePaths":79,"remoteImagePaths":80,"frontmatter":81,"imagePaths":84},[69,73,76],{"depth":70,"slug":71,"text":72},3,"front-end-framework-nextjs","Front-end Framework: Next.js",{"depth":70,"slug":74,"text":75},"headless-cms-cosmic","Headless CMS: Cosmic",{"depth":70,"slug":77,"text":78},"final-notes","Final Notes",[],[],{"title":58,"pubDate":82,"tags":83},"2022-10-16",[40,61],[],"2022/coding-with-depression",{"id":85,"data":87,"body":91,"filePath":92,"digest":93,"rendered":94},{"title":88,"pubDate":89,"tags":90},"Coding With Depression",["Date","2022-11-11T00:00:00.000Z"],[40,41],"One of the reasons I started this blog, aside from wanting to share my thoughts and experiences as someone early in my web development career, was to write about mental illness as it relates to development. As you can imagine, it's not an easy topic by any means, as it's something that profoundly affects me personally on a daily basis.\n\nFor a decent chunk of this past week, I've been struggling with a bit of a depressive episode. For me this manifests as lack of motivation, and especially \"brain fog\", which just kills my logical thinking and problem solving skills. Obviously this is not ideal for web development, but I've found ways to make it work and maintain some level of productivity, even if it's not my absolute best.\n\n### Getting Motivated\n\nThe first step to overcoming anything is showing up.\n\nWhether I'm laying in bed wishing I could just go back to sleep, or sitting at my computer struggling to make myself just open my code editor, I have to find a way to get myself motivated. When I'm hitting these low points, I've found it incredibly helpful to break things down into tiny pieces and just work through them a piece at a time.\n\nIf I'm struggling to get out of bed, instead of trying to motivate myself to get up because I need to go to work, I focus on the process one step at a time. It's far easier to motivate myself to do a bunch of little things in sequence than it is to motivate myself to reach the end goal.\n\nThis even applies to just tackling things throughout the day. Today I had a rather large task to complete, and I was simply not motivated to do it. I took it one step at a time, down to the most mundane steps like executing a CLI command, or opening a file. I didn't have to be motivated to finish the task as a whole, I just had to motivate myself to tackle each step until I finished.\n\n### Navigating the Fog\n\nBrain fog is a complicated one. I first experienced the impact it has on coding when I was working on homework for boot camp. It's resulted in me blankly staring at a block of code and just totally forgetting how to read it, or just forgetting the name of a variable I defined less than a minute earlier.\n\nIt's so unbelievably frustrating to experience. The knowledge required to understand the code, the ability needed to problem solve the issue, it's all in there somewhere but it feels like that particular brain function is out of scope.\n\nOne of my bad habits to tackle this problem is coffee. I hate to admit it, but it does help take the edge of the fog.\n\nFirstly, I'd suggest some preventative measures like sleeping, getting some sun when you can, and using a light therapy lamp in the morning on those dark rainy mornings. It seems obvious, but it's worth mentioning these things help manage depression, and, by extension, brain fog.\n\nBut if you're in the moment, the best thing you can do is just step away from the computer for a few minutes. Get up, stretch, walk around, do some jumping jacks, go outside, whatever you can do to just get away from the problem and get your body moving. It's good advice for anyone facing a programming problem, but it's especially good if you're struggling with a bit of brain fog.\n\n### Be Kind to Yourself\n\nThrough all this, the most important thing to remember is to be kind to yourself.\n\nI tend to be extremely self-critical on the best of days, but when I'm struggling and not producing my best work I am even more so. I have to remind myself that this isn't typical, I'm not lazy or dumb, I'm just having a rough time. It's ok to slip up here and there and not be at 100% peak productivity, because I'm doing my best and I'm getting stuff done despite the challenges.\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/coding-with-depression.md","d2bf7a0999d48ac1",{"html":95,"metadata":96},"\u003Cp>One of the reasons I started this blog, aside from wanting to share my thoughts and experiences as someone early in my web development career, was to write about mental illness as it relates to development. As you can imagine, its not an easy topic by any means, as its something that profoundly affects me personally on a daily basis.\u003C/p>\n\u003Cp>For a decent chunk of this past week, Ive been struggling with a bit of a depressive episode. For me this manifests as lack of motivation, and especially “brain fog”, which just kills my logical thinking and problem solving skills. Obviously this is not ideal for web development, but Ive found ways to make it work and maintain some level of productivity, even if its not my absolute best.\u003C/p>\n\u003Ch3 id=\"getting-motivated\">Getting Motivated\u003C/h3>\n\u003Cp>The first step to overcoming anything is showing up.\u003C/p>\n\u003Cp>Whether Im laying in bed wishing I could just go back to sleep, or sitting at my computer struggling to make myself just open my code editor, I have to find a way to get myself motivated. When Im hitting these low points, Ive found it incredibly helpful to break things down into tiny pieces and just work through them a piece at a time.\u003C/p>\n\u003Cp>If Im struggling to get out of bed, instead of trying to motivate myself to get up because I need to go to work, I focus on the process one step at a time. Its far easier to motivate myself to do a bunch of little things in sequence than it is to motivate myself to reach the end goal.\u003C/p>\n\u003Cp>This even applies to just tackling things throughout the day. Today I had a rather large task to complete, and I was simply not motivated to do it. I took it one step at a time, down to the most mundane steps like executing a CLI command, or opening a file. I didnt have to be motivated to finish the task as a whole, I just had to motivate myself to tackle each step until I finished.\u003C/p>\n\u003Ch3 id=\"navigating-the-fog\">Navigating the Fog\u003C/h3>\n\u003Cp>Brain fog is a complicated one. I first experienced the impact it has on coding when I was working on homework for boot camp. Its resulted in me blankly staring at a block of code and just totally forgetting how to read it, or just forgetting the name of a variable I defined less than a minute earlier.\u003C/p>\n\u003Cp>Its so unbelievably frustrating to experience. The knowledge required to understand the code, the ability needed to problem solve the issue, its all in there somewhere but it feels like that particular brain function is out of scope.\u003C/p>\n\u003Cp>One of my bad habits to tackle this problem is coffee. I hate to admit it, but it does help take the edge of the fog.\u003C/p>\n\u003Cp>Firstly, Id suggest some preventative measures like sleeping, getting some sun when you can, and using a light therapy lamp in the morning on those dark rainy mornings. It seems obvious, but its worth mentioning these things help manage depression, and, by extension, brain fog.\u003C/p>\n\u003Cp>But if youre in the moment, the best thing you can do is just step away from the computer for a few minutes. Get up, stretch, walk around, do some jumping jacks, go outside, whatever you can do to just get away from the problem and get your body moving. Its good advice for anyone facing a programming problem, but its especially good if youre struggling with a bit of brain fog.\u003C/p>\n\u003Ch3 id=\"be-kind-to-yourself\">Be Kind to Yourself\u003C/h3>\n\u003Cp>Through all this, the most important thing to remember is to be kind to yourself.\u003C/p>\n\u003Cp>I tend to be extremely self-critical on the best of days, but when Im struggling and not producing my best work I am even more so. I have to remind myself that this isnt typical, Im not lazy or dumb, Im just having a rough time. Its ok to slip up here and there and not be at 100% peak productivity, because Im doing my best and Im getting stuff done despite the challenges.\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":97,"localImagePaths":107,"remoteImagePaths":108,"frontmatter":109,"imagePaths":112},[98,101,104],{"depth":70,"slug":99,"text":100},"getting-motivated","Getting Motivated",{"depth":70,"slug":102,"text":103},"navigating-the-fog","Navigating the Fog",{"depth":70,"slug":105,"text":106},"be-kind-to-yourself","Be Kind to Yourself",[],[],{"title":88,"pubDate":110,"tags":111},"2022-11-11",[40,41],[],"2022/ileopard-a-retrospective",{"id":113,"data":115,"body":120,"filePath":121,"assetImports":122,"digest":126,"rendered":127},{"title":116,"pubDate":117,"tags":118},"iLeopard - A Retrospective",["Date","2022-12-26T00:00:00.000Z"],[18,119,61],"MacOS","I few months ago I rediscovered among some old project folders the source code and markdown files for an old blog I ran in the early 2010s. With nothing to do on the afternoon of Christmas Eve, which was a brisk 15°F, I decided I wanted to search through and try to find a rather lengthy retrospective I wrote on Star Trek: The Next Generation. Now that Ive finally started up a new blog I thought it would be fun to touch it up and republish it, since I put so many hours worth of work into it back in the day. Upsettingly, it was not there.\n\nBut I did find a rather salty post I wrote about a Mac theme I created back when I was a senior in high school. I thought it would be nice to go back and take a fresh look at the project, and how I feel about it now, being another 10 years removed from it.\n\nIf you were around the Mac customization scenespecifically on the now-defunct MacThemes.netaround 2007, you probably remember a little project called iLeopard. Admittedly, the chance that youre in that extremely specific niché is incredibly small. The best data I could find is this [Ars Technica article](https://arstechnica.com/gadgets/2007/03/7296/) from March 2007 saying the Mac hit about 6% marketshare. And only a tiny subset of those users even had the thought that customizing the look of Mac OS X was something they wanted to do.\n\n![a screenshot of Mac OS X 10.1 with various apps open](src/assets/blog/ileopard/mac-os-10-1.png)\n\n*Mac OS X 10.1 and the Aqua Interface, from* [_GUIdebook_](https://guidebookgallery.org/screenshots/macosx101)\n\nI was one of the few that had that had that idea pop into my head. I was super into finding and downloading cool themes, including one I distinctly remember that looked like Windows Vista for some reason. It was 2007, the Aqua Interface (the playful, plastic-looking interface style Apple used for about a decade) was already feeling a little passé to me. I wanted something new, and weirdly enough that new thing came from Apple, in the form of iTunes 7.\n\n![a screenshot iTunes 7 with the iTunes Music Store open](src/assets/blog/ileopard/itunes-7.gif)\n\n_iTunes 7 screenshot, from [AppleInsider](https://appleinsider.com/articles/06/09/12/apple_introduces_itunes_7_previews_itv_device)_\n\nIn retrospect, and with the hindsight of 15 years of UI design evolution, its not exactly pretty, but I liked it at the time. It was classy, and simple, and I thought it was the future of the Mac OS X design language.\n\nFast-forward to the release of Mac OS X Leopard, and I was disappointed to see that the bubbly, lick-able scrollbars and buttons were still quite prominent. Having dabbled in the Mac OS X theming scene already, I decided to take matters into my own hands.\n\nThere was a small problem though. With the release of Leopard, Apple changed the format the system used for UI resources, and introduced a new framework to power it all, called CoreUI. The tools that had existed to make theming the OS relatively simple were useless.\n\nIf youre curious, [heres a writeup](https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/10/) from John Siracusas Mac OS X Leopard review about CoreUI, which was, if I recall, what served as the starting point on the road to being able to even locate the system files I needed to crack open.\n\nNow, just as a heads up, most of what follows is based on memory and a fairly cringy blog post I wrote 10 years ago and found in the bowls of my digital archives. Also, my memory on the timeline is a bit fuzzy, but with some digging I found that this mostly takes place between April and June 2008.\n\nBasically, the main barrier to theming Mac OS X Leopard were 2 files; ArtFile.bin, and SArtFile.bin. This is where nearly all the UI resources were stored, aside from scroll bars, which were stored in a file called Extras.rsrc, a file that had been cracked ages before. If I recalland I could be totally wrong so if anybody knows better feel free to tell meExtras.rsrc, and its sister file Extras2.rsrc, still contained all the UI resources, but only the scrollbars were actually used by the system.\n\nI want to make it clear that I cant take the credit for cracking open ArtFile.bin and SArtFile.bin. I believe it was someone on the MacThemes.net forum, and I wish I could remember or find their nameif youre out there reading this, thank you! Those files were essentially encrypted ZIP files, and this genius of a human build a command line tool to decrypt and extract them. This was actually the experience that got me comfortable with the command line, and well say indirectly led to my current career as a web developer, but I digress…\n\nAnyway, I knew where to find the files. I had the tool to decrypt the files. The only thing that stood in my way was the mass of nonsensical folder names filled with equally nonsensically named bitmap images that got extracted from the files.\n\nBeing that I was a bored teenager in high school with way too much time on my hands, I decided to figure out exactly what every bitmap image was by methodically changing the graphics to the most garish colors I could, recreating the bin fileswhich if I recall was as easy as zipping them up and renaming them, but this was 15 years ago so I could definitely be misrememberingrestarting my computer, and hunting down the various neon hues while taking notes.\n\nAfter dozens of restarts, and a couple corrupted OS installs, I had figured out a good chunk of the building blocks making up Leopards UI. Even still, after weeks of this, there was still so much to be done. Bear in mind, there was no documentation on any of this stuff. I was about to create, as far as I know, the first theme for Mac OS X Leopard.\n\n![a screenshot of the Mac OS X Appearance preference pane showing off the modifications made by iLeopard](src/assets/blog/ileopard/ileopard-2-0-1.png)\n\n_iLeopard 2.0.1 screenshot, from [AmazingHenry on MacRumors](https://forums.macrumors.com/threads/ileopard-theme.2045553/), released by fellow MacThemes.net user gcamp' after I essentially handed off the project_\n\nI started pulling elements from iTunes, and, using a “totally legal, I swear” copy of Adobe PhotoShop, tweaked them to fit in their new home. I shared the very first version of the theme, which I called iLeopard, a portmanteau of iTunes and Leopard, on the MacThemes.net forum (thankfully archived [here](https://web.archive.org/web/20080702015727/http://macthemes2.net:80/forum/viewtopic.php?id=16785679&p=1) by the Wayback Machine!!), and it kind of took off more than I expected. By that, I mean people actually used it. Then it made the MacThemes.net front page. Yeah, it was all a bit overwhelming.\n\nAt some point, I got an offer to help out with the theme from fellow forum user gcamp. This was probably the best possible thing to happen for the longevity of the theme. He initially started by contributing custom graphics, and ended up taking the reigns on the project after I graduated high school and lost my passion for the project. He kept the project alive, I believe until Apple effectively killed Mac theming for good a few releases later.\n\nThe sad news is I lost all my original work on iLeopard, along with countless other digital relics from that era of my life, when my MacBook suffered a major hard drive crash in 2011. I had to go on a crazy archeological dig through the internet just to find the above screenshot, and its from after I handed off the project. I did reach out on Mastodon on the extremely off-chance that someone had some more screenshots, or even a pre-2.0 installer, but I haven't got back anything substantial as of this writing.\n\nWhats been interesting as Ive written and researched this piece is the contrast between the Apple of 15+ years ago, and the Apple of today. It was a weird time, they had just completed transitioning the Mac from PowerPC to Intelinterestingly, were currently in the midst of a transition from Intel to Apple Siliconand the first iPhone was brand new.\n\nSecurity on the Mac was pretty laissez-faire, to the point where a dorky high school kid could modify system files and create a simple tool to let other people install those modifications. These days, as a more security-conscious user, that idea horrifies me. But at the same time, I do miss being able to tinker with the little parts of software that werent made to be tinkered with.","src/content/blog/2022/ileopard-a-retrospective.md",[123,124,125],"src/assets/blog/ileopard/mac-os-10-1.png","src/assets/blog/ileopard/itunes-7.gif","src/assets/blog/ileopard/ileopard-2-0-1.png","ce7d3a1c348de781",{"html":128,"metadata":129},"\u003Cp>I few months ago I rediscovered among some old project folders the source code and markdown files for an old blog I ran in the early 2010s. With nothing to do on the afternoon of Christmas Eve, which was a brisk 15°F, I decided I wanted to search through and try to find a rather lengthy retrospective I wrote on Star Trek: The Next Generation. Now that Ive finally started up a new blog I thought it would be fun to touch it up and republish it, since I put so many hours worth of work into it back in the day. Upsettingly, it was not there.\u003C/p>\n\u003Cp>But I did find a rather salty post I wrote about a Mac theme I created back when I was a senior in high school. I thought it would be nice to go back and take a fresh look at the project, and how I feel about it now, being another 10 years removed from it.\u003C/p>\n\u003Cp>If you were around the Mac customization scenespecifically on the now-defunct MacThemes.netaround 2007, you probably remember a little project called iLeopard. Admittedly, the chance that youre in that extremely specific niché is incredibly small. The best data I could find is this \u003Ca href=\"https://arstechnica.com/gadgets/2007/03/7296/\">Ars Technica article\u003C/a> from March 2007 saying the Mac hit about 6% marketshare. And only a tiny subset of those users even had the thought that customizing the look of Mac OS X was something they wanted to do.\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/ileopard/mac-os-10-1.png","alt":"a screenshot of Mac OS X 10.1 with various apps open","index":0}\">\u003C/p>\n\u003Cp>\u003Cem>Mac OS X 10.1 and the Aqua Interface, from\u003C/em> \u003Ca href=\"https://guidebookgallery.org/screenshots/macosx101\">\u003Cem>GUIdebook\u003C/em>\u003C/a>\u003C/p>\n\u003Cp>I was one of the few that had that had that idea pop into my head. I was super into finding and downloading cool themes, including one I distinctly remember that looked like Windows Vista for some reason. It was 2007, the Aqua Interface (the playful, plastic-looking interface style Apple used for about a decade) was already feeling a little passé to me. I wanted something new, and weirdly enough that new thing came from Apple, in the form of iTunes 7.\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/ileopard/itunes-7.gif","alt":"a screenshot iTunes 7 with the iTunes Music Store open","index":0}\">\u003C/p>\n\u003Cp>\u003Cem>iTunes 7 screenshot, from \u003Ca href=\"https://appleinsider.com/articles/06/09/12/apple_introduces_itunes_7_previews_itv_device\">AppleInsider\u003C/a>\u003C/em>\u003C/p>\n\u003Cp>In retrospect, and with the hindsight of 15 years of UI design evolution, its not exactly pretty, but I liked it at the time. It was classy, and simple, and I thought it was the future of the Mac OS X design language.\u003C/p>\n\u003Cp>Fast-forward to the release of Mac OS X Leopard, and I was disappointed to see that the bubbly, lick-able scrollbars and buttons were still quite prominent. Having dabbled in the Mac OS X theming scene already, I decided to take matters into my own hands.\u003C/p>\n\u003Cp>There was a small problem though. With the release of Leopard, Apple changed the format the system used for UI resources, and introduced a new framework to power it all, called CoreUI. The tools that had existed to make theming the OS relatively simple were useless.\u003C/p>\n\u003Cp>If youre curious, \u003Ca href=\"https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/10/\">heres a writeup\u003C/a> from John Siracusas Mac OS X Leopard review about CoreUI, which was, if I recall, what served as the starting point on the road to being able to even locate the system files I needed to crack open.\u003C/p>\n\u003Cp>Now, just as a heads up, most of what follows is based on memory and a fairly cringy blog post I wrote 10 years ago and found in the bowls of my digital archives. Also, my memory on the timeline is a bit fuzzy, but with some digging I found that this mostly takes place between April and June 2008.\u003C/p>\n\u003Cp>Basically, the main barrier to theming Mac OS X Leopard were 2 files; ArtFile.bin, and SArtFile.bin. This is where nearly all the UI resources were stored, aside from scroll bars, which were stored in a file called Extras.rsrc, a file that had been cracked ages before. If I recalland I could be totally wrong so if anybody knows better feel free to tell meExtras.rsrc, and its sister file Extras2.rsrc, still contained all the UI resources, but only the scrollbars were actually used by the system.\u003C/p>\n\u003Cp>I want to make it clear that I cant take the credit for cracking open ArtFile.bin and SArtFile.bin. I believe it was someone on the MacThemes.net forum, and I wish I could remember or find their nameif youre out there reading this, thank you! Those files were essentially encrypted ZIP files, and this genius of a human build a command line tool to decrypt and extract them. This was actually the experience that got me comfortable with the command line, and well say indirectly led to my current career as a web developer, but I digress…\u003C/p>\n\u003Cp>Anyway, I knew where to find the files. I had the tool to decrypt the files. The only thing that stood in my way was the mass of nonsensical folder names filled with equally nonsensically named bitmap images that got extracted from the files.\u003C/p>\n\u003Cp>Being that I was a bored teenager in high school with way too much time on my hands, I decided to figure out exactly what every bitmap image was by methodically changing the graphics to the most garish colors I could, recreating the bin fileswhich if I recall was as easy as zipping them up and renaming them, but this was 15 years ago so I could definitely be misrememberingrestarting my computer, and hunting down the various neon hues while taking notes.\u003C/p>\n\u003Cp>After dozens of restarts, and a couple corrupted OS installs, I had figured out a good chunk of the building blocks making up Leopards UI. Even still, after weeks of this, there was still so much to be done. Bear in mind, there was no documentation on any of this stuff. I was about to create, as far as I know, the first theme for Mac OS X Leopard.\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/ileopard/ileopard-2-0-1.png","alt":"a screenshot of the Mac OS X Appearance preference pane showing off the modifications made by iLeopard","index":0}\">\u003C/p>\n\u003Cp>\u003Cem>iLeopard 2.0.1 screenshot, from \u003Ca href=\"https://forums.macrumors.com/threads/ileopard-theme.2045553/\">AmazingHenry on MacRumors\u003C/a>, released by fellow MacThemes.net user gcamp after I essentially handed off the project\u003C/em>\u003C/p>\n\u003Cp>I started pulling elements from iTunes, and, using a “totally legal, I swear” copy of Adobe PhotoShop, tweaked them to fit in their new home. I shared the very first version of the theme, which I called iLeopard, a portmanteau of iTunes and Leopard, on the MacThemes.net forum (thankfully archived \u003Ca href=\"https://web.archive.org/web/20080702015727/http://macthemes2.net:80/forum/viewtopic.php?id=16785679&p=1\">here\u003C/a> by the Wayback Machine!!), and it kind of took off more than I expected. By that, I mean people actually used it. Then it made the MacThemes.net front page. Yeah, it was all a bit overwhelming.\u003C/p>\n\u003Cp>At some point, I got an offer to help out with the theme from fellow forum user gcamp. This was probably the best possible thing to happen for the longevity of the theme. He initially started by contributing custom graphics, and ended up taking the reigns on the project after I graduated high school and lost my passion for the project. He kept the project alive, I believe until Apple effectively killed Mac theming for good a few releases later.\u003C/p>\n\u003Cp>The sad news is I lost all my original work on iLeopard, along with countless other digital relics from that era of my life, when my MacBook suffered a major hard drive crash in 2011. I had to go on a crazy archeological dig through the internet just to find the above screenshot, and its from after I handed off the project. I did reach out on Mastodon on the extremely off-chance that someone had some more screenshots, or even a pre-2.0 installer, but I havent got back anything substantial as of this writing.\u003C/p>\n\u003Cp>Whats been interesting as Ive written and researched this piece is the contrast between the Apple of 15+ years ago, and the Apple of today. It was a weird time, they had just completed transitioning the Mac from PowerPC to Intelinterestingly, were currently in the midst of a transition from Intel to Apple Siliconand the first iPhone was brand new.\u003C/p>\n\u003Cp>Security on the Mac was pretty laissez-faire, to the point where a dorky high school kid could modify system files and create a simple tool to let other people install those modifications. These days, as a more security-conscious user, that idea horrifies me. But at the same time, I do miss being able to tinker with the little parts of software that werent made to be tinkered with.\u003C/p>",{"headings":130,"localImagePaths":131,"remoteImagePaths":132,"frontmatter":133,"imagePaths":136},[],[123,124,125],[],{"title":116,"pubDate":134,"tags":135},"2022-12-26",[18,119,61],[123,124,125],"2022/my-favorite-little-apps",{"id":137,"data":139,"body":144,"filePath":145,"digest":146,"rendered":147},{"title":140,"pubDate":141,"tags":142},"My Favorite Little Apps",["Date","2022-11-28T00:00:00.000Z"],[119,143],"Apps","There are a lot of apps on my Macs that I use every day. Theres the big ones like Nova for coding, Brave for testing and dev tools, Craft for taking notes and keeping track of projects, and many more. But I wanted to pay special attention to the smaller apps that I use that just hang out in the menu bar or the background that make working in MacOS that much more seamless and enjoyable.\n\n### Itsycal\n\nThis is a cool little free that puts a calendar in your menubar. Its a great way to get a quick glance at my day, and join Zoom/Google Meet calls without opening a full calendar app.\n\n[Download Here](https://www.mowglii.com/itsycal/)\n\n### Tot\n\nA note pad that lives in your menu bar! I use it for jotting down notes during meetings, temporarily storing snippets of text and code, making quick lists, storing links for later…you get the idea.\n\nThe Mac app is free, but you can also buy an iOS version.\n\n[Download Here](https://apps.apple.com/us/app/tot/id1491071483?mt=12)\n\n### Rectangle Pro\n\nSnap, resize, and align windows with keyboard shortcuts, or by dragging then across the screen. Its highly customizable, and Im going to be honest I havent even scratched the surface of the variety of options the Pro version provides, I just bought it to support development.\n\nThere are a lot of apps for Mac that do similar things, but this is, in my opinion, the best available.\n\n[Download/Buy Here](https://rectangleapp.com/)\n\n### Velja\n\nBecause I use Safari as my primary browser, but prefer to use Brave for development, this app saves me time and mouse clicks. Basically Velja routes links opened from any app to any browser you have installed. For example, I have it set up to open any localhost URLs in Brave.\n\nIt offers a variety of built-in filters that will even work with certain apps (like Apple Music, Discord, Zoom, etc).\n\n[Download Here](https://apps.apple.com/us/app/velja/id1607635845?mt=12)\n\n### Contexts\n\nIts the built-in command + tab app switcher on steroids! Instead of a row of icons, you get a list of every window that you can either tab through or even search by app or window title. Its another app I feel lost with if Im using a computer without it installed.\n\n[Buy Here](https://contexts.co/)\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/my-favorite-little-apps.md","561165d463c24f48",{"html":148,"metadata":149},"\u003Cp>There are a lot of apps on my Macs that I use every day. Theres the big ones like Nova for coding, Brave for testing and dev tools, Craft for taking notes and keeping track of projects, and many more. But I wanted to pay special attention to the smaller apps that I use that just hang out in the menu bar or the background that make working in MacOS that much more seamless and enjoyable.\u003C/p>\n\u003Ch3 id=\"itsycal\">Itsycal\u003C/h3>\n\u003Cp>This is a cool little free that puts a calendar in your menubar. Its a great way to get a quick glance at my day, and join Zoom/Google Meet calls without opening a full calendar app.\u003C/p>\n\u003Cp>\u003Ca href=\"https://www.mowglii.com/itsycal/\">Download Here\u003C/a>\u003C/p>\n\u003Ch3 id=\"tot\">Tot\u003C/h3>\n\u003Cp>A note pad that lives in your menu bar! I use it for jotting down notes during meetings, temporarily storing snippets of text and code, making quick lists, storing links for later…you get the idea.\u003C/p>\n\u003Cp>The Mac app is free, but you can also buy an iOS version.\u003C/p>\n\u003Cp>\u003Ca href=\"https://apps.apple.com/us/app/tot/id1491071483?mt=12\">Download Here\u003C/a>\u003C/p>\n\u003Ch3 id=\"rectangle-pro\">Rectangle Pro\u003C/h3>\n\u003Cp>Snap, resize, and align windows with keyboard shortcuts, or by dragging then across the screen. Its highly customizable, and Im going to be honest I havent even scratched the surface of the variety of options the Pro version provides, I just bought it to support development.\u003C/p>\n\u003Cp>There are a lot of apps for Mac that do similar things, but this is, in my opinion, the best available.\u003C/p>\n\u003Cp>\u003Ca href=\"https://rectangleapp.com/\">Download/Buy Here\u003C/a>\u003C/p>\n\u003Ch3 id=\"velja\">Velja\u003C/h3>\n\u003Cp>Because I use Safari as my primary browser, but prefer to use Brave for development, this app saves me time and mouse clicks. Basically Velja routes links opened from any app to any browser you have installed. For example, I have it set up to open any localhost URLs in Brave.\u003C/p>\n\u003Cp>It offers a variety of built-in filters that will even work with certain apps (like Apple Music, Discord, Zoom, etc).\u003C/p>\n\u003Cp>\u003Ca href=\"https://apps.apple.com/us/app/velja/id1607635845?mt=12\">Download Here\u003C/a>\u003C/p>\n\u003Ch3 id=\"contexts\">Contexts\u003C/h3>\n\u003Cp>Its the built-in command + tab app switcher on steroids! Instead of a row of icons, you get a list of every window that you can either tab through or even search by app or window title. Its another app I feel lost with if Im using a computer without it installed.\u003C/p>\n\u003Cp>\u003Ca href=\"https://contexts.co/\">Buy Here\u003C/a>\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":150,"localImagePaths":166,"remoteImagePaths":167,"frontmatter":168,"imagePaths":171},[151,154,157,160,163],{"depth":70,"slug":152,"text":153},"itsycal","Itsycal",{"depth":70,"slug":155,"text":156},"tot","Tot",{"depth":70,"slug":158,"text":159},"rectangle-pro","Rectangle Pro",{"depth":70,"slug":161,"text":162},"velja","Velja",{"depth":70,"slug":164,"text":165},"contexts","Contexts",[],[],{"title":140,"pubDate":169,"tags":170},"2022-11-28",[119,143],[],"2022/my-top-3-games-of-2022",{"id":172,"data":174,"body":179,"filePath":180,"digest":181,"rendered":182},{"title":175,"pubDate":176,"tags":177},"My Top 3 Games of 2022",["Date","2022-12-09T00:00:00.000Z"],[178],"Gaming","The Game Awards were last night, so I was inspired to take some time and write about my personal game of the year. But I couldn't narrow it down to just one, so I picked 3 games which were nominated for several awards but didn't get much, if any, recognition.\n\n### Xenoblade Chronicles 3\n\nI'm not a huge JRPG fan, but with the original Xenoblade Chronicles being among the few I've finished, I had to check this out. It ended up being pretty much the only game I played for weeks.\n\nIt scratches several RPG itches for me; a compelling cast of characters, a fun combat system that you can spend hours just experimenting with, and an intriguing world I still long to go back to even months later. This is definitely a game I will keep coming back to, between all the side content I still have left, and the DLC that's slowly rolling out.\n\nIs it a masterpiece? Probably not. But it stands among Persona 5 and Dragon Quest XI as another modern JRPG that I can not only stomach, but thoroughly enjoy. And to think, I almost skipped out on it because I thought Xenoblade Chronicles 2 was absolute cringe.\n\n### Tunic\n\nI don't play as many indie games as I would like, and I finish even fewer. I love indie games, perhaps a little too much, because I'm always jumping around to the latest one that's grabbed my attention. Thankfully, Tunic is one I managed to finish.\n\nIt came at just the right time, I had just wrapped up Xenoblade Chronicles 3, and I was in the modo for a light action-adventure game. I was ready to start another playthrough of Link's Awakening HD, but I happened to see that this adorable looking game starring a cute fox was about to drop on PS5 and Switch (it had been on Xbox since March I believe, but I don't have an Xbox).\n\nI was not prepared for the challenge this game posed, but it was just the right kind of challenging that made me go, \"Ok, I need to show this game who's boss!\" Beyond challenging bosses, the game mechanics are never tutorialized. Instead, you collect pages of the game's \"manual\" as you play, and have to figure things out from there. Even simple things like how to upgrade your stats isn't explained to you in plain terms.\n\n### Horizon Forbidden West\n\nHorizon Zero Dawn launched in a crowded year for good games, but it stood out to me for its incredibly engrossing story, and its primary mechanic of fighting giant friggin' robots. I was captivated from the start, and was chomping at the bit for a sequel. That sequel finally came, and once again got buried by other games (yeah, I'm looking at you, Elden Ring). But I didn't care, I wanted to see the next chapter in Aloy's story.\n\nI will confess, the story didn't grab me as much as the first game's. It was a satisfying continuation for me, without a doubt, but part of the mystery that made the first game so compellingnamely; how the world ended up in the state it is in the gamewas already solved.\n\nThe gameplay in this sequel, however, was a _huge_ improvement. Melee combat, world traversal, side content, it was all so much better in this game, and showed that the developers took the feedback of the first game to heart. I couldn't put this game down, and once the new game plus patch dropped I jumped right back in. And I'm anxiously awaiting the Burning Shores DLC dropping next year!","src/content/blog/2022/my-top-3-games-of-2022.md","ba3d0b0794128043",{"html":183,"metadata":184},"\u003Cp>The Game Awards were last night, so I was inspired to take some time and write about my personal game of the year. But I couldnt narrow it down to just one, so I picked 3 games which were nominated for several awards but didnt get much, if any, recognition.\u003C/p>\n\u003Ch3 id=\"xenoblade-chronicles-3\">Xenoblade Chronicles 3\u003C/h3>\n\u003Cp>Im not a huge JRPG fan, but with the original Xenoblade Chronicles being among the few Ive finished, I had to check this out. It ended up being pretty much the only game I played for weeks.\u003C/p>\n\u003Cp>It scratches several RPG itches for me; a compelling cast of characters, a fun combat system that you can spend hours just experimenting with, and an intriguing world I still long to go back to even months later. This is definitely a game I will keep coming back to, between all the side content I still have left, and the DLC thats slowly rolling out.\u003C/p>\n\u003Cp>Is it a masterpiece? Probably not. But it stands among Persona 5 and Dragon Quest XI as another modern JRPG that I can not only stomach, but thoroughly enjoy. And to think, I almost skipped out on it because I thought Xenoblade Chronicles 2 was absolute cringe.\u003C/p>\n\u003Ch3 id=\"tunic\">Tunic\u003C/h3>\n\u003Cp>I dont play as many indie games as I would like, and I finish even fewer. I love indie games, perhaps a little too much, because Im always jumping around to the latest one thats grabbed my attention. Thankfully, Tunic is one I managed to finish.\u003C/p>\n\u003Cp>It came at just the right time, I had just wrapped up Xenoblade Chronicles 3, and I was in the modo for a light action-adventure game. I was ready to start another playthrough of Links Awakening HD, but I happened to see that this adorable looking game starring a cute fox was about to drop on PS5 and Switch (it had been on Xbox since March I believe, but I dont have an Xbox).\u003C/p>\n\u003Cp>I was not prepared for the challenge this game posed, but it was just the right kind of challenging that made me go, “Ok, I need to show this game whos boss!” Beyond challenging bosses, the game mechanics are never tutorialized. Instead, you collect pages of the games “manual” as you play, and have to figure things out from there. Even simple things like how to upgrade your stats isnt explained to you in plain terms.\u003C/p>\n\u003Ch3 id=\"horizon-forbidden-west\">Horizon Forbidden West\u003C/h3>\n\u003Cp>Horizon Zero Dawn launched in a crowded year for good games, but it stood out to me for its incredibly engrossing story, and its primary mechanic of fighting giant friggin robots. I was captivated from the start, and was chomping at the bit for a sequel. That sequel finally came, and once again got buried by other games (yeah, Im looking at you, Elden Ring). But I didnt care, I wanted to see the next chapter in Aloys story.\u003C/p>\n\u003Cp>I will confess, the story didnt grab me as much as the first games. It was a satisfying continuation for me, without a doubt, but part of the mystery that made the first game so compellingnamely; how the world ended up in the state it is in the gamewas already solved.\u003C/p>\n\u003Cp>The gameplay in this sequel, however, was a \u003Cem>huge\u003C/em> improvement. Melee combat, world traversal, side content, it was all so much better in this game, and showed that the developers took the feedback of the first game to heart. I couldnt put this game down, and once the new game plus patch dropped I jumped right back in. And Im anxiously awaiting the Burning Shores DLC dropping next year!\u003C/p>",{"headings":185,"localImagePaths":195,"remoteImagePaths":196,"frontmatter":197,"imagePaths":200},[186,189,192],{"depth":70,"slug":187,"text":188},"xenoblade-chronicles-3","Xenoblade Chronicles 3",{"depth":70,"slug":190,"text":191},"tunic","Tunic",{"depth":70,"slug":193,"text":194},"horizon-forbidden-west","Horizon Forbidden West",[],[],{"title":175,"pubDate":198,"tags":199},"2022-12-09",[178],[],"2022/my-macos-home-directory-overview",{"id":201,"data":203,"body":207,"filePath":208,"digest":209,"rendered":210},{"title":204,"pubDate":205,"tags":206},"My MacOS Home Directory Overview",["Date","2022-12-23T00:00:00.000Z"],[119,18],"On [the latest episode of ATP](https://atp.fm/514), Casey, John, and Marco discussed MacOS home directories. After I was done cringing at John keeping his git clones in the root level of his home directory, I started thinking about how I use my own home folder, and how I keep it organized. I wont go into the hidden items, because I dont think either of us want that (with hidden items included, my home directory has 34 documents, and 47 folders 😅).\n\nAnyway, heres my overview...\n\n- Applications - Honestly, all thats in here are a handful of Shortcuts, and Im not sure why because I never put them there.\n- Desktop - This is empty, because I dont keep anything on my desktop.\n- Developer - Now this is where git clones go. Mostly web projects, a folder for all my work repos, and the [Playdate SDK](https://play.date/dev/) from when I was fiddling with that a couple months ago.\n- Documents - Basically just a folder where Divinity: Original Sin 2 keeps its saves, and where I keep various Pages documents and PDFs for some reason (I should probably sort through that at some point)\n- Downloads - Self-explanatory. I tend to keep this clean manually and with Hazel scripts, so theres nothing of note in here at the moment.\n- Movies - Empty, except for my TV.app library.\n- Music - Same as above, except with my Music.app library.\n- Pictures - My Photos.app library, as well as a hodgepodge of scanned photos, drawings, desktop wallpapers, and GIFs I like. All sorted by folder, of course. Im not a monster!\n- Postman - From when I tried Postman, and then immediately switched back to Insomnia.\n- Public - I dont think Ive ever used this folder.\n- Sites - Same as above.\n- Sync - A synced folder, used by an app called Sync, that syncs little bits and bobs like shell scripts and Hazel rules between my 2 Macs.\n\nI didnt bother listing my Library folder because theres not much to say about thatits the same as it is on anyone elses Mac.\n\nOn an additional note, I would really like an iCloud Drive folder in the home directory. I could add one with an alias or symlink, but it just seems weird to me that its squirreled away in the Library folder, cryptically named Mobile Documents.","src/content/blog/2022/my-macos-home-directory-overview.md","c1d7b4f1e53ad3d1",{"html":211,"metadata":212},"\u003Cp>On \u003Ca href=\"https://atp.fm/514\">the latest episode of ATP\u003C/a>, Casey, John, and Marco discussed MacOS home directories. After I was done cringing at John keeping his git clones in the root level of his home directory, I started thinking about how I use my own home folder, and how I keep it organized. I wont go into the hidden items, because I dont think either of us want that (with hidden items included, my home directory has 34 documents, and 47 folders 😅).\u003C/p>\n\u003Cp>Anyway, heres my overview…\u003C/p>\n\u003Cul>\n\u003Cli>Applications - Honestly, all thats in here are a handful of Shortcuts, and Im not sure why because I never put them there.\u003C/li>\n\u003Cli>Desktop - This is empty, because I dont keep anything on my desktop.\u003C/li>\n\u003Cli>Developer - Now this is where git clones go. Mostly web projects, a folder for all my work repos, and the \u003Ca href=\"https://play.date/dev/\">Playdate SDK\u003C/a> from when I was fiddling with that a couple months ago.\u003C/li>\n\u003Cli>Documents - Basically just a folder where Divinity: Original Sin 2 keeps its saves, and where I keep various Pages documents and PDFs for some reason (I should probably sort through that at some point)\u003C/li>\n\u003Cli>Downloads - Self-explanatory. I tend to keep this clean manually and with Hazel scripts, so theres nothing of note in here at the moment.\u003C/li>\n\u003Cli>Movies - Empty, except for my TV.app library.\u003C/li>\n\u003Cli>Music - Same as above, except with my Music.app library.\u003C/li>\n\u003Cli>Pictures - My Photos.app library, as well as a hodgepodge of scanned photos, drawings, desktop wallpapers, and GIFs I like. All sorted by folder, of course. Im not a monster!\u003C/li>\n\u003Cli>Postman - From when I tried Postman, and then immediately switched back to Insomnia.\u003C/li>\n\u003Cli>Public - I dont think Ive ever used this folder.\u003C/li>\n\u003Cli>Sites - Same as above.\u003C/li>\n\u003Cli>Sync - A synced folder, used by an app called Sync, that syncs little bits and bobs like shell scripts and Hazel rules between my 2 Macs.\u003C/li>\n\u003C/ul>\n\u003Cp>I didnt bother listing my Library folder because theres not much to say about thatits the same as it is on anyone elses Mac.\u003C/p>\n\u003Cp>On an additional note, I would really like an iCloud Drive folder in the home directory. I could add one with an alias or symlink, but it just seems weird to me that its squirreled away in the Library folder, cryptically named Mobile Documents.\u003C/p>",{"headings":213,"localImagePaths":214,"remoteImagePaths":215,"frontmatter":216,"imagePaths":219},[],[],[],{"title":204,"pubDate":217,"tags":218},"2022-12-23",[119,18],[],"2022/nextjs-13-and-exploring-new-technologies",{"id":220,"data":222,"body":227,"filePath":228,"digest":229,"rendered":230},{"title":223,"pubDate":224,"tags":225},"Next.js 13 and Exploring New Technologies",["Date","2022-10-28T00:00:00.000Z"],[40,226],"Learning","Next.js 13 was launched a few days ago ([More details here!](https://nextjs.org/blog/next-13)), and Ive been slowly working my way through the new stuff. As a relative newcomer to the world of Next.js Im very excited by what I see, but I also dont want to get too bogged down in whats new because Im already feeling a little bombarded with new stuff at my day job. Besides, it might be a while before I get to use Next.js 13 in a professional setting.\n\nYes Im a tech nerd, and I become easily enamored with the shiny new thing, perhaps to a fault, especially when that shiny new thing is a piece of software. Im the guy who installs OS updates on day one—MacOS Ventura seems to be running fine so far, _knock on wood_—and I just want to just dive head-first into Next.js 13.\n\nBut, when youre as new to the industry as I am, there are already so many new tools and technologies to learn it can already seem overwhelming without throwing in trying to keep up with the latest in the ever-evolving world of web development.\n\nMy attitude is embrace the curiosity, but focus on mastering the tools youre currently using on a daily basis. Whether youre using an entirely different set of frameworks,, or if youre like me and just using an older version of Next.js, the new shiny stuff will still be there when youre ready. And possibly, by the time youre ready, an even newer, shinier technology will be around for you to check out.\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/nextjs-13-and-exploring-new-technologies.md","ea18592c3f2fe135",{"html":231,"metadata":232},"\u003Cp>Next.js 13 was launched a few days ago (\u003Ca href=\"https://nextjs.org/blog/next-13\">More details here!\u003C/a>), and Ive been slowly working my way through the new stuff. As a relative newcomer to the world of Next.js Im very excited by what I see, but I also dont want to get too bogged down in whats new because Im already feeling a little bombarded with new stuff at my day job. Besides, it might be a while before I get to use Next.js 13 in a professional setting.\u003C/p>\n\u003Cp>Yes Im a tech nerd, and I become easily enamored with the shiny new thing, perhaps to a fault, especially when that shiny new thing is a piece of software. Im the guy who installs OS updates on day one—MacOS Ventura seems to be running fine so far, \u003Cem>knock on wood\u003C/em>—and I just want to just dive head-first into Next.js 13.\u003C/p>\n\u003Cp>But, when youre as new to the industry as I am, there are already so many new tools and technologies to learn it can already seem overwhelming without throwing in trying to keep up with the latest in the ever-evolving world of web development.\u003C/p>\n\u003Cp>My attitude is embrace the curiosity, but focus on mastering the tools youre currently using on a daily basis. Whether youre using an entirely different set of frameworks,, or if youre like me and just using an older version of Next.js, the new shiny stuff will still be there when youre ready. And possibly, by the time youre ready, an even newer, shinier technology will be around for you to check out.\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":233,"localImagePaths":234,"remoteImagePaths":235,"frontmatter":236,"imagePaths":239},[],[],[],{"title":223,"pubDate":237,"tags":238},"2022-10-28",[40,226],[],"2022/getting-out-of-your-comfort-zone",{"id":240,"data":242,"body":246,"filePath":247,"digest":248,"rendered":249},{"title":243,"pubDate":244,"tags":245},"Getting Out of Your Comfort Zone",["Date","2022-12-10T00:00:00.000Z"],[17,226,40],"When it comes to frameworks, Ive been firmly stuck in the Reactand React-adjacentworld. Basically, my “coding comfort zone” has been vanilla JavaScript, React, and Next.js. The world of web development is much broader than that, but Im going to be honest, I was a little scared to branch out.\n\nDespite my curiosity and eagerness to learn, I tend to stick to whats comfortable, and I have to work a little harder to branch out. Im comfortable with React, so my tendency is to learn everything I can about React. Im comfortable with JavaScript, so its more natural for me to try to master that language.\n\nBut there was a time I didnt know how to do anything beyond a simple website with HTML and CSS (and I barely knew CSS). Heck, there was a time I was building websites with [iWeb.](https://en.wikipedia.org/wiki/IWeb) I wouldn't be anywhere near where I am as a web developer if I didn't get out of my comfort zone.\n\nSo with that in mind, after a friend suggested I try out [Astro](https://astro.build/), I decided maybe it's time to branch out and try new things. I've also been wanting to build a blog site where I can write about my other interests outside of web development. So it all came together nicely.\n\nSo, the other night I sat down on the couch with my laptop, opened up the Astro documentation, and got to work. Over the course of that evening I built a fully-functional blog site, learned the fundamentals of Astro in the process, and added another tool to my web developer tool belt.\n\nThrough this experience, I proved to myself that learning new things isnt as scary as it seems. Does this mean Im going to go out and learn every framework? No, I dont think thats realistic or advisable for anybody to do. But it showed me how relatively easy it is to branch out, so I wont be so nervous about stepping outside the comfort of the React world in the future.\n\nIf youre feeling like youre stuck in your comfort zone, using whatever technologies and languages youre used to using, try mixing things up. Find a project you want to build, and try tackling it with a tool youve never used before.\n\nAlso, if you're curious, you can check out my Astro blog at [ghall.blog](http://ghall.blog).\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/getting-out-of-your-comfort-zone.md","aa2ec47f7048c7f2",{"html":250,"metadata":251},"\u003Cp>When it comes to frameworks, Ive been firmly stuck in the Reactand React-adjacentworld. Basically, my “coding comfort zone” has been vanilla JavaScript, React, and Next.js. The world of web development is much broader than that, but Im going to be honest, I was a little scared to branch out.\u003C/p>\n\u003Cp>Despite my curiosity and eagerness to learn, I tend to stick to whats comfortable, and I have to work a little harder to branch out. Im comfortable with React, so my tendency is to learn everything I can about React. Im comfortable with JavaScript, so its more natural for me to try to master that language.\u003C/p>\n\u003Cp>But there was a time I didnt know how to do anything beyond a simple website with HTML and CSS (and I barely knew CSS). Heck, there was a time I was building websites with \u003Ca href=\"https://en.wikipedia.org/wiki/IWeb\">iWeb.\u003C/a> I wouldnt be anywhere near where I am as a web developer if I didnt get out of my comfort zone.\u003C/p>\n\u003Cp>So with that in mind, after a friend suggested I try out \u003Ca href=\"https://astro.build/\">Astro\u003C/a>, I decided maybe its time to branch out and try new things. Ive also been wanting to build a blog site where I can write about my other interests outside of web development. So it all came together nicely.\u003C/p>\n\u003Cp>So, the other night I sat down on the couch with my laptop, opened up the Astro documentation, and got to work. Over the course of that evening I built a fully-functional blog site, learned the fundamentals of Astro in the process, and added another tool to my web developer tool belt.\u003C/p>\n\u003Cp>Through this experience, I proved to myself that learning new things isnt as scary as it seems. Does this mean Im going to go out and learn every framework? No, I dont think thats realistic or advisable for anybody to do. But it showed me how relatively easy it is to branch out, so I wont be so nervous about stepping outside the comfort of the React world in the future.\u003C/p>\n\u003Cp>If youre feeling like youre stuck in your comfort zone, using whatever technologies and languages youre used to using, try mixing things up. Find a project you want to build, and try tackling it with a tool youve never used before.\u003C/p>\n\u003Cp>Also, if youre curious, you can check out my Astro blog at \u003Ca href=\"http://ghall.blog\">ghall.blog\u003C/a>.\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":252,"localImagePaths":253,"remoteImagePaths":254,"frontmatter":255,"imagePaths":257},[],[],[],{"title":243,"pubDate":31,"tags":256},[17,226,40],[],"2022/on-text-editors",{"id":258,"data":260,"body":264,"filePath":265,"digest":266,"rendered":267},{"title":261,"pubDate":262,"tags":263},"On Text Editors",["Date","2022-10-22T00:00:00.000Z"],[18,143,40],"Among the various types of software tools I use every day, the one I spend a majority of my time in is a text editor. If Im going to be spending most of my working day using one of these tools, I want it to be something that I enjoy using, and helps me work the way I like to work.\n\nThere are certainly no shortage of text editors out there. Ive tried more than I can name, and I havent even scratched the surface of whats out there. The most popular out there is Visual Studio Code, and its no mystery why. Its absolutely packed with features, code completion is top notch, and theres an extension for just about anything you could ever imagine.\n\nBut Im going to be honest, Im a Mac user and a bit of a software snob. I do use good old VS Code when the mood strikes me, but Ive come to far prefer Nova, a fantastic piece of software from the people at [Panic Inc.](https://www.panic.com/) Its fast, its clean, and most importantly for me, its MacOS native.\n\nNova has its drawbacks. Its extension support is nowhere near VS Codes. Its also got some janky-ness when working with JSX files, at least in my experience. On the other hand, while some people might find its code completion leaves much to be desired, for me, outside of automatic imports, its a lot less frustrating.\n\nBasically, I still use VS Code from time to time. I turn to it when Im working my day job, which involves working on a fairly large Next.js codebase, and I need to collaborate on something, or if Im building out new components I need to import. I also built this website entirely in VS Code. Still, I far prefer using Nova.\n\nAt the end of the day, the tool you use doesnt really matter. Using a particular text editor isnt going to make you a better developer. The only thing that really matters is you use the tool that you like. Dont just use VS Code because its trendy, or Nova because Im singing its praises. I know people who swear by Sublime Text, WebStorm, and BBEdit. The best tool for web development is the one that works for you.\n\nEven if that tool is vim. 😉\n\n---\n\n_This post was originally published on my (now defunct) blog on my portfolio site [ghall.dev](https://ghall.dev), and was republished here for archival purposes._","src/content/blog/2022/on-text-editors.md","71d6bf519c412ce1",{"html":268,"metadata":269},"\u003Cp>Among the various types of software tools I use every day, the one I spend a majority of my time in is a text editor. If Im going to be spending most of my working day using one of these tools, I want it to be something that I enjoy using, and helps me work the way I like to work.\u003C/p>\n\u003Cp>There are certainly no shortage of text editors out there. Ive tried more than I can name, and I havent even scratched the surface of whats out there. The most popular out there is Visual Studio Code, and its no mystery why. Its absolutely packed with features, code completion is top notch, and theres an extension for just about anything you could ever imagine.\u003C/p>\n\u003Cp>But Im going to be honest, Im a Mac user and a bit of a software snob. I do use good old VS Code when the mood strikes me, but Ive come to far prefer Nova, a fantastic piece of software from the people at \u003Ca href=\"https://www.panic.com/\">Panic Inc.\u003C/a> Its fast, its clean, and most importantly for me, its MacOS native.\u003C/p>\n\u003Cp>Nova has its drawbacks. Its extension support is nowhere near VS Codes. Its also got some janky-ness when working with JSX files, at least in my experience. On the other hand, while some people might find its code completion leaves much to be desired, for me, outside of automatic imports, its a lot less frustrating.\u003C/p>\n\u003Cp>Basically, I still use VS Code from time to time. I turn to it when Im working my day job, which involves working on a fairly large Next.js codebase, and I need to collaborate on something, or if Im building out new components I need to import. I also built this website entirely in VS Code. Still, I far prefer using Nova.\u003C/p>\n\u003Cp>At the end of the day, the tool you use doesnt really matter. Using a particular text editor isnt going to make you a better developer. The only thing that really matters is you use the tool that you like. Dont just use VS Code because its trendy, or Nova because Im singing its praises. I know people who swear by Sublime Text, WebStorm, and BBEdit. The best tool for web development is the one that works for you.\u003C/p>\n\u003Cp>Even if that tool is vim. 😉\u003C/p>\n\u003Chr>\n\u003Cp>\u003Cem>This post was originally published on my (now defunct) blog on my portfolio site \u003Ca href=\"https://ghall.dev\">ghall.dev\u003C/a>, and was republished here for archival purposes.\u003C/em>\u003C/p>",{"headings":270,"localImagePaths":271,"remoteImagePaths":272,"frontmatter":273,"imagePaths":276},[],[],[],{"title":261,"pubDate":274,"tags":275},"2022-10-22",[18,143,40],[],"2024/am-i-switching-to-zed",{"id":277,"data":279,"body":284,"filePath":285,"digest":286,"rendered":287},{"title":280,"pubDate":281,"tags":282},"Am I Switching From Nova To Zed?",["Date","2024-04-14T13:20:00.000Z"],[143,283,40],"Programming","For the past several days I've been using the [Zed](https://zed.dev/) editor at work, and on my personal web projects. It started out as just curiosity, but I wasn't immediately sold. I even went so far as to [toot](https://mastodon.social/@ghalldev/112243389407945338) that I'd be going back to Nova as my daily driver.\n\nBut then something weird happened. The next day, I signed into my day job, opened up Nova, and then worked for maybe an hour before Zed started calling to me. After using Zed for 8 hours the previous day, Nova suddenly felt overwhelming and clunky in the same way VSCode felt when I first started using Nova.\n\nNova is, on paper, everything I want from a Mac app; it's slick, it's fast, and it feels right at home on macOS. Zed on the other hand, while fast (perhaps more so than Nova), is not all that pretty, and does not feel like a native Mac app.\n\nBut it has one huge advantage over Nova; it's a code editor first and foremost. And once you figure out the [various JSON incantations](https://zed.dev/docs/configuring-zed) to disable the extraneous AI and collaboration features, it's a pretty barebones app that puts your code front-and-center. Even something like git integration, which is a big deal in both VSCode and Nova, is pretty limited, necessitating the use of the command line tool, or an app like Fork, to perform any action besides seeing which lines and files have been changed.\n\nThis isn't to say I don't have any concerns about Zed, and the team behind it. Their business model doesn't seem all that clear to me, and their AI focus as outlined on their [roadmap](https://zed.dev/roadmap) doesn't exactly indicate to me that this is a product I want to use long term I'd rather they focus those resources on just trying to build a good editor.\n\nOn an emotional level I'd rather give my business to a company like Panic, who have a clear business model with Nova, and who are very good at targeting the niche I happen to fall into - namely, the discerning, if not extremely nit-picky, Mac user. But Zed makes me _feel_ more productive (the science is still out on if it _actually_ makes me more productive), and the extension ecosystem, while still much smaller than the one around Nova, seems a lot healthier[^1].\n\nOf course, this whole post could be totally premature, and, once the honeymoon period is over, I'll find myself crawling back from the cold utilitarianism of Zed to the warm friendliness of Nova. After all, I am known, among those who know my computing habits, to be extremely finicky about the software I choose to use...\n\n[^1]: Example: Nova's TypeScript extension hasn't been updated in about a year, and the developer archived the project on GitHub in late December. 🙁","src/content/blog/2024/am-i-switching-to-zed.md","187937ad7baf7428",{"html":288,"metadata":289},"\u003Cp>For the past several days Ive been using the \u003Ca href=\"https://zed.dev/\">Zed\u003C/a> editor at work, and on my personal web projects. It started out as just curiosity, but I wasnt immediately sold. I even went so far as to \u003Ca href=\"https://mastodon.social/@ghalldev/112243389407945338\">toot\u003C/a> that Id be going back to Nova as my daily driver.\u003C/p>\n\u003Cp>But then something weird happened. The next day, I signed into my day job, opened up Nova, and then worked for maybe an hour before Zed started calling to me. After using Zed for 8 hours the previous day, Nova suddenly felt overwhelming and clunky in the same way VSCode felt when I first started using Nova.\u003C/p>\n\u003Cp>Nova is, on paper, everything I want from a Mac app; its slick, its fast, and it feels right at home on macOS. Zed on the other hand, while fast (perhaps more so than Nova), is not all that pretty, and does not feel like a native Mac app.\u003C/p>\n\u003Cp>But it has one huge advantage over Nova; its a code editor first and foremost. And once you figure out the \u003Ca href=\"https://zed.dev/docs/configuring-zed\">various JSON incantations\u003C/a> to disable the extraneous AI and collaboration features, its a pretty barebones app that puts your code front-and-center. Even something like git integration, which is a big deal in both VSCode and Nova, is pretty limited, necessitating the use of the command line tool, or an app like Fork, to perform any action besides seeing which lines and files have been changed.\u003C/p>\n\u003Cp>This isnt to say I dont have any concerns about Zed, and the team behind it. Their business model doesnt seem all that clear to me, and their AI focus as outlined on their \u003Ca href=\"https://zed.dev/roadmap\">roadmap\u003C/a> doesnt exactly indicate to me that this is a product I want to use long term Id rather they focus those resources on just trying to build a good editor.\u003C/p>\n\u003Cp>On an emotional level Id rather give my business to a company like Panic, who have a clear business model with Nova, and who are very good at targeting the niche I happen to fall into - namely, the discerning, if not extremely nit-picky, Mac user. But Zed makes me \u003Cem>feel\u003C/em> more productive (the science is still out on if it \u003Cem>actually\u003C/em> makes me more productive), and the extension ecosystem, while still much smaller than the one around Nova, seems a lot healthier\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>.\u003C/p>\n\u003Cp>Of course, this whole post could be totally premature, and, once the honeymoon period is over, Ill find myself crawling back from the cold utilitarianism of Zed to the warm friendliness of Nova. After all, I am known, among those who know my computing habits, to be extremely finicky about the software I choose to use…\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Example: Novas TypeScript extension hasnt been updated in about a year, and the developer archived the project on GitHub in late December. 🙁 \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":290,"localImagePaths":295,"remoteImagePaths":296,"frontmatter":297,"imagePaths":300},[291],{"depth":292,"slug":293,"text":294},2,"footnote-label","Footnotes",[],[],{"title":280,"pubDate":298,"tags":299},"4/14/24, 9:20AM",[143,283,40],[],"2024/finishing-stuff",{"id":301,"data":303,"body":307,"filePath":308,"digest":309,"rendered":310},{"title":304,"pubDate":305,"tags":306},"Finishing Stuff",["Date","2024-07-08T04:00:00.000Z"],[41],"It's been a while, longer than usual, since I've posted something here.\n\nI often have a hard time finishing stuff if I don't have some kind of external pressure (like, say, my job depends on it), and it seems like it's been worse over the last several months.\n\nIf you were to take a look into my WIP folder for this blog, you'll see about a dozen or so posts in various states of unfinished. The next big update for my app is in limbo. My gaming backlog is littered with games I started and never finished. My sink always has a couple dishes I couldn't bring myself to just wash along with the rest of them.\n\nIt feels bad to have all these unfinished things hanging over my head. There's the guilt of course, but then there's the frustration and lack of fulfillment that comes with leaving so many things unfinished.\n\nI have so many reasons for leaving things unfinished.\n\nWhen it comes to writing or programming, it's lack of confidence in my work. With writing it's because I decided I have a bad take, or that my writing is just poor quality. With programming it's because I feel like I don't know what I'm doing (especially when working with Swift...).\n\nFor games, it's the desire to move on to the new shiny thing even though I'm still having fun with the game I'm playing.\n\nWith chores, my brain just gets bored and I feel the need to do something more mentally stimulating.\n\nThe cycle repeats, and eventually I'm overwhelmed. I have too many projects to finish. Too many blog posts to write. Too many games to play. Trying to go back and finish these things becomes less about the joy of creating or enjoying a hobby, and more about checking things off a list. So I lose the passion to even finish them.\n\nI've never been diagnosed with Attention Deficit Disorder, but sometimes I wonder if that's something I should pursue (yet another unfinished task I suppose). I tend to blam it on my anxiety since I seem to have more of a challenge during periods of high anxiety (like I've had for the last few months), but maybe this is something I should look into.\n\nIn the meantime though, I did finish this blog post (finally), _and_ posted it, so I'm going to have a mini celebratory cup of tea.","src/content/blog/2024/finishing-stuff.md","88795150a7cb9ac6",{"html":311,"metadata":312},"\u003Cp>Its been a while, longer than usual, since Ive posted something here.\u003C/p>\n\u003Cp>I often have a hard time finishing stuff if I dont have some kind of external pressure (like, say, my job depends on it), and it seems like its been worse over the last several months.\u003C/p>\n\u003Cp>If you were to take a look into my WIP folder for this blog, youll see about a dozen or so posts in various states of unfinished. The next big update for my app is in limbo. My gaming backlog is littered with games I started and never finished. My sink always has a couple dishes I couldnt bring myself to just wash along with the rest of them.\u003C/p>\n\u003Cp>It feels bad to have all these unfinished things hanging over my head. Theres the guilt of course, but then theres the frustration and lack of fulfillment that comes with leaving so many things unfinished.\u003C/p>\n\u003Cp>I have so many reasons for leaving things unfinished.\u003C/p>\n\u003Cp>When it comes to writing or programming, its lack of confidence in my work. With writing its because I decided I have a bad take, or that my writing is just poor quality. With programming its because I feel like I dont know what Im doing (especially when working with Swift…).\u003C/p>\n\u003Cp>For games, its the desire to move on to the new shiny thing even though Im still having fun with the game Im playing.\u003C/p>\n\u003Cp>With chores, my brain just gets bored and I feel the need to do something more mentally stimulating.\u003C/p>\n\u003Cp>The cycle repeats, and eventually Im overwhelmed. I have too many projects to finish. Too many blog posts to write. Too many games to play. Trying to go back and finish these things becomes less about the joy of creating or enjoying a hobby, and more about checking things off a list. So I lose the passion to even finish them.\u003C/p>\n\u003Cp>Ive never been diagnosed with Attention Deficit Disorder, but sometimes I wonder if thats something I should pursue (yet another unfinished task I suppose). I tend to blam it on my anxiety since I seem to have more of a challenge during periods of high anxiety (like Ive had for the last few months), but maybe this is something I should look into.\u003C/p>\n\u003Cp>In the meantime though, I did finish this blog post (finally), \u003Cem>and\u003C/em> posted it, so Im going to have a mini celebratory cup of tea.\u003C/p>",{"headings":313,"localImagePaths":314,"remoteImagePaths":315,"frontmatter":316,"imagePaths":319},[],[],[],{"title":304,"pubDate":317,"tags":318},"7/8/24",[41],[],"2024/my-five-formative-games",{"id":320,"data":322,"body":326,"filePath":327,"digest":328,"rendered":329},{"title":323,"pubDate":324,"tags":325},"My Five Formative Video Games",["Date","2024-07-18T04:00:00.000Z"],[178],"This week, the Triple Click podcast posted to their main feed [a bonus episode from a couple years ago](https://overcast.fm/+AAZusZIrU4E) about the hosts' top 5 formative games. It got me thinking about some of my most formative video game experiences, and what shaped me into the gamer I am today.\n\nLike the postcast, I've picked 5 games I consider to be important to me personally. They're in no particular order, and they're not all my favorites, but they are the games that contributed most to my love of gaming.\n\n## Donkey Kong Country\n\nThis game hold a special place in my heart as my first ever video game. When I was 6, my dad bought me a Super Nintendo bundled with this game, and it blew my little mind. While I think its sequel, Donkey Kong Country 2: Diddy's Kong Quest, is the better game, the original still has a warm place in my heart, and I revisit it from time to time.\n\n## Super Mario Land 2: Six Golden Coins\n\nMy parents got divorced when I was young, and I wasn't really allowed to have a console at my mom's house. I was, however, allowed to have my GameBoy, which my mom bought for me alongside a copy of this game.\n\nIt's not what I'd call a favorite of minesorry to everyone who loves this gamebut it was my first experience with portable gaming, and the start of my preference for that kind of experience. And it eventually led to my next formative game...\n\n## Pokémon Red[^1]\n\nIf you're a gamer in your early-to-mid-30's, Pokémon is probably the game that introduced to you to the genre of role-playing games. That was definitely the case for me. I didn't know anything about RPGs, but I was just the right age for Pokémon fever and I had to play it. In the years since, RPGs have become my favorite type of game to play, and I owe it all to Pokémon.\n\n## The Legend of Zelda: The Wind Waker\n\nI went back and forth between including this or Ocarina of Time, but in the grand scheme of things I think Wind Waker had a much larger effect on me personally. It's my earliest memory of a game that really captivated me, and drew me into its world in a way that I could believe it was alive. I didn't care enough to know about the controversy around the cartoony graphics, if anything that's what really made the game for me at the time.\n\n## Sim Copter\n\nThis is probably a strange pick, and it's the only game on this list I'd never recommend to anyone. But I was absolutely obsessed with this game for a time. I hated doing the missions, I just enjoyed flying the helicopter around. I spent most of my time playing with an included tool called the SimCity Urban Renewal Kit, building my own intricate cities, and loading them into the game to fly around in 3D.\n\n[^1]: I specifically chose Pokémon Red because that's the version I had growing up.","src/content/blog/2024/my-five-formative-games.md","8934d26bee452399",{"html":330,"metadata":331},"\u003Cp>This week, the Triple Click podcast posted to their main feed \u003Ca href=\"https://overcast.fm/+AAZusZIrU4E\">a bonus episode from a couple years ago\u003C/a> about the hosts top 5 formative games. It got me thinking about some of my most formative video game experiences, and what shaped me into the gamer I am today.\u003C/p>\n\u003Cp>Like the postcast, Ive picked 5 games I consider to be important to me personally. Theyre in no particular order, and theyre not all my favorites, but they are the games that contributed most to my love of gaming.\u003C/p>\n\u003Ch2 id=\"donkey-kong-country\">Donkey Kong Country\u003C/h2>\n\u003Cp>This game hold a special place in my heart as my first ever video game. When I was 6, my dad bought me a Super Nintendo bundled with this game, and it blew my little mind. While I think its sequel, Donkey Kong Country 2: Diddys Kong Quest, is the better game, the original still has a warm place in my heart, and I revisit it from time to time.\u003C/p>\n\u003Ch2 id=\"super-mario-land-2-six-golden-coins\">Super Mario Land 2: Six Golden Coins\u003C/h2>\n\u003Cp>My parents got divorced when I was young, and I wasnt really allowed to have a console at my moms house. I was, however, allowed to have my GameBoy, which my mom bought for me alongside a copy of this game.\u003C/p>\n\u003Cp>Its not what Id call a favorite of minesorry to everyone who loves this gamebut it was my first experience with portable gaming, and the start of my preference for that kind of experience. And it eventually led to my next formative game…\u003C/p>\n\u003Ch2 id=\"pokémon-red1\">Pokémon Red\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>\u003C/h2>\n\u003Cp>If youre a gamer in your early-to-mid-30s, Pokémon is probably the game that introduced to you to the genre of role-playing games. That was definitely the case for me. I didnt know anything about RPGs, but I was just the right age for Pokémon fever and I had to play it. In the years since, RPGs have become my favorite type of game to play, and I owe it all to Pokémon.\u003C/p>\n\u003Ch2 id=\"the-legend-of-zelda-the-wind-waker\">The Legend of Zelda: The Wind Waker\u003C/h2>\n\u003Cp>I went back and forth between including this or Ocarina of Time, but in the grand scheme of things I think Wind Waker had a much larger effect on me personally. Its my earliest memory of a game that really captivated me, and drew me into its world in a way that I could believe it was alive. I didnt care enough to know about the controversy around the cartoony graphics, if anything thats what really made the game for me at the time.\u003C/p>\n\u003Ch2 id=\"sim-copter\">Sim Copter\u003C/h2>\n\u003Cp>This is probably a strange pick, and its the only game on this list Id never recommend to anyone. But I was absolutely obsessed with this game for a time. I hated doing the missions, I just enjoyed flying the helicopter around. I spent most of my time playing with an included tool called the SimCity Urban Renewal Kit, building my own intricate cities, and loading them into the game to fly around in 3D.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>I specifically chose Pokémon Red because thats the version I had growing up. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":332,"localImagePaths":349,"remoteImagePaths":350,"frontmatter":351,"imagePaths":354},[333,336,339,342,345,348],{"depth":292,"slug":334,"text":335},"donkey-kong-country","Donkey Kong Country",{"depth":292,"slug":337,"text":338},"super-mario-land-2-six-golden-coins","Super Mario Land 2: Six Golden Coins",{"depth":292,"slug":340,"text":341},"pokémon-red1","Pokémon Red1",{"depth":292,"slug":343,"text":344},"the-legend-of-zelda-the-wind-waker","The Legend of Zelda: The Wind Waker",{"depth":292,"slug":346,"text":347},"sim-copter","Sim Copter",{"depth":292,"slug":293,"text":294},[],[],{"title":323,"pubDate":352,"tags":353},"7/18/24",[178],[],"2024/my-backup-solution",{"id":355,"data":357,"body":362,"filePath":363,"digest":364,"rendered":365},{"title":358,"pubDate":359,"tags":360},"My Backup Solution",["Date","2024-01-27T05:00:00.000Z"],[18,361],"Digital Life","Backing up your data is probably the most important thing you can do with it. This is something I learned the hard way, a little over 10 years ago now, when I lost almost everything on a failed hard drive. Photos, school projects, personal projects, a bunch of terrible stories I wrote (to be fair, that last one wasn't a huge loss). It was then I decided to get serious about backing up, and scrounged up what little money I had at the time to buy a 500GB external drive.\n\nSince then, though my backup solution has evolved, I haven't lost a single bit of data. Outside of my own stupidity of course, but that's another story...\n\nMy current backup solution is 2-fold:\n\nFirst, my entire MacBook is backed up over my local network to an external 4TB drive connected to Mac Mini server using [Carbon Copy Cloner](https://bombich.com/).\n\nSecond, the Mac Mini server is then backed up to the cloud via [Backblaze](https://www.backblaze.com/).\n\nTo complicate things a tad, I also have a 1TB external SSD connected to the Mac Mini which I use as extra storage for files I don't really need on my MacBook, but still want to keep. This SSD is also backed up to the 4TB drive (via another install of Carbon Copy Cloner), and is thus included in the Backblaze backup.\n\nI've opted to use Carbon Copy Cloner instead of Time Machine because it offers a lot more flexibility, both in scheduling and in how my backups are organized.\n\nFor example, the external SSD on the Mac Mini doesn't get written to a whole lot, so I have it scheduled to backup once a day. It's probably a little excessive for how often I actually need to save files there, but I figure it's better to backup more often than I actually need.\n\nOn my MacBook, I have it set to backup every 6 hours. I figured this was a good balance between safety and convenience. Most of my mission-critical work is code, which I commit to GitHub on a regular basis, and I'd rather not have to tie up my network every hour.\n\nFinally, I have both these backups separated into their own folders on the 4TB drive for organizational purposes, which I don't think is possible, or at least not that easy to set up, with Time Machine.\n\nBut my solution is not perfect, and I have identified a few weaknesses in my setup:\n\nFirstly, my backup is not bootable. This is more of a convenience than anything else, but because of how I have everything configured it's not possible to boot from my network backup.\n\nAlso, because my backups are over my local network, I can only backup from home. This isn't the end of the world since I don't often take my MacBook with me for more than a few hours but there have been instances where I've been away for a few days with it in tow. But again, it would be mostly an inconvenience because my mission-critical work gets pushed to GitHub regularly.\n\nThirdly, I don't have a great solution for keeping backups of my photos and anything else I have in iCloud. While both my local Photos library and the \"Mobile Documents\" folderwhere macOS stores iCloud Drive locallyare included in the backup, the way iCloud handles files, and its overall reliability, makes me a little nervous. What if some of my photos are missing from the local library, or some document in my iCloud Drive isn't properly downloaded. I don't have a great solution to this, but I am open to suggestions. Please [hit me up on Mastodon](https://mastodon.social/@ghalldev) if you have any.\n\nAnd finally, I don't have another offsite backup, so if my apartment burns down AND Backblaze for some reason loses all my data (which is an unlikely, but not impossible, scenario) I'm SOL. Even having a backup drive at a relative's house that I backup to once in a while would be better than relying entirely on local network backups and the cloud.\n\nBut if there's one thing I learned, and would like to impart on anyone who, in the year 2024, doesn't have a backup, is that _any_ backup is better than _no_ backup. It all depends on your risk tolerance and how much complexity you want to introduce. But I think, at the very least, backing up to an external drive connected to your computer is a must.","src/content/blog/2024/my-backup-solution.md","cb0af27199af223d",{"html":366,"metadata":367},"\u003Cp>Backing up your data is probably the most important thing you can do with it. This is something I learned the hard way, a little over 10 years ago now, when I lost almost everything on a failed hard drive. Photos, school projects, personal projects, a bunch of terrible stories I wrote (to be fair, that last one wasnt a huge loss). It was then I decided to get serious about backing up, and scrounged up what little money I had at the time to buy a 500GB external drive.\u003C/p>\n\u003Cp>Since then, though my backup solution has evolved, I havent lost a single bit of data. Outside of my own stupidity of course, but thats another story…\u003C/p>\n\u003Cp>My current backup solution is 2-fold:\u003C/p>\n\u003Cp>First, my entire MacBook is backed up over my local network to an external 4TB drive connected to Mac Mini server using \u003Ca href=\"https://bombich.com/\">Carbon Copy Cloner\u003C/a>.\u003C/p>\n\u003Cp>Second, the Mac Mini server is then backed up to the cloud via \u003Ca href=\"https://www.backblaze.com/\">Backblaze\u003C/a>.\u003C/p>\n\u003Cp>To complicate things a tad, I also have a 1TB external SSD connected to the Mac Mini which I use as extra storage for files I dont really need on my MacBook, but still want to keep. This SSD is also backed up to the 4TB drive (via another install of Carbon Copy Cloner), and is thus included in the Backblaze backup.\u003C/p>\n\u003Cp>Ive opted to use Carbon Copy Cloner instead of Time Machine because it offers a lot more flexibility, both in scheduling and in how my backups are organized.\u003C/p>\n\u003Cp>For example, the external SSD on the Mac Mini doesnt get written to a whole lot, so I have it scheduled to backup once a day. Its probably a little excessive for how often I actually need to save files there, but I figure its better to backup more often than I actually need.\u003C/p>\n\u003Cp>On my MacBook, I have it set to backup every 6 hours. I figured this was a good balance between safety and convenience. Most of my mission-critical work is code, which I commit to GitHub on a regular basis, and Id rather not have to tie up my network every hour.\u003C/p>\n\u003Cp>Finally, I have both these backups separated into their own folders on the 4TB drive for organizational purposes, which I dont think is possible, or at least not that easy to set up, with Time Machine.\u003C/p>\n\u003Cp>But my solution is not perfect, and I have identified a few weaknesses in my setup:\u003C/p>\n\u003Cp>Firstly, my backup is not bootable. This is more of a convenience than anything else, but because of how I have everything configured its not possible to boot from my network backup.\u003C/p>\n\u003Cp>Also, because my backups are over my local network, I can only backup from home. This isnt the end of the world since I dont often take my MacBook with me for more than a few hours but there have been instances where Ive been away for a few days with it in tow. But again, it would be mostly an inconvenience because my mission-critical work gets pushed to GitHub regularly.\u003C/p>\n\u003Cp>Thirdly, I dont have a great solution for keeping backups of my photos and anything else I have in iCloud. While both my local Photos library and the “Mobile Documents” folderwhere macOS stores iCloud Drive locallyare included in the backup, the way iCloud handles files, and its overall reliability, makes me a little nervous. What if some of my photos are missing from the local library, or some document in my iCloud Drive isnt properly downloaded. I dont have a great solution to this, but I am open to suggestions. Please \u003Ca href=\"https://mastodon.social/@ghalldev\">hit me up on Mastodon\u003C/a> if you have any.\u003C/p>\n\u003Cp>And finally, I dont have another offsite backup, so if my apartment burns down AND Backblaze for some reason loses all my data (which is an unlikely, but not impossible, scenario) Im SOL. Even having a backup drive at a relatives house that I backup to once in a while would be better than relying entirely on local network backups and the cloud.\u003C/p>\n\u003Cp>But if theres one thing I learned, and would like to impart on anyone who, in the year 2024, doesnt have a backup, is that \u003Cem>any\u003C/em> backup is better than \u003Cem>no\u003C/em> backup. It all depends on your risk tolerance and how much complexity you want to introduce. But I think, at the very least, backing up to an external drive connected to your computer is a must.\u003C/p>",{"headings":368,"localImagePaths":369,"remoteImagePaths":370,"frontmatter":371,"imagePaths":374},[],[],[],{"title":358,"pubDate":372,"tags":373},"1/27/24",[18,361],[],"2024/ai-and-creativity",{"id":375,"data":377,"body":382,"filePath":383,"digest":384,"rendered":385},{"title":378,"pubDate":379,"tags":380},"AI & Creativity",["Date","2024-11-11T05:00:00.000Z"],[18,381],"Creativity","Recently, Ive been pondering generative AI and its effects. Not on jobs, the economy, or even the damage its done to our ability to trust information we see online (whether its something generated by a malicious actor looking to mislead, or a simple “hallucination” causing an innocent mistake). No, Ive been pondering its effects on human creativity, and our capacity to learn and grow as creative creatures. This is something Ive had in the back of my mind for a quite a while, and I think Ive finally reached a point where I can put my feelings into words.\n\nMy experience with generative AI started way back at the end of 2022 with [an AI-assisted dating profile](https://ghall.blog/posts/2022/creating-a-dating-profile-with-ai/). Just over a month later, I posted a [follow up](https://ghall.blog/posts/2023/an-update-on-my-ai-dating-profile/), in which I said the following:\n\n> …it didnt feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasnt falsely representing me, but I still felt dirty. Like the few matches I did get werent matching with me, but with the AI. My profile may have been technically accurate to who I am as a person, but I felt somewhat removed from it.\n\nIve used AI on and off for different reasons since then. Ive used it to help solve programming issues at work and on side projects, to generate images in various art styles that I dont have the patience or talent to draw in, and even tinkered with it for writing letters. But I kept experiencing the same feelings I had from “creating” my AI dating profile; these creations were far more a product of the machine than my own humanity.\n\nIt can beand has beenargued that generative AI democratizes creativity. A person who can barely draw a stick figure can create intricate works of art just by writing some words and feeding them into an algorithm. Or someone with no sense of rhythm or tune can make music that sounds clean and professional. As someone who lacks skill in both those areas (and many more), that sounds incredibly liberating.\n\nBut, the more I think about it, even when ignoring the plagiarism inherent in using generative AI, the more problematic it feels. Yes, generative AI is a tool like any other, and requires a human to operate it[^1], but at what point does a tool eclipse the creative input of the human behind it?\n\nArt, writing, any sort of creative output, is the result of our emotions, our thoughts, our experiences. Perhaps even more important is the journey we must take to create. We cant be good at everything, and part of the joy of creation is finding the things that we can be good at, and honing that skill. The best painters in history didnt wake up one day and start making masterpieces, the best writers didnt start writing classics from the moment they put pen to paper, and the best photographers werent masters of framing when they picked up a camera for the first time.\n\nI would argue that Generative AI does not democratize art or self-expression. It enables us to create a hollow facsimile of those things, something that doesnt truly express to the world who we are. If an AI wrote my blog posts, they might convey some broad thought or opinion I may share, but you wouldnt be any closer to understanding how I truly feel about whatever it is Im writing about.\n\nWhy does any of this even matter? Perhaps, in the grand scheme of things, it doesnt. But, I would argue that, whether its commercial art or just art for the sake of art, a personal blog or a best-selling novel, a side project or just a small piece of a larger piece of software, its the human element, the emotions and experiences of the creator, that makes any art worth creating or consuming.\n\nGenerative AI is already writing articles for publications like Sports Illustrated, creating motion graphics for shows like Marvels Secret Invasion, and being pushed into countless tools for creatives, developers, and designers. Even Apple, which has prided itself for decades on making products that appeal to artists, has got into the generative AI game with their upcoming Image Playground app.\n\nNone of this is to say AI has no place in our livesI for one would love an AI to do my taxes, create meal plans, and handle whatever other drudgery we need to deal with. Like any tool, it should supplement, not replace, the human touch.\n\nThe question I think we need to ponder is this; Where do we draw the line?\n\nSurely, purely AI-generated works are a bridge too far. But is there room for AI to assist in the creative process, and to what extent? How do we strike a balance and use this tool in a way that maximizes its positive impact on our lives while minimizing the negative impact on society? I hope that this is a question we can answer as a society sooner than later…\n\n[^1]: For now, anyway… _Cue dramatic music_. 🎵","src/content/blog/2024/ai-and-creativity.md","2edab0178a3a930f",{"html":386,"metadata":387},"\u003Cp>Recently, Ive been pondering generative AI and its effects. Not on jobs, the economy, or even the damage its done to our ability to trust information we see online (whether its something generated by a malicious actor looking to mislead, or a simple “hallucination” causing an innocent mistake). No, Ive been pondering its effects on human creativity, and our capacity to learn and grow as creative creatures. This is something Ive had in the back of my mind for a quite a while, and I think Ive finally reached a point where I can put my feelings into words.\u003C/p>\n\u003Cp>My experience with generative AI started way back at the end of 2022 with \u003Ca href=\"https://ghall.blog/posts/2022/creating-a-dating-profile-with-ai/\">an AI-assisted dating profile\u003C/a>. Just over a month later, I posted a \u003Ca href=\"https://ghall.blog/posts/2023/an-update-on-my-ai-dating-profile/\">follow up\u003C/a>, in which I said the following:\u003C/p>\n\u003Cblockquote>\n\u003Cp>…it didnt feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasnt falsely representing me, but I still felt dirty. Like the few matches I did get werent matching with me, but with the AI. My profile may have been technically accurate to who I am as a person, but I felt somewhat removed from it.\u003C/p>\n\u003C/blockquote>\n\u003Cp>Ive used AI on and off for different reasons since then. Ive used it to help solve programming issues at work and on side projects, to generate images in various art styles that I dont have the patience or talent to draw in, and even tinkered with it for writing letters. But I kept experiencing the same feelings I had from “creating” my AI dating profile; these creations were far more a product of the machine than my own humanity.\u003C/p>\n\u003Cp>It can beand has beenargued that generative AI democratizes creativity. A person who can barely draw a stick figure can create intricate works of art just by writing some words and feeding them into an algorithm. Or someone with no sense of rhythm or tune can make music that sounds clean and professional. As someone who lacks skill in both those areas (and many more), that sounds incredibly liberating.\u003C/p>\n\u003Cp>But, the more I think about it, even when ignoring the plagiarism inherent in using generative AI, the more problematic it feels. Yes, generative AI is a tool like any other, and requires a human to operate it\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>, but at what point does a tool eclipse the creative input of the human behind it?\u003C/p>\n\u003Cp>Art, writing, any sort of creative output, is the result of our emotions, our thoughts, our experiences. Perhaps even more important is the journey we must take to create. We cant be good at everything, and part of the joy of creation is finding the things that we can be good at, and honing that skill. The best painters in history didnt wake up one day and start making masterpieces, the best writers didnt start writing classics from the moment they put pen to paper, and the best photographers werent masters of framing when they picked up a camera for the first time.\u003C/p>\n\u003Cp>I would argue that Generative AI does not democratize art or self-expression. It enables us to create a hollow facsimile of those things, something that doesnt truly express to the world who we are. If an AI wrote my blog posts, they might convey some broad thought or opinion I may share, but you wouldnt be any closer to understanding how I truly feel about whatever it is Im writing about.\u003C/p>\n\u003Cp>Why does any of this even matter? Perhaps, in the grand scheme of things, it doesnt. But, I would argue that, whether its commercial art or just art for the sake of art, a personal blog or a best-selling novel, a side project or just a small piece of a larger piece of software, its the human element, the emotions and experiences of the creator, that makes any art worth creating or consuming.\u003C/p>\n\u003Cp>Generative AI is already writing articles for publications like Sports Illustrated, creating motion graphics for shows like Marvels Secret Invasion, and being pushed into countless tools for creatives, developers, and designers. Even Apple, which has prided itself for decades on making products that appeal to artists, has got into the generative AI game with their upcoming Image Playground app.\u003C/p>\n\u003Cp>None of this is to say AI has no place in our livesI for one would love an AI to do my taxes, create meal plans, and handle whatever other drudgery we need to deal with. Like any tool, it should supplement, not replace, the human touch.\u003C/p>\n\u003Cp>The question I think we need to ponder is this; Where do we draw the line?\u003C/p>\n\u003Cp>Surely, purely AI-generated works are a bridge too far. But is there room for AI to assist in the creative process, and to what extent? How do we strike a balance and use this tool in a way that maximizes its positive impact on our lives while minimizing the negative impact on society? I hope that this is a question we can answer as a society sooner than later…\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>For now, anyway… \u003Cem>Cue dramatic music\u003C/em>. 🎵 \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":388,"localImagePaths":390,"remoteImagePaths":391,"frontmatter":392,"imagePaths":395},[389],{"depth":292,"slug":293,"text":294},[],[],{"title":378,"pubDate":393,"tags":394},"11/11/24",[18,381],[],"2024/default-apps-2024",{"id":396,"data":398,"body":402,"filePath":403,"digest":404,"rendered":405},{"title":399,"pubDate":400,"tags":401},"Default Apps 2024",["Date","2024-12-29T05:00:00.000Z"],[143,18],"An updated version of [this post](/posts/2023/default-apps-2023) from 2023, inspired by [this post](https://chriscoyier.net/2023/11/25/default-apps-2023/) from Chris Coyier (which was in turn inpsired by [this post](https://mattcool.tech/posts/default-apps-2023)).\n\nI changed up some of the categories to avoid any entries with \"none\" or \"N/A\".\n\n---\n\n✉️ Mail Client: [Mail.app](https://support.apple.com/guide/mail/welcome/mac)\n\n📮 Mail Server: [Proton](https://proton.me/)\n\n📓 Notes: [Bear](https://bear.app/), [Tot](https://tot.rocks/)\n\n✅ To Do: [Reminders](https://support.apple.com/guide/reminders/welcome/mac)\n\n📷 Photo Shooting: [iPhone 14](https://www.apple.com/shop/buy-iphone/iphone-14)\n\n🎨 Photo Editing: [Affinity Photo](https://affinity.serif.com/en-us/photo/)\n\n📆 Calendar: [Fantastical](https://flexibits.com/fantastical), synced with [Google Calendar](https://calendar.google.com)\n\n☁️ Cloud Storage: [iCloud](https://www.icloud.com/)\n\n📰 RSS: [Reeder](https://www.reederapp.com/)\n\n📇 Contacts: [Contacts.app](https://support.apple.com/guide/contacts/welcome/mac)\n\n🌐 Browser: [Arc](https://www.apple.com/safari/)\n\n💬 Chat: [Messages](https://support.apple.com/guide/messages/welcome/mac), [Slack](https://slack.com/), [WhatsApp](https://www.whatsapp.com/)\n\n🔖 Bookmarks: [Anybox](https://anybox.app/)\n\n📑 Read It Later: [Reeder](https://www.reederapp.com/)\n\n📝 Writing & Text Editing: [BBEdit](https://www.barebones.com/products/bbedit/index.html)\n\n📈 Spreadsheets: [Numbers](https://www.apple.com/numbers/)\n\n🪟 Window Management: [Rectangle Pro](https://rectangleapp.com/pro)\n\n🛒 Shopping Lists: [Tot](https://tot.rocks/)\n\n🏋️‍♀️Workout Tracking: [Fitness](https://apps.apple.com/us/app/fitness/id1208224953)\n\n💰 Budgeting: [Expenses](https://getexpenses.app/)\n\n🗞 News: [RSS](https://en.wikipedia.org/wiki/RSS)\n\n🎵 Music: [Apple Music](https://www.apple.com/apple-music/)\n\n🎙 Podcasts: [Overcast](https://overcast.fm/)\n\n🔑 Password Management: [Passwords](https://support.apple.com/en-us/120758)\n\n👨‍💻 Code Editor: [Zed](https://zed.dev/), [Xcode](https://developer.apple.com/xcode/)\n\n🐘 Mastodon Client: [Ivory](https://tapbots.com/ivory/)","src/content/blog/2024/default-apps-2024.md","e29513d601ee8ea8",{"html":406,"metadata":407},"\u003Cp>An updated version of \u003Ca href=\"/posts/2023/default-apps-2023\">this post\u003C/a> from 2023, inspired by \u003Ca href=\"https://chriscoyier.net/2023/11/25/default-apps-2023/\">this post\u003C/a> from Chris Coyier (which was in turn inpsired by \u003Ca href=\"https://mattcool.tech/posts/default-apps-2023\">this post\u003C/a>).\u003C/p>\n\u003Cp>I changed up some of the categories to avoid any entries with “none” or “N/A”.\u003C/p>\n\u003Chr>\n\u003Cp>✉️ Mail Client: \u003Ca href=\"https://support.apple.com/guide/mail/welcome/mac\">Mail.app\u003C/a>\u003C/p>\n\u003Cp>📮 Mail Server: \u003Ca href=\"https://proton.me/\">Proton\u003C/a>\u003C/p>\n\u003Cp>📓 Notes: \u003Ca href=\"https://bear.app/\">Bear\u003C/a>, \u003Ca href=\"https://tot.rocks/\">Tot\u003C/a>\u003C/p>\n\u003Cp>✅ To Do: \u003Ca href=\"https://support.apple.com/guide/reminders/welcome/mac\">Reminders\u003C/a>\u003C/p>\n\u003Cp>📷 Photo Shooting: \u003Ca href=\"https://www.apple.com/shop/buy-iphone/iphone-14\">iPhone 14\u003C/a>\u003C/p>\n\u003Cp>🎨 Photo Editing: \u003Ca href=\"https://affinity.serif.com/en-us/photo/\">Affinity Photo\u003C/a>\u003C/p>\n\u003Cp>📆 Calendar: \u003Ca href=\"https://flexibits.com/fantastical\">Fantastical\u003C/a>, synced with \u003Ca href=\"https://calendar.google.com\">Google Calendar\u003C/a>\u003C/p>\n\u003Cp>☁️ Cloud Storage: \u003Ca href=\"https://www.icloud.com/\">iCloud\u003C/a>\u003C/p>\n\u003Cp>📰 RSS: \u003Ca href=\"https://www.reederapp.com/\">Reeder\u003C/a>\u003C/p>\n\u003Cp>📇 Contacts: \u003Ca href=\"https://support.apple.com/guide/contacts/welcome/mac\">Contacts.app\u003C/a>\u003C/p>\n\u003Cp>🌐 Browser: \u003Ca href=\"https://www.apple.com/safari/\">Arc\u003C/a>\u003C/p>\n\u003Cp>💬 Chat: \u003Ca href=\"https://support.apple.com/guide/messages/welcome/mac\">Messages\u003C/a>, \u003Ca href=\"https://slack.com/\">Slack\u003C/a>, \u003Ca href=\"https://www.whatsapp.com/\">WhatsApp\u003C/a>\u003C/p>\n\u003Cp>🔖 Bookmarks: \u003Ca href=\"https://anybox.app/\">Anybox\u003C/a>\u003C/p>\n\u003Cp>📑 Read It Later: \u003Ca href=\"https://www.reederapp.com/\">Reeder\u003C/a>\u003C/p>\n\u003Cp>📝 Writing & Text Editing: \u003Ca href=\"https://www.barebones.com/products/bbedit/index.html\">BBEdit\u003C/a>\u003C/p>\n\u003Cp>📈 Spreadsheets: \u003Ca href=\"https://www.apple.com/numbers/\">Numbers\u003C/a>\u003C/p>\n\u003Cp>🪟 Window Management: \u003Ca href=\"https://rectangleapp.com/pro\">Rectangle Pro\u003C/a>\u003C/p>\n\u003Cp>🛒 Shopping Lists: \u003Ca href=\"https://tot.rocks/\">Tot\u003C/a>\u003C/p>\n\u003Cp>🏋️‍♀️Workout Tracking: \u003Ca href=\"https://apps.apple.com/us/app/fitness/id1208224953\">Fitness\u003C/a>\u003C/p>\n\u003Cp>💰 Budgeting: \u003Ca href=\"https://getexpenses.app/\">Expenses\u003C/a>\u003C/p>\n\u003Cp>🗞 News: \u003Ca href=\"https://en.wikipedia.org/wiki/RSS\">RSS\u003C/a>\u003C/p>\n\u003Cp>🎵 Music: \u003Ca href=\"https://www.apple.com/apple-music/\">Apple Music\u003C/a>\u003C/p>\n\u003Cp>🎙 Podcasts: \u003Ca href=\"https://overcast.fm/\">Overcast\u003C/a>\u003C/p>\n\u003Cp>🔑 Password Management: \u003Ca href=\"https://support.apple.com/en-us/120758\">Passwords\u003C/a>\u003C/p>\n\u003Cp>👨‍💻 Code Editor: \u003Ca href=\"https://zed.dev/\">Zed\u003C/a>, \u003Ca href=\"https://developer.apple.com/xcode/\">Xcode\u003C/a>\u003C/p>\n\u003Cp>🐘 Mastodon Client: \u003Ca href=\"https://tapbots.com/ivory/\">Ivory\u003C/a>\u003C/p>",{"headings":408,"localImagePaths":409,"remoteImagePaths":410,"frontmatter":411,"imagePaths":414},[],[],[],{"title":399,"pubDate":412,"tags":413},"12/29/24",[143,18],[],"2024/doctor-type-love",{"id":415,"data":417,"body":421,"filePath":422,"digest":423,"rendered":424},{"title":418,"pubDate":419,"tags":420},"How I Learned to Stop Worrying and Love TypeScript",["Date","2024-02-21T05:00:00.000Z"],[226,283],"One of the first steps I took on my post-boot camp webdev journey was to learn TypeScript. It wasn't something that was coveredthough I wish it had been, I'll get into why in a secondbut it was something we were encouraged to study on our own. I immediately got frustrated, and determined that there was no point. Why would I need to go through the trouble of assigning types to my variables when it was all just getting compiled into vanilla JavaScript anyway?\n\nTwo major things happened since then that changed my tune; I learned Swift, and I started using Bun for personal projects.\n\nFirst, I'll tackle Swift.\n\nLearning Swift was both pretty straightforward coming from JavaScript. The syntax, while pretty different, has some concepts that were familiar to me. By the same token though, Swift is a statically-typed[^1] language and I found that difficult to wrap my head around at firstI had, after all, given up on TypeScript in frustration.\n\nAs I got more comfortable with Swift, I starte to miss the benefits of static typing when working in JavaScript. The ability to just tell my code \"hey, this variable here is an integer\" and have my code crash, or even just fail to even compile, with a super specific error when I inevitably do something stupid and try to treat that variable as a string is infinitely less frustrating than the alternative.\n\nSecondly, there's Bun.\n\nBun is amazing, and I could write an entire post about how much I love working with bun. Heck, maybe I will, but that's something for another day...\n\nThe main thing about Bun that's relevant to my TypeScript journey is the fact that it can natively interpret TypeScript without having to compile to JavaScript. That means that right out of the box, with no dependencies, Bun can just run your TypeScript code just as easily as it can run JavaScript.[^2]\n\nWhile any code getting shipped to the browser will still need to be compiled to vanilla JavaScript, you could, as I understand it, theoretically write your entire back-end in TypeScript and just skip the build step. 🤯\n\nI started off being annoyed with using types in my code because, to be quite frank, they are annoying. They'll make your code throw errors whenever you try to multiply a string, or something silly like that. But that's part of the beauty I've come to appreciate. They're there to help you write better code, and to point you in the right direction when something inevitably goes wrong.\n\n[^1]: [Here](https://stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages) is a StackOverflow thread on the difference between dynamic and static typing put far better than I ever could explain it\n\n[^2]: As an example, I rewrote [my CLI clone of Wordle](https://github.com/ghall89/wordle-cli) in TypeScript","src/content/blog/2024/doctor-type-love.md","7e9785d103b6e141",{"html":425,"metadata":426},"\u003Cp>One of the first steps I took on my post-boot camp webdev journey was to learn TypeScript. It wasnt something that was coveredthough I wish it had been, Ill get into why in a secondbut it was something we were encouraged to study on our own. I immediately got frustrated, and determined that there was no point. Why would I need to go through the trouble of assigning types to my variables when it was all just getting compiled into vanilla JavaScript anyway?\u003C/p>\n\u003Cp>Two major things happened since then that changed my tune; I learned Swift, and I started using Bun for personal projects.\u003C/p>\n\u003Cp>First, Ill tackle Swift.\u003C/p>\n\u003Cp>Learning Swift was both pretty straightforward coming from JavaScript. The syntax, while pretty different, has some concepts that were familiar to me. By the same token though, Swift is a statically-typed\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup> language and I found that difficult to wrap my head around at firstI had, after all, given up on TypeScript in frustration.\u003C/p>\n\u003Cp>As I got more comfortable with Swift, I starte to miss the benefits of static typing when working in JavaScript. The ability to just tell my code “hey, this variable here is an integer” and have my code crash, or even just fail to even compile, with a super specific error when I inevitably do something stupid and try to treat that variable as a string is infinitely less frustrating than the alternative.\u003C/p>\n\u003Cp>Secondly, theres Bun.\u003C/p>\n\u003Cp>Bun is amazing, and I could write an entire post about how much I love working with bun. Heck, maybe I will, but thats something for another day…\u003C/p>\n\u003Cp>The main thing about Bun thats relevant to my TypeScript journey is the fact that it can natively interpret TypeScript without having to compile to JavaScript. That means that right out of the box, with no dependencies, Bun can just run your TypeScript code just as easily as it can run JavaScript.\u003Csup>\u003Ca href=\"#user-content-fn-2\" id=\"user-content-fnref-2\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">2\u003C/a>\u003C/sup>\u003C/p>\n\u003Cp>While any code getting shipped to the browser will still need to be compiled to vanilla JavaScript, you could, as I understand it, theoretically write your entire back-end in TypeScript and just skip the build step. 🤯\u003C/p>\n\u003Cp>I started off being annoyed with using types in my code because, to be quite frank, they are annoying. Theyll make your code throw errors whenever you try to multiply a string, or something silly like that. But thats part of the beauty Ive come to appreciate. Theyre there to help you write better code, and to point you in the right direction when something inevitably goes wrong.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>\u003Ca href=\"https://stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages\">Here\u003C/a> is a StackOverflow thread on the difference between dynamic and static typing put far better than I ever could explain it \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-2\">\n\u003Cp>As an example, I rewrote \u003Ca href=\"https://github.com/ghall89/wordle-cli\">my CLI clone of Wordle\u003C/a> in TypeScript \u003Ca href=\"#user-content-fnref-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":427,"localImagePaths":429,"remoteImagePaths":430,"frontmatter":431,"imagePaths":434},[428],{"depth":292,"slug":293,"text":294},[],[],{"title":418,"pubDate":432,"tags":433},"2/21/24",[226,283],[],"2024/my-terminal-setup",{"id":435,"data":437,"body":441,"filePath":442,"digest":443,"rendered":444},{"title":438,"pubDate":439,"tags":440},"My Terminal Setup",["Date","2024-03-09T05:00:00.000Z"],[119,18],"The command line is something I've tinkered with for years. Ever since I discovered Terminal.app in the Utilities folder on my PowerBook G4 back in the day, I've been curious about the kinds of things I could do with it. For most of that time, I've really only used it to change hidden settings, and run tools like 'diskutil', but since entering the world of software development the terminal has become an indispensable tool.\n\nOne of the things I enjoy about the terminal is how customizable it is. If you're on macOS like I am, it can be a nice little reprieve from the relatively locked-down GUI. As such, I've had a lot of fun tweaking the Unix underpinnings of the Mac to my own preferences.\n\n### The Basics\n\nTo start off, let's look at the basic setup. Though macOS comes with the built-in Terminal.app I mentioned earlier, I prefer to use an app called [iTerm 2](https://iterm2.com). There are a lot of alternative terminal emulators out there, and I've tried most of them, but I keep coming back to iTerm because it just feels at home on the Mac in the way Warp, Alacritty, and the like, just don't.\n\nFor the shell itself, I use ZSH, which is what ships by default on Mac. I'll admit I'm not sure what the pros and cons are versus something like Bash, but it works for me. I also use [ohmyzsh](https://github.com/ohmyzsh/ohmyzsh) for an extra level of customization.\n\nFinally, I use [Homebrew](https://brew.sh) for my package manager. That seems to be the go-to solution for Mac. I use it to not only install and manage the CLI tools I use, but also any GUI apps I install outside the App Store. There's even a nice little app called [Cork](https://github.com/buresdv/Cork) which is a GUI app that makes dealing with Homebrew a lot nicer.\n\n### Themes and Plugins\n\nUsing ohmyzsh opens the door for a lot of easy customization. One of the other tools I use is [Powerlevel10k](https://github.com/romkatv/powerlevel10k), which can be used with or without ohmyzsh. This allows you to create a theme by mixing and matching several preset options. I went with a pretty barebones, minimal look, but you don't have to go that route.\n\nFor plugins, I use [zsh-autocomplete](https://github.com/marlonrichert/zsh-autocomplete), which is basically a search function and autocompletion for terminal commands. I also use [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting), which not only adds a bit of color, but can be useful as well because it will color code valid commands in green and invalid ones in red.\n\n### Useful Tools\n\nThere are also a handful of useful tools I have installed that make using the command line a much more pleasant experience. I'm going to skip over ones like git and Homebrew, they're pretty much a necessity for developers, and instead focus on some tools I'd consider nice to have.\n\nAll of these tools can be installed via Homebrew.\n\n**gum**\n\nThis isn't so much a standalone tool as it is a way to easily add some interactivity to shell scripts. You can easily add text inputs, confirmation dialogs, list selections, and even loading spinners to your shell scripts. There's a lot, so I'd suggest checking out [the readme](https://github.com/charmbracelet/gum/blob/main/README.md) to see if it's something you'd find useful.\n\n**mas**\n\nA CLI for the Mac App Store. It may seem a little redundant, but I find it a much more reliable way to update apps installed via the App Store since auto-update seems pretty hit-or-miss, and many times updates will not show for me at all in the GUI interface. Simply running `mas upgrade` will find and install updates much more reliably in my experience.\n\n**thefuck**\n\nEven with all my autocomplete and syntax highlighting shenanigans, I still sometimes make mistakes (ever do a git push without setting an origin?). All I have to do when I make these silly mistakes is run the command `fuck` and it will pretty reliably find and run the command you meant to run.\n\n**yt-dlp**\n\nI don't always have to download YouTube videos, but when I do, I use yt-dlp. It makes it pretty simple to download videos, and it's feels a lot less sketchy than using one of those YouTube downloader websites. Shameless plug, I also [built a GUI front end for it](https://github.com/ghall89/Siphon).\n\n**zoxide**\n\nUsing cd to navigate our computers is an everyday part of using the terminal, but zoxide makes that experience much better. On top just being able to navigate your folders just like with cd, zoxide can keep track of your most visited folders and lets you quickly navigate to them with a fuzzy search. So, say you have a folder you navigate to a lot with `cd ~/Developer/web/personal/my-cool-blog`, instead of having to type that out you can simply type `z web blog` and it will, like magic, take you right there. Also, if you're like me and have the cd command burned into your brain, you can set cd as an alias of z.","src/content/blog/2024/my-terminal-setup.md","8dfb2c1b5e92ae77",{"html":445,"metadata":446},"\u003Cp>The command line is something Ive tinkered with for years. Ever since I discovered Terminal.app in the Utilities folder on my PowerBook G4 back in the day, Ive been curious about the kinds of things I could do with it. For most of that time, Ive really only used it to change hidden settings, and run tools like diskutil, but since entering the world of software development the terminal has become an indispensable tool.\u003C/p>\n\u003Cp>One of the things I enjoy about the terminal is how customizable it is. If youre on macOS like I am, it can be a nice little reprieve from the relatively locked-down GUI. As such, Ive had a lot of fun tweaking the Unix underpinnings of the Mac to my own preferences.\u003C/p>\n\u003Ch3 id=\"the-basics\">The Basics\u003C/h3>\n\u003Cp>To start off, lets look at the basic setup. Though macOS comes with the built-in Terminal.app I mentioned earlier, I prefer to use an app called \u003Ca href=\"https://iterm2.com\">iTerm 2\u003C/a>. There are a lot of alternative terminal emulators out there, and Ive tried most of them, but I keep coming back to iTerm because it just feels at home on the Mac in the way Warp, Alacritty, and the like, just dont.\u003C/p>\n\u003Cp>For the shell itself, I use ZSH, which is what ships by default on Mac. Ill admit Im not sure what the pros and cons are versus something like Bash, but it works for me. I also use \u003Ca href=\"https://github.com/ohmyzsh/ohmyzsh\">ohmyzsh\u003C/a> for an extra level of customization.\u003C/p>\n\u003Cp>Finally, I use \u003Ca href=\"https://brew.sh\">Homebrew\u003C/a> for my package manager. That seems to be the go-to solution for Mac. I use it to not only install and manage the CLI tools I use, but also any GUI apps I install outside the App Store. Theres even a nice little app called \u003Ca href=\"https://github.com/buresdv/Cork\">Cork\u003C/a> which is a GUI app that makes dealing with Homebrew a lot nicer.\u003C/p>\n\u003Ch3 id=\"themes-and-plugins\">Themes and Plugins\u003C/h3>\n\u003Cp>Using ohmyzsh opens the door for a lot of easy customization. One of the other tools I use is \u003Ca href=\"https://github.com/romkatv/powerlevel10k\">Powerlevel10k\u003C/a>, which can be used with or without ohmyzsh. This allows you to create a theme by mixing and matching several preset options. I went with a pretty barebones, minimal look, but you dont have to go that route.\u003C/p>\n\u003Cp>For plugins, I use \u003Ca href=\"https://github.com/marlonrichert/zsh-autocomplete\">zsh-autocomplete\u003C/a>, which is basically a search function and autocompletion for terminal commands. I also use \u003Ca href=\"https://github.com/zsh-users/zsh-syntax-highlighting\">zsh-syntax-highlighting\u003C/a>, which not only adds a bit of color, but can be useful as well because it will color code valid commands in green and invalid ones in red.\u003C/p>\n\u003Ch3 id=\"useful-tools\">Useful Tools\u003C/h3>\n\u003Cp>There are also a handful of useful tools I have installed that make using the command line a much more pleasant experience. Im going to skip over ones like git and Homebrew, theyre pretty much a necessity for developers, and instead focus on some tools Id consider nice to have.\u003C/p>\n\u003Cp>All of these tools can be installed via Homebrew.\u003C/p>\n\u003Cp>\u003Cstrong>gum\u003C/strong>\u003C/p>\n\u003Cp>This isnt so much a standalone tool as it is a way to easily add some interactivity to shell scripts. You can easily add text inputs, confirmation dialogs, list selections, and even loading spinners to your shell scripts. Theres a lot, so Id suggest checking out \u003Ca href=\"https://github.com/charmbracelet/gum/blob/main/README.md\">the readme\u003C/a> to see if its something youd find useful.\u003C/p>\n\u003Cp>\u003Cstrong>mas\u003C/strong>\u003C/p>\n\u003Cp>A CLI for the Mac App Store. It may seem a little redundant, but I find it a much more reliable way to update apps installed via the App Store since auto-update seems pretty hit-or-miss, and many times updates will not show for me at all in the GUI interface. Simply running \u003Ccode>mas upgrade\u003C/code> will find and install updates much more reliably in my experience.\u003C/p>\n\u003Cp>\u003Cstrong>thefuck\u003C/strong>\u003C/p>\n\u003Cp>Even with all my autocomplete and syntax highlighting shenanigans, I still sometimes make mistakes (ever do a git push without setting an origin?). All I have to do when I make these silly mistakes is run the command \u003Ccode>fuck\u003C/code> and it will pretty reliably find and run the command you meant to run.\u003C/p>\n\u003Cp>\u003Cstrong>yt-dlp\u003C/strong>\u003C/p>\n\u003Cp>I dont always have to download YouTube videos, but when I do, I use yt-dlp. It makes it pretty simple to download videos, and its feels a lot less sketchy than using one of those YouTube downloader websites. Shameless plug, I also \u003Ca href=\"https://github.com/ghall89/Siphon\">built a GUI front end for it\u003C/a>.\u003C/p>\n\u003Cp>\u003Cstrong>zoxide\u003C/strong>\u003C/p>\n\u003Cp>Using cd to navigate our computers is an everyday part of using the terminal, but zoxide makes that experience much better. On top just being able to navigate your folders just like with cd, zoxide can keep track of your most visited folders and lets you quickly navigate to them with a fuzzy search. So, say you have a folder you navigate to a lot with \u003Ccode>cd ~/Developer/web/personal/my-cool-blog\u003C/code>, instead of having to type that out you can simply type \u003Ccode>z web blog\u003C/code> and it will, like magic, take you right there. Also, if youre like me and have the cd command burned into your brain, you can set cd as an alias of z.\u003C/p>",{"headings":447,"localImagePaths":457,"remoteImagePaths":458,"frontmatter":459,"imagePaths":462},[448,451,454],{"depth":70,"slug":449,"text":450},"the-basics","The Basics",{"depth":70,"slug":452,"text":453},"themes-and-plugins","Themes and Plugins",{"depth":70,"slug":455,"text":456},"useful-tools","Useful Tools",[],[],{"title":438,"pubDate":460,"tags":461},"3/9/24",[119,18],[],"2024/my-top-3-games-of-2024",{"id":463,"data":465,"body":469,"filePath":470,"digest":471,"rendered":472},{"title":466,"pubDate":467,"tags":468},"My Top 3 Games of 2024",["Date","2024-12-12T00:00:00.000Z"],[178],"Back in December 2022, I wrote about [my top 3 games of that year](/posts/2022/my-top-3-games-of-2022/) in what I hoped would be a yearly tradition. For 2023, Tears of the Kingdom and Baldurs Gate 3 blew me away that I couldnt fathom selecting a third game that stood up to them. This year however, Im returning to the originally envisioned format for my top 3 games of 2024.\n\nOne of my regrets from the 2022 post was that I didnt go into very much detail as to why I liked the games, so this time around I wanted to make sure to go more in-depth (but not too in-depth). So, over the course of the year, Ive kept a journal of every game I finished in 2024, and wrote down what I thought about it while the experience was still fresh in my mind. I chose this list by re-reading my journal and picking the 3 games that, upon reflection, still resonate with me in the same way.\n\n### Star Wars: Outlaws\n\nOk, this is a controversial pick, but, despite its many flaws, Star Wars: Outlaws is a game I genuinely enjoyed from start to finish. Granted, many of its strengths are a result of it being a Star Wars game, but as a fan of the franchise thats enough for me.\n\nTo me, this game nailed the feeling of being a roguish scoundrel going on adventures across the Star Wars galaxy. From classic locations such as Mos Eisley, to new places like Mirogana, it all felt authentically a part of that galaxy far, far away. Its clear the people behind the game are big fans of the universe George Lucas created.\n\nEven the typical Ubisoft open-world tropes didnt detract from the experience. In fact, setting the game across multiple planets, and therefore segmenting the game into smaller open areas instead of one huge map, did a lot to remove the tedium that comes with open-world games.\n\nAnother aspect of the game I enjoyed was the “Reputation System”. During the course of the game youll encounter and do missions for various criminal syndicates; The Hutts, The Pykes, Crimson Dawn, and the Ashiga Clan. Which missions you do, and whether you succeed or fail, will affect your standing with these organizations. Raising your reputation with a particular group can unlock special merchants, allow you to take higher paying missions, and freely move about the gangs territory. However, betraying a gang, stealing from them, entering restricted areas, or just being a menace towards them, will lower your reputation. Its a cool system, and I think it has plenty of room for iteration in a sequel.\n\n### Final Fantasy VII Rebirth\n\nI have to say, this is the game that most surprised me this year. While I enjoyed Final Fantasy VII Remakethe first entry in this trilogy-to-be of games re-imagining the classic 90s RPGwhen I originally played it during Covid lockdown in 2020, I found it very tedious when I revisited it a couple years ago In addition, 2023s Final Fantasy XVI left me a bit down on the series as a whole. But I gave Rebirth a shot anyway, and Im glad I did.\n\nOne thing this game shares in common with the first entry is how well it handles real-time combat, especially compared to the more recent “mainline” entries. Final Fantasy XVs real-time combat was tedious, while XVIs was frustrating and shallow. I really appreciate the ability in this game to switch characters in combat to not only keep gameplay interesting, but provide a level of depth and control that the aforementioned mainline games just dont.\n\nThe world design, similar to Star Wars: Outlaws, is more segmented, which makes the exploration much less tedious, and far more varied. Each map is littered with side objectives to encourage exploration, but its not so much that its overwhelming. The only 2 exceptions were Cosmo Canyon and Gongaga, which I found extremely convoluted and not at all enjoyable to navigate.\n\nThe game has a multitude of mini-games, which felt like a throwback to an older style of video game design, and I thought it was fun. They werent all bangers, but I did find myself engaging in Gwen…sorry, I mean, Queens Blood. Also, Chocobo Racing ended up being another big time sink. It was enough to keep me coming back for many more hours, even after I finished the story (and is probably why I didnt finish more games this year 😬).\n\n### The Legend of Zelda: Echoes of Wisdom\n\nIt goes without saying, if theres a new Zelda game out its going to make my top 3 games of the year, no question. Like any other game, its not perfect. As the first brand-new “2D” Zelda in a decade, and the first in the series to star the titular princess, it had high expectations to live up to, but I think it ran away with them.\n\nIts the first Zelda game of this style to take on the open-world design of the 2 most recent 3D gamesBreath of the Wild, and Tears of the Kingdomand it really fit a lot better that I was expecting. In fact, Id say it did the open-world much better, because it was reigned in just enough to not impede on the storytelling (such as it is in a Nintendo title), but still gave the player a good level of freedom to explore.\n\nAnother area this game excels is the puzzles. Much like in Tears of the Kingdom, the puzzles in this game are more focused on player creativity and finding fun solutions than simply trying to figure out the one solution the designers intended. Much of this creativity comes from what this game calls “echoes”, basically various objects and enemies you can conjure up.\n\nI hope this is a concept Nintendo revisits, because I really want to see a successor to this game that iterates upon what is already great, and improves on what didnt quite work. Basically, what Tears of the Kingdom did for Breath of the Wild.","src/content/blog/2024/my-top-3-games-of-2024.md","aeb241061d662d08",{"html":473,"metadata":474},"\u003Cp>Back in December 2022, I wrote about \u003Ca href=\"/posts/2022/my-top-3-games-of-2022/\">my top 3 games of that year\u003C/a> in what I hoped would be a yearly tradition. For 2023, Tears of the Kingdom and Baldurs Gate 3 blew me away that I couldnt fathom selecting a third game that stood up to them. This year however, Im returning to the originally envisioned format for my top 3 games of 2024.\u003C/p>\n\u003Cp>One of my regrets from the 2022 post was that I didnt go into very much detail as to why I liked the games, so this time around I wanted to make sure to go more in-depth (but not too in-depth). So, over the course of the year, Ive kept a journal of every game I finished in 2024, and wrote down what I thought about it while the experience was still fresh in my mind. I chose this list by re-reading my journal and picking the 3 games that, upon reflection, still resonate with me in the same way.\u003C/p>\n\u003Ch3 id=\"star-wars-outlaws\">Star Wars: Outlaws\u003C/h3>\n\u003Cp>Ok, this is a controversial pick, but, despite its many flaws, Star Wars: Outlaws is a game I genuinely enjoyed from start to finish. Granted, many of its strengths are a result of it being a Star Wars game, but as a fan of the franchise thats enough for me.\u003C/p>\n\u003Cp>To me, this game nailed the feeling of being a roguish scoundrel going on adventures across the Star Wars galaxy. From classic locations such as Mos Eisley, to new places like Mirogana, it all felt authentically a part of that galaxy far, far away. Its clear the people behind the game are big fans of the universe George Lucas created.\u003C/p>\n\u003Cp>Even the typical Ubisoft open-world tropes didnt detract from the experience. In fact, setting the game across multiple planets, and therefore segmenting the game into smaller open areas instead of one huge map, did a lot to remove the tedium that comes with open-world games.\u003C/p>\n\u003Cp>Another aspect of the game I enjoyed was the “Reputation System”. During the course of the game youll encounter and do missions for various criminal syndicates; The Hutts, The Pykes, Crimson Dawn, and the Ashiga Clan. Which missions you do, and whether you succeed or fail, will affect your standing with these organizations. Raising your reputation with a particular group can unlock special merchants, allow you to take higher paying missions, and freely move about the gangs territory. However, betraying a gang, stealing from them, entering restricted areas, or just being a menace towards them, will lower your reputation. Its a cool system, and I think it has plenty of room for iteration in a sequel.\u003C/p>\n\u003Ch3 id=\"final-fantasy-vii-rebirth\">Final Fantasy VII Rebirth\u003C/h3>\n\u003Cp>I have to say, this is the game that most surprised me this year. While I enjoyed Final Fantasy VII Remakethe first entry in this trilogy-to-be of games re-imagining the classic 90s RPGwhen I originally played it during Covid lockdown in 2020, I found it very tedious when I revisited it a couple years ago In addition, 2023s Final Fantasy XVI left me a bit down on the series as a whole. But I gave Rebirth a shot anyway, and Im glad I did.\u003C/p>\n\u003Cp>One thing this game shares in common with the first entry is how well it handles real-time combat, especially compared to the more recent “mainline” entries. Final Fantasy XVs real-time combat was tedious, while XVIs was frustrating and shallow. I really appreciate the ability in this game to switch characters in combat to not only keep gameplay interesting, but provide a level of depth and control that the aforementioned mainline games just dont.\u003C/p>\n\u003Cp>The world design, similar to Star Wars: Outlaws, is more segmented, which makes the exploration much less tedious, and far more varied. Each map is littered with side objectives to encourage exploration, but its not so much that its overwhelming. The only 2 exceptions were Cosmo Canyon and Gongaga, which I found extremely convoluted and not at all enjoyable to navigate.\u003C/p>\n\u003Cp>The game has a multitude of mini-games, which felt like a throwback to an older style of video game design, and I thought it was fun. They werent all bangers, but I did find myself engaging in Gwen…sorry, I mean, Queens Blood. Also, Chocobo Racing ended up being another big time sink. It was enough to keep me coming back for many more hours, even after I finished the story (and is probably why I didnt finish more games this year 😬).\u003C/p>\n\u003Ch3 id=\"the-legend-of-zelda-echoes-of-wisdom\">The Legend of Zelda: Echoes of Wisdom\u003C/h3>\n\u003Cp>It goes without saying, if theres a new Zelda game out its going to make my top 3 games of the year, no question. Like any other game, its not perfect. As the first brand-new “2D” Zelda in a decade, and the first in the series to star the titular princess, it had high expectations to live up to, but I think it ran away with them.\u003C/p>\n\u003Cp>Its the first Zelda game of this style to take on the open-world design of the 2 most recent 3D gamesBreath of the Wild, and Tears of the Kingdomand it really fit a lot better that I was expecting. In fact, Id say it did the open-world much better, because it was reigned in just enough to not impede on the storytelling (such as it is in a Nintendo title), but still gave the player a good level of freedom to explore.\u003C/p>\n\u003Cp>Another area this game excels is the puzzles. Much like in Tears of the Kingdom, the puzzles in this game are more focused on player creativity and finding fun solutions than simply trying to figure out the one solution the designers intended. Much of this creativity comes from what this game calls “echoes”, basically various objects and enemies you can conjure up.\u003C/p>\n\u003Cp>I hope this is a concept Nintendo revisits, because I really want to see a successor to this game that iterates upon what is already great, and improves on what didnt quite work. Basically, what Tears of the Kingdom did for Breath of the Wild.\u003C/p>",{"headings":475,"localImagePaths":485,"remoteImagePaths":486,"frontmatter":487,"imagePaths":490},[476,479,482],{"depth":70,"slug":477,"text":478},"star-wars-outlaws","Star Wars: Outlaws",{"depth":70,"slug":480,"text":481},"final-fantasy-vii-rebirth","Final Fantasy VII Rebirth",{"depth":70,"slug":483,"text":484},"the-legend-of-zelda-echoes-of-wisdom","The Legend of Zelda: Echoes of Wisdom",[],[],{"title":466,"pubDate":488,"tags":489},"2024-12-12",[178],[],"2024/playing-on-easy-mode",{"id":491,"data":493,"body":497,"filePath":498,"digest":499,"rendered":500},{"title":494,"pubDate":495,"tags":496},"Playing on \"Easy Mode\"",["Date","2024-04-09T04:00:00.000Z"],[178],"I have a confession to make; I am terrible at video games! Yes, I've played them regularly for almost 30 years but I still manage to really suck at them. Some genres I'm ok with, such as platformers and turn-based RPGs, but I feel like I just don't have the coordination to pull off shooters and other action games.\n\nI'm not sure if I've just got worse at video games with age, I'm 34 now, or if my patience for the struggle of powering through a particularly hard boss is just a lot lower than it used to be. After all, there are so many games I want to get to, and not enough time in the day. Whatever the case, I find myself turning to easy mode a lot more often.\n\nSometimes I find easy mode frustrating in a different way though. I recently finished Final Fantasy VII Rebirth, and I spent most of the game switching back-and-forth between easy and medium. I found easy a bit boring, but normal a little bit frustrating for my skill level. On easy, outside of boss fights, I didn't really feel any resistance from the game, and even then, some boss fights felt too...well...easy.\n\nYou could say, \"Well, what did you expect from easy mode?\" And that would be a fair point, easy mode is supposed to be just that. It's not really fair of me to expect anything more. But, at least for me, it robs the game of any sort of tension, and makes it nearly impossible to fail.\n\nOne relatively recent game I think did difficulty real well was Horizon Forbidden West. You had the standard \"easy, medium, or hard\" setting, but beyond that you could customize and tune the difficulty to your own specific preferences.\n\nFor example, you could tweak the damage modifiers for both you and your enemies. In my case, I found the enemies a little too weak on easy, so I tuned their damage up a little bit.\n\nOn the other hand I found Aloy, the character you play as in the Horizon series, to be a bit too beefed up on easy, so I was able to tune her down a bit as well. I was able to find this sweet spot between easy and medium that wasn't too frustrating but still gave me a satisfying experience.\n\nWhile this kind of feature is slowly becoming more common, we've still got a long way to go. I realize it's probably not the easiest thing to account for when programming a game game dev is so far beyond what I do, so I can only begin to fathom the challenges that level of customization would add to the development process but it's something I think should be taken into account more often, along with other accessibility features.","src/content/blog/2024/playing-on-easy-mode.md","1dc0a77e11b91736",{"html":501,"metadata":502},"\u003Cp>I have a confession to make; I am terrible at video games! Yes, Ive played them regularly for almost 30 years but I still manage to really suck at them. Some genres Im ok with, such as platformers and turn-based RPGs, but I feel like I just dont have the coordination to pull off shooters and other action games.\u003C/p>\n\u003Cp>Im not sure if Ive just got worse at video games with age, Im 34 now, or if my patience for the struggle of powering through a particularly hard boss is just a lot lower than it used to be. After all, there are so many games I want to get to, and not enough time in the day. Whatever the case, I find myself turning to easy mode a lot more often.\u003C/p>\n\u003Cp>Sometimes I find easy mode frustrating in a different way though. I recently finished Final Fantasy VII Rebirth, and I spent most of the game switching back-and-forth between easy and medium. I found easy a bit boring, but normal a little bit frustrating for my skill level. On easy, outside of boss fights, I didnt really feel any resistance from the game, and even then, some boss fights felt too…well…easy.\u003C/p>\n\u003Cp>You could say, “Well, what did you expect from easy mode?” And that would be a fair point, easy mode is supposed to be just that. Its not really fair of me to expect anything more. But, at least for me, it robs the game of any sort of tension, and makes it nearly impossible to fail.\u003C/p>\n\u003Cp>One relatively recent game I think did difficulty real well was Horizon Forbidden West. You had the standard “easy, medium, or hard” setting, but beyond that you could customize and tune the difficulty to your own specific preferences.\u003C/p>\n\u003Cp>For example, you could tweak the damage modifiers for both you and your enemies. In my case, I found the enemies a little too weak on easy, so I tuned their damage up a little bit.\u003C/p>\n\u003Cp>On the other hand I found Aloy, the character you play as in the Horizon series, to be a bit too beefed up on easy, so I was able to tune her down a bit as well. I was able to find this sweet spot between easy and medium that wasnt too frustrating but still gave me a satisfying experience.\u003C/p>\n\u003Cp>While this kind of feature is slowly becoming more common, weve still got a long way to go. I realize its probably not the easiest thing to account for when programming a game game dev is so far beyond what I do, so I can only begin to fathom the challenges that level of customization would add to the development process but its something I think should be taken into account more often, along with other accessibility features.\u003C/p>",{"headings":503,"localImagePaths":504,"remoteImagePaths":505,"frontmatter":506,"imagePaths":509},[],[],[],{"title":494,"pubDate":507,"tags":508},"4/9/24",[178],[],"2024/ramblings-on-the-macintosh",{"id":510,"data":512,"body":516,"filePath":517,"digest":518,"rendered":519},{"title":513,"pubDate":514,"tags":515},"Ramblings On The Macintosh",["Date","2024-02-18T05:00:00.000Z"],[17,119,18],"2024 marks the 40th anniversary of the Macintosh. You've probably heard this a million times already this year, I'm pretty late to the party for writing a Macintosh retrospective, but I wanted to write this post anyway because of how important the Mac is to me. I might not be where I am today, especially not career-wise, if it weren't for the Macintosh.\n\nThat may seem like hyperbole, but it's really not. The Mac was the computer that ignighted my love of computers, not just using them but tinkering with them. The Mac showed me an entire world of near-infinite possibilities which I am still exploring to this day!\n\nOne of my earliest memories using a computer is playing Super Munchers on my grandparents' SE/30[^1]. I can't recall what originally caused me to become obsessed with this simple educational game, but I was hooked.\n\nSome of my earliest memories of actually tinkering with computers though came from having to spend time with my mom after work at a local university. This is where I discovered the Internet and network share drives. I remember finding a seemingly limitless repository of software and games-in retrospect, probably pirated-on the university network and taking whatever I could fit on a handful of floppies home to run on our Macintosh at home.\n\nI don't actually remember what model we had at home at the time, it looked like a Power Mac 7100 but did not have a CD-ROM driveI distinctly remember going to pick up an external CD-ROM drive at CompUSA. My mom got it used, I can't recall where from but it was definitly not a new computer at the time. But I didn't care! I had games, both the 2 or 3 I had on CD-ROM, plus the many I had inadvertantly pirated.\n\nI remember it had an earlier version of System 7 (what I consider to be the quintissential \"Classic Mac OS\") so it was missing some small features that were on the newer university computers. A couple of those features that come to mind are the Control Strip, and the more 3D-esque UI style, both introduced in later version of System 7. I discovered that these features were merely system extensions so I resolved to copy those extensions onto a floppy disk, copy them into the Extensions folder on our Mac at home, and cross my fingers. To my shock and awe, it worked, and that's where my love for tinkering with computers blossomed.\n\nNot too long after, I discovered the application ResEdit, which could have been dangerous, but thankfully I was usually smart enough to make duplicates of anything before modifying them (guess I was born with good data hygene) and lucky enough to not trash any crucial system files.\n\nLater, in middle school and high school, I started making real simple websites, set up a forum (remember those?!), and learned some rudimentary C, tried (and failed) to learn Objective C. In addition, the Unix underpinnings of Mac OS X introduced me to tinkering via the command line.\n\nWould I have followed the same, or similar, path if I'd only ever used Windows PCs? What about if the Macintosh never existed? We'll never know, but I can say for sure that I wouldn't adore computers in quite the same way. Maybe that's a \"fanboi\" thing to say, but I do truly believe it.\n\nOh, and, fun fact; I wrote this entire post in BBEdit 4 inside the Basilisk II emulator running Mac OS 7.6.\n\n[^1]: I actually still have this exact computer, but it's long since bitten the dust.","src/content/blog/2024/ramblings-on-the-macintosh.md","c1cdfc0ecbc9b897",{"html":520,"metadata":521},"\u003Cp>2024 marks the 40th anniversary of the Macintosh. Youve probably heard this a million times already this year, Im pretty late to the party for writing a Macintosh retrospective, but I wanted to write this post anyway because of how important the Mac is to me. I might not be where I am today, especially not career-wise, if it werent for the Macintosh.\u003C/p>\n\u003Cp>That may seem like hyperbole, but its really not. The Mac was the computer that ignighted my love of computers, not just using them but tinkering with them. The Mac showed me an entire world of near-infinite possibilities which I am still exploring to this day!\u003C/p>\n\u003Cp>One of my earliest memories using a computer is playing Super Munchers on my grandparents SE/30\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>. I cant recall what originally caused me to become obsessed with this simple educational game, but I was hooked.\u003C/p>\n\u003Cp>Some of my earliest memories of actually tinkering with computers though came from having to spend time with my mom after work at a local university. This is where I discovered the Internet and network share drives. I remember finding a seemingly limitless repository of software and games-in retrospect, probably pirated-on the university network and taking whatever I could fit on a handful of floppies home to run on our Macintosh at home.\u003C/p>\n\u003Cp>I dont actually remember what model we had at home at the time, it looked like a Power Mac 7100 but did not have a CD-ROM driveI distinctly remember going to pick up an external CD-ROM drive at CompUSA. My mom got it used, I cant recall where from but it was definitly not a new computer at the time. But I didnt care! I had games, both the 2 or 3 I had on CD-ROM, plus the many I had inadvertantly pirated.\u003C/p>\n\u003Cp>I remember it had an earlier version of System 7 (what I consider to be the quintissential “Classic Mac OS”) so it was missing some small features that were on the newer university computers. A couple of those features that come to mind are the Control Strip, and the more 3D-esque UI style, both introduced in later version of System 7. I discovered that these features were merely system extensions so I resolved to copy those extensions onto a floppy disk, copy them into the Extensions folder on our Mac at home, and cross my fingers. To my shock and awe, it worked, and thats where my love for tinkering with computers blossomed.\u003C/p>\n\u003Cp>Not too long after, I discovered the application ResEdit, which could have been dangerous, but thankfully I was usually smart enough to make duplicates of anything before modifying them (guess I was born with good data hygene) and lucky enough to not trash any crucial system files.\u003C/p>\n\u003Cp>Later, in middle school and high school, I started making real simple websites, set up a forum (remember those?!), and learned some rudimentary C, tried (and failed) to learn Objective C. In addition, the Unix underpinnings of Mac OS X introduced me to tinkering via the command line.\u003C/p>\n\u003Cp>Would I have followed the same, or similar, path if Id only ever used Windows PCs? What about if the Macintosh never existed? Well never know, but I can say for sure that I wouldnt adore computers in quite the same way. Maybe thats a “fanboi” thing to say, but I do truly believe it.\u003C/p>\n\u003Cp>Oh, and, fun fact; I wrote this entire post in BBEdit 4 inside the Basilisk II emulator running Mac OS 7.6.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>I actually still have this exact computer, but its long since bitten the dust. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":522,"localImagePaths":524,"remoteImagePaths":525,"frontmatter":526,"imagePaths":529},[523],{"depth":292,"slug":293,"text":294},[],[],{"title":513,"pubDate":527,"tags":528},"2/18/24",[17,119,18],[],"2023/an-update-on-my-ai-dating-profile",{"id":530,"data":532,"body":536,"filePath":537,"digest":538,"rendered":539},{"title":533,"pubDate":534,"tags":535},"An Update on my AI Dating Profile",["Date","2023-01-14T00:00:00.000Z"],[17,18],"Back in early December I posted about [how I created a dating profile using AI](/posts/2022/creating-a-dating-profile-with-ai). I haven't forgotten about my promise to follow up on the results from that very unscientific experiment. Though I stated I'd commit to using my AI profile for a week, I quickly realized that was not a reasonable amount of time. So a week, turned into 2, which turned into just over a month, and I finally reached a point where I feel like a follow up is warranted.\n\nNow, I wish I had some interesting stats to share. I wish I could say that my AI-assisted dating profile resulted in X% greater or fewer matches. The truth is there was nothing remarkable about my results. I got 5 matches in the first week-and-a-half, and zero after that.\n\nThe only standout event was that I received a message from a woman saying she really liked my outlook on relationships, so thank you AI for so eloquently phrasing my thoughts and feelings.\n\nThat was another thing I noticed in this experiment; it didnt feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasnt falsely representing me, but I still felt dirty. Like the few matches I did get werent matching with me, but with the AI. My profile may have been technically accurate to who I am as a person, but I felt somewhat removed from it.\n\nSo, to answer the question I posed at the end of my previous post; did this turn my love-life around, or did it backfire? The truth is, neither. It was just an uncomfortably weird and disappointing experience, which is just par for the course when dating in a post-2020 worldat least in my experience. 🤷‍♂️","src/content/blog/2023/an-update-on-my-ai-dating-profile.md","db64faaaad105b1a",{"html":540,"metadata":541},"\u003Cp>Back in early December I posted about \u003Ca href=\"/posts/2022/creating-a-dating-profile-with-ai\">how I created a dating profile using AI\u003C/a>. I havent forgotten about my promise to follow up on the results from that very unscientific experiment. Though I stated Id commit to using my AI profile for a week, I quickly realized that was not a reasonable amount of time. So a week, turned into 2, which turned into just over a month, and I finally reached a point where I feel like a follow up is warranted.\u003C/p>\n\u003Cp>Now, I wish I had some interesting stats to share. I wish I could say that my AI-assisted dating profile resulted in X% greater or fewer matches. The truth is there was nothing remarkable about my results. I got 5 matches in the first week-and-a-half, and zero after that.\u003C/p>\n\u003Cp>The only standout event was that I received a message from a woman saying she really liked my outlook on relationships, so thank you AI for so eloquently phrasing my thoughts and feelings.\u003C/p>\n\u003Cp>That was another thing I noticed in this experiment; it didnt feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasnt falsely representing me, but I still felt dirty. Like the few matches I did get werent matching with me, but with the AI. My profile may have been technically accurate to who I am as a person, but I felt somewhat removed from it.\u003C/p>\n\u003Cp>So, to answer the question I posed at the end of my previous post; did this turn my love-life around, or did it backfire? The truth is, neither. It was just an uncomfortably weird and disappointing experience, which is just par for the course when dating in a post-2020 worldat least in my experience. 🤷‍♂️\u003C/p>",{"headings":542,"localImagePaths":543,"remoteImagePaths":544,"frontmatter":545,"imagePaths":548},[],[],[],{"title":533,"pubDate":546,"tags":547},"2023-01-14",[17,18],[],"2024/notes-on-these-airpods",{"id":549,"data":551,"body":555,"filePath":556,"digest":557,"rendered":558},{"title":552,"pubDate":553,"tags":554},"Notes on the AirPods 4",["Date","2024-09-24T01:10:00.000Z"],[18],"My big purchase from the iPhone event a couple weeks ago was the AirPods 4 With Active Noise Cancellation[^1].\n\nI've only had them a few days at this point, and writing product reviews isn't my strong suite, so I've collected up some notes on my experience with the new AirPods' audio modes:\n\n## Noise Cancellation\n\nI've never owned a set of headphones with noise cancellation so I don't really have anything to compare these to, but I feel like it works pretty well considering there are no rubber tips (and thus no seal to fully block out external noise).\n\nI've tried them when working at my desk and it does a real good job of blocking out most ambient noise, and I feel less distracted. I've also tried them working in a crowded cafe, and while I could still hear the chatter of the people around me, it was muffled enough to minimize any distraction.\n\nSpeaking on the phone or in meetings is still a bit strange and I feel like I have to shout. Might default to turning off noise cancellation in these situations if I don't adapt.\n\n## Passthrough\n\nI found the passthrough on the AirPods 4 to be a little unsettling since I was hearing ambient noise naturally as well as through the headphones. This made ambience a bit more grating. Not sure if I'll use passthrough mode, and just stick to either \"active noise cancellation\" or \"off\".\n\n## Misc Notes\n\nThey don't feel quite as secure in my ear as the AirPods 3, but still way better than the AirPods 1 and 2.\n\nThe AirPods 3 had an issue with stuttering music when I was using my MacBook in clamshell mode but that seems to not be an issue so far with these.\n\n[^1]: Listeners of the Accidental Tech Podcast know the product better as These AirPods.","src/content/blog/2024/notes-on-these-airpods.md","4d5c184f9b6f67e1",{"html":559,"metadata":560},"\u003Cp>My big purchase from the iPhone event a couple weeks ago was the AirPods 4 With Active Noise Cancellation\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>.\u003C/p>\n\u003Cp>Ive only had them a few days at this point, and writing product reviews isnt my strong suite, so Ive collected up some notes on my experience with the new AirPods audio modes:\u003C/p>\n\u003Ch2 id=\"noise-cancellation\">Noise Cancellation\u003C/h2>\n\u003Cp>Ive never owned a set of headphones with noise cancellation so I dont really have anything to compare these to, but I feel like it works pretty well considering there are no rubber tips (and thus no seal to fully block out external noise).\u003C/p>\n\u003Cp>Ive tried them when working at my desk and it does a real good job of blocking out most ambient noise, and I feel less distracted. Ive also tried them working in a crowded cafe, and while I could still hear the chatter of the people around me, it was muffled enough to minimize any distraction.\u003C/p>\n\u003Cp>Speaking on the phone or in meetings is still a bit strange and I feel like I have to shout. Might default to turning off noise cancellation in these situations if I dont adapt.\u003C/p>\n\u003Ch2 id=\"passthrough\">Passthrough\u003C/h2>\n\u003Cp>I found the passthrough on the AirPods 4 to be a little unsettling since I was hearing ambient noise naturally as well as through the headphones. This made ambience a bit more grating. Not sure if Ill use passthrough mode, and just stick to either “active noise cancellation” or “off”.\u003C/p>\n\u003Ch2 id=\"misc-notes\">Misc Notes\u003C/h2>\n\u003Cp>They dont feel quite as secure in my ear as the AirPods 3, but still way better than the AirPods 1 and 2.\u003C/p>\n\u003Cp>The AirPods 3 had an issue with stuttering music when I was using my MacBook in clamshell mode but that seems to not be an issue so far with these.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Listeners of the Accidental Tech Podcast know the product better as These AirPods. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":561,"localImagePaths":572,"remoteImagePaths":573,"frontmatter":574,"imagePaths":577},[562,565,568,571],{"depth":292,"slug":563,"text":564},"noise-cancellation","Noise Cancellation",{"depth":292,"slug":566,"text":567},"passthrough","Passthrough",{"depth":292,"slug":569,"text":570},"misc-notes","Misc Notes",{"depth":292,"slug":293,"text":294},[],[],{"title":552,"pubDate":575,"tags":576},"9/23/24, 9:10PM",[18],[],"2024/rip-homepod-mini",{"id":578,"data":580,"body":584,"filePath":585,"digest":586,"rendered":587},{"title":581,"pubDate":582,"tags":583},"RIP HomePod Mini",["Date","2024-05-02T04:00:00.000Z"],[18],"Recently, my HomePod Mini broke. It will no longer even power on at all. I think I may have damaged the _NON-REMOVABLE_ cable, perhaps while moving furniture (I'm not entirely sure _when_ it broke, but I'll get into that), and my options are send it in to Apple for repair or buy a new one. I have zero motivation to do either.\n\nI've owned my fair share of Apple products over the years, and while most of them have had flaws that got under my skin (but honestly, what product doesn't), none of them have consistently frustrated me as much as the HomePod.\n\nBut first, let's start off with the things I like; It looks nice, sounds really good (at least to my ears, but I am admittedly _not_ an audiophile), and is just overall a well-made piece of hardware - non-removable power cable notwithstanding.\n\nHowever, all of that is totally undone by the software. Specifically, Siri.\n\nI never really understood the complains people had about Siri before I had a HomePod. Probably because I never really used Siri regularly on my other devices.[^1] But Siri is the primary way you interact with the HomePod. Sure you can just AirPlay some music to it from your phone, but it's, at least in theory, easier to say \"Hey Siri, play some music\" and have it intelligently play a selection of music that fits your tastes.\n\nWhen it worked, it was amazing. But when it didn't, which slowly became more and more common over time, it was infuriating. The number of times it would just fail to do something I asked it to do 100 times before without issue by responding \"I'm sorry, I can't do that\" was, as the meme says, Too Damn High!\n\nHowever, the last straw for me was during the period sometime after iOS 16 (can't remember exactly which update, but it was after the initial release of version 16), and leading up to the release of iOS 17, when it would consistently insist it wasn't connected to the internet. No amount of factory resets would resolve the issue for more than a day, and eventually even AirPlay would just decide to randomly stop working. I know it wasn't my network because during this period I moved to a new apartment and had to get a whole new network setup, and the issue still persisted.\n\nBy the time iOS 17 rolled around and the bulk of the issues seemed to be over though, I had already fell out of the habit of actually using my HomePod. Worst of all though, I lost trust that it would continue to function reliably. It just continued to sit on my shelf, in silence, for months after iOS 17 seemingly fixed my woes.\n\nThen one day I decided to play some music. Not sure what possessed me to try on that particular day, perhaps I was feeling a bit masochistic, but when I spoke the words, \"Hey Siri, play the new Taylor Swift album,\" I was met with silence. I asked again, still nothing. I tried the old \"turn it off and on again\", and the weird little lightshow it usually does didn't happen. I tried another outlet, and got the same result, and I finally accepted that thus cool-but-infuriating little speaker was dead. I hadn't used it in weeks, and I'd moved furniture around to clean several times in that period so I can only assume I damaged the (I'll repeat; _NON-REMOVABLE_) cable while doing that.\n\nMy first thought was, \"Well, surely I can just buy a replacement cable.\" That is when I learned the hard truth.\n\nMy second thought was, \"Well, I'll just buy a new one.\" So I went to Apple.com, added a nice dark blue HomePod Mini to my cart, and decided that I'd wait.\n\nIt's been a week, the HomePod is still in my cart, and I'm not sure I'll ever hit that checkout button. The truth is, I don't miss it. I'd love a little high-quality speaker to play music and podcasts out of, but it's just not worth the frustration for me. I'd pay at least $100 for a speaker that sounds as good as the HomePod Mini, supports AirPlay, and does not have Siri (or any other virtual assistant). That's the route I'd probably go _if_ I can find something like that, though I'm not crossing my fingers.\n\nSo, RIP to my HomePod Mini, the most infuriating Apple product I've ever used.\n\n[^1]: I use Siri occasionally on my iPhone, and not at all on my Mac or iPad.","src/content/blog/2024/rip-homepod-mini.md","d3efe122fb9807ba",{"html":588,"metadata":589},"\u003Cp>Recently, my HomePod Mini broke. It will no longer even power on at all. I think I may have damaged the \u003Cem>NON-REMOVABLE\u003C/em> cable, perhaps while moving furniture (Im not entirely sure \u003Cem>when\u003C/em> it broke, but Ill get into that), and my options are send it in to Apple for repair or buy a new one. I have zero motivation to do either.\u003C/p>\n\u003Cp>Ive owned my fair share of Apple products over the years, and while most of them have had flaws that got under my skin (but honestly, what product doesnt), none of them have consistently frustrated me as much as the HomePod.\u003C/p>\n\u003Cp>But first, lets start off with the things I like; It looks nice, sounds really good (at least to my ears, but I am admittedly \u003Cem>not\u003C/em> an audiophile), and is just overall a well-made piece of hardware - non-removable power cable notwithstanding.\u003C/p>\n\u003Cp>However, all of that is totally undone by the software. Specifically, Siri.\u003C/p>\n\u003Cp>I never really understood the complains people had about Siri before I had a HomePod. Probably because I never really used Siri regularly on my other devices.\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup> But Siri is the primary way you interact with the HomePod. Sure you can just AirPlay some music to it from your phone, but its, at least in theory, easier to say “Hey Siri, play some music” and have it intelligently play a selection of music that fits your tastes.\u003C/p>\n\u003Cp>When it worked, it was amazing. But when it didnt, which slowly became more and more common over time, it was infuriating. The number of times it would just fail to do something I asked it to do 100 times before without issue by responding “Im sorry, I cant do that” was, as the meme says, Too Damn High!\u003C/p>\n\u003Cp>However, the last straw for me was during the period sometime after iOS 16 (cant remember exactly which update, but it was after the initial release of version 16), and leading up to the release of iOS 17, when it would consistently insist it wasnt connected to the internet. No amount of factory resets would resolve the issue for more than a day, and eventually even AirPlay would just decide to randomly stop working. I know it wasnt my network because during this period I moved to a new apartment and had to get a whole new network setup, and the issue still persisted.\u003C/p>\n\u003Cp>By the time iOS 17 rolled around and the bulk of the issues seemed to be over though, I had already fell out of the habit of actually using my HomePod. Worst of all though, I lost trust that it would continue to function reliably. It just continued to sit on my shelf, in silence, for months after iOS 17 seemingly fixed my woes.\u003C/p>\n\u003Cp>Then one day I decided to play some music. Not sure what possessed me to try on that particular day, perhaps I was feeling a bit masochistic, but when I spoke the words, “Hey Siri, play the new Taylor Swift album,” I was met with silence. I asked again, still nothing. I tried the old “turn it off and on again”, and the weird little lightshow it usually does didnt happen. I tried another outlet, and got the same result, and I finally accepted that thus cool-but-infuriating little speaker was dead. I hadnt used it in weeks, and Id moved furniture around to clean several times in that period so I can only assume I damaged the (Ill repeat; \u003Cem>NON-REMOVABLE\u003C/em>) cable while doing that.\u003C/p>\n\u003Cp>My first thought was, “Well, surely I can just buy a replacement cable.” That is when I learned the hard truth.\u003C/p>\n\u003Cp>My second thought was, “Well, Ill just buy a new one.” So I went to Apple.com, added a nice dark blue HomePod Mini to my cart, and decided that Id wait.\u003C/p>\n\u003Cp>Its been a week, the HomePod is still in my cart, and Im not sure Ill ever hit that checkout button. The truth is, I dont miss it. Id love a little high-quality speaker to play music and podcasts out of, but its just not worth the frustration for me. Id pay at least $100 for a speaker that sounds as good as the HomePod Mini, supports AirPlay, and does not have Siri (or any other virtual assistant). Thats the route Id probably go \u003Cem>if\u003C/em> I can find something like that, though Im not crossing my fingers.\u003C/p>\n\u003Cp>So, RIP to my HomePod Mini, the most infuriating Apple product Ive ever used.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>I use Siri occasionally on my iPhone, and not at all on my Mac or iPad. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":590,"localImagePaths":592,"remoteImagePaths":593,"frontmatter":594,"imagePaths":597},[591],{"depth":292,"slug":293,"text":294},[],[],{"title":581,"pubDate":595,"tags":596},"5/2/24",[18],[],"2023/baldurs-gate-3-feels",{"id":598,"data":600,"body":604,"filePath":605,"digest":606,"rendered":607},{"title":601,"pubDate":602,"tags":603},"Baldur's Gate 3, and Lots of Feels About Video Games",["Date","2023-11-01T04:00:00.000Z"],[178,41],"2023 has been insane for games. We've seen such an influx of quality titles that it's been hard to even keep track, or even dedicate the time to the ones I have been able to keep track of. One of the two games that has really captured my attention the other being Tears of the Kingdom is Baldur's Gate 3.\n\nIve typically have had a difficult time getting invested in deep, Western-made RPGs, with the notable exception of The Witcher 3. The specific sub-genre that Baldurs Gate 3 belongs to, the CRPG (or, Computer Role Playing Game) has been particularly challenging for me to latch on to.\n\nAround late-2020 or early-2021 I started playing Dungeons and Dragons remotely with a couple internet friends. It was in the midst of Covid, so we all had too much time to kill, and would spend a good chunk of our Sundays adventuring across the Forgotten Realms. Id played D&D before, but it wasnt something I really got into until that point.\n\nIf I didnt have this experience I dont think I would have been open to playing Baldurs Gate. Because its mechanics are based on the same D&D rules I had spent hours immersed in every Sunday for nearly a year, I was going into the game already knowing the mechanics I usually find overwhelming and obtuse in these types of games.\n\nFor my first playthrough, I decided to port my wood elf ranger, the character I played as in the aforementioned remote D&D campaigns. I tried to recreate him as closely as the game allowed Baldurs Gate 3 actually uses a slightly modified version of the current D&D ruleset and tried to role-play him the same. Basically my head canon was, after his previous adventures, he was thrust into this story.\n\nI never actually finished this playthrough. I got to the final story quest and decided to start over, Id made so many mistakes, missed out on 3 major companions (Wyll, Karlach, and Halsin), and was only just getting comfortable with the freedom the game offers. Maybe someday Ill finish my plucky wood elfs journey, but until then...\n\nFor my second character, I chose to play as the Dark Urge. Unlike a purely custom character like I used for my first playthrough, the Dark Urge is not a blank slate, and has a story that interlinks with the games overall story.\n\nFor the Dark Urge I went with a human rogue, and Ive had a lot more fun leaning into the games mechanics this time around. Shes basically a badass assassin, a master of deception, who disguises herself using this magical mask which I got as part of the deluxe edition to reach her targets.\n\nThis subtly altered my approach to the game in more ways than I had anticipated. For instance, during the early stages of the game, there's a quest to infiltrate a goblin camp and eliminate their three leaders. On both occasions, I successfully gained entry by persuading the goblins that I belonged to the nefarious cult that plays a significant role in the story. The first attempt required passing a series of deception checks, while during the second attempt, I employed the aforementioned magical mask to transform my character into a Drow a race of dark elves allowing me to waltz right into the camp.\n\nCarrying out the quest to take out the 3 goblin leaders played out quite a bit differently, at least on a mechanical level. The first time around I went in guns (er, arrows) blazing to take out the first 2 leaders, and then somehow convincing the 3rd I was on her side, leading her to a Druid grove, and having an all-out battle.\n\nThe second time I took full advantage of my partys range of capabilities at that point, as well as the environment, to ambush the 3 leaders and get out with as little damage to my team as possible. I had a much easier time using this method, but it was so much more fulfilling to pull off. It didnt feel cheap because I wasnt cheesing the mechanics, I was figuring out how to best use them to my advantage.\n\nOn the surface, Baldurs Gate 3 seems to share very little in common with Tears of the Kingdom, but I think it has enraptured me in much the same way. Both games not only allow you to push their mechanics to the limit to find your own solutions to the challenges they present you, but they make doing so extremely rewarding. These are games that are at their best when you think outside the box and get creative with the tools they give you.\n\nLast year I wrote about [my 3 favorite games of 2022](/posts/2022/my-top-3-games-of-2022) with the intention of doing a similar thing this year, but I dont think I can. Ive played a few games that could be the 3rd game in a potential “3 Favorite Games of 2023”, Sea of Stars, Spider-Man 2, and Star Wars: Jedi Survivor come to mind, and while theyre all very good games worthy of the spot, they just didn't come close to impacting me in the same way.\n\nTears of the Kingdom [gave me a place to feel at home](/posts/2023/finding-home-in-hyrule) at a time when I felt out of place after moving apartments. Baldurs Gate 3 has given me a sense of camaraderie, albeit a virtual one, in a point in my life when Ive been feeling alone and lost trying to find myself in a new city. No other game Ive played this year has been a fraction as meaningful as these two have been.","src/content/blog/2023/baldurs-gate-3-feels.md","8e61cb1d5d95716f",{"html":608,"metadata":609},"\u003Cp>2023 has been insane for games. Weve seen such an influx of quality titles that its been hard to even keep track, or even dedicate the time to the ones I have been able to keep track of. One of the two games that has really captured my attention the other being Tears of the Kingdom is Baldurs Gate 3.\u003C/p>\n\u003Cp>Ive typically have had a difficult time getting invested in deep, Western-made RPGs, with the notable exception of The Witcher 3. The specific sub-genre that Baldurs Gate 3 belongs to, the CRPG (or, Computer Role Playing Game) has been particularly challenging for me to latch on to.\u003C/p>\n\u003Cp>Around late-2020 or early-2021 I started playing Dungeons and Dragons remotely with a couple internet friends. It was in the midst of Covid, so we all had too much time to kill, and would spend a good chunk of our Sundays adventuring across the Forgotten Realms. Id played D&D before, but it wasnt something I really got into until that point.\u003C/p>\n\u003Cp>If I didnt have this experience I dont think I would have been open to playing Baldurs Gate. Because its mechanics are based on the same D&D rules I had spent hours immersed in every Sunday for nearly a year, I was going into the game already knowing the mechanics I usually find overwhelming and obtuse in these types of games.\u003C/p>\n\u003Cp>For my first playthrough, I decided to port my wood elf ranger, the character I played as in the aforementioned remote D&D campaigns. I tried to recreate him as closely as the game allowed Baldurs Gate 3 actually uses a slightly modified version of the current D&D ruleset and tried to role-play him the same. Basically my head canon was, after his previous adventures, he was thrust into this story.\u003C/p>\n\u003Cp>I never actually finished this playthrough. I got to the final story quest and decided to start over, Id made so many mistakes, missed out on 3 major companions (Wyll, Karlach, and Halsin), and was only just getting comfortable with the freedom the game offers. Maybe someday Ill finish my plucky wood elfs journey, but until then…\u003C/p>\n\u003Cp>For my second character, I chose to play as the Dark Urge. Unlike a purely custom character like I used for my first playthrough, the Dark Urge is not a blank slate, and has a story that interlinks with the games overall story.\u003C/p>\n\u003Cp>For the Dark Urge I went with a human rogue, and Ive had a lot more fun leaning into the games mechanics this time around. Shes basically a badass assassin, a master of deception, who disguises herself using this magical mask which I got as part of the deluxe edition to reach her targets.\u003C/p>\n\u003Cp>This subtly altered my approach to the game in more ways than I had anticipated. For instance, during the early stages of the game, theres a quest to infiltrate a goblin camp and eliminate their three leaders. On both occasions, I successfully gained entry by persuading the goblins that I belonged to the nefarious cult that plays a significant role in the story. The first attempt required passing a series of deception checks, while during the second attempt, I employed the aforementioned magical mask to transform my character into a Drow a race of dark elves allowing me to waltz right into the camp.\u003C/p>\n\u003Cp>Carrying out the quest to take out the 3 goblin leaders played out quite a bit differently, at least on a mechanical level. The first time around I went in guns (er, arrows) blazing to take out the first 2 leaders, and then somehow convincing the 3rd I was on her side, leading her to a Druid grove, and having an all-out battle.\u003C/p>\n\u003Cp>The second time I took full advantage of my partys range of capabilities at that point, as well as the environment, to ambush the 3 leaders and get out with as little damage to my team as possible. I had a much easier time using this method, but it was so much more fulfilling to pull off. It didnt feel cheap because I wasnt cheesing the mechanics, I was figuring out how to best use them to my advantage.\u003C/p>\n\u003Cp>On the surface, Baldurs Gate 3 seems to share very little in common with Tears of the Kingdom, but I think it has enraptured me in much the same way. Both games not only allow you to push their mechanics to the limit to find your own solutions to the challenges they present you, but they make doing so extremely rewarding. These are games that are at their best when you think outside the box and get creative with the tools they give you.\u003C/p>\n\u003Cp>Last year I wrote about \u003Ca href=\"/posts/2022/my-top-3-games-of-2022\">my 3 favorite games of 2022\u003C/a> with the intention of doing a similar thing this year, but I dont think I can. Ive played a few games that could be the 3rd game in a potential “3 Favorite Games of 2023”, Sea of Stars, Spider-Man 2, and Star Wars: Jedi Survivor come to mind, and while theyre all very good games worthy of the spot, they just didnt come close to impacting me in the same way.\u003C/p>\n\u003Cp>Tears of the Kingdom \u003Ca href=\"/posts/2023/finding-home-in-hyrule\">gave me a place to feel at home\u003C/a> at a time when I felt out of place after moving apartments. Baldurs Gate 3 has given me a sense of camaraderie, albeit a virtual one, in a point in my life when Ive been feeling alone and lost trying to find myself in a new city. No other game Ive played this year has been a fraction as meaningful as these two have been.\u003C/p>",{"headings":610,"localImagePaths":611,"remoteImagePaths":612,"frontmatter":613,"imagePaths":616},[],[],[],{"title":601,"pubDate":614,"tags":615},"11/1/23",[178,41],[],"2023/default-apps-2023",{"id":617,"data":619,"body":623,"filePath":624,"digest":625,"rendered":626},{"title":620,"pubDate":621,"tags":622},"Default Apps 2023",["Date","2023-11-25T05:00:00.000Z"],[143,18],"Inspired by [this post](https://chriscoyier.net/2023/11/25/default-apps-2023/) from Chris Coyier (which was in turn inpsired by [this post](https://mattcool.tech/posts/default-apps-2023)).\n\nI changed up some of the categories to avoid any entries with \"none\" or \"N/A\".\n\n---\n\n✉️ Mail Client: [Mail.app](https://support.apple.com/guide/mail/welcome/mac)\n\n📮 Mail Server: [Hover](https://www.hover.com/email)\n\n📓 Notes: [Bear](https://bear.app/), [Tot](https://tot.rocks/)\n\n✅ To Do: [Reminders](https://support.apple.com/guide/reminders/welcome/mac)\n\n📷 Photo Shooting: [iPhone 14](https://www.apple.com/shop/buy-iphone/iphone-14)\n\n🎨 Photo Editing: [Affinity Photo](https://affinity.serif.com/en-us/photo/)\n\n📆 Calendar: [Calendar](https://support.apple.com/guide/calendar/welcome/mac), [Dato](https://sindresorhus.com/dato), synced with [Google Calendar](https://calendar.google.com)\n\n☁️ Cloud Storage: [iCloud](https://www.icloud.com/)\n\n📰 RSS: [Reeder](https://www.reederapp.com/), synced with [Inoreeder](https://www.inoreader.com/)\n\n📇 Contacts: [Contacts.app](https://support.apple.com/guide/contacts/welcome/mac)\n\n🌐 Browser: [Safari](https://www.apple.com/safari/) for personal use, [Vivaldi](https://vivaldi.com/?mtm_ad=79027606064265&mtm_kwd=broswers) for work\n\n💬 Chat: [Messages](https://support.apple.com/guide/messages/welcome/mac), [Slack](https://slack.com/), [WhatsApp](https://www.whatsapp.com/)\n\n🔖 Bookmarks: [Anybox](https://anybox.app/)\n\n📑 Read It Later: [Reeder](https://www.reederapp.com/) (synced with [iCloud](https://www.icloud.com/))\n\n📝 Writing & Text Editing: [BBEdit](https://www.barebones.com/products/bbedit/index.html)\n\n📈 Spreadsheets: [Numbers](https://www.apple.com/numbers/)\n\n🪟 Window Management: [Rectangle Pro](https://rectangleapp.com/pro)\n\n🛒 Shopping Lists: [Tot](https://tot.rocks/)\n\n🏋️‍♀️Workout Tracking: [Gentler Streaks](https://www.gentler.app/)\n\n💰 Budgeting: [Numbers](https://www.apple.com/numbers/)\n\n🗞 News: [RSS](https://en.wikipedia.org/wiki/RSS)\n\n🎵 Music: [Apple Music](https://www.apple.com/apple-music/)\n\n🎙 Podcasts: [Overcast](https://overcast.fm/)\n\n🔑 Password Management: [iCloud Keychain](https://support.apple.com/en-us/HT204085)\n\n👨‍💻 Code Editor: [Nova](https://nova.app/), [Xcode](https://developer.apple.com/xcode/), [VSCode](https://code.visualstudio.com/)\n\n🐘 Mastodon Client: [Ivory](https://tapbots.com/ivory/)\n\n### Honorable Mentions\n\n- [Collections](https://collectionsdb.com/) - Personal Database\n- [Vinegar](https://andadinosaur.com/launch-vinegar) - Replaces YouTube player with standard HTML `\u003Cvideo>` tag\n- [Contexts](https://contexts.co/) - \u003Ckbd>⌘\u003C/kbd> + \u003Ckbd>tab\u003C/kbd> replacement","src/content/blog/2023/default-apps-2023.md","02920a3d7bf4c282",{"html":627,"metadata":628},"\u003Cp>Inspired by \u003Ca href=\"https://chriscoyier.net/2023/11/25/default-apps-2023/\">this post\u003C/a> from Chris Coyier (which was in turn inpsired by \u003Ca href=\"https://mattcool.tech/posts/default-apps-2023\">this post\u003C/a>).\u003C/p>\n\u003Cp>I changed up some of the categories to avoid any entries with “none” or “N/A”.\u003C/p>\n\u003Chr>\n\u003Cp>✉️ Mail Client: \u003Ca href=\"https://support.apple.com/guide/mail/welcome/mac\">Mail.app\u003C/a>\u003C/p>\n\u003Cp>📮 Mail Server: \u003Ca href=\"https://www.hover.com/email\">Hover\u003C/a>\u003C/p>\n\u003Cp>📓 Notes: \u003Ca href=\"https://bear.app/\">Bear\u003C/a>, \u003Ca href=\"https://tot.rocks/\">Tot\u003C/a>\u003C/p>\n\u003Cp>✅ To Do: \u003Ca href=\"https://support.apple.com/guide/reminders/welcome/mac\">Reminders\u003C/a>\u003C/p>\n\u003Cp>📷 Photo Shooting: \u003Ca href=\"https://www.apple.com/shop/buy-iphone/iphone-14\">iPhone 14\u003C/a>\u003C/p>\n\u003Cp>🎨 Photo Editing: \u003Ca href=\"https://affinity.serif.com/en-us/photo/\">Affinity Photo\u003C/a>\u003C/p>\n\u003Cp>📆 Calendar: \u003Ca href=\"https://support.apple.com/guide/calendar/welcome/mac\">Calendar\u003C/a>, \u003Ca href=\"https://sindresorhus.com/dato\">Dato\u003C/a>, synced with \u003Ca href=\"https://calendar.google.com\">Google Calendar\u003C/a>\u003C/p>\n\u003Cp>☁️ Cloud Storage: \u003Ca href=\"https://www.icloud.com/\">iCloud\u003C/a>\u003C/p>\n\u003Cp>📰 RSS: \u003Ca href=\"https://www.reederapp.com/\">Reeder\u003C/a>, synced with \u003Ca href=\"https://www.inoreader.com/\">Inoreeder\u003C/a>\u003C/p>\n\u003Cp>📇 Contacts: \u003Ca href=\"https://support.apple.com/guide/contacts/welcome/mac\">Contacts.app\u003C/a>\u003C/p>\n\u003Cp>🌐 Browser: \u003Ca href=\"https://www.apple.com/safari/\">Safari\u003C/a> for personal use, \u003Ca href=\"https://vivaldi.com/?mtm_ad=79027606064265&mtm_kwd=broswers\">Vivaldi\u003C/a> for work\u003C/p>\n\u003Cp>💬 Chat: \u003Ca href=\"https://support.apple.com/guide/messages/welcome/mac\">Messages\u003C/a>, \u003Ca href=\"https://slack.com/\">Slack\u003C/a>, \u003Ca href=\"https://www.whatsapp.com/\">WhatsApp\u003C/a>\u003C/p>\n\u003Cp>🔖 Bookmarks: \u003Ca href=\"https://anybox.app/\">Anybox\u003C/a>\u003C/p>\n\u003Cp>📑 Read It Later: \u003Ca href=\"https://www.reederapp.com/\">Reeder\u003C/a> (synced with \u003Ca href=\"https://www.icloud.com/\">iCloud\u003C/a>)\u003C/p>\n\u003Cp>📝 Writing & Text Editing: \u003Ca href=\"https://www.barebones.com/products/bbedit/index.html\">BBEdit\u003C/a>\u003C/p>\n\u003Cp>📈 Spreadsheets: \u003Ca href=\"https://www.apple.com/numbers/\">Numbers\u003C/a>\u003C/p>\n\u003Cp>🪟 Window Management: \u003Ca href=\"https://rectangleapp.com/pro\">Rectangle Pro\u003C/a>\u003C/p>\n\u003Cp>🛒 Shopping Lists: \u003Ca href=\"https://tot.rocks/\">Tot\u003C/a>\u003C/p>\n\u003Cp>🏋️‍♀️Workout Tracking: \u003Ca href=\"https://www.gentler.app/\">Gentler Streaks\u003C/a>\u003C/p>\n\u003Cp>💰 Budgeting: \u003Ca href=\"https://www.apple.com/numbers/\">Numbers\u003C/a>\u003C/p>\n\u003Cp>🗞 News: \u003Ca href=\"https://en.wikipedia.org/wiki/RSS\">RSS\u003C/a>\u003C/p>\n\u003Cp>🎵 Music: \u003Ca href=\"https://www.apple.com/apple-music/\">Apple Music\u003C/a>\u003C/p>\n\u003Cp>🎙 Podcasts: \u003Ca href=\"https://overcast.fm/\">Overcast\u003C/a>\u003C/p>\n\u003Cp>🔑 Password Management: \u003Ca href=\"https://support.apple.com/en-us/HT204085\">iCloud Keychain\u003C/a>\u003C/p>\n\u003Cp>👨‍💻 Code Editor: \u003Ca href=\"https://nova.app/\">Nova\u003C/a>, \u003Ca href=\"https://developer.apple.com/xcode/\">Xcode\u003C/a>, \u003Ca href=\"https://code.visualstudio.com/\">VSCode\u003C/a>\u003C/p>\n\u003Cp>🐘 Mastodon Client: \u003Ca href=\"https://tapbots.com/ivory/\">Ivory\u003C/a>\u003C/p>\n\u003Ch3 id=\"honorable-mentions\">Honorable Mentions\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://collectionsdb.com/\">Collections\u003C/a> - Personal Database\u003C/li>\n\u003Cli>\u003Ca href=\"https://andadinosaur.com/launch-vinegar\">Vinegar\u003C/a> - Replaces YouTube player with standard HTML \u003Ccode><video>\u003C/code> tag\u003C/li>\n\u003Cli>\u003Ca href=\"https://contexts.co/\">Contexts\u003C/a> - \u003Ckbd>⌘\u003C/kbd> + \u003Ckbd>tab\u003C/kbd> replacement\u003C/li>\n\u003C/ul>",{"headings":629,"localImagePaths":633,"remoteImagePaths":634,"frontmatter":635,"imagePaths":638},[630],{"depth":70,"slug":631,"text":632},"honorable-mentions","Honorable Mentions",[],[],{"title":620,"pubDate":636,"tags":637},"11/25/23",[143,18],[],"2023/handheld-gaming",{"id":639,"data":641,"body":645,"filePath":646,"digest":647,"rendered":648},{"title":642,"pubDate":643,"tags":644},"Handheld Gaming",["Date","2023-01-07T00:00:00.000Z"],[178],"I dont know if its the particular mood Ive been in, the colder weather, or some combination of the 2, but something about cozying up with a handheld game console has been incredibly appealing lately. My PS5 sits under my TV, streaming the occasional movie or show, and begging me to jump into that Witcher 3 update, or continue playing Tales of Arise. Meanwhile, my Switch Lite is getting all the love.\n\nGenerally speaking, I feel like Ive logged most of the game time over the course of my life on a handheld of some kind, from my GameBoy Pocket, all the way up to the Switch Lite. The first console I ever bought with my own money was a GameBoy Advance SP. Portable gaming is in my blood! (Ok, maybe thats a touch dramatic…)\n\nThats not to say I didnt ever play home consoles. Ive had every Nintendo system since the SNESyup, that includes the Wii Uand got into PlayStation around the mid-PS3 era.\n\nThe thing is, my parents were divorced by the time I was into gaming, and the home consoles lived at my dads house. But I spent a majority of my childhood at my moms, and she didnt want those things around, and I was only allowed to have my GameBoy. To this day, Im not sure why that was. Maybe because she found it less annoying.\n\nGrowing up, console games were a treat I got on the weekend, so most of my afternoons after school were spent playing Pokémon, Super Mario Land 2, Links Awakening, and others that I could take this whole blog post listing.\n\nI had some big gaming firsts on handhelds; My first RPG? Pokémon Red. My first Final Fantasy? Final Fantasy IV Advance. My first Zelda? The aforementioned Links Awakening. The first game I put 100+ hours into? Pokémon Silver.\n\nHandheld gaming even kept me sane during lockdown in 2020. Lets not talk about how many hours I logged in Animal Crossing and Fire Emblem Three Houses I logged during that time. Yeah I played some console gamesnotably, I replayed and re-completed Horizon Zero Dawnbut I practically wore out my original Switch Lite that year.\n\nMaybe theres something nostalgic about handheld gaming that draws me in when I just want to get cozy, even if Im playing a newer game that Im not necessarily nostalgic for. Maybe my brain gets tired of the flashy, blockbuster-level graphics of home consoles, and just longs for something simpler.\n\nWhatever the case, my biggest trivial fear in life is handheld gaming going away, because mobile games do not cut it at all.","src/content/blog/2023/handheld-gaming.md","378580903305b18d",{"html":649,"metadata":650},"\u003Cp>I dont know if its the particular mood Ive been in, the colder weather, or some combination of the 2, but something about cozying up with a handheld game console has been incredibly appealing lately. My PS5 sits under my TV, streaming the occasional movie or show, and begging me to jump into that Witcher 3 update, or continue playing Tales of Arise. Meanwhile, my Switch Lite is getting all the love.\u003C/p>\n\u003Cp>Generally speaking, I feel like Ive logged most of the game time over the course of my life on a handheld of some kind, from my GameBoy Pocket, all the way up to the Switch Lite. The first console I ever bought with my own money was a GameBoy Advance SP. Portable gaming is in my blood! (Ok, maybe thats a touch dramatic…)\u003C/p>\n\u003Cp>Thats not to say I didnt ever play home consoles. Ive had every Nintendo system since the SNESyup, that includes the Wii Uand got into PlayStation around the mid-PS3 era.\u003C/p>\n\u003Cp>The thing is, my parents were divorced by the time I was into gaming, and the home consoles lived at my dads house. But I spent a majority of my childhood at my moms, and she didnt want those things around, and I was only allowed to have my GameBoy. To this day, Im not sure why that was. Maybe because she found it less annoying.\u003C/p>\n\u003Cp>Growing up, console games were a treat I got on the weekend, so most of my afternoons after school were spent playing Pokémon, Super Mario Land 2, Links Awakening, and others that I could take this whole blog post listing.\u003C/p>\n\u003Cp>I had some big gaming firsts on handhelds; My first RPG? Pokémon Red. My first Final Fantasy? Final Fantasy IV Advance. My first Zelda? The aforementioned Links Awakening. The first game I put 100+ hours into? Pokémon Silver.\u003C/p>\n\u003Cp>Handheld gaming even kept me sane during lockdown in 2020. Lets not talk about how many hours I logged in Animal Crossing and Fire Emblem Three Houses I logged during that time. Yeah I played some console gamesnotably, I replayed and re-completed Horizon Zero Dawnbut I practically wore out my original Switch Lite that year.\u003C/p>\n\u003Cp>Maybe theres something nostalgic about handheld gaming that draws me in when I just want to get cozy, even if Im playing a newer game that Im not necessarily nostalgic for. Maybe my brain gets tired of the flashy, blockbuster-level graphics of home consoles, and just longs for something simpler.\u003C/p>\n\u003Cp>Whatever the case, my biggest trivial fear in life is handheld gaming going away, because mobile games do not cut it at all.\u003C/p>",{"headings":651,"localImagePaths":652,"remoteImagePaths":653,"frontmatter":654,"imagePaths":657},[],[],[],{"title":642,"pubDate":655,"tags":656},"2023-01-07",[178],[],"2023/journal-app-impressions",{"id":658,"data":660,"body":664,"filePath":665,"digest":666,"rendered":667},{"title":661,"pubDate":662,"tags":663},"Apple's Journal App: First Impressions",["Date","2023-11-12T05:00:00.000Z"],[18,143,41],"With the upcoming iOS 17.2 update, well finally get our hands on the new Journal app Apple announced at WWDC earlier this year. I decided to be brave and install the public beta so I could take a look and get some first impressions. As someone with mental health struggles, I appreciate the recent efforts Apple has put into making these kinds of features available, so I was really excited to take a look at this latest addition.\n\nFirst off, I like the simplicity of the interface. It doesnt have much going on, and I think thats a point in its favor. You can open the app and get journaling right away. It even offers you journaling prompt which is excellent for those like me who are not always sure what to write about. [^1]\n\nIt doesnt have the bells and whistles an app like Day One has, but when it comes to writing a journal entry youre given the option to add photos, location, and even an audio recording. Its pretty barebones, but I think thats ok. The one thing I would like is the ability to tie into the mood tracking on Apple Watch and either be able to set your current mood from the app, or tie mood tracking into the Journaling Suggestions feature.\n\nSpeaking of, I actually dont have much to say about the Journaling Suggestions feature. At the moment it can only suggest journaling based on your workouts, music and podcasts, messages and calls you make, your photos, and significant locations. Thats not at all how I like to journal, so I actually have those turned off. Apparently theres an API that 3rd party apps can use, but we wont see what that will bring until iOS 17.2 officially comes out later this year.\n\nSome other things I like are the ability to lock your journal with its own password, which I think is an absolute must for this kind of app, and the ability to set a journal schedule, which is nice for helping to build or rebuild a regular journaling habit.\n\nThe one thing I do not like, and this could be the dealbreaker for me, is that, at the moment, Journal is iPhone only. No iPad, no Mac, just iPhone. This severely limits its usability for me, I generally do not like writing anything more than a sentence or 2 on an iPhone. It really needs to be available on all Apples platforms and Im puzzled that it isnt. Even just making it available on iPad would be acceptable, but as it stands now I dont think I can make use of it.\n\n[^1]: Shameless plug: I built [a webpage to solve this very problem](https://www.journal-prompt.com).","src/content/blog/2023/journal-app-impressions.md","5e466d3aa46de587",{"html":668,"metadata":669},"\u003Cp>With the upcoming iOS 17.2 update, well finally get our hands on the new Journal app Apple announced at WWDC earlier this year. I decided to be brave and install the public beta so I could take a look and get some first impressions. As someone with mental health struggles, I appreciate the recent efforts Apple has put into making these kinds of features available, so I was really excited to take a look at this latest addition.\u003C/p>\n\u003Cp>First off, I like the simplicity of the interface. It doesnt have much going on, and I think thats a point in its favor. You can open the app and get journaling right away. It even offers you journaling prompt which is excellent for those like me who are not always sure what to write about. \u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>\u003C/p>\n\u003Cp>It doesnt have the bells and whistles an app like Day One has, but when it comes to writing a journal entry youre given the option to add photos, location, and even an audio recording. Its pretty barebones, but I think thats ok. The one thing I would like is the ability to tie into the mood tracking on Apple Watch and either be able to set your current mood from the app, or tie mood tracking into the Journaling Suggestions feature.\u003C/p>\n\u003Cp>Speaking of, I actually dont have much to say about the Journaling Suggestions feature. At the moment it can only suggest journaling based on your workouts, music and podcasts, messages and calls you make, your photos, and significant locations. Thats not at all how I like to journal, so I actually have those turned off. Apparently theres an API that 3rd party apps can use, but we wont see what that will bring until iOS 17.2 officially comes out later this year.\u003C/p>\n\u003Cp>Some other things I like are the ability to lock your journal with its own password, which I think is an absolute must for this kind of app, and the ability to set a journal schedule, which is nice for helping to build or rebuild a regular journaling habit.\u003C/p>\n\u003Cp>The one thing I do not like, and this could be the dealbreaker for me, is that, at the moment, Journal is iPhone only. No iPad, no Mac, just iPhone. This severely limits its usability for me, I generally do not like writing anything more than a sentence or 2 on an iPhone. It really needs to be available on all Apples platforms and Im puzzled that it isnt. Even just making it available on iPad would be acceptable, but as it stands now I dont think I can make use of it.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Shameless plug: I built \u003Ca href=\"https://www.journal-prompt.com\">a webpage to solve this very problem\u003C/a>. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":670,"localImagePaths":672,"remoteImagePaths":673,"frontmatter":674,"imagePaths":677},[671],{"depth":292,"slug":293,"text":294},[],[],{"title":661,"pubDate":675,"tags":676},"11/12/23",[18,143,41],[],"2023/finding-home-in-hyrule",{"id":678,"data":680,"body":684,"filePath":685,"digest":686,"rendered":687},{"title":681,"pubDate":682,"tags":683},"Finding Home in Hyrule",["Date","2023-05-22T04:00:00.000Z"],[178,41],"5 years ago I underwent a big change in my life, my girlfriend of 8 years and I split up. One of the things that got me through that particularly tough change was a little game called The Legend of Zelda: Breath of the Wild. I had played it the year previous on the Wii U, but I had finally upgraded to the Switch and was in the middle of my second play through when it all went down. I would spend a couple hours every day just aimlessly wandering around Hyrule, it made me feel a strange comfort. My sadness about the situation I found myself in melted away whenever I took these little virtual treks across the map, finding little nooks and crannies Id never seen before.\n\nFast forward to last week, and I underwent another drastic life change; I moved from the apartment Ive lived in for most of my adult life to a totally new place in a totally new city. I was, and still am, overwhelmed, homesick, and questioning all my decisions that led me to this point. Coincidentally, a little game called The Legend of Zelda Tears of the Kingdom dropped the day before I was to embark on this IRL adventure.\n\nMy first night in the new place involved staying up well past midnight diving into Hyrule once again, but this time it brought be a different kind of comfort. Fortuitously for me, Nintendo decided to reuse the world map from the previous game and just build upon it, and that has made this game feel a lot like coming home to me. Hyrule was a world that got me through a rough point in my life, and here it is again giving me a little taste of familiarity, of home, at a time when I need it the most.\n\nLast night I made a point to find a place Hateno Village, a town where you can buy a little house in Breath of the Wild. I wanted to visit it again, and see what had become of this virtual home-away-from-home. So, over the course of the evening I made my journey, and eventually came to the little house, sitting there at the edge of the village. I walked inside, and, for the first time in a week, I felt at home.","src/content/blog/2023/finding-home-in-hyrule.md","cbba225ac107c916",{"html":688,"metadata":689},"\u003Cp>5 years ago I underwent a big change in my life, my girlfriend of 8 years and I split up. One of the things that got me through that particularly tough change was a little game called The Legend of Zelda: Breath of the Wild. I had played it the year previous on the Wii U, but I had finally upgraded to the Switch and was in the middle of my second play through when it all went down. I would spend a couple hours every day just aimlessly wandering around Hyrule, it made me feel a strange comfort. My sadness about the situation I found myself in melted away whenever I took these little virtual treks across the map, finding little nooks and crannies Id never seen before.\u003C/p>\n\u003Cp>Fast forward to last week, and I underwent another drastic life change; I moved from the apartment Ive lived in for most of my adult life to a totally new place in a totally new city. I was, and still am, overwhelmed, homesick, and questioning all my decisions that led me to this point. Coincidentally, a little game called The Legend of Zelda Tears of the Kingdom dropped the day before I was to embark on this IRL adventure.\u003C/p>\n\u003Cp>My first night in the new place involved staying up well past midnight diving into Hyrule once again, but this time it brought be a different kind of comfort. Fortuitously for me, Nintendo decided to reuse the world map from the previous game and just build upon it, and that has made this game feel a lot like coming home to me. Hyrule was a world that got me through a rough point in my life, and here it is again giving me a little taste of familiarity, of home, at a time when I need it the most.\u003C/p>\n\u003Cp>Last night I made a point to find a place Hateno Village, a town where you can buy a little house in Breath of the Wild. I wanted to visit it again, and see what had become of this virtual home-away-from-home. So, over the course of the evening I made my journey, and eventually came to the little house, sitting there at the edge of the village. I walked inside, and, for the first time in a week, I felt at home.\u003C/p>",{"headings":690,"localImagePaths":691,"remoteImagePaths":692,"frontmatter":693,"imagePaths":696},[],[],[],{"title":681,"pubDate":694,"tags":695},"5/22/23",[178,41],[],"2023/nostalgia",{"id":697,"data":699,"body":704,"filePath":705,"digest":706,"rendered":707},{"title":700,"pubDate":701,"tags":702},"Nostalgia",["Date","2023-03-04T00:00:00.000Z"],[17,178,703],"Movies & TV","I've recently been playing 2 games that would be considered \"retro\", but referring to them as such would make me feel old, so we'll call them \"classics\". These classics are Metroid Prime, via the recent remaster on Switch, and The Legend of Zelda: The Minish Cap, via the Switch Online GameBoy Advance collection. It got me thinking about how nostalgia can color our opinions of certain pieces of media, primarily when comparing media of a similar vintage.\n\nMetroid Prime originally came out on the GameCube in 2002, my the extent of my knowledge of the series was via Samus in Super Smash Bros, and I never played the game until the Wii version, which I hated due to the controls.\n\nTo contrast, Minish Cap came out on the GameBoy Advance in 2004, and I've been a Zelda fan since Link's Awakening DX on the GameBoy Color. I played this game to death when it released, and spent countless hours searching the (admittedly small) game world seeking out secrets and collectables.\n\nThese 2 games are both well-regarded and loved among their respective fans. Both of them are quality, well-made games in their own right. But I've found myself enjoying the time I've spent replaying Minish Cap more than my time experiencing much of Metroid Prime for the first time. Is Minish Cap just more my style of game? Could it just be a better game? Or maybe my nostalgia is influencing my opinions.\n\nThere's also the fact that my first experience with the Wii version of Metroid Prime was suboptimal. Could that be coloring my opinion of the Switch version, even though none of the issues I had on the Wii existor, more accurately, they are not mandatory, as motion controls can be turned on in the game's settings.\n\nThis kind of thing isn't exclusive to video games. As a child of the 90's I grew up in the so-called \"Disney Renaissance\" and, as I've been re-exploring that era thanks to Disney Plus, I've found myself gravitating towards certain movies. Aladdin, Lion King, Mulan, Pocahontas, the Disney films I watched the most growing up, were the ones I enjoyed the most. And I found myself wholly uninterested in The Little Mermaid, Beauty and the Beast, Tarzan, or Hercules. None of this is a reflection on the quality of these movies. My feelings about them are entirely down to the ones I remember watching the most, the ones I could picture in my head as clear as day.\n\nMaybe, objectively speaking, Metroid Prime is a better game than Minish Cap. I'm sure there are many people who would be insisting that's the case, and many others who would argue the opposite. But I don't know if trying to settle that, or similar debates, would be all that productive. Whether we're talking Nintendo games from the early 2000's, or Disney movies from the 1990's, their perceived quality is wholly determined by how they made us feel when we first experienced them.\n\nPerhaps asking someone today, someone who has yet to experience either game, to play both Minish Cap and Metroid Prime and pick their favorite of the 2 would produce some useful insight. But on the other hand, would their opinions be colored by the ever-evolving experiences games have produced over the last 20 years? Someone who played Breath of the Wild before experiencing Minish Cap for the first time is going to experience the game differently than someone who played it back in 2004.\n\nAdmittedly, as someone who un-ironically enjoys Star Wars Episode IIpurely due to nostalgia, even though I can recognize and point out the movies many flawsI'm perhaps not the best person to examine nostalgia vs. objective quality.","src/content/blog/2023/nostalgia.md","02495bfc28d1a357",{"html":708,"metadata":709},"\u003Cp>Ive recently been playing 2 games that would be considered “retro”, but referring to them as such would make me feel old, so well call them “classics”. These classics are Metroid Prime, via the recent remaster on Switch, and The Legend of Zelda: The Minish Cap, via the Switch Online GameBoy Advance collection. It got me thinking about how nostalgia can color our opinions of certain pieces of media, primarily when comparing media of a similar vintage.\u003C/p>\n\u003Cp>Metroid Prime originally came out on the GameCube in 2002, my the extent of my knowledge of the series was via Samus in Super Smash Bros, and I never played the game until the Wii version, which I hated due to the controls.\u003C/p>\n\u003Cp>To contrast, Minish Cap came out on the GameBoy Advance in 2004, and Ive been a Zelda fan since Links Awakening DX on the GameBoy Color. I played this game to death when it released, and spent countless hours searching the (admittedly small) game world seeking out secrets and collectables.\u003C/p>\n\u003Cp>These 2 games are both well-regarded and loved among their respective fans. Both of them are quality, well-made games in their own right. But Ive found myself enjoying the time Ive spent replaying Minish Cap more than my time experiencing much of Metroid Prime for the first time. Is Minish Cap just more my style of game? Could it just be a better game? Or maybe my nostalgia is influencing my opinions.\u003C/p>\n\u003Cp>Theres also the fact that my first experience with the Wii version of Metroid Prime was suboptimal. Could that be coloring my opinion of the Switch version, even though none of the issues I had on the Wii existor, more accurately, they are not mandatory, as motion controls can be turned on in the games settings.\u003C/p>\n\u003Cp>This kind of thing isnt exclusive to video games. As a child of the 90s I grew up in the so-called “Disney Renaissance” and, as Ive been re-exploring that era thanks to Disney Plus, Ive found myself gravitating towards certain movies. Aladdin, Lion King, Mulan, Pocahontas, the Disney films I watched the most growing up, were the ones I enjoyed the most. And I found myself wholly uninterested in The Little Mermaid, Beauty and the Beast, Tarzan, or Hercules. None of this is a reflection on the quality of these movies. My feelings about them are entirely down to the ones I remember watching the most, the ones I could picture in my head as clear as day.\u003C/p>\n\u003Cp>Maybe, objectively speaking, Metroid Prime is a better game than Minish Cap. Im sure there are many people who would be insisting thats the case, and many others who would argue the opposite. But I dont know if trying to settle that, or similar debates, would be all that productive. Whether were talking Nintendo games from the early 2000s, or Disney movies from the 1990s, their perceived quality is wholly determined by how they made us feel when we first experienced them.\u003C/p>\n\u003Cp>Perhaps asking someone today, someone who has yet to experience either game, to play both Minish Cap and Metroid Prime and pick their favorite of the 2 would produce some useful insight. But on the other hand, would their opinions be colored by the ever-evolving experiences games have produced over the last 20 years? Someone who played Breath of the Wild before experiencing Minish Cap for the first time is going to experience the game differently than someone who played it back in 2004.\u003C/p>\n\u003Cp>Admittedly, as someone who un-ironically enjoys Star Wars Episode IIpurely due to nostalgia, even though I can recognize and point out the movies many flawsIm perhaps not the best person to examine nostalgia vs. objective quality.\u003C/p>",{"headings":710,"localImagePaths":711,"remoteImagePaths":712,"frontmatter":713,"imagePaths":716},[],[],[],{"title":700,"pubDate":714,"tags":715},"2023-03-04",[17,178,703],[],"2023/my-favorite-little-apps-part-2",{"id":717,"data":719,"body":723,"filePath":724,"digest":725,"rendered":726},{"title":720,"pubDate":721,"tags":722},"My Favorite Little Apps, Part 2",["Date","2023-01-21T00:00:00.000Z"],[119,143],"A few months ago, I wrote about [my favorite little Mac apps](/posts/2022/my-favorite-little-apps). This post was originally published on my portfolio blog (which I have since merged with this one), so it had more of a focus on web development and productivity, so I wanted to write up a part 2 with more general-use apps I use frequently.\n\n### Vinegar\n\nI use YouTube a lot, but I hate their video player, and the constant ads are obnoxious (nothing is worse than watching a dev tutorial and having it get interrupted by an ad for Wix). Vinegar is a Safari extension that replaces the YouTube player with a standard HTML 5 player, and blocks ads. It's made YouTube so much more enjoyable to use on both my Mac and iOS devices. I suggest getting it in a bundle with Baking Soda, which replaces custom video players on other websites with standard HTML 5 players.\n\n[Buy Here](https://apps.apple.com/us/app-bundle/fizzy-water-bundle/id1601247237)\n\n### Rocket\n\nRocket gives you quick and easy access to the full swath of Emoji with a simple search function you can either access via the menu bar, or in any text field via a trigger key (for example, Rocket pops up when I type `::`). And that's just the free version! With the pro version, you can store and search custom text snippets, ASCII art, images, and even gifs. Furthermore, you can search various symbols and glyphs like ↺, ◆, ∭, etc...\n\n[Download/Buy Here](https://matthewpalmer.net/rocket/)\n\n### QLMarkdown\n\nI do 90% of my writing in Markdown (heck, this blog is just a collection of Markdown files), and I wanted to see if there was a way to preview Markdown in QuickLook. After some searching, I found QLMarkdown! While it is an app you install to your Applications folder, it is primarily a QuickLook plugin that will display any `.md` file as a fully styled Markdown preview. The app itself is simply a interface to change various settings for how you want the preview to look and function. Best of all, it's open source!\n\n[Download Here](https://github.com/toland/qlmarkdown/releases)\n\nOr, if you use Homebrew, you can install it with `brew install --cask qlmarkdown`.\n\n### Keka\n\nEven though MacOS handles ZIP files, and other similar formats, it does have some limitations. I used the Unarchiver for many years, but I recently discovered Keka. I find it to be faster, and has a lot more options for compression and encyption if you're into that.\n\n[Download Here](https://www.keka.io/en/)","src/content/blog/2023/my-favorite-little-apps-part-2.md","d010e1b1a6fe4e97",{"html":727,"metadata":728},"\u003Cp>A few months ago, I wrote about \u003Ca href=\"/posts/2022/my-favorite-little-apps\">my favorite little Mac apps\u003C/a>. This post was originally published on my portfolio blog (which I have since merged with this one), so it had more of a focus on web development and productivity, so I wanted to write up a part 2 with more general-use apps I use frequently.\u003C/p>\n\u003Ch3 id=\"vinegar\">Vinegar\u003C/h3>\n\u003Cp>I use YouTube a lot, but I hate their video player, and the constant ads are obnoxious (nothing is worse than watching a dev tutorial and having it get interrupted by an ad for Wix). Vinegar is a Safari extension that replaces the YouTube player with a standard HTML 5 player, and blocks ads. Its made YouTube so much more enjoyable to use on both my Mac and iOS devices. I suggest getting it in a bundle with Baking Soda, which replaces custom video players on other websites with standard HTML 5 players.\u003C/p>\n\u003Cp>\u003Ca href=\"https://apps.apple.com/us/app-bundle/fizzy-water-bundle/id1601247237\">Buy Here\u003C/a>\u003C/p>\n\u003Ch3 id=\"rocket\">Rocket\u003C/h3>\n\u003Cp>Rocket gives you quick and easy access to the full swath of Emoji with a simple search function you can either access via the menu bar, or in any text field via a trigger key (for example, Rocket pops up when I type \u003Ccode>::\u003C/code>). And thats just the free version! With the pro version, you can store and search custom text snippets, ASCII art, images, and even gifs. Furthermore, you can search various symbols and glyphs like ↺, ◆, ∭, etc…\u003C/p>\n\u003Cp>\u003Ca href=\"https://matthewpalmer.net/rocket/\">Download/Buy Here\u003C/a>\u003C/p>\n\u003Ch3 id=\"qlmarkdown\">QLMarkdown\u003C/h3>\n\u003Cp>I do 90% of my writing in Markdown (heck, this blog is just a collection of Markdown files), and I wanted to see if there was a way to preview Markdown in QuickLook. After some searching, I found QLMarkdown! While it is an app you install to your Applications folder, it is primarily a QuickLook plugin that will display any \u003Ccode>.md\u003C/code> file as a fully styled Markdown preview. The app itself is simply a interface to change various settings for how you want the preview to look and function. Best of all, its open source!\u003C/p>\n\u003Cp>\u003Ca href=\"https://github.com/toland/qlmarkdown/releases\">Download Here\u003C/a>\u003C/p>\n\u003Cp>Or, if you use Homebrew, you can install it with \u003Ccode>brew install --cask qlmarkdown\u003C/code>.\u003C/p>\n\u003Ch3 id=\"keka\">Keka\u003C/h3>\n\u003Cp>Even though MacOS handles ZIP files, and other similar formats, it does have some limitations. I used the Unarchiver for many years, but I recently discovered Keka. I find it to be faster, and has a lot more options for compression and encyption if youre into that.\u003C/p>\n\u003Cp>\u003Ca href=\"https://www.keka.io/en/\">Download Here\u003C/a>\u003C/p>",{"headings":729,"localImagePaths":742,"remoteImagePaths":743,"frontmatter":744,"imagePaths":747},[730,733,736,739],{"depth":70,"slug":731,"text":732},"vinegar","Vinegar",{"depth":70,"slug":734,"text":735},"rocket","Rocket",{"depth":70,"slug":737,"text":738},"qlmarkdown","QLMarkdown",{"depth":70,"slug":740,"text":741},"keka","Keka",[],[],{"title":720,"pubDate":745,"tags":746},"2023-01-21",[119,143],[],"2023/on-using-chat-gpt",{"id":748,"data":750,"body":754,"filePath":755,"digest":756,"rendered":757},{"title":751,"pubDate":752,"tags":753},"Quick Thoughts On Using Chat GPT as a Coding Assistant",["Date","2023-04-30T04:00:00.000Z"],[226,283],"When I was learning to code, the line my tutor kept repeating was, “Half of programming is knowing how to use Google.” That can be pretty much boiled down to half of programming is knowing how to look things up, whether thats in a book, online, or with a language model. You cant know everything there is to know about programming, so you have to be good at looking things up when you dont have the answer to a problem, and you have to be able to do it effectively with whatever tool\n\nFor the last several weeks Ive been using ChatGPT in lieu of Google for looking up code examples when Im stuck on a problem at work, or when working on side-projects. Its been hugely beneficial to my productivity and workflow, but its not perfect.\n\nGoing in you need to have enough knowledge to be able to call it on its BS. Ive found ChatGPT will get things wrong, give you code that maybe doesnt quite do what youre looking for, or sometimes try to get you to use non-existent or deprecated packages or language features.\n\nEspecially when Im going in trying to learn something new, whether its a web technology Im not experienced in, or trying to [learn Swift from scratch](/posts/2023/reflecting-on-building-my-first-app), Ive found it helpful to go in at least knowing what Im looking for. That means reading documentation, and trying a few things out on my own. If Im stuck, or if the documentation has poor or non-existent sample code (looking at you Apple), Ill use ChatGPT to generate some generic starter code I can use as a jumping off point.","src/content/blog/2023/on-using-chat-gpt.md","d0468670ada28309",{"html":758,"metadata":759},"\u003Cp>When I was learning to code, the line my tutor kept repeating was, “Half of programming is knowing how to use Google.” That can be pretty much boiled down to half of programming is knowing how to look things up, whether thats in a book, online, or with a language model. You cant know everything there is to know about programming, so you have to be good at looking things up when you dont have the answer to a problem, and you have to be able to do it effectively with whatever tool\u003C/p>\n\u003Cp>For the last several weeks Ive been using ChatGPT in lieu of Google for looking up code examples when Im stuck on a problem at work, or when working on side-projects. Its been hugely beneficial to my productivity and workflow, but its not perfect.\u003C/p>\n\u003Cp>Going in you need to have enough knowledge to be able to call it on its BS. Ive found ChatGPT will get things wrong, give you code that maybe doesnt quite do what youre looking for, or sometimes try to get you to use non-existent or deprecated packages or language features.\u003C/p>\n\u003Cp>Especially when Im going in trying to learn something new, whether its a web technology Im not experienced in, or trying to \u003Ca href=\"/posts/2023/reflecting-on-building-my-first-app\">learn Swift from scratch\u003C/a>, Ive found it helpful to go in at least knowing what Im looking for. That means reading documentation, and trying a few things out on my own. If Im stuck, or if the documentation has poor or non-existent sample code (looking at you Apple), Ill use ChatGPT to generate some generic starter code I can use as a jumping off point.\u003C/p>",{"headings":760,"localImagePaths":761,"remoteImagePaths":762,"frontmatter":763,"imagePaths":766},[],[],[],{"title":751,"pubDate":764,"tags":765},"4/30/23",[226,283],[],"2023/questlogger-from-ios-to-mac",{"id":767,"data":769,"body":773,"filePath":774,"digest":775,"rendered":776},{"title":770,"pubDate":771,"tags":772},"QuestLogger - From Closed-Source iOS App to Open-Source Mac App",["Date","2023-09-03T04:00:00.000Z"],[61,283,143],"A few weeks ago I relaunched my work-in-progress iOS app, QuestLogger, as [an open-source Mac app](https://github.com/ghall89/questlogger-mac). Thats quite a shift, but I felt it was best for the project itself, and my interest in carrying it on.\n\nWithout getting too into the technical details, it required a bit of work to pull off. The app was originally written specifically for the iPhone, and used a bit of custom nonsense that wouldt work at all on macOS, so I had to rewrite a non-insignificant part of the user interface. Thankfully I had the forethought to break up my interface code into smaller components, so a lot of that code could be reused (once any iOS-specific code was stripped out). The bulk of the work was rewriting the entire layout to use the screen real estate of the Mac more effectively.\n\nSo, I guess the big question is, “Why did I do this?”\n\nThe answer? Subscriptions.\n\nFrom the get-go I was adamant about making this app a pay once type of deal. I wasnt looking to make a lot of money, I just wanted to build something that people might want to use. Maybe use it as a way to build towards more lucrative projects if I was lucky. And I didnt want the to deal with the pressure of subscriptions and the demands that could bring. Maybe this would be something Id be more comfortable with down the line with an app or 2 under my belt, or if I were doing this full time, but as a little side project Im just not comfortable with asking people to pay a recurring subscription\n\nBut after running a relatively short TestFlight beta over the summer, and witnessing the drama with the Reddit API, I got very nervous about running an app with the payment structure I wanted off an API I have no control over, and an estimated 30¢ cost per user to run a proxy server on AWS to access that API. That doesnt sound like a lot, but if for some reason my app happened to blow up (unlikely, but not impossible) I could be stuck with a sizable AWS bill, and no recurring revenue to cover it.\n\nI should probably explain that QuestLogger gets its data from IGDB (Internet Game Database) through an API. In order to access the API, an app first needs to authenticate with their server by sending a pair of authentication keys and receiving back a special “bearer token”. This token can then be used to access the API itself, but as a developer my app can only request a very limited number of tokens at a time across all instances. Thats not a problem if you have only a couple users, but it could become one very quickly if say I had even 50 people using my app. So the best way around that is to set up a proxy server for the app to communicate with instead, and essentially let all users share the same token.\n\nI was feeling super discouraged. I dont think I wrote a single line of code for QuestLogger throughout the month of July. Then, in early August, I decided I didnt want all the work I put into the app go to waste, so I had the idea to convert the whole thing into a Mac app and release it as an open source project.\n\nI think this change allows the project to be a lot more flexible. First, I was able to circumvent the token issue by requiring users to provide their own authentication keyswhich is, as I understand it, against Apples rules for the App Storeand request the token on-device. It also gives a lot more freedom in terms of being able to switch to another source of data as it seems there are more options for non-commercial projects.\n\nMost importantly though, its reignited my interest in building this project, and honing my Swift skills. I dont need to worry about optimal subscription prices, or making sure people are getting their moneys worth. I can just focus on making something I think is cool, and hopefully others do too.","src/content/blog/2023/questlogger-from-ios-to-mac.md","80a59f8bec0f36dc",{"html":777,"metadata":778},"\u003Cp>A few weeks ago I relaunched my work-in-progress iOS app, QuestLogger, as \u003Ca href=\"https://github.com/ghall89/questlogger-mac\">an open-source Mac app\u003C/a>. Thats quite a shift, but I felt it was best for the project itself, and my interest in carrying it on.\u003C/p>\n\u003Cp>Without getting too into the technical details, it required a bit of work to pull off. The app was originally written specifically for the iPhone, and used a bit of custom nonsense that wouldt work at all on macOS, so I had to rewrite a non-insignificant part of the user interface. Thankfully I had the forethought to break up my interface code into smaller components, so a lot of that code could be reused (once any iOS-specific code was stripped out). The bulk of the work was rewriting the entire layout to use the screen real estate of the Mac more effectively.\u003C/p>\n\u003Cp>So, I guess the big question is, “Why did I do this?”\u003C/p>\n\u003Cp>The answer? Subscriptions.\u003C/p>\n\u003Cp>From the get-go I was adamant about making this app a pay once type of deal. I wasnt looking to make a lot of money, I just wanted to build something that people might want to use. Maybe use it as a way to build towards more lucrative projects if I was lucky. And I didnt want the to deal with the pressure of subscriptions and the demands that could bring. Maybe this would be something Id be more comfortable with down the line with an app or 2 under my belt, or if I were doing this full time, but as a little side project Im just not comfortable with asking people to pay a recurring subscription\u003C/p>\n\u003Cp>But after running a relatively short TestFlight beta over the summer, and witnessing the drama with the Reddit API, I got very nervous about running an app with the payment structure I wanted off an API I have no control over, and an estimated 30¢ cost per user to run a proxy server on AWS to access that API. That doesnt sound like a lot, but if for some reason my app happened to blow up (unlikely, but not impossible) I could be stuck with a sizable AWS bill, and no recurring revenue to cover it.\u003C/p>\n\u003Cp>I should probably explain that QuestLogger gets its data from IGDB (Internet Game Database) through an API. In order to access the API, an app first needs to authenticate with their server by sending a pair of authentication keys and receiving back a special “bearer token”. This token can then be used to access the API itself, but as a developer my app can only request a very limited number of tokens at a time across all instances. Thats not a problem if you have only a couple users, but it could become one very quickly if say I had even 50 people using my app. So the best way around that is to set up a proxy server for the app to communicate with instead, and essentially let all users share the same token.\u003C/p>\n\u003Cp>I was feeling super discouraged. I dont think I wrote a single line of code for QuestLogger throughout the month of July. Then, in early August, I decided I didnt want all the work I put into the app go to waste, so I had the idea to convert the whole thing into a Mac app and release it as an open source project.\u003C/p>\n\u003Cp>I think this change allows the project to be a lot more flexible. First, I was able to circumvent the token issue by requiring users to provide their own authentication keyswhich is, as I understand it, against Apples rules for the App Storeand request the token on-device. It also gives a lot more freedom in terms of being able to switch to another source of data as it seems there are more options for non-commercial projects.\u003C/p>\n\u003Cp>Most importantly though, its reignited my interest in building this project, and honing my Swift skills. I dont need to worry about optimal subscription prices, or making sure people are getting their moneys worth. I can just focus on making something I think is cool, and hopefully others do too.\u003C/p>",{"headings":779,"localImagePaths":780,"remoteImagePaths":781,"frontmatter":782,"imagePaths":785},[],[],[],{"title":770,"pubDate":783,"tags":784},"9/3/23",[61,283,143],[],"2023/my-gunpla-adventure",{"id":786,"data":788,"body":792,"filePath":793,"assetImports":794,"digest":798,"rendered":799},{"title":789,"pubDate":790,"tags":791},"My Gunpla Adventure",["Date","2023-01-28T00:00:00.000Z"],[61],"Back in my teenage years I used to build model kits. Mostly Star Trek, some Star Wars, and 1 or 2 model planes. It was sort of a continuation of my Lego obsession from my pre-teen days, but at some point I just kind of fell of. Fast-forward Summer 2022, I was going through a rough patch and wanted to focus on some hobbies that would get me away from the screen, and I decided to pick up model building again. Because the YouTube algorithm is a thing, as I watched more and more reviews and tutorials, I naturally ended up in a strange corner of the model kit scene called Gunpla.\n\nSo, what the heck is Gunpla? Best I can understand is that it's a portmanteau of [Gundam](https://en.wikipedia.org/wiki/Gundam) and plastic. So simply put, it's about building robots (sorry, mecha) out of plastic.\n\nI've never been a Gundam fan, the genre just never really appealed to me. But I became enamored with watching Gunpla videos on YouTube, which is a whole genre of ASMR-like videos like [this one](https://www.youtube.com/watch?v=Nq88NAAD25k). The level of engineering behind these kits was just so fascinating to me, but I'm not super big on buying merch for franchises I don't really enjoy. Happily, that ended up not being a problem.\n\nSo, there was a little anime I watched back in high school called [Full Metal Panic](https://en.wikipedia.org/wiki/Full_Metal_Panic!) which, like Gundam, features people piloting giant mecha. As luck would have it, Bandai, the makers of Gunpla kits, have/had the license to make kits for the series. Not-so-luckily, the kit I wanted based on the main character's mech is impossible to find at a reasonable price at the moment, so I settled for my second pick:\n\n![a box sitting on a table with an image of a mech and text that reads 'M9 Gernsback ver IV (Agressor Squadron)'](src/assets/blog/gunpla/box.jpg)\n\nSo, with the kit in hand, I opened the box and was greeted by a handful of plastic pouches containing what seemed like a thousand parts connected on plastic sprues in a variety of blues and grays. I took out the contents and perused through the included instructions, which read very much like it was designed by Ikea, if Ikea sold miniature giant robots. The writing was all in Japanese, but the illustrations were enough to guide one through the process no matter what language they can read.\n\n![neatly piled plastic sprues sorted by color, an instruction booklet, and a model of R2-D2 lurking in the corner](src/assets/blog/gunpla/all-the-parts.jpg)\n\nSeparating the individual pieces from each sprue was pretty painless. They came off very cleanly and I barely had to use my handy hobby knife to clean up bits of excess plastic, and when I did it cut through like butter. Not a drop of glue was needed, everything snapped together perfectly. I struggled a bit with the smaller parts (of which there were plenty), and there were a couple seemingly microscopic stickers I had to apply, so my iFixIt tweezers came in handy quite a few times.\n\nAfter a couple hours, I had a pretty sweet looking miniature mecha.\n\n![the finished model, standing tall, and holding a scary looking gun](src/assets/blog/gunpla/final.jpg)\n\nPutting it together, I was just so amazed by the level of engineering that went into this kit. Putting it all together, I could tell someone put a lot of care and attention into designing this thing, rivaling some of the Lego kits I've built, from the near-seamless fit of all the pieces, to the various types of joints enabling a quite frankly insane level of pose-ability for something this size.\n\nI had a lot of fun doing this, and it was cool to see what this little subculture of model building is like. Would I build another one? For sure, but I don't think it will be a regular thing for me because of how expensive it could get. This kit cost me around $50, and I tend to go hard on stuff like this (see my obscene collection of 2016-2017-era Magic The Gathering cards), so I could see myself spending way too much money on this if I'm not careful.\n\nI'm sure I'll get another kit eventually, but in the meantime there's a seemingly infinite number of those ASMR-style assembly videos, so I can marvel at the the engineering behind these kits second-hand for now.","src/content/blog/2023/my-gunpla-adventure.md",[795,796,797],"src/assets/blog/gunpla/box.jpg","src/assets/blog/gunpla/all-the-parts.jpg","src/assets/blog/gunpla/final.jpg","0d5b9fc581cc4ddd",{"html":800,"metadata":801},"\u003Cp>Back in my teenage years I used to build model kits. Mostly Star Trek, some Star Wars, and 1 or 2 model planes. It was sort of a continuation of my Lego obsession from my pre-teen days, but at some point I just kind of fell of. Fast-forward Summer 2022, I was going through a rough patch and wanted to focus on some hobbies that would get me away from the screen, and I decided to pick up model building again. Because the YouTube algorithm is a thing, as I watched more and more reviews and tutorials, I naturally ended up in a strange corner of the model kit scene called Gunpla.\u003C/p>\n\u003Cp>So, what the heck is Gunpla? Best I can understand is that its a portmanteau of \u003Ca href=\"https://en.wikipedia.org/wiki/Gundam\">Gundam\u003C/a> and plastic. So simply put, its about building robots (sorry, mecha) out of plastic.\u003C/p>\n\u003Cp>Ive never been a Gundam fan, the genre just never really appealed to me. But I became enamored with watching Gunpla videos on YouTube, which is a whole genre of ASMR-like videos like \u003Ca href=\"https://www.youtube.com/watch?v=Nq88NAAD25k\">this one\u003C/a>. The level of engineering behind these kits was just so fascinating to me, but Im not super big on buying merch for franchises I dont really enjoy. Happily, that ended up not being a problem.\u003C/p>\n\u003Cp>So, there was a little anime I watched back in high school called \u003Ca href=\"https://en.wikipedia.org/wiki/Full_Metal_Panic!\">Full Metal Panic\u003C/a> which, like Gundam, features people piloting giant mecha. As luck would have it, Bandai, the makers of Gunpla kits, have/had the license to make kits for the series. Not-so-luckily, the kit I wanted based on the main characters mech is impossible to find at a reasonable price at the moment, so I settled for my second pick:\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/gunpla/box.jpg","alt":"a box sitting on a table with an image of a mech and text that reads 'M9 Gernsback ver IV (Agressor Squadron)'","index":0}\">\u003C/p>\n\u003Cp>So, with the kit in hand, I opened the box and was greeted by a handful of plastic pouches containing what seemed like a thousand parts connected on plastic sprues in a variety of blues and grays. I took out the contents and perused through the included instructions, which read very much like it was designed by Ikea, if Ikea sold miniature giant robots. The writing was all in Japanese, but the illustrations were enough to guide one through the process no matter what language they can read.\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/gunpla/all-the-parts.jpg","alt":"neatly piled plastic sprues sorted by color, an instruction booklet, and a model of R2-D2 lurking in the corner","index":0}\">\u003C/p>\n\u003Cp>Separating the individual pieces from each sprue was pretty painless. They came off very cleanly and I barely had to use my handy hobby knife to clean up bits of excess plastic, and when I did it cut through like butter. Not a drop of glue was needed, everything snapped together perfectly. I struggled a bit with the smaller parts (of which there were plenty), and there were a couple seemingly microscopic stickers I had to apply, so my iFixIt tweezers came in handy quite a few times.\u003C/p>\n\u003Cp>After a couple hours, I had a pretty sweet looking miniature mecha.\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/gunpla/final.jpg","alt":"the finished model, standing tall, and holding a scary looking gun","index":0}\">\u003C/p>\n\u003Cp>Putting it together, I was just so amazed by the level of engineering that went into this kit. Putting it all together, I could tell someone put a lot of care and attention into designing this thing, rivaling some of the Lego kits Ive built, from the near-seamless fit of all the pieces, to the various types of joints enabling a quite frankly insane level of pose-ability for something this size.\u003C/p>\n\u003Cp>I had a lot of fun doing this, and it was cool to see what this little subculture of model building is like. Would I build another one? For sure, but I dont think it will be a regular thing for me because of how expensive it could get. This kit cost me around $50, and I tend to go hard on stuff like this (see my obscene collection of 2016-2017-era Magic The Gathering cards), so I could see myself spending way too much money on this if Im not careful.\u003C/p>\n\u003Cp>Im sure Ill get another kit eventually, but in the meantime theres a seemingly infinite number of those ASMR-style assembly videos, so I can marvel at the the engineering behind these kits second-hand for now.\u003C/p>",{"headings":802,"localImagePaths":803,"remoteImagePaths":804,"frontmatter":805,"imagePaths":808},[],[795,796,797],[],{"title":789,"pubDate":806,"tags":807},"2023-01-28",[61],[795,796,797],"2023/reflecting-on-building-my-first-app",{"id":809,"data":811,"body":815,"filePath":816,"digest":817,"rendered":818},{"title":812,"pubDate":813,"tags":814},"Reflecting on Building My First App",["Date","2023-02-28T00:00:00.000Z"],[226,61,119,283],"I'm primarily a web developer. Everything I build, whether it's for work or for fun, is destined for the web. I love it, building stuff for the web has been a part of my life since I first cobbled together a Star Trek fan site in my tween years. But I've also wanted to broaden my horizons a bit beyond the web, and create something for another platform I love; the Mac.\n\nI've dipped my toes into building desktop apps in Electron with my app [Classic Calc](https://github.com/ghall89/classic-calc), but I wasn't all that fulfilled by building it. It was a good exercise, but it felt inauthentic, like I was cheating, so I lost interest. That was about a year-and-a-half ago.\n\nMore recently, I decided to tackle building something more substantial. I started fiddling around with Swift Playgrounds on my MacBook, trying to use the built-in learning tools to create a basic UI. Coming from JavaScript, I found Swift as a language fairly easy to grasp the basics of. But when it came to SwiftUI, I quickly found myself struggling.\n\nAfter a few days of this, I decided to try my hand at building a basic app: a Markdown text editor. Over the course of a couple nights (and one or two lunch breaks), I built [Scrib](https://github.com/ghall89/Scrib). Is it something I'd suggest using? Nope. But to be fair, I'd readily suggest it over [CSS Shadow Tool](https://ghall89.github.io/css-shadow-tool/), one of my first attempts at an interactive web app.\n\nI pushed this project aside too. Unlike my Electron app though, I wasnt unfulfilled or bored. I was overwhelmed. SwiftUI can be a finicky beast for seasoned developers, but Id never written a line of it until recently so I was feeling totally lost. I felt stupid. The pride I felt in creating a functional Mac app was replaced with harsh self-critique. So I dove headfirst back into web development projects, my comfort zone.\n\nBut the thing is, web development wasnt always my comfort zone. I used to be scared, overwhelmed, at the prospect of building for the web. Hell, it still scares me sometimes, but its what I know. I dont know Swift very well yet, and I certainly am not very familiar with SwiftUI, and I often forget there was a time I was in the same boat with JavaScript (not to say Im an expert, far from it, but I think you get my point).\n\nSo what did I learn that I can apply to my future endeavors to build a Mac app? Honestly, its something I already knew, but maybe I just needed to be reminded of: Start small, and dont try to do everything at once.\n\nI made a mistake trying to just immerse myself in everything Swift, but, as a result, I feel like I actually learned very little. What I should have done, and will do when Im ready to dive back in, is start at step one. I know the fundamentals of programming, but thats like trying to speak a language when you know the grammar but not the vocabulary. So I need to just forget about SwiftUI and building functional apps, and just start with the core language and get comfortable with that. Maybe write some command line tools and work my way up from there.\n\nIts definitely hard for me when learning something new to not immediately put myself down for not being good at it on my first go. Its unrealistic, and unproductive, but for some reason its my natural inclination. The boot camp format mitigated that a bit, between the structured lessons and interacting with people who were in the same boat of having no idea what the frick we were doing.","src/content/blog/2023/reflecting-on-building-my-first-app.md","0a22fbc38e358da1",{"html":819,"metadata":820},"\u003Cp>Im primarily a web developer. Everything I build, whether its for work or for fun, is destined for the web. I love it, building stuff for the web has been a part of my life since I first cobbled together a Star Trek fan site in my tween years. But Ive also wanted to broaden my horizons a bit beyond the web, and create something for another platform I love; the Mac.\u003C/p>\n\u003Cp>Ive dipped my toes into building desktop apps in Electron with my app \u003Ca href=\"https://github.com/ghall89/classic-calc\">Classic Calc\u003C/a>, but I wasnt all that fulfilled by building it. It was a good exercise, but it felt inauthentic, like I was cheating, so I lost interest. That was about a year-and-a-half ago.\u003C/p>\n\u003Cp>More recently, I decided to tackle building something more substantial. I started fiddling around with Swift Playgrounds on my MacBook, trying to use the built-in learning tools to create a basic UI. Coming from JavaScript, I found Swift as a language fairly easy to grasp the basics of. But when it came to SwiftUI, I quickly found myself struggling.\u003C/p>\n\u003Cp>After a few days of this, I decided to try my hand at building a basic app: a Markdown text editor. Over the course of a couple nights (and one or two lunch breaks), I built \u003Ca href=\"https://github.com/ghall89/Scrib\">Scrib\u003C/a>. Is it something Id suggest using? Nope. But to be fair, Id readily suggest it over \u003Ca href=\"https://ghall89.github.io/css-shadow-tool/\">CSS Shadow Tool\u003C/a>, one of my first attempts at an interactive web app.\u003C/p>\n\u003Cp>I pushed this project aside too. Unlike my Electron app though, I wasnt unfulfilled or bored. I was overwhelmed. SwiftUI can be a finicky beast for seasoned developers, but Id never written a line of it until recently so I was feeling totally lost. I felt stupid. The pride I felt in creating a functional Mac app was replaced with harsh self-critique. So I dove headfirst back into web development projects, my comfort zone.\u003C/p>\n\u003Cp>But the thing is, web development wasnt always my comfort zone. I used to be scared, overwhelmed, at the prospect of building for the web. Hell, it still scares me sometimes, but its what I know. I dont know Swift very well yet, and I certainly am not very familiar with SwiftUI, and I often forget there was a time I was in the same boat with JavaScript (not to say Im an expert, far from it, but I think you get my point).\u003C/p>\n\u003Cp>So what did I learn that I can apply to my future endeavors to build a Mac app? Honestly, its something I already knew, but maybe I just needed to be reminded of: Start small, and dont try to do everything at once.\u003C/p>\n\u003Cp>I made a mistake trying to just immerse myself in everything Swift, but, as a result, I feel like I actually learned very little. What I should have done, and will do when Im ready to dive back in, is start at step one. I know the fundamentals of programming, but thats like trying to speak a language when you know the grammar but not the vocabulary. So I need to just forget about SwiftUI and building functional apps, and just start with the core language and get comfortable with that. Maybe write some command line tools and work my way up from there.\u003C/p>\n\u003Cp>Its definitely hard for me when learning something new to not immediately put myself down for not being good at it on my first go. Its unrealistic, and unproductive, but for some reason its my natural inclination. The boot camp format mitigated that a bit, between the structured lessons and interacting with people who were in the same boat of having no idea what the frick we were doing.\u003C/p>",{"headings":821,"localImagePaths":822,"remoteImagePaths":823,"frontmatter":824,"imagePaths":827},[],[],[],{"title":812,"pubDate":825,"tags":826},"2023-02-28",[226,61,119,283],[],"2023/reflecting-on-my-first-year-as-a-developer",{"id":828,"data":830,"body":834,"filePath":835,"digest":836,"rendered":837},{"title":831,"pubDate":832,"tags":833},"Reflecting On My First Year as a Developer",["Date","2023-08-07T04:00:00.000Z"],[17,226,283],"Next week will mark the end of my first year (of hopefully many more) working as a software developer. This fact blows my mind, and feels wholly unreal. Its still difficult for me to believe that I made it this far. I still remember thinking my interview was a total disaster and being genuinely shocked when I got the job offer.\n\nI cant understate how life changing this last year has been. Last summer I was at a low point. My year-long job search was proving unfruitful, and I was not really feeling good about myself. I had been working at a small startup doing quality control for short-form video clips on a contract basis, and I was slowly losing my mind.\n\nIve grown a lot in the last year, not just as a developer, but also as a person. Financially, being a full time job, its given me stability I didnt have doing contract work. Emotionally, it isnt as overwhelming to deal with (when Im not having a bout of Imposter Syndrome). Its given me the space to work on myself in a way I havent really had in a long time.\n\nHell, even the job itself has allowed me to grow as a person. Right off the bat, I had to learn Next.js, and over time Ive learned and grown more comfortable with a multitude of technologies that I lacked the confidence to touch or expand my knowledge of. Things like working with databases, something that Ive found very intimidating in the past, has become not _quite_ second nature, but a lot less overwhelming.\n\nThe most important thing I learned, the one common thread tying this last year together, is the importance of just _doing_. I have a tendency to not believe in myself, and that has led to me saying “I cant” to a lot of things. “I cant learn to code.” “I cant handle working with databases.” “I cant live in a new place.” “I cant find happiness.”\n\nFor Star Wars Day this year I rewatched The Empire Strikes Back. In that movie, after Luke is unable to use the Force to lift his X-Wing out of the swamp on Dagobah, exclaiming that its “impossible”. Yoda sighs and pulls the starfighter out of the swamp himself. Luke, upon seeing this, says, “I dont believe it.” To which Yoda responds, “That is why you failed.” This scene really struck a chord with me when I watched it this past May. For so long I had been Luke, failing because I didnt have faith I could succeed.\n\nOf course, belief does not always equal success, though it would be nice if it did. But, what this last yearand honestly, my entire journey into the world of software developmenthas taught me is that the only guarantee is that not trying, not taking the chance, will always lead to failure. But sometimes, every once in a while, if you believe in yourself and take that chance, you might just succeed.","src/content/blog/2023/reflecting-on-my-first-year-as-a-developer.md","59ccb49a7a592e63",{"html":838,"metadata":839},"\u003Cp>Next week will mark the end of my first year (of hopefully many more) working as a software developer. This fact blows my mind, and feels wholly unreal. Its still difficult for me to believe that I made it this far. I still remember thinking my interview was a total disaster and being genuinely shocked when I got the job offer.\u003C/p>\n\u003Cp>I cant understate how life changing this last year has been. Last summer I was at a low point. My year-long job search was proving unfruitful, and I was not really feeling good about myself. I had been working at a small startup doing quality control for short-form video clips on a contract basis, and I was slowly losing my mind.\u003C/p>\n\u003Cp>Ive grown a lot in the last year, not just as a developer, but also as a person. Financially, being a full time job, its given me stability I didnt have doing contract work. Emotionally, it isnt as overwhelming to deal with (when Im not having a bout of Imposter Syndrome). Its given me the space to work on myself in a way I havent really had in a long time.\u003C/p>\n\u003Cp>Hell, even the job itself has allowed me to grow as a person. Right off the bat, I had to learn Next.js, and over time Ive learned and grown more comfortable with a multitude of technologies that I lacked the confidence to touch or expand my knowledge of. Things like working with databases, something that Ive found very intimidating in the past, has become not \u003Cem>quite\u003C/em> second nature, but a lot less overwhelming.\u003C/p>\n\u003Cp>The most important thing I learned, the one common thread tying this last year together, is the importance of just \u003Cem>doing\u003C/em>. I have a tendency to not believe in myself, and that has led to me saying “I cant” to a lot of things. “I cant learn to code.” “I cant handle working with databases.” “I cant live in a new place.” “I cant find happiness.”\u003C/p>\n\u003Cp>For Star Wars Day this year I rewatched The Empire Strikes Back. In that movie, after Luke is unable to use the Force to lift his X-Wing out of the swamp on Dagobah, exclaiming that its “impossible”. Yoda sighs and pulls the starfighter out of the swamp himself. Luke, upon seeing this, says, “I dont believe it.” To which Yoda responds, “That is why you failed.” This scene really struck a chord with me when I watched it this past May. For so long I had been Luke, failing because I didnt have faith I could succeed.\u003C/p>\n\u003Cp>Of course, belief does not always equal success, though it would be nice if it did. But, what this last yearand honestly, my entire journey into the world of software developmenthas taught me is that the only guarantee is that not trying, not taking the chance, will always lead to failure. But sometimes, every once in a while, if you believe in yourself and take that chance, you might just succeed.\u003C/p>",{"headings":840,"localImagePaths":841,"remoteImagePaths":842,"frontmatter":843,"imagePaths":846},[],[],[],{"title":831,"pubDate":844,"tags":845},"8/7/23",[17,226,283],[],"2023/thoughs-on-macos",{"id":847,"data":849,"body":853,"filePath":854,"digest":855,"rendered":856},{"title":850,"pubDate":851,"tags":852},"Thoughts on macOS",["Date","2023-06-04T04:00:00.000Z"],[119,18],"So, as of this writing, WWDC 2023 kicks off _tomorrow_. As a web developer whos recently started dabbling in Swift, and building apps for Apple platforms, Im excited to see what gets shown off that I can start sinking my teeth into. On the other hand, as a longtime Mac user, Im a little apprehensive about what well see there.\n\nHardware-wise, the Mac is in a fantastic place. Were 3 years into the transition from Intel to Apple Silicon, and the design aesthetic is changing up for the first time in like a decade (maybe more??). However, in terms of software, specifically macOS itself, were kind of in a weird place.\n\nJust looking at macOS 13 Ventura, the latest version until the next one is most likely announced tomorrow, there are so many little oddities that range from minor annoyances to showstoppers. Some bugs introduced in the betas from last year, for example the infamous launch item notification bug, are _still_ present in the currently shipping version (13.4). Then theres the mess that is System Settings, which received a major redesign last year for the first time since the Mac OS X betas from 23 years ago.\n\nThen there are some long-standing issues, like a memory leak in the WindowServer system process that has existed since at least Monterey in 2021 (though I feel like Ive been experiencing it longer). Or the fact that the TV app straight up doesnt work most of the time.\n\nThen theres Launchpad (which may not be long for this world as the dedicated key on Apples keyboard has been replaced with Spotlight) which Ive tried to use since it was introduced in Mac OS X Lion all the way back in 2010, but has a bug that will randomly just reorder the icons, which has been an issue since day 1.\n\nOne other long-standing issue that Ive experienced is how unreliable network drives are. I have a Mac Mini set up as a home server, and the amount of times itll just fail to connect when I need to access one of the drives, or Time Machine just fails to recognize that theres a network volume, is exceedingly frustrating.\n\nThe reliability of macOS varies so much from person to person. Some people experience just one, or maybe even none, of the issues Ive mentioned. Others experience totally different issues that Ive never run into. Its just so wild that an operating system that has been around for 23 years (33 if you count NeXTSTEP as part of the lineage) has so many little issues. Yes, every piece of software has bugs, especially when working with the bogglingly large codebase of an operating system, but so many of what people encounter on the Mac are not small issues.\n\nAll this to say, my one wish for WWDC 2023 is that we _dont_ see a new version of macOS, and if we do, its purely focused on fixing the outstanding issues (and, if we want to get really crazy, fixing the System Settings design). I doubt either of those will happen, but I can certainly dream.","src/content/blog/2023/thoughs-on-macos.md","ab22dd606410397d",{"html":857,"metadata":858},"\u003Cp>So, as of this writing, WWDC 2023 kicks off \u003Cem>tomorrow\u003C/em>. As a web developer whos recently started dabbling in Swift, and building apps for Apple platforms, Im excited to see what gets shown off that I can start sinking my teeth into. On the other hand, as a longtime Mac user, Im a little apprehensive about what well see there.\u003C/p>\n\u003Cp>Hardware-wise, the Mac is in a fantastic place. Were 3 years into the transition from Intel to Apple Silicon, and the design aesthetic is changing up for the first time in like a decade (maybe more??). However, in terms of software, specifically macOS itself, were kind of in a weird place.\u003C/p>\n\u003Cp>Just looking at macOS 13 Ventura, the latest version until the next one is most likely announced tomorrow, there are so many little oddities that range from minor annoyances to showstoppers. Some bugs introduced in the betas from last year, for example the infamous launch item notification bug, are \u003Cem>still\u003C/em> present in the currently shipping version (13.4). Then theres the mess that is System Settings, which received a major redesign last year for the first time since the Mac OS X betas from 23 years ago.\u003C/p>\n\u003Cp>Then there are some long-standing issues, like a memory leak in the WindowServer system process that has existed since at least Monterey in 2021 (though I feel like Ive been experiencing it longer). Or the fact that the TV app straight up doesnt work most of the time.\u003C/p>\n\u003Cp>Then theres Launchpad (which may not be long for this world as the dedicated key on Apples keyboard has been replaced with Spotlight) which Ive tried to use since it was introduced in Mac OS X Lion all the way back in 2010, but has a bug that will randomly just reorder the icons, which has been an issue since day 1.\u003C/p>\n\u003Cp>One other long-standing issue that Ive experienced is how unreliable network drives are. I have a Mac Mini set up as a home server, and the amount of times itll just fail to connect when I need to access one of the drives, or Time Machine just fails to recognize that theres a network volume, is exceedingly frustrating.\u003C/p>\n\u003Cp>The reliability of macOS varies so much from person to person. Some people experience just one, or maybe even none, of the issues Ive mentioned. Others experience totally different issues that Ive never run into. Its just so wild that an operating system that has been around for 23 years (33 if you count NeXTSTEP as part of the lineage) has so many little issues. Yes, every piece of software has bugs, especially when working with the bogglingly large codebase of an operating system, but so many of what people encounter on the Mac are not small issues.\u003C/p>\n\u003Cp>All this to say, my one wish for WWDC 2023 is that we \u003Cem>dont\u003C/em> see a new version of macOS, and if we do, its purely focused on fixing the outstanding issues (and, if we want to get really crazy, fixing the System Settings design). I doubt either of those will happen, but I can certainly dream.\u003C/p>",{"headings":859,"localImagePaths":860,"remoteImagePaths":861,"frontmatter":862,"imagePaths":865},[],[],[],{"title":850,"pubDate":863,"tags":864},"6/4/23",[119,18],[],"2023/using-json-for-data-storage",{"id":866,"data":868,"body":872,"filePath":873,"digest":874,"rendered":875},{"title":869,"pubDate":870,"tags":871},"More Swift Learnings: Using JSON For Data Storage",["Date","2023-04-09T04:00:00.000Z"],[119,226,283],"Back at the end of February, I built [a simple Markdown editor](https://github.com/ghall89/Scrib) using SwiftUI. It was an interesting learning experience, not just in terms of learning a new programming language, but also in terms of _how_ to learn said programming language. So, I decided to take a step back and approach this educational journey from another angle.\n\nI decided to take a project I built before for the web and recreate it in a native Mac app, rather than try to do something Id never done before (like, for example, a document-based application). AI is sort of a big deal right now, so I decided to revisit [a project I made last year](https://github.com/ghall89/openai-challenge) using the OpenAI API.\n\nSo, over the course of the last couple weeks, Ive been working on the incredibly cleverly named [SwiftGPT](https://github.com/ghall89/swiftgpt), and its proven to be quite the interesting challenge translating what I know about building data-focused applications for the web into building them for the Mac.\n\nThe biggest challenge for me, by far, was dealing with storing and retrieving user data. My experience is in NoSQL databases like MongoDB, as well as local and session storage in the browser. But how, I wondered, should I go about persisting user data in a native Mac app? In this case, this primarily means the chat history between the user and the OpenAI assistant.\n\nI tinkered a bit with Core Data, but I had a hard time wrapping my head around it, and, from what little I did understand, it seemed like overkill anyway. My inspiration came in the form of [episode \\#87 of the CoRecursive podcast](https://corecursive.com/json-vs-xml-douglas-crockford/), which featured an interview with Douglas Crockford, the creator of a little format called JSON (a.k.a., JavaScript Object Notation).\n\nJavaScript being my primary language, I knew all about JSON. I also happened to know that Swift has some built-in support for it, so it seemed like the natural direction to go. However, the main problem was, while I somewhat knew how to read JSON data in Swift, I had no idea how to create it, much less save it to a file and read that file back reliably.\n\nIm sure any Mac or iOS developer with an ounce of experience reading this is screaming, “Just use [JSONEncoder](https://developer.apple.com/documentation/foundation/jsonencoder/) and [FileManager](https://developer.apple.com/documentation/foundation/filemanager)!” Well, youll be happy to knowunless theres some better method I overlookedthats exactly what I used. Though Im sure my code is filled with flaws. 😅\n\nIf I were doing something more complex, beyond storing a list of messages and who “wrote” them, I would probably be better served by sucking it up and learning Core Data. But, as Im working with a small set of very simple data, Im not sure there are any downsides to my solution. I will say though, my curiosity has been piqued, and I wonder what other sorts of things I can build with this method.","src/content/blog/2023/using-json-for-data-storage.md","65f8b3445085777a",{"html":876,"metadata":877},"\u003Cp>Back at the end of February, I built \u003Ca href=\"https://github.com/ghall89/Scrib\">a simple Markdown editor\u003C/a> using SwiftUI. It was an interesting learning experience, not just in terms of learning a new programming language, but also in terms of \u003Cem>how\u003C/em> to learn said programming language. So, I decided to take a step back and approach this educational journey from another angle.\u003C/p>\n\u003Cp>I decided to take a project I built before for the web and recreate it in a native Mac app, rather than try to do something Id never done before (like, for example, a document-based application). AI is sort of a big deal right now, so I decided to revisit \u003Ca href=\"https://github.com/ghall89/openai-challenge\">a project I made last year\u003C/a> using the OpenAI API.\u003C/p>\n\u003Cp>So, over the course of the last couple weeks, Ive been working on the incredibly cleverly named \u003Ca href=\"https://github.com/ghall89/swiftgpt\">SwiftGPT\u003C/a>, and its proven to be quite the interesting challenge translating what I know about building data-focused applications for the web into building them for the Mac.\u003C/p>\n\u003Cp>The biggest challenge for me, by far, was dealing with storing and retrieving user data. My experience is in NoSQL databases like MongoDB, as well as local and session storage in the browser. But how, I wondered, should I go about persisting user data in a native Mac app? In this case, this primarily means the chat history between the user and the OpenAI assistant.\u003C/p>\n\u003Cp>I tinkered a bit with Core Data, but I had a hard time wrapping my head around it, and, from what little I did understand, it seemed like overkill anyway. My inspiration came in the form of \u003Ca href=\"https://corecursive.com/json-vs-xml-douglas-crockford/\">episode #87 of the CoRecursive podcast\u003C/a>, which featured an interview with Douglas Crockford, the creator of a little format called JSON (a.k.a., JavaScript Object Notation).\u003C/p>\n\u003Cp>JavaScript being my primary language, I knew all about JSON. I also happened to know that Swift has some built-in support for it, so it seemed like the natural direction to go. However, the main problem was, while I somewhat knew how to read JSON data in Swift, I had no idea how to create it, much less save it to a file and read that file back reliably.\u003C/p>\n\u003Cp>Im sure any Mac or iOS developer with an ounce of experience reading this is screaming, “Just use \u003Ca href=\"https://developer.apple.com/documentation/foundation/jsonencoder/\">JSONEncoder\u003C/a> and \u003Ca href=\"https://developer.apple.com/documentation/foundation/filemanager\">FileManager\u003C/a>!” Well, youll be happy to knowunless theres some better method I overlookedthats exactly what I used. Though Im sure my code is filled with flaws. 😅\u003C/p>\n\u003Cp>If I were doing something more complex, beyond storing a list of messages and who “wrote” them, I would probably be better served by sucking it up and learning Core Data. But, as Im working with a small set of very simple data, Im not sure there are any downsides to my solution. I will say though, my curiosity has been piqued, and I wonder what other sorts of things I can build with this method.\u003C/p>",{"headings":878,"localImagePaths":879,"remoteImagePaths":880,"frontmatter":881,"imagePaths":884},[],[],[],{"title":869,"pubDate":882,"tags":883},"4/9/23",[119,226,283],[],"2023/using-tailwind-with-mui-base",{"id":885,"data":887,"body":892,"filePath":893,"digest":894,"rendered":895},{"title":888,"pubDate":889,"tags":890},"Using Tailwind With MUI Base",["Date","2023-03-11T05:00:00.000Z"],[40,891],"Tutorial","I've had some frustration lately working with [MUI](https://mui.com), a styled component library for React. I decided to try and experiment with combining [MUI Base](https://mui.com/base/getting-started/overview/), the barebones version of the MUI library, with [Tailwind](https://tailwindcss.com) to allow easier customization. Here's an overview of how I set up a test project using [Next.js](https://nextjs.org). This writeup assumes you have some experience with Next.js, using the terminal, and ideally some experience with MUI and Tailwind.\n\n## Step 1: Set Up Next.js\n\nNothing special is going on here. You can use `npx create-next-app@latest` or `yarn create next-app` depending on which package manager you prefer. I personally like Yarn, so that's what I'll be using. If you use NPM though the commands are similar so you'll be able to follow along.\n\nFollow the prompts to set up your Next.js project. These are the choices I went with:\n\n- Project name: mui-tailwind\n- Typescript: No\n- ESLint: Yes\n- Use 'src/' directory: Yes\n- Experimental 'app/' directory: No\n\nI also chose not to set up any import aliases for now. These can be easily added later if you so choose.\n\nIt will take a few moments for Next.js to download and for the project to set up, but when that's done, cd into '/mui-tailwind' (or whatever you named the project).\n\n## Step 2: Install MUI Base & Tailwind\n\nInstalling MUI Base is simple. Just run `yarn add @mui/base`, and you're good to go. There will be some config to do later, but once the package is done installing we're ready to install Tailwind with `yarn add -D tailwindcss postcss autoprefixer`.\n\nOnce both MUI Base and Tailwind are installed, we next need to run `yarn tailwindcss init -p`, which will create 2 files, one called 'tailwind.config.js', and another called 'postcss.config.js'. Now we're ready to do some setup.\n\n## Step 3: Configuration\n\nFirst thing's first, open up the project folder in your code editor of choice and at the root of the project you should see the 'tailwind.config.js' we created in step 2. Open that, and under `module.exports` you should see an empty array named 'content'. Add the following to the array: `'./src/**/*.{js,jsx,ts,tsx}'` Your config file should look like this:\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/tailwind-config.png\" width=\"80%\" alt=\"module.exports = { content: ['./src/**/*.{js,jsx,ts,tsx}'], theme: { extend: {}, }, plugins: [],};\">\n\nNext, we need to import Tailwind into our 'globals.css' file, which is located in 'src/styles/'. We can delete everything in the file as we won't be needing any of it. Then, add the following:\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/global-css.png\" width=\"80%\" alt=\"@tailwind base; @tailwind components; @tailwind utilities;\">\n\nAnd that's it! We're ready to start creating something!\n\n## Step 4: Creating Your First Component\n\nIdeally, we'd want to create smaller, reusable component files, but that's beyond the scope of this post, and is something you're most likely already familiar with if you have any experience with Next.js. Instead, we're going to work entirely in 'src/pages/index.js'.\n\nFirst, we should delete everything we don't need so that our 'index.js' file looks like this:\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/index-js.png\" width=\"80%\" alt=\"export default function Home() { return() }\">\n\nWe're going to create a simple button, nothing too fancy. So first we need to import the MUI Unstyled Button component by adding `import { ButtonUnstyled as Button } from '@mui/base'` on the first line of our file.\n\n_Note: The official MUI docs say to import as `import ButtonUnstyled from '@mui/base/ButtonUnstyled'`, which also works, but I prefer to use destructing which allows you to import multiple components with a single import statement'_\n\nNow we can create our button. Inside the return statement, add the following:\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/unstyled-button-code.png\" width=\"80%\" alt=\"\u003CButton>Click Me!\u003C/Button>\" />\n\nNext, go back to your terminal and run `yarn dev` to start up the dev server, and click the 'localhost' link that appears (most likely 'localhost:3000'). We'll be greeted by what looks like just a bit of text (it's a button, I promise), which isn't what we want, but that's because we haven't added any styles yet!\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/unstyled-button.png\" width=\"40%\" alt=\"A plain old 'button' that reads 'Click Me!'\" />\n\nAll we need to do is add the `className` prop with some nice Tailwind utility classes:\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/styled-button-code.png\" width=\"80%\" alt=\"\u003CButton className='rounded-lg border-2 border-sky-500 bg-sky-600 py-2 px-10 font-medium text-slate-300 shadow hover:bg-sky-700 active:translate-y-0.5'>\n Click Me!\n\u003C/Button>\" />\n\nNow, when we go back to the browser, we should see the following:\n\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/styled-button.png\" width=\"40%\" alt=\"A styled blue button that reads 'Click Me!'\" />\n\nNice! That looks a lot more like a button.\n\n## Step 5: Further Reading\n\nThis tutorial is just the basics of setting up a project using Next.js, MUI Base, and Tailwind. Of course, there's so much more to all these tools than I can possibly cover. For a more in-depth overview, I recommend you check out [this documentation](https://mui.com/base/guides/working-with-tailwind-css/) for using MUI Base with Tailwind, which I used as the basis for this guide, in combination with [this documentation](https://tailwindcss.com/docs/guides/nextjs) for using Tailwind with Next.js.\n\nOf course, the documentation I linked to at the top of this post is also suggested reading if you're not familiar with any of what I've written about here.","src/content/blog/2023/using-tailwind-with-mui-base.md","3dd8d37931add1bc",{"html":896,"metadata":897},"\u003Cp>Ive had some frustration lately working with \u003Ca href=\"https://mui.com\">MUI\u003C/a>, a styled component library for React. I decided to try and experiment with combining \u003Ca href=\"https://mui.com/base/getting-started/overview/\">MUI Base\u003C/a>, the barebones version of the MUI library, with \u003Ca href=\"https://tailwindcss.com\">Tailwind\u003C/a> to allow easier customization. Heres an overview of how I set up a test project using \u003Ca href=\"https://nextjs.org\">Next.js\u003C/a>. This writeup assumes you have some experience with Next.js, using the terminal, and ideally some experience with MUI and Tailwind.\u003C/p>\n\u003Ch2 id=\"step-1-set-up-nextjs\">Step 1: Set Up Next.js\u003C/h2>\n\u003Cp>Nothing special is going on here. You can use \u003Ccode>npx create-next-app@latest\u003C/code> or \u003Ccode>yarn create next-app\u003C/code> depending on which package manager you prefer. I personally like Yarn, so thats what Ill be using. If you use NPM though the commands are similar so youll be able to follow along.\u003C/p>\n\u003Cp>Follow the prompts to set up your Next.js project. These are the choices I went with:\u003C/p>\n\u003Cul>\n\u003Cli>Project name: mui-tailwind\u003C/li>\n\u003Cli>Typescript: No\u003C/li>\n\u003Cli>ESLint: Yes\u003C/li>\n\u003Cli>Use src/ directory: Yes\u003C/li>\n\u003Cli>Experimental app/ directory: No\u003C/li>\n\u003C/ul>\n\u003Cp>I also chose not to set up any import aliases for now. These can be easily added later if you so choose.\u003C/p>\n\u003Cp>It will take a few moments for Next.js to download and for the project to set up, but when thats done, cd into /mui-tailwind (or whatever you named the project).\u003C/p>\n\u003Ch2 id=\"step-2-install-mui-base--tailwind\">Step 2: Install MUI Base & Tailwind\u003C/h2>\n\u003Cp>Installing MUI Base is simple. Just run \u003Ccode>yarn add @mui/base\u003C/code>, and youre good to go. There will be some config to do later, but once the package is done installing were ready to install Tailwind with \u003Ccode>yarn add -D tailwindcss postcss autoprefixer\u003C/code>.\u003C/p>\n\u003Cp>Once both MUI Base and Tailwind are installed, we next need to run \u003Ccode>yarn tailwindcss init -p\u003C/code>, which will create 2 files, one called tailwind.config.js, and another called postcss.config.js. Now were ready to do some setup.\u003C/p>\n\u003Ch2 id=\"step-3-configuration\">Step 3: Configuration\u003C/h2>\n\u003Cp>First things first, open up the project folder in your code editor of choice and at the root of the project you should see the tailwind.config.js we created in step 2. Open that, and under \u003Ccode>module.exports\u003C/code> you should see an empty array named content. Add the following to the array: \u003Ccode>'./src/**/*.{js,jsx,ts,tsx}'\u003C/code> Your config file should look like this:\u003C/p>\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/tailwind-config.png\" width=\"80%\" alt=\"module.exports = { content: ['./src/**/*.{js,jsx,ts,tsx}'], theme: { extend: {}, }, plugins: [],};\">\n\u003Cp>Next, we need to import Tailwind into our globals.css file, which is located in src/styles/. We can delete everything in the file as we wont be needing any of it. Then, add the following:\u003C/p>\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/global-css.png\" width=\"80%\" alt=\"@tailwind base; @tailwind components; @tailwind utilities;\">\n\u003Cp>And thats it! Were ready to start creating something!\u003C/p>\n\u003Ch2 id=\"step-4-creating-your-first-component\">Step 4: Creating Your First Component\u003C/h2>\n\u003Cp>Ideally, wed want to create smaller, reusable component files, but thats beyond the scope of this post, and is something youre most likely already familiar with if you have any experience with Next.js. Instead, were going to work entirely in src/pages/index.js.\u003C/p>\n\u003Cp>First, we should delete everything we dont need so that our index.js file looks like this:\u003C/p>\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/index-js.png\" width=\"80%\" alt=\"export default function Home() { return() }\">\n\u003Cp>Were going to create a simple button, nothing too fancy. So first we need to import the MUI Unstyled Button component by adding \u003Ccode>import { ButtonUnstyled as Button } from '@mui/base'\u003C/code> on the first line of our file.\u003C/p>\n\u003Cp>\u003Cem>Note: The official MUI docs say to import as \u003Ccode>import ButtonUnstyled from '@mui/base/ButtonUnstyled'\u003C/code>, which also works, but I prefer to use destructing which allows you to import multiple components with a single import statement\u003C/em>\u003C/p>\n\u003Cp>Now we can create our button. Inside the return statement, add the following:\u003C/p>\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/unstyled-button-code.png\" width=\"80%\" alt=\"\u003CButton>Click Me!\u003C/Button>\">\n\u003Cp>Next, go back to your terminal and run \u003Ccode>yarn dev\u003C/code> to start up the dev server, and click the localhost link that appears (most likely localhost:3000). Well be greeted by what looks like just a bit of text (its a button, I promise), which isnt what we want, but thats because we havent added any styles yet!\u003C/p>\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/unstyled-button.png\" width=\"40%\" alt=\"A plain old 'button' that reads 'Click Me!'\">\n\u003Cp>All we need to do is add the \u003Ccode>className\u003C/code> prop with some nice Tailwind utility classes:\u003C/p>\n\u003Cp>\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/styled-button-code.png\" width=\"80%\" alt=\"\u003CButton className='rounded-lg border-2 border-sky-500 bg-sky-600 py-2 px-10 font-medium text-slate-300 shadow hover:bg-sky-700 active:translate-y-0.5'>\nClick Me!\n\u003C/Button>\">\u003C/p>\n\u003Cp>Now, when we go back to the browser, we should see the following:\u003C/p>\n\u003Cimg src=\"src/assets/blog/mui-plus-tailwind/styled-button.png\" width=\"40%\" alt=\"A styled blue button that reads 'Click Me!'\">\n\u003Cp>Nice! That looks a lot more like a button.\u003C/p>\n\u003Ch2 id=\"step-5-further-reading\">Step 5: Further Reading\u003C/h2>\n\u003Cp>This tutorial is just the basics of setting up a project using Next.js, MUI Base, and Tailwind. Of course, theres so much more to all these tools than I can possibly cover. For a more in-depth overview, I recommend you check out \u003Ca href=\"https://mui.com/base/guides/working-with-tailwind-css/\">this documentation\u003C/a> for using MUI Base with Tailwind, which I used as the basis for this guide, in combination with \u003Ca href=\"https://tailwindcss.com/docs/guides/nextjs\">this documentation\u003C/a> for using Tailwind with Next.js.\u003C/p>\n\u003Cp>Of course, the documentation I linked to at the top of this post is also suggested reading if youre not familiar with any of what Ive written about here.\u003C/p>",{"headings":898,"localImagePaths":914,"remoteImagePaths":915,"frontmatter":916,"imagePaths":919},[899,902,905,908,911],{"depth":292,"slug":900,"text":901},"step-1-set-up-nextjs","Step 1: Set Up Next.js",{"depth":292,"slug":903,"text":904},"step-2-install-mui-base--tailwind","Step 2: Install MUI Base & Tailwind",{"depth":292,"slug":906,"text":907},"step-3-configuration","Step 3: Configuration",{"depth":292,"slug":909,"text":910},"step-4-creating-your-first-component","Step 4: Creating Your First Component",{"depth":292,"slug":912,"text":913},"step-5-further-reading","Step 5: Further Reading",[],[],{"title":888,"pubDate":917,"tags":918},"3/11/23",[40,891],[],"2025/being-your-own-online-curator",{"id":920,"data":922,"body":927,"filePath":928,"digest":929,"rendered":930},{"title":923,"pubDate":924,"tags":925},"Skip the Algorithm: Be Your Own Online Curator",["Date","2025-03-01T05:00:00.000Z"],[18,926,143],"Mindfulness","Ever since I started using Mastodon, I've become a lot more interested in reducing the presence of algorithmic content in my digital life. I've never been particularly thrilled with algorithmic feeds of content. I was among the people who was quite furious when Instagram ditched the chronological timeline, and then started inserting content from accounts I didn't even follow.\n\nSomewhere along the line, I think I just started accepting what I assumed was inevitable. I think I was probably naive, and didn't consider the ills both social and psychological that resulted algorithmically curated content. It was just an annoying thing that I just had to accept.\n\nMastodon reminded me that not only do things not have to be this way, but connecting with people more naturally online is, at least in my experience, a lot more meaningful. I can't tell you the name of a single person I interacted with on Twitter, but I will always remember the small number of infinitely more meaningful connections I've made on Mastodon. With the exception of a couple friends I made on Reddit during Covid lockdown, I don't think I really formed any memorable or meaningful connections online since the App.net days.\n\nNot too long after joining Mastodon I started using an RSS reader for my news once again, something I hadn't considered since the Google Reader days (RIP). It not only gave me the freedom to curate my news feed myself, picking the articles I found interesting or important rather than letting Google News spoon feed me what it thought I'd want to read, but it also got me to follow blogs again.\n\nMost recently, I decided to totally restructure how I consume YouTube content. At some point, probably around the time YouTube started prioritizing suggested content over subscriptions, I picked up the habit of just watching what they put in front of my face. I lost touch with a lot of cool creators whos content was meaningful for me. So I went through my subscriptions, added those channels' RSS feeds to my RSS reader of choice ([Reeder](https://reeder.app) if you're curious), and deleted my Google account. We'll see how it goes longer term, but for right now I couldn't be happier with my choice.\n\nBeing the curator of your own online experience is a bit more of a cognitive load at first, but I think the empowerment it provides is more than worth the initial investment. The connections and content you mindfully choose to engage with are far more meaningful and enriching than any algorithm that's designed to consume your attention for as long as possible.\n\nThere are no shortage of tools out there to help you curate your online experience. In addition to an RSS reader, check out independent Podcast clients (my personal favorite is [Overcast](https://overcast.fm)). If you're on Mastodon or Bluesky, follow hashtags for topics that interest you and join in on the conversation (and, of course, be kind when you do 🙂).","src/content/blog/2025/being-your-own-online-curator.md","91a987a4d627e9e0",{"html":931,"metadata":932},"\u003Cp>Ever since I started using Mastodon, Ive become a lot more interested in reducing the presence of algorithmic content in my digital life. Ive never been particularly thrilled with algorithmic feeds of content. I was among the people who was quite furious when Instagram ditched the chronological timeline, and then started inserting content from accounts I didnt even follow.\u003C/p>\n\u003Cp>Somewhere along the line, I think I just started accepting what I assumed was inevitable. I think I was probably naive, and didnt consider the ills both social and psychological that resulted algorithmically curated content. It was just an annoying thing that I just had to accept.\u003C/p>\n\u003Cp>Mastodon reminded me that not only do things not have to be this way, but connecting with people more naturally online is, at least in my experience, a lot more meaningful. I cant tell you the name of a single person I interacted with on Twitter, but I will always remember the small number of infinitely more meaningful connections Ive made on Mastodon. With the exception of a couple friends I made on Reddit during Covid lockdown, I dont think I really formed any memorable or meaningful connections online since the App.net days.\u003C/p>\n\u003Cp>Not too long after joining Mastodon I started using an RSS reader for my news once again, something I hadnt considered since the Google Reader days (RIP). It not only gave me the freedom to curate my news feed myself, picking the articles I found interesting or important rather than letting Google News spoon feed me what it thought Id want to read, but it also got me to follow blogs again.\u003C/p>\n\u003Cp>Most recently, I decided to totally restructure how I consume YouTube content. At some point, probably around the time YouTube started prioritizing suggested content over subscriptions, I picked up the habit of just watching what they put in front of my face. I lost touch with a lot of cool creators whos content was meaningful for me. So I went through my subscriptions, added those channels RSS feeds to my RSS reader of choice (\u003Ca href=\"https://reeder.app\">Reeder\u003C/a> if youre curious), and deleted my Google account. Well see how it goes longer term, but for right now I couldnt be happier with my choice.\u003C/p>\n\u003Cp>Being the curator of your own online experience is a bit more of a cognitive load at first, but I think the empowerment it provides is more than worth the initial investment. The connections and content you mindfully choose to engage with are far more meaningful and enriching than any algorithm thats designed to consume your attention for as long as possible.\u003C/p>\n\u003Cp>There are no shortage of tools out there to help you curate your online experience. In addition to an RSS reader, check out independent Podcast clients (my personal favorite is \u003Ca href=\"https://overcast.fm\">Overcast\u003C/a>). If youre on Mastodon or Bluesky, follow hashtags for topics that interest you and join in on the conversation (and, of course, be kind when you do 🙂).\u003C/p>",{"headings":933,"localImagePaths":934,"remoteImagePaths":935,"frontmatter":936,"imagePaths":939},[],[],[],{"title":923,"pubDate":937,"tags":938},"3/1/25",[18,926,143],[],"2025/a-note-on-file-naming-conventions",{"id":940,"data":942,"body":946,"filePath":947,"digest":948,"rendered":949},{"title":943,"pubDate":944,"tags":945},"A Note On File Naming Conventions",["Date","2025-09-26T04:00:00.000Z"],[40],"It seems like the common convention for naming component files in React and other JavaScript frameworks is to use `PascalCase` rather than `kebab-case`. This was the way I was taught, and this is the way it's been in every shared project I've contributed to. I sort of just took for granted that it was just done that way.\n\nRecently though, while tinkering with my own little side-projects, I've started using `kebab-case` for all file names, including components. I think I prefer this method, it's something I'll be doing for all my own projects going forward[^1].\n\nNot sure if this is a hot take, or if this is a more popular opinion than I realize. I did a little searching and found [it's certainly not an original take](https://www.reddit.com/r/reactjs/comments/s2wbfx/jsts_frameworks_file_naming_convention_camelcase/).\n\nMy biggest reasons for preferring `kebab-case` are readability, and avoiding potential issues with case-insensitive file systems, both of which seem to align with why other people share my preference.\n\nAnyway, out of pure curiosity, I'm [running a poll](https://mastodon.social/@ghalldev/115271184813254936) on Mastodon to see what the general consensus is.\n\n[^1]: Except for Astro projects, annoyingly.","src/content/blog/2025/a-note-on-file-naming-conventions.md","0336d7fb8e4636f5",{"html":950,"metadata":951},"\u003Cp>It seems like the common convention for naming component files in React and other JavaScript frameworks is to use \u003Ccode>PascalCase\u003C/code> rather than \u003Ccode>kebab-case\u003C/code>. This was the way I was taught, and this is the way its been in every shared project Ive contributed to. I sort of just took for granted that it was just done that way.\u003C/p>\n\u003Cp>Recently though, while tinkering with my own little side-projects, Ive started using \u003Ccode>kebab-case\u003C/code> for all file names, including components. I think I prefer this method, its something Ill be doing for all my own projects going forward\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>.\u003C/p>\n\u003Cp>Not sure if this is a hot take, or if this is a more popular opinion than I realize. I did a little searching and found \u003Ca href=\"https://www.reddit.com/r/reactjs/comments/s2wbfx/jsts_frameworks_file_naming_convention_camelcase/\">its certainly not an original take\u003C/a>.\u003C/p>\n\u003Cp>My biggest reasons for preferring \u003Ccode>kebab-case\u003C/code> are readability, and avoiding potential issues with case-insensitive file systems, both of which seem to align with why other people share my preference.\u003C/p>\n\u003Cp>Anyway, out of pure curiosity, Im \u003Ca href=\"https://mastodon.social/@ghalldev/115271184813254936\">running a poll\u003C/a> on Mastodon to see what the general consensus is.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Except for Astro projects, annoyingly. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":952,"localImagePaths":954,"remoteImagePaths":955,"frontmatter":956,"imagePaths":959},[953],{"depth":292,"slug":293,"text":294},[],[],{"title":943,"pubDate":957,"tags":958},"9/26/25",[40],[],"2025/announcing-autodock",{"id":960,"data":962,"body":966,"filePath":967,"digest":968,"rendered":969},{"title":963,"pubDate":964,"tags":965},"Announcing AutoDock",["Date","2025-01-17T05:00:00.000Z"],[119,143,283],"I'm a MacBook Air user who often uses a larger external display, and I have a, perhaps, idiosyncratic desire to have the dock always visible on the larger display at my desk, but prefer it hidden when using the smaller, built-in one.\n\nWhile it's not all that inconvenient to manually swap the dock with a quick \u003Ckbd>opt\u003C/kbd> + \u003Ckbd>cmd\u003C/kbd> + \u003Ckbd>D\u003C/kbd>, I thought it would be cool to automate the process based on display size. I looked around for an app that would do this, and couldn't find one that worked reliably.\n\nSo, like any nerd with a bit too much free time, I thought I could make one myself. The problem is, I didn't know where to start, so I ended up putting the project off for months. Finally, last night I got a bit inspired to at least learn how to detect and read the displays connected to a Mac, which involved diving into the CoreGraphics API, something I was pretty unfamiliar with.\n\nOne thing led to another, and before I knew it I went from my original idea to working MVP in just a couple hours, which was not at all my plan. This morning, I had a few ideas to improve the UX which I then implemented and decided it was good enough to throw the 1.0 up online.\n\nIt's not perfect, but it's probably the first Mac app that I've made that I can say I'm truly proud of. The main thing I don't like is the fact that the app has to kill the Dock whenever autohiding gets switched on or offthough I've somewhat mitigated this by checking the Dock's current autohide status and only applying the changes if there's actually a changebut I'm not sure that's something that can be worked around. (If you do happen to know of a way, please [reach out to me on Mastodon](https://mastodon.social/@ghalldev) or [submit an issue](https://github.com/ghall89/AutoDock/issues/new?template=Blank+issue))\n\nFinally, due to the nature of the app, it is not sandboxed. If there is a way to handle updating the Dock in a way that will allow me to enable sandboxing I will implement it, but, based on my limited knowlege of Mac development, I don't think that's very likely.\n\nIf the app sounds useful to you, and you'd like to try it out, you can install it via Homebrew with `brew tap ghall89/tap && brew install --cask autodock`, or [download it manually](https://github.com/ghall89/AutoDock/releases).","src/content/blog/2025/announcing-autodock.md","92f9d94133eb06ca",{"html":970,"metadata":971},"\u003Cp>Im a MacBook Air user who often uses a larger external display, and I have a, perhaps, idiosyncratic desire to have the dock always visible on the larger display at my desk, but prefer it hidden when using the smaller, built-in one.\u003C/p>\n\u003Cp>While its not all that inconvenient to manually swap the dock with a quick \u003Ckbd>opt\u003C/kbd> + \u003Ckbd>cmd\u003C/kbd> + \u003Ckbd>D\u003C/kbd>, I thought it would be cool to automate the process based on display size. I looked around for an app that would do this, and couldnt find one that worked reliably.\u003C/p>\n\u003Cp>So, like any nerd with a bit too much free time, I thought I could make one myself. The problem is, I didnt know where to start, so I ended up putting the project off for months. Finally, last night I got a bit inspired to at least learn how to detect and read the displays connected to a Mac, which involved diving into the CoreGraphics API, something I was pretty unfamiliar with.\u003C/p>\n\u003Cp>One thing led to another, and before I knew it I went from my original idea to working MVP in just a couple hours, which was not at all my plan. This morning, I had a few ideas to improve the UX which I then implemented and decided it was good enough to throw the 1.0 up online.\u003C/p>\n\u003Cp>Its not perfect, but its probably the first Mac app that Ive made that I can say Im truly proud of. The main thing I dont like is the fact that the app has to kill the Dock whenever autohiding gets switched on or offthough Ive somewhat mitigated this by checking the Docks current autohide status and only applying the changes if theres actually a changebut Im not sure thats something that can be worked around. (If you do happen to know of a way, please \u003Ca href=\"https://mastodon.social/@ghalldev\">reach out to me on Mastodon\u003C/a> or \u003Ca href=\"https://github.com/ghall89/AutoDock/issues/new?template=Blank+issue\">submit an issue\u003C/a>)\u003C/p>\n\u003Cp>Finally, due to the nature of the app, it is not sandboxed. If there is a way to handle updating the Dock in a way that will allow me to enable sandboxing I will implement it, but, based on my limited knowlege of Mac development, I dont think thats very likely.\u003C/p>\n\u003Cp>If the app sounds useful to you, and youd like to try it out, you can install it via Homebrew with \u003Ccode>brew tap ghall89/tap && brew install --cask autodock\u003C/code>, or \u003Ca href=\"https://github.com/ghall89/AutoDock/releases\">download it manually\u003C/a>.\u003C/p>",{"headings":972,"localImagePaths":973,"remoteImagePaths":974,"frontmatter":975,"imagePaths":978},[],[],[],{"title":963,"pubDate":976,"tags":977},"1/17/25",[119,143,283],[],"2025/creating-my-perfect-smartphone",{"id":979,"data":981,"body":985,"filePath":986,"digest":987,"rendered":988},{"title":982,"pubDate":983,"tags":984},"Creating My Perfect Smartphone",["Date","2025-11-14T05:00:00.000Z"],[18,926],"Recently, I found myself wishing for a device with all the modern conveniences of a smartphone, but without all the baggage that comes along with those conveniences. A device to keep in touch with people, keep organized with notes and reminders, listen to music and podcasts, and access a handful of useful online services. Turns out, I already have one!\n\nOver the last several weeks, I've been slowly paring down what's on my phone. It started with basically anything with an endless, scrollable feed with the exception of Tapestry, Ivory,Ice Cubes, and Bluesky, though I'll come back to those. I also turned off all notifications except for the bare essentials, like text alerts, and have made judicious use of the iPhone's \"Scheduled Summary\" feature for things that I still want to get notified about, but don't warrant an alert, like podcast notifications.\n\nI've also removed any free-to-play games, with the exception of Pokémon TCG Pocket (it's been my guilty pleasure since it released 😅), and unsubscribed from Apple Arcade. My phone is not my primary gaming device, nor do I ever want it to be, so limiting my phone to games that I can just pick up and play for a few minutes here and there just makes sense.\n\nMore recently, I began the next phase of my plan for a better smartphone; removing the remaining \"infinite feed\" apps I mentioned earlier. Bluesky was easy, I spend very little time on there, there are just a few people in the web dev and gaming worlds I like to follow. Ivory and Ice Cubes (my Mastodon clients of choice) will probably be the most missed, but I have it open at pretty much all times when I'm at my computer, so I'm sure I will adapt.\n\nTapestry, I think, I will leave on because I have a little bit of a soft spot for it from being a Kickstarter backer, and because my feed is just web comics and cute animals.\n\nThere are definitely more things I can do to achieve the \"perfect\" smartphone. It's going to take a combination of experimentation and re-training my brain, but I think it can be done.","src/content/blog/2025/creating-my-perfect-smartphone.md","df3ce4f376f738fa",{"html":989,"metadata":990},"\u003Cp>Recently, I found myself wishing for a device with all the modern conveniences of a smartphone, but without all the baggage that comes along with those conveniences. A device to keep in touch with people, keep organized with notes and reminders, listen to music and podcasts, and access a handful of useful online services. Turns out, I already have one!\u003C/p>\n\u003Cp>Over the last several weeks, Ive been slowly paring down whats on my phone. It started with basically anything with an endless, scrollable feed with the exception of Tapestry, Ivory,Ice Cubes, and Bluesky, though Ill come back to those. I also turned off all notifications except for the bare essentials, like text alerts, and have made judicious use of the iPhones “Scheduled Summary” feature for things that I still want to get notified about, but dont warrant an alert, like podcast notifications.\u003C/p>\n\u003Cp>Ive also removed any free-to-play games, with the exception of Pokémon TCG Pocket (its been my guilty pleasure since it released 😅), and unsubscribed from Apple Arcade. My phone is not my primary gaming device, nor do I ever want it to be, so limiting my phone to games that I can just pick up and play for a few minutes here and there just makes sense.\u003C/p>\n\u003Cp>More recently, I began the next phase of my plan for a better smartphone; removing the remaining “infinite feed” apps I mentioned earlier. Bluesky was easy, I spend very little time on there, there are just a few people in the web dev and gaming worlds I like to follow. Ivory and Ice Cubes (my Mastodon clients of choice) will probably be the most missed, but I have it open at pretty much all times when Im at my computer, so Im sure I will adapt.\u003C/p>\n\u003Cp>Tapestry, I think, I will leave on because I have a little bit of a soft spot for it from being a Kickstarter backer, and because my feed is just web comics and cute animals.\u003C/p>\n\u003Cp>There are definitely more things I can do to achieve the “perfect” smartphone. Its going to take a combination of experimentation and re-training my brain, but I think it can be done.\u003C/p>",{"headings":991,"localImagePaths":992,"remoteImagePaths":993,"frontmatter":994,"imagePaths":997},[],[],[],{"title":982,"pubDate":995,"tags":996},"11/14/25",[18,926],[],"2025/getting-laid-off-and-the-state-of-tech",{"id":998,"data":1000,"body":1004,"filePath":1005,"digest":1006,"rendered":1007},{"title":1001,"pubDate":1002,"tags":1003},"On Getting Laid Off, and the State of Tech",["Date","2025-07-11T04:00:00.000Z"],[18,17],"Sometimes it feels like I got into tech at the exact wrong time. The state of the industry in 2021 seemed like exact break I needed after years working in customer service. But the combination of post-lockdown market corrections and the explosion of LLMs kind of put a damper on all that, and so I felt like I had to just make do with the job I had.\n\nFor those who don't follow me on Mastodon or LinkedIn, I was recently laid off from my first tech job after nearly 3 years. I spent the last several weeks processing the massive change this caused in my day-to-day life, and figuring out my next steps. In some ways I've been happier, I've had more time to focus on projects that appeal to me personally, but, because we live in a capitalist society, I am hyper-aware of the fact that I need an income and, thusly, a job.\n\nWith all the aforementioned changes that have happened over the last few years, finding a new job feels like an insurmountable task. I'm left wondering if perhaps I would have been in a better position if it didn't take me over a decade to realize that software development isn't just something I can do, but can be pretty competent at. But it's undeniable that a resumé made up of mostly tech experience would work in my favor far more than one made up of customer service jobs, but that's my reality.\n\nI am by no means fishing for sympathy, I know too well that I am far from the only person in this boat. I think that frustrates me more than anything, that this world I've loved for most of my life, and finally had the courage to break into and find my place in, is in the state that it is.\n\nI want to stay in the tech world, not just because I would rather drop a bowling ball on my toes than go back into customer service, but because I truly love tech. It would be a lie to say I never woke up dreading work, but it happened far more rarely than it did in any previous job. And, even at its worst, the work has been far more fulfilling than serving obnoxiously complex coffee orders, or printing people's ugly pamphlets designed in PowerPoint (sorry, not sorry 🫢).\n\nBut, most importantly, I love the potential for tech to improve people's lives. To bring us closer together, to streamline or eliminate the drudgery of life, and allow us to express ourselves and our creativity. More than anything, I want to continue to be a part of that world.","src/content/blog/2025/getting-laid-off-and-the-state-of-tech.md","b799cd383f69ef7c",{"html":1008,"metadata":1009},"\u003Cp>Sometimes it feels like I got into tech at the exact wrong time. The state of the industry in 2021 seemed like exact break I needed after years working in customer service. But the combination of post-lockdown market corrections and the explosion of LLMs kind of put a damper on all that, and so I felt like I had to just make do with the job I had.\u003C/p>\n\u003Cp>For those who dont follow me on Mastodon or LinkedIn, I was recently laid off from my first tech job after nearly 3 years. I spent the last several weeks processing the massive change this caused in my day-to-day life, and figuring out my next steps. In some ways Ive been happier, Ive had more time to focus on projects that appeal to me personally, but, because we live in a capitalist society, I am hyper-aware of the fact that I need an income and, thusly, a job.\u003C/p>\n\u003Cp>With all the aforementioned changes that have happened over the last few years, finding a new job feels like an insurmountable task. Im left wondering if perhaps I would have been in a better position if it didnt take me over a decade to realize that software development isnt just something I can do, but can be pretty competent at. But its undeniable that a resumé made up of mostly tech experience would work in my favor far more than one made up of customer service jobs, but thats my reality.\u003C/p>\n\u003Cp>I am by no means fishing for sympathy, I know too well that I am far from the only person in this boat. I think that frustrates me more than anything, that this world Ive loved for most of my life, and finally had the courage to break into and find my place in, is in the state that it is.\u003C/p>\n\u003Cp>I want to stay in the tech world, not just because I would rather drop a bowling ball on my toes than go back into customer service, but because I truly love tech. It would be a lie to say I never woke up dreading work, but it happened far more rarely than it did in any previous job. And, even at its worst, the work has been far more fulfilling than serving obnoxiously complex coffee orders, or printing peoples ugly pamphlets designed in PowerPoint (sorry, not sorry 🫢).\u003C/p>\n\u003Cp>But, most importantly, I love the potential for tech to improve peoples lives. To bring us closer together, to streamline or eliminate the drudgery of life, and allow us to express ourselves and our creativity. More than anything, I want to continue to be a part of that world.\u003C/p>",{"headings":1010,"localImagePaths":1011,"remoteImagePaths":1012,"frontmatter":1013,"imagePaths":1016},[],[],[],{"title":1001,"pubDate":1014,"tags":1015},"7/11/25",[18,17],[],"2025/knarr-a-pretty-cool-game",{"id":1017,"data":1019,"body":1023,"filePath":1024,"digest":1025,"rendered":1026},{"title":1020,"pubDate":1021,"tags":1022},"Knarr is a Pretty Cool Board Game",["Date","2025-05-11T04:00:00.000Z"],[178],"My latest board gaming obsession is quite an unlikely one for me. Im not particularly fond of the viking aesthetic in general, and, while I dont dislike engine-builder games, theyre not generally the type of game Id go out of my way to play.\n\nBut a little game called [Knarr](https://boardgamegeek.com/boardgame/379629) struck a chord with me. Someone in my gaming group introduced me, and I enjoyed it so much I ended up picking up my own copy. Something that has only happened once before with [Akropolis](https://boardgamegeek.com/boardgame/357563), another favorite of mine.\n\nThe concept of the game, without getting too much into the rules, is pretty simple; You play “crew cards” so named because they depict and represent members of a viking crew from your hand into columns based on color, when you play a card you trigger the effect of the card, in addition to the cards beneath it in that column. However, these cards serve another purpose as currency to purchase upgrades for you ship, which generally offer some immediate benefit, but also gets added to a separate engine that is triggered with another resource that you gather by playing the aforementioned crew cards.\n\nThats a gross oversimplification of the mechanics, but it pretty aptly describes the bit of the gameplay loop that tickles something in my brain. Basically the same kind of loop that hooked me on The Legend of Zelda: Tears of the Kingdom, albeit on a much smaller and more physical scale.\n\nThe other thing I enjoy about the game is how tense the game gets. In many games Ive played, once you fall too far behind you dont have a prayer of winning, but, at least in the games Ive played, even the player lagging behind the most can catch up with a good turn or two. Just about every game Ive played of it thus far, aside from a few times where a player who was already in the lead ends with an amazing turn and smokes everyone at the last second, has ended with all players within a few points of each other. It really feels like it could be anyones game until the very end, and, in my opinion, thats the mark of a truly fun and engaging game.","src/content/blog/2025/knarr-a-pretty-cool-game.md","7c45d4ed13f50a3d",{"html":1027,"metadata":1028},"\u003Cp>My latest board gaming obsession is quite an unlikely one for me. Im not particularly fond of the viking aesthetic in general, and, while I dont dislike engine-builder games, theyre not generally the type of game Id go out of my way to play.\u003C/p>\n\u003Cp>But a little game called \u003Ca href=\"https://boardgamegeek.com/boardgame/379629\">Knarr\u003C/a> struck a chord with me. Someone in my gaming group introduced me, and I enjoyed it so much I ended up picking up my own copy. Something that has only happened once before with \u003Ca href=\"https://boardgamegeek.com/boardgame/357563\">Akropolis\u003C/a>, another favorite of mine.\u003C/p>\n\u003Cp>The concept of the game, without getting too much into the rules, is pretty simple; You play “crew cards” so named because they depict and represent members of a viking crew from your hand into columns based on color, when you play a card you trigger the effect of the card, in addition to the cards beneath it in that column. However, these cards serve another purpose as currency to purchase upgrades for you ship, which generally offer some immediate benefit, but also gets added to a separate engine that is triggered with another resource that you gather by playing the aforementioned crew cards.\u003C/p>\n\u003Cp>Thats a gross oversimplification of the mechanics, but it pretty aptly describes the bit of the gameplay loop that tickles something in my brain. Basically the same kind of loop that hooked me on The Legend of Zelda: Tears of the Kingdom, albeit on a much smaller and more physical scale.\u003C/p>\n\u003Cp>The other thing I enjoy about the game is how tense the game gets. In many games Ive played, once you fall too far behind you dont have a prayer of winning, but, at least in the games Ive played, even the player lagging behind the most can catch up with a good turn or two. Just about every game Ive played of it thus far, aside from a few times where a player who was already in the lead ends with an amazing turn and smokes everyone at the last second, has ended with all players within a few points of each other. It really feels like it could be anyones game until the very end, and, in my opinion, thats the mark of a truly fun and engaging game.\u003C/p>",{"headings":1029,"localImagePaths":1030,"remoteImagePaths":1031,"frontmatter":1032,"imagePaths":1035},[],[],[],{"title":1020,"pubDate":1033,"tags":1034},"5/11/25",[178],[],"2025/intentional-analog-time",{"id":1036,"data":1038,"body":1042,"filePath":1043,"digest":1044,"rendered":1045},{"title":1039,"pubDate":1040,"tags":1041},"Intentional Analog Time",["Date","2025-09-19T04:00:00.000Z"],[17,41],"I've recently been experimenting with what I'm calling \"Intentional Analog Time\", where I take some time every day to do something without a screen, or any type of digital interruptions. Since getting laid off back in June, it feels like I've been spending more time in the digital realm, with my only reprieve being socializing, or doing stuff like cooking and cleaning.\n\nWithout the structure of a workday, I've found it easy to fall into the trap of being at my desk, either job searching or working on projects, until, 7, 8, even 9 PM, with some gaming mixed in. It's not great for my mental health, especially when news about all the terrible things happening in the world is just a few clicks away.\n\nSo what does \"Intentional Analog Time\" look like?\n\nIt varies, but the one consistent thing is no screens, no internet, nothing digital at all. If I want to listen to music, I have plenty of vinyl records I can play. If I want to write, I have a journal I actually wrote the first draft of this post in said journal. And if I want to play a game, I have a handful of board games that can be played solo, or a book of crossword puzzles if setting up a board game is too much friction.\n\nIt's been a nice way to break up the day, clear my head, focus on some other hobbies, and fully reset before diving back into tackling a job application or coding problem, or just winding down at the end of the day.\n\nI've only been trying this experiment for about a week, so it's probably to soon to see any major, noticeable changes. What I can say is that I've actually had the energy to start making the most of my screen time by also using that time more intentionally, and sitting down with a goal like refreshing my resumé, solving a frustrating problem with my app, sharpening my skills, or when I feel like slacking off a bit completing a quest in a video game.","src/content/blog/2025/intentional-analog-time.md","894d9f84d2d5f75b",{"html":1046,"metadata":1047},"\u003Cp>Ive recently been experimenting with what Im calling “Intentional Analog Time”, where I take some time every day to do something without a screen, or any type of digital interruptions. Since getting laid off back in June, it feels like Ive been spending more time in the digital realm, with my only reprieve being socializing, or doing stuff like cooking and cleaning.\u003C/p>\n\u003Cp>Without the structure of a workday, Ive found it easy to fall into the trap of being at my desk, either job searching or working on projects, until, 7, 8, even 9 PM, with some gaming mixed in. Its not great for my mental health, especially when news about all the terrible things happening in the world is just a few clicks away.\u003C/p>\n\u003Cp>So what does “Intentional Analog Time” look like?\u003C/p>\n\u003Cp>It varies, but the one consistent thing is no screens, no internet, nothing digital at all. If I want to listen to music, I have plenty of vinyl records I can play. If I want to write, I have a journal I actually wrote the first draft of this post in said journal. And if I want to play a game, I have a handful of board games that can be played solo, or a book of crossword puzzles if setting up a board game is too much friction.\u003C/p>\n\u003Cp>Its been a nice way to break up the day, clear my head, focus on some other hobbies, and fully reset before diving back into tackling a job application or coding problem, or just winding down at the end of the day.\u003C/p>\n\u003Cp>Ive only been trying this experiment for about a week, so its probably to soon to see any major, noticeable changes. What I can say is that Ive actually had the energy to start making the most of my screen time by also using that time more intentionally, and sitting down with a goal like refreshing my resumé, solving a frustrating problem with my app, sharpening my skills, or when I feel like slacking off a bit completing a quest in a video game.\u003C/p>",{"headings":1048,"localImagePaths":1049,"remoteImagePaths":1050,"frontmatter":1051,"imagePaths":1054},[],[],[],{"title":1039,"pubDate":1052,"tags":1053},"09/19/2025",[17,41],[],"2025/music-blog-challenge",{"id":1055,"data":1057,"body":1063,"filePath":1064,"digest":1065,"rendered":1066},{"title":1058,"pubDate":1059,"tags":1060},"Blog Questions Challenge: Music Edition",["Date","2025-02-07T05:00:00.000Z"],[1061,1062],"Music","Blog Challenge","For my very first Blog Question Challenge, I've been tagged by [Kyle](https://weblog.kylereddoch.me/2025/02/blog-questions-challenge-music-edition) to answer questions about music. This is going to be a bit of a challenge, but here we go...\n\n## What Are 5 Of Your Favorite Albums?\n\nThere are so many albums I'd consider favorites, narrowing them down to just 5 seems like an impossible task. Here's the 5 I've whittled my list down to, with the disclaimer that I don't necessarily like them more than other albums that didn't make the cut.\n\n- The Else - They Might Be Giants\n- Ocean Eyes - Owl City\n- Franz Ferdinand - Franz Ferdinand\n- Hey, I'm Just Like You - Tegan and Sara\n- White Blood Cells - The White Stripes\n\n## What Are 5 Of Your Favorite Songs?\n\nDitto for songs, but 100x more difficult...\n\n- Synopsis for Latecomers - They Might Be Giants\n- What Feels Like Eternity - Metric\n- The Last Great American Dynasty - Taylor Swift\n- This is Why - Paramore\n- Good Morning Tucson - Jonathan Coulton\n\n## Favorite Instrument(s)?\n\nI used to play the trumpet, so that's probably my favorite. After that, probably keyboard because I think it would be fun to play.\n\n## What Song Or Album Are You Currently Listening To?\n\nAs I write this, I am listening to Poké & Chill, which is an album of lo-fi renditions of music from the Pokémon video games.\n\n## Do You Listen To The Radio, And If So, How Often?\n\nI don't listen to the radio at all anymore. The one station I did listen to closed and got sold off years ago, and so my days of listening to the radio ended.\n\n## How Often Do You Listen To Music?\n\nAlmost constantly. I sometimes substitute it out for podcasts, but I'm generally listening to music while I work, clean, or just relax. I also listen to music while I write, but I generally only listen to various lo-fi albums.\n\n## How Often Do You Discover Music And How Do You Discover It?\n\nI don't discover as much new music as I would like to, but when I do it's through Apple Music in the New section, or from listening to some of their recommended playlists.\n\n## Whats A Song Or Album You Enjoy That You Wish Had More Recognition?\n\nI'm absolutely 100% biased here since I know the artist, but my pick is [Here's to the Sojourners](https://album.link/i/1598277466) by Nathan Landis Funk. Cool music by a cool guy.\n\n## Whats Your Favorite Song Of All Time?\n\nThis answer changes constantly, but at the moment I'd have to pick Birdhouse in Your Soul by They Might Be Giants. It's perhaps an odd choice, but it never fails to cheer me up when I'm feeling down and that's enough to cement it as my favorite...for the moment.\n\n## Has Your Taste Of Music Evolved Over The Years?\n\nI'd say it's expanded quite a bit, and I'd even say changed slighlty. I had a very limited taste in high school, and, while I still do like a lot of the music I listened to then, as my tastes have expanded I've found myself perferring a lot of different artists and genres. \"Alternative\" is still the most common genre in my Apple Music library, but over the last 16 years I've added electronic, folk, grunge, K-pop, and \"singer/songwriter\" (though I'm still not entirely sure what that means as a genre 🤷‍♂️).\n\nSo, after much overthinking, those are my answers to these musical questions. Thanks again to Kyle for tagging me. I'm tagging [Mark @ CodeMacLife](https://blog.codemaclife.net), good luck!","src/content/blog/2025/music-blog-challenge.md","6a14b92f68c390a8",{"html":1067,"metadata":1068},"\u003Cp>For my very first Blog Question Challenge, Ive been tagged by \u003Ca href=\"https://weblog.kylereddoch.me/2025/02/blog-questions-challenge-music-edition\">Kyle\u003C/a> to answer questions about music. This is going to be a bit of a challenge, but here we go…\u003C/p>\n\u003Ch2 id=\"what-are-5-of-your-favorite-albums\">What Are 5 Of Your Favorite Albums?\u003C/h2>\n\u003Cp>There are so many albums Id consider favorites, narrowing them down to just 5 seems like an impossible task. Heres the 5 Ive whittled my list down to, with the disclaimer that I dont necessarily like them more than other albums that didnt make the cut.\u003C/p>\n\u003Cul>\n\u003Cli>The Else - They Might Be Giants\u003C/li>\n\u003Cli>Ocean Eyes - Owl City\u003C/li>\n\u003Cli>Franz Ferdinand - Franz Ferdinand\u003C/li>\n\u003Cli>Hey, Im Just Like You - Tegan and Sara\u003C/li>\n\u003Cli>White Blood Cells - The White Stripes\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"what-are-5-of-your-favorite-songs\">What Are 5 Of Your Favorite Songs?\u003C/h2>\n\u003Cp>Ditto for songs, but 100x more difficult…\u003C/p>\n\u003Cul>\n\u003Cli>Synopsis for Latecomers - They Might Be Giants\u003C/li>\n\u003Cli>What Feels Like Eternity - Metric\u003C/li>\n\u003Cli>The Last Great American Dynasty - Taylor Swift\u003C/li>\n\u003Cli>This is Why - Paramore\u003C/li>\n\u003Cli>Good Morning Tucson - Jonathan Coulton\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"favorite-instruments\">Favorite Instrument(s)?\u003C/h2>\n\u003Cp>I used to play the trumpet, so thats probably my favorite. After that, probably keyboard because I think it would be fun to play.\u003C/p>\n\u003Ch2 id=\"what-song-or-album-are-you-currently-listening-to\">What Song Or Album Are You Currently Listening To?\u003C/h2>\n\u003Cp>As I write this, I am listening to Poké & Chill, which is an album of lo-fi renditions of music from the Pokémon video games.\u003C/p>\n\u003Ch2 id=\"do-you-listen-to-the-radio-and-if-so-how-often\">Do You Listen To The Radio, And If So, How Often?\u003C/h2>\n\u003Cp>I dont listen to the radio at all anymore. The one station I did listen to closed and got sold off years ago, and so my days of listening to the radio ended.\u003C/p>\n\u003Ch2 id=\"how-often-do-you-listen-to-music\">How Often Do You Listen To Music?\u003C/h2>\n\u003Cp>Almost constantly. I sometimes substitute it out for podcasts, but Im generally listening to music while I work, clean, or just relax. I also listen to music while I write, but I generally only listen to various lo-fi albums.\u003C/p>\n\u003Ch2 id=\"how-often-do-you-discover-music-and-how-do-you-discover-it\">How Often Do You Discover Music And How Do You Discover It?\u003C/h2>\n\u003Cp>I dont discover as much new music as I would like to, but when I do its through Apple Music in the New section, or from listening to some of their recommended playlists.\u003C/p>\n\u003Ch2 id=\"whats-a-song-or-album-you-enjoy-that-you-wish-had-more-recognition\">Whats A Song Or Album You Enjoy That You Wish Had More Recognition?\u003C/h2>\n\u003Cp>Im absolutely 100% biased here since I know the artist, but my pick is \u003Ca href=\"https://album.link/i/1598277466\">Heres to the Sojourners\u003C/a> by Nathan Landis Funk. Cool music by a cool guy.\u003C/p>\n\u003Ch2 id=\"whats-your-favorite-song-of-all-time\">Whats Your Favorite Song Of All Time?\u003C/h2>\n\u003Cp>This answer changes constantly, but at the moment Id have to pick Birdhouse in Your Soul by They Might Be Giants. Its perhaps an odd choice, but it never fails to cheer me up when Im feeling down and thats enough to cement it as my favorite…for the moment.\u003C/p>\n\u003Ch2 id=\"has-your-taste-of-music-evolved-over-the-years\">Has Your Taste Of Music Evolved Over The Years?\u003C/h2>\n\u003Cp>Id say its expanded quite a bit, and Id even say changed slighlty. I had a very limited taste in high school, and, while I still do like a lot of the music I listened to then, as my tastes have expanded Ive found myself perferring a lot of different artists and genres. “Alternative” is still the most common genre in my Apple Music library, but over the last 16 years Ive added electronic, folk, grunge, K-pop, and “singer/songwriter” (though Im still not entirely sure what that means as a genre 🤷‍♂️).\u003C/p>\n\u003Cp>So, after much overthinking, those are my answers to these musical questions. Thanks again to Kyle for tagging me. Im tagging \u003Ca href=\"https://blog.codemaclife.net\">Mark @ CodeMacLife\u003C/a>, good luck!\u003C/p>",{"headings":1069,"localImagePaths":1100,"remoteImagePaths":1101,"frontmatter":1102,"imagePaths":1105},[1070,1073,1076,1079,1082,1085,1088,1091,1094,1097],{"depth":292,"slug":1071,"text":1072},"what-are-5-of-your-favorite-albums","What Are 5 Of Your Favorite Albums?",{"depth":292,"slug":1074,"text":1075},"what-are-5-of-your-favorite-songs","What Are 5 Of Your Favorite Songs?",{"depth":292,"slug":1077,"text":1078},"favorite-instruments","Favorite Instrument(s)?",{"depth":292,"slug":1080,"text":1081},"what-song-or-album-are-you-currently-listening-to","What Song Or Album Are You Currently Listening To?",{"depth":292,"slug":1083,"text":1084},"do-you-listen-to-the-radio-and-if-so-how-often","Do You Listen To The Radio, And If So, How Often?",{"depth":292,"slug":1086,"text":1087},"how-often-do-you-listen-to-music","How Often Do You Listen To Music?",{"depth":292,"slug":1089,"text":1090},"how-often-do-you-discover-music-and-how-do-you-discover-it","How Often Do You Discover Music And How Do You Discover It?",{"depth":292,"slug":1092,"text":1093},"whats-a-song-or-album-you-enjoy-that-you-wish-had-more-recognition","Whats A Song Or Album You Enjoy That You Wish Had More Recognition?",{"depth":292,"slug":1095,"text":1096},"whats-your-favorite-song-of-all-time","Whats Your Favorite Song Of All Time?",{"depth":292,"slug":1098,"text":1099},"has-your-taste-of-music-evolved-over-the-years","Has Your Taste Of Music Evolved Over The Years?",[],[],{"title":1058,"pubDate":1103,"tags":1104},"2/7/25",[1061,1062],[],"2025/my-favorite-analog-tech",{"id":1106,"data":1108,"body":1112,"filePath":1113,"digest":1114,"rendered":1115},{"title":1109,"pubDate":1110,"tags":1111},"My Favorite Analog Tech",["Date","2025-10-16T04:00:00.000Z"],[18],"Im a bit of a tech nerd, so its no surprise that I love my gadgets. While it is fun to talk about my computer setup, or how I use my smartphone, its not something I particularly enjoy writing about, unless I feel like I have something interesting to share, or Im doing my yearly “Default Apps” update.\n\nBut, inspired in part by my [intentional analog time](blog/2025/intentional-analog-time/), I thought it might be fun to take a look at my analog tech setup that is, gadgets I love and use almost every day that arent a computer or computer-adjacent.\n\n## Electric Kettle\n\nWhen I moved into my current place, I found myself stuck with a gas stove. Im not a fan of them for many reasons, one of which is how much longer it takes to boil a kettle of water. I drink a lot of tea, and enjoy pour-over coffee, so I decided to replace my stovetop kettle with an electric one, and I dont think I can ever go back. Theyre so fast, and you dont have to have your eardrums blasted by the whistle of a stovetop kettle.\n\nI probably could have gone with a nicer one, but [this one](https://shopelitegourmet.com/collections/electric-kettles/products/1l-glass-kettle?variant=37480151482526) from Elite Gourmet has done the job for a couple years now.\n\n## Record Player\n\nListening to music is a big part of my life. While I do love having almost any album I want at my fingertips, theres something more personal about putting on a record. Perhaps it's the tactility of placing the vinyl disc on the platter and lowering the needle, or maybe its the “warmness” of the analog sound, but it provides a very different experience than digital streaming.\n\nMy turntable of choice is the [RT80](https://www.fluance.com/rt80-high-fidelity-vinyl-turntable-record-player-with-premium-cartridge-diamond-needle) from Fluance.\n\n## Smoothie Blender\n\nIve historically eaten less fruit due to some digestive issues, which I wont go into here. But I always enjoy a good smoothie.\n\nSo, I decided to get a smoothie blender to improve my fruit intake, and have some fun concocting smoothie recipes. My favorite recipe so far is a peanut butter and banana smoothie, made with unsweetened vanilla oat milk, and a hint of cacao.\n\nI had some trouble tracking it down, but I use [this one](https://www.amazon.com/s?k=frigidaire+smoothie+blender+retro&i=garden&page=2&xpid=pPphYp9Iq1rgo&crid=3HQNHUXD2UICY&qid=1760648409&sprefix=frigidaire+smoothie+blender+retro%2Cgarden%2C69&ref=sr_pg_1) from Frigidaire.\n\n## Handheld Vacuum\n\nI hate vacuuming. I dont know what it is about it, but its one of my least favorite chores. However, I find sweeping kind of relaxing[^1]. In addition, I find most household vacuums unwieldy, and you have to deal with plugging and unplugging cords because god forbid they make a cord long enough to cover a 1-bedroom apartment…sorry where was I?\n\nAnyway, Ive found cleaning to be much more agreeable when Im sweeping the floor, and then, when Im done, vacuuming up the dirt piles, and reaching the various un-sweepable crevices with a much more manageable handheld, battery-powered vacuum.\n\nAgain, I had trouble finding my exact model, but [this guy](https://www.blackanddecker.com/products/chv1410l?variant=43205384831197) from Black & Decker is a slightly fancier (and uglier) version of the model I have\n\n[^1]: I suppose this is some psychological conditioning from my food service days, when sweeping the floor meant my shift was almost over. 🤷‍♂️","src/content/blog/2025/my-favorite-analog-tech.md","48d80048733bc0e4",{"html":1116,"metadata":1117},"\u003Cp>Im a bit of a tech nerd, so its no surprise that I love my gadgets. While it is fun to talk about my computer setup, or how I use my smartphone, its not something I particularly enjoy writing about, unless I feel like I have something interesting to share, or Im doing my yearly “Default Apps” update.\u003C/p>\n\u003Cp>But, inspired in part by my \u003Ca href=\"blog/2025/intentional-analog-time/\">intentional analog time\u003C/a>, I thought it might be fun to take a look at my analog tech setup that is, gadgets I love and use almost every day that arent a computer or computer-adjacent.\u003C/p>\n\u003Ch2 id=\"electric-kettle\">Electric Kettle\u003C/h2>\n\u003Cp>When I moved into my current place, I found myself stuck with a gas stove. Im not a fan of them for many reasons, one of which is how much longer it takes to boil a kettle of water. I drink a lot of tea, and enjoy pour-over coffee, so I decided to replace my stovetop kettle with an electric one, and I dont think I can ever go back. Theyre so fast, and you dont have to have your eardrums blasted by the whistle of a stovetop kettle.\u003C/p>\n\u003Cp>I probably could have gone with a nicer one, but \u003Ca href=\"https://shopelitegourmet.com/collections/electric-kettles/products/1l-glass-kettle?variant=37480151482526\">this one\u003C/a> from Elite Gourmet has done the job for a couple years now.\u003C/p>\n\u003Ch2 id=\"record-player\">Record Player\u003C/h2>\n\u003Cp>Listening to music is a big part of my life. While I do love having almost any album I want at my fingertips, theres something more personal about putting on a record. Perhaps its the tactility of placing the vinyl disc on the platter and lowering the needle, or maybe its the “warmness” of the analog sound, but it provides a very different experience than digital streaming.\u003C/p>\n\u003Cp>My turntable of choice is the \u003Ca href=\"https://www.fluance.com/rt80-high-fidelity-vinyl-turntable-record-player-with-premium-cartridge-diamond-needle\">RT80\u003C/a> from Fluance.\u003C/p>\n\u003Ch2 id=\"smoothie-blender\">Smoothie Blender\u003C/h2>\n\u003Cp>Ive historically eaten less fruit due to some digestive issues, which I wont go into here. But I always enjoy a good smoothie.\u003C/p>\n\u003Cp>So, I decided to get a smoothie blender to improve my fruit intake, and have some fun concocting smoothie recipes. My favorite recipe so far is a peanut butter and banana smoothie, made with unsweetened vanilla oat milk, and a hint of cacao.\u003C/p>\n\u003Cp>I had some trouble tracking it down, but I use \u003Ca href=\"https://www.amazon.com/s?k=frigidaire+smoothie+blender+retro&i=garden&page=2&xpid=pPphYp9Iq1rgo&crid=3HQNHUXD2UICY&qid=1760648409&sprefix=frigidaire+smoothie+blender+retro%2Cgarden%2C69&ref=sr_pg_1\">this one\u003C/a> from Frigidaire.\u003C/p>\n\u003Ch2 id=\"handheld-vacuum\">Handheld Vacuum\u003C/h2>\n\u003Cp>I hate vacuuming. I dont know what it is about it, but its one of my least favorite chores. However, I find sweeping kind of relaxing\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>. In addition, I find most household vacuums unwieldy, and you have to deal with plugging and unplugging cords because god forbid they make a cord long enough to cover a 1-bedroom apartment…sorry where was I?\u003C/p>\n\u003Cp>Anyway, Ive found cleaning to be much more agreeable when Im sweeping the floor, and then, when Im done, vacuuming up the dirt piles, and reaching the various un-sweepable crevices with a much more manageable handheld, battery-powered vacuum.\u003C/p>\n\u003Cp>Again, I had trouble finding my exact model, but \u003Ca href=\"https://www.blackanddecker.com/products/chv1410l?variant=43205384831197\">this guy\u003C/a> from Black & Decker is a slightly fancier (and uglier) version of the model I have\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>I suppose this is some psychological conditioning from my food service days, when sweeping the floor meant my shift was almost over. 🤷‍♂️ \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":1118,"localImagePaths":1132,"remoteImagePaths":1133,"frontmatter":1134,"imagePaths":1137},[1119,1122,1125,1128,1131],{"depth":292,"slug":1120,"text":1121},"electric-kettle","Electric Kettle",{"depth":292,"slug":1123,"text":1124},"record-player","Record Player",{"depth":292,"slug":1126,"text":1127},"smoothie-blender","Smoothie Blender",{"depth":292,"slug":1129,"text":1130},"handheld-vacuum","Handheld Vacuum",{"depth":292,"slug":293,"text":294},[],[],{"title":1109,"pubDate":1135,"tags":1136},"10/16/2025",[18],[],"2025/the-new-ghall-dot-space",{"id":1138,"data":1140,"body":1145,"filePath":1146,"digest":1147,"rendered":1148},{"title":1141,"pubDate":1142,"tags":1143},"The New ghall.space",["Date","2025-09-01T04:00:00.000Z"],[1144,283,40],"Meta","It's been a while since I originally built this website, which started life as a little project to learn the, at the time, brand new web framework Astro. My skills in web development have improved greatly in that time, as has the functionality of the Astro framework. Therefore, I thought it would be a fun project to make some improvements to the site, both visually and in how the codebase is structured.\n\nOne of the biggest front-facing changes I've made, aside from new typography and some layout adjustments, is a mobile-responsive navigation bar. Mobile is always something I've been conscious of when building this site, but I opted for a simplified approach by ensuring the site was usable on mobile without introducing many responsive elements. But as the site morphed from a simple blog to a more generalized space on the internet (hence the \".space\" TLD), I've discovered the limits of that design philosophy.\n\nBehind the scenes, there have been a few changes as well. I originally built this site with Astro version 1.6.13, and I have periodically upgraded it over time. Today, it's using Astro 5.13.3, and while it's a credit to the Astro framework that the codebase for this site has seen very few upgrade-related changes over the various versions, some annoying tech debt has been building up especially around [content collections](https://docs.astro.build/en/guides/content-collections/), which the blog section of this site relies on, and has been coasting along on legacy support for a previous implementation.\n\nFinally, I didn't fully appreciate Astro's support for scoped styles when I originally built this site. I pretty much dumped everything in a _global.css_ file, which would have been fine, but over time I started using scoped styles and it became a bit confusing where the styles for various elements were. So, as part of this revamp, I finally moved CSS that should be scoped into its respective page or component files.\n\nThis is far from the final version of this revamp, but I think the design and structural changes will make it much easier to improve and build upon what's here. Addressing the tech debt will also allow me to make use of some newer features, especially around content collections, and hopefully make future upgrades to the Astro framework and its associated dependencies more painless.","src/content/blog/2025/the-new-ghall-dot-space.md","f02020e228dd90c2",{"html":1149,"metadata":1150},"\u003Cp>Its been a while since I originally built this website, which started life as a little project to learn the, at the time, brand new web framework Astro. My skills in web development have improved greatly in that time, as has the functionality of the Astro framework. Therefore, I thought it would be a fun project to make some improvements to the site, both visually and in how the codebase is structured.\u003C/p>\n\u003Cp>One of the biggest front-facing changes Ive made, aside from new typography and some layout adjustments, is a mobile-responsive navigation bar. Mobile is always something Ive been conscious of when building this site, but I opted for a simplified approach by ensuring the site was usable on mobile without introducing many responsive elements. But as the site morphed from a simple blog to a more generalized space on the internet (hence the “.space” TLD), Ive discovered the limits of that design philosophy.\u003C/p>\n\u003Cp>Behind the scenes, there have been a few changes as well. I originally built this site with Astro version 1.6.13, and I have periodically upgraded it over time. Today, its using Astro 5.13.3, and while its a credit to the Astro framework that the codebase for this site has seen very few upgrade-related changes over the various versions, some annoying tech debt has been building up especially around \u003Ca href=\"https://docs.astro.build/en/guides/content-collections/\">content collections\u003C/a>, which the blog section of this site relies on, and has been coasting along on legacy support for a previous implementation.\u003C/p>\n\u003Cp>Finally, I didnt fully appreciate Astros support for scoped styles when I originally built this site. I pretty much dumped everything in a \u003Cem>global.css\u003C/em> file, which would have been fine, but over time I started using scoped styles and it became a bit confusing where the styles for various elements were. So, as part of this revamp, I finally moved CSS that should be scoped into its respective page or component files.\u003C/p>\n\u003Cp>This is far from the final version of this revamp, but I think the design and structural changes will make it much easier to improve and build upon whats here. Addressing the tech debt will also allow me to make use of some newer features, especially around content collections, and hopefully make future upgrades to the Astro framework and its associated dependencies more painless.\u003C/p>",{"headings":1151,"localImagePaths":1152,"remoteImagePaths":1153,"frontmatter":1154,"imagePaths":1157},[],[],[],{"title":1141,"pubDate":1155,"tags":1156},"9/1/25",[1144,283,40],[],"2025/redoing-my-gaming-setup",{"id":1158,"data":1160,"body":1164,"filePath":1165,"digest":1166,"rendered":1167},{"title":1161,"pubDate":1162,"tags":1163},"Redoing My Gaming Setup",["Date","2025-04-13T04:00:00.000Z"],[178,18,17],"Recently, the backlight on my TV crapped out. If I'm honest, it's a miracle a budget TV from the early 2010's lasted this long. Though I'd thought about replacing it over the last few years, my stubborn refusal to purchase a smart TV kept me from taking the leap.\n\nThat stubbornness, along with the fact that spending a few hundred dollars on consumer electronics seems a tad irresponsible at the moment, led me to rethink my setup, and question if I even need a TV. After all, 95% of the time that TV is on I'm playing a video game, and I almost always watch movies and shows on my MacBook (probably because the screen is a lot nicer).\n\nI already have a pretty nice 4K panel with HDR at my desk, the perfect companion for a PlayStation 5 and maybe the upcoming Switch 2 if it's not pushed cleanly outside of my price range by tariffs. It's even been a huge boon to the visual quality of Switch games, despite the 1080p resolution.\n\nI quickly ran into a problem though; my display the LG UltraFine only has 2 HDMI ports. That seems more than reasonable for a product designed for a desk, but but it was going to make my setup a tad inconvenient.\n\nI ended up purchasing an Anker HDMI switch to connect my game consoles, which I then affixed to the back of my desk for easy access since it doesn't always correctly pick up which console is powered on (maybe I just need to tinker with each console's CEC config?).\n\nIt's been a little over a week using this setup, and after several rounds of Fortnite (which were some of my best rounds I've ever played amazing how visual clarity helps aim) and a handful of hours of Xenoblade Chronicles X, I can see myself getting used to this setup. It brings me back to my PC gaming days, without all the hardware shenanigans, and having to use Windows. 🤢\n\nAnother benefit is that it's freed up my old TV area, and opened many possibilities to be more flexible with how I have it arranged. I can make it a more comfortable space without having to arrange it around a screen, where I can relax, listen to music, or even do some work if I want to get away from my desk.","src/content/blog/2025/redoing-my-gaming-setup.md","be3dd4bfffd8339f",{"html":1168,"metadata":1169},"\u003Cp>Recently, the backlight on my TV crapped out. If Im honest, its a miracle a budget TV from the early 2010s lasted this long. Though Id thought about replacing it over the last few years, my stubborn refusal to purchase a smart TV kept me from taking the leap.\u003C/p>\n\u003Cp>That stubbornness, along with the fact that spending a few hundred dollars on consumer electronics seems a tad irresponsible at the moment, led me to rethink my setup, and question if I even need a TV. After all, 95% of the time that TV is on Im playing a video game, and I almost always watch movies and shows on my MacBook (probably because the screen is a lot nicer).\u003C/p>\n\u003Cp>I already have a pretty nice 4K panel with HDR at my desk, the perfect companion for a PlayStation 5 and maybe the upcoming Switch 2 if its not pushed cleanly outside of my price range by tariffs. Its even been a huge boon to the visual quality of Switch games, despite the 1080p resolution.\u003C/p>\n\u003Cp>I quickly ran into a problem though; my display the LG UltraFine only has 2 HDMI ports. That seems more than reasonable for a product designed for a desk, but but it was going to make my setup a tad inconvenient.\u003C/p>\n\u003Cp>I ended up purchasing an Anker HDMI switch to connect my game consoles, which I then affixed to the back of my desk for easy access since it doesnt always correctly pick up which console is powered on (maybe I just need to tinker with each consoles CEC config?).\u003C/p>\n\u003Cp>Its been a little over a week using this setup, and after several rounds of Fortnite (which were some of my best rounds Ive ever played amazing how visual clarity helps aim) and a handful of hours of Xenoblade Chronicles X, I can see myself getting used to this setup. It brings me back to my PC gaming days, without all the hardware shenanigans, and having to use Windows. 🤢\u003C/p>\n\u003Cp>Another benefit is that its freed up my old TV area, and opened many possibilities to be more flexible with how I have it arranged. I can make it a more comfortable space without having to arrange it around a screen, where I can relax, listen to music, or even do some work if I want to get away from my desk.\u003C/p>",{"headings":1170,"localImagePaths":1171,"remoteImagePaths":1172,"frontmatter":1173,"imagePaths":1176},[],[],[],{"title":1161,"pubDate":1174,"tags":1175},"4/13/2025",[178,18,17],[],"2025/ramblings-on-zen-browser",{"id":1177,"data":1179,"body":1183,"filePath":1184,"digest":1185,"rendered":1186},{"title":1180,"pubDate":1181,"tags":1182},"Ramblings on the Zen Browser",["Date","2025-05-30T04:00:00.000Z"],[18,143],"Ive been using the Zen Browser for a little over a month now. I was introduced to it via a co-worker during a screen share, and I pretty much instantly fell in love. Its got its share of issues, but its served as an excellent replacement for Arc, which is now (for abundantly stupid reasons) a dead product.\n\nBetween Arc and Zen, I was using Vivaldi. I found the UI extremely clunky and frankly pretty ugly. And I had grown used to the idea of the collapsible sidebar of tabs, as well as different browsing contexts, things that fundamentally changed how I use a web browser. While Vivaldi had similar functionality, it was, not surprisingly, clunky and unintuitive.\n\nThats not to say Zen doesnt have its share of clunkiness at times, its definitely not as polished as Arc was. But its always improving, and, even at its clunkiest, its nowhere near as unpleasant as Vivaldis UX. But it works great 95% of the time, and thats quite impressive for a relatively young open-source project thats not backed by a big tech company.\n\nUnlike Arc, and indeed unlike most browsers these days, Zen doesnt use Chromium for its rendering engine. Instead, it uses Gecko, which is maintained by Mozilla, and used in their Firefox browser. This may be a downside for a lot of people, its not the most cutting edge in terms of web standards, but if it helps bring renewed interest in rendering engines not made by Apple or Google I see that as a major plus Ill spare the lecture on why I believe Chromium has become far too ubiquitous.\n\nOn the web dev side, Ive found the developer tools to be…fine. Ive used the Firefox dev tools in the past, so Im comfortable with them, and it didnt take me long to adjust. While I much prefer the Chromium dev tools (which is about the only thing I _like_ about Chromium), I dont find the Gecko dev tools that much worse. Which is more than I can say about Safaris dev tools. 😬\n\nAnother major positive is battery life. Id become somewhat used to the less-than-ideal battery life I was getting with Arc, and slightly less so than Vivaldi. But after switching to Zen, I started to notice my battery was lasting quite a bit longer. As I write this (with Zen open in the background), my M2 MacBook Air is at about 88% battery, with 11 hours remaining. I know in practice it wont _actually_ last 11 hours, but thats higher than any estimation that I can recall ever getting using a Chromium-based browser. In practice, it means that, generally, depending on which Node environments I have to run locally that day, I can make it through an entire 8 hour workday, with a bit to spare.\n\nThe biggest downsides are the inability to access DRMd content online, specifically on streaming services (Ive been swapping to Safari to get my Andor and Doctor Who fix), and the fact that the iCloud Keychain extension doesn't work (though I've heard through the internet grapevine a fix is coming). Also, the fun and I will admit, relatively obnoxious animations on this site do not work, but that should be remedied whenever Firefox fully implements the View Transition API.\n\nAll in all, my experience with the Zen Browser has been positive, and, barring any unforeseen changes, I see myself sticking with it for the long haul. Or, at least until a shiny new browser pops up. 😅","src/content/blog/2025/ramblings-on-zen-browser.md","512851242e130de2",{"html":1187,"metadata":1188},"\u003Cp>Ive been using the Zen Browser for a little over a month now. I was introduced to it via a co-worker during a screen share, and I pretty much instantly fell in love. Its got its share of issues, but its served as an excellent replacement for Arc, which is now (for abundantly stupid reasons) a dead product.\u003C/p>\n\u003Cp>Between Arc and Zen, I was using Vivaldi. I found the UI extremely clunky and frankly pretty ugly. And I had grown used to the idea of the collapsible sidebar of tabs, as well as different browsing contexts, things that fundamentally changed how I use a web browser. While Vivaldi had similar functionality, it was, not surprisingly, clunky and unintuitive.\u003C/p>\n\u003Cp>Thats not to say Zen doesnt have its share of clunkiness at times, its definitely not as polished as Arc was. But its always improving, and, even at its clunkiest, its nowhere near as unpleasant as Vivaldis UX. But it works great 95% of the time, and thats quite impressive for a relatively young open-source project thats not backed by a big tech company.\u003C/p>\n\u003Cp>Unlike Arc, and indeed unlike most browsers these days, Zen doesnt use Chromium for its rendering engine. Instead, it uses Gecko, which is maintained by Mozilla, and used in their Firefox browser. This may be a downside for a lot of people, its not the most cutting edge in terms of web standards, but if it helps bring renewed interest in rendering engines not made by Apple or Google I see that as a major plus Ill spare the lecture on why I believe Chromium has become far too ubiquitous.\u003C/p>\n\u003Cp>On the web dev side, Ive found the developer tools to be…fine. Ive used the Firefox dev tools in the past, so Im comfortable with them, and it didnt take me long to adjust. While I much prefer the Chromium dev tools (which is about the only thing I \u003Cem>like\u003C/em> about Chromium), I dont find the Gecko dev tools that much worse. Which is more than I can say about Safaris dev tools. 😬\u003C/p>\n\u003Cp>Another major positive is battery life. Id become somewhat used to the less-than-ideal battery life I was getting with Arc, and slightly less so than Vivaldi. But after switching to Zen, I started to notice my battery was lasting quite a bit longer. As I write this (with Zen open in the background), my M2 MacBook Air is at about 88% battery, with 11 hours remaining. I know in practice it wont \u003Cem>actually\u003C/em> last 11 hours, but thats higher than any estimation that I can recall ever getting using a Chromium-based browser. In practice, it means that, generally, depending on which Node environments I have to run locally that day, I can make it through an entire 8 hour workday, with a bit to spare.\u003C/p>\n\u003Cp>The biggest downsides are the inability to access DRMd content online, specifically on streaming services (Ive been swapping to Safari to get my Andor and Doctor Who fix), and the fact that the iCloud Keychain extension doesnt work (though Ive heard through the internet grapevine a fix is coming). Also, the fun and I will admit, relatively obnoxious animations on this site do not work, but that should be remedied whenever Firefox fully implements the View Transition API.\u003C/p>\n\u003Cp>All in all, my experience with the Zen Browser has been positive, and, barring any unforeseen changes, I see myself sticking with it for the long haul. Or, at least until a shiny new browser pops up. 😅\u003C/p>",{"headings":1189,"localImagePaths":1190,"remoteImagePaths":1191,"frontmatter":1192,"imagePaths":1195},[],[],[],{"title":1180,"pubDate":1193,"tags":1194},"5/30/25",[18,143],[],"2025/my-top-20-switch-games",{"id":1196,"data":1198,"body":1202,"filePath":1203,"digest":1204,"rendered":1205},{"title":1199,"pubDate":1200,"tags":1201},"My Top 20 Nintendo Switch Games",["Date","2025-03-07T05:00:00.000Z"],[178],"Its crazy that the Nintendo Switch has been around for 8 years now. While I didnt get the Switch until about a year after it released, I think it just might be the console that Ive played regularly for the longest amount of time (just barely edging out the Nintendo 3DS), and as such will always have a special place in my heart. Even with the Switch 2 on the horizon, Im not sure Im ready to move on.\n\nThe Switch is also the console Ive played the most games on, so I thought it would be fun to go through and rank my personal top 20 games that I played on the system. Because Im posting this on the Internet, I should give the disclaimer that this is my own purely subjective selection of games that are meaningful to me personally. There may be objectively better games than some of the ones on this list, but I either havent played them or they werent as personally meaningful to me.\n\nAlso, I listed them in alphabetical order partly because I couldnt decide on a ranking, but mostly because it makes my brain happy. 🧠\n\n- A Short Hike\n- Animal Crossing: New Horizons\n- Fire Emblem Engage\n- Hades\n- Kirby and the Forgotten Land\n- The Legend of Zelda: Tears of the Kingdom\n- Metroid Dread\n- Persona 5 Royal\n- Pokemon Legends: Arceus\n- Sea of Stars\n- Shantae and the Seven Sirens\n- Splatoon 3\n- Super Mario Odyssey\n- Super Mario Wonder\n- Super Smash Bros Ultimate\n- Tetris 99\n- Unicorn Overlord\n- The Witcher 3: Wild Hunt\n- Xenoblade Chronicles 3\n- Yooka-Laylee and the Impossible Lair\n\nI opted to stay away from remasters/remakes, but as a bonus here are the ones that stood out to me…\n\n- Assassins Creed: The Ezio Collection\n- Bayonetta\n- Final Fantasy IV Pixel Remaster\n- The Legend of Zelda: Links Awakening\n- Life is Strange Remastered\n- Pokemon Brilliant Diamond/Shining Pearl\n- Star Ocean The Second Story R\n- Super Mario RPG\n- Xenoblade Chronicles: Definitive Edition","src/content/blog/2025/my-top-20-switch-games.md","5d2294bfa6e8ce7b",{"html":1206,"metadata":1207},"\u003Cp>Its crazy that the Nintendo Switch has been around for 8 years now. While I didnt get the Switch until about a year after it released, I think it just might be the console that Ive played regularly for the longest amount of time (just barely edging out the Nintendo 3DS), and as such will always have a special place in my heart. Even with the Switch 2 on the horizon, Im not sure Im ready to move on.\u003C/p>\n\u003Cp>The Switch is also the console Ive played the most games on, so I thought it would be fun to go through and rank my personal top 20 games that I played on the system. Because Im posting this on the Internet, I should give the disclaimer that this is my own purely subjective selection of games that are meaningful to me personally. There may be objectively better games than some of the ones on this list, but I either havent played them or they werent as personally meaningful to me.\u003C/p>\n\u003Cp>Also, I listed them in alphabetical order partly because I couldnt decide on a ranking, but mostly because it makes my brain happy. 🧠\u003C/p>\n\u003Cul>\n\u003Cli>A Short Hike\u003C/li>\n\u003Cli>Animal Crossing: New Horizons\u003C/li>\n\u003Cli>Fire Emblem Engage\u003C/li>\n\u003Cli>Hades\u003C/li>\n\u003Cli>Kirby and the Forgotten Land\u003C/li>\n\u003Cli>The Legend of Zelda: Tears of the Kingdom\u003C/li>\n\u003Cli>Metroid Dread\u003C/li>\n\u003Cli>Persona 5 Royal\u003C/li>\n\u003Cli>Pokemon Legends: Arceus\u003C/li>\n\u003Cli>Sea of Stars\u003C/li>\n\u003Cli>Shantae and the Seven Sirens\u003C/li>\n\u003Cli>Splatoon 3\u003C/li>\n\u003Cli>Super Mario Odyssey\u003C/li>\n\u003Cli>Super Mario Wonder\u003C/li>\n\u003Cli>Super Smash Bros Ultimate\u003C/li>\n\u003Cli>Tetris 99\u003C/li>\n\u003Cli>Unicorn Overlord\u003C/li>\n\u003Cli>The Witcher 3: Wild Hunt\u003C/li>\n\u003Cli>Xenoblade Chronicles 3\u003C/li>\n\u003Cli>Yooka-Laylee and the Impossible Lair\u003C/li>\n\u003C/ul>\n\u003Cp>I opted to stay away from remasters/remakes, but as a bonus here are the ones that stood out to me…\u003C/p>\n\u003Cul>\n\u003Cli>Assassins Creed: The Ezio Collection\u003C/li>\n\u003Cli>Bayonetta\u003C/li>\n\u003Cli>Final Fantasy IV Pixel Remaster\u003C/li>\n\u003Cli>The Legend of Zelda: Links Awakening\u003C/li>\n\u003Cli>Life is Strange Remastered\u003C/li>\n\u003Cli>Pokemon Brilliant Diamond/Shining Pearl\u003C/li>\n\u003Cli>Star Ocean The Second Story R\u003C/li>\n\u003Cli>Super Mario RPG\u003C/li>\n\u003Cli>Xenoblade Chronicles: Definitive Edition\u003C/li>\n\u003C/ul>",{"headings":1208,"localImagePaths":1209,"remoteImagePaths":1210,"frontmatter":1211,"imagePaths":1214},[],[],[],{"title":1199,"pubDate":1212,"tags":1213},"3/7/25",[178],[],"2025/the-steam-machine",{"id":1215,"data":1217,"body":1221,"filePath":1222,"digest":1223,"rendered":1224},{"title":1218,"pubDate":1219,"tags":1220},"Notes on the Steam Machine",["Date","2025-11-16T05:00:00.000Z"],[178,18],"The big news in the tech and gaming worlds this past week is Valve announcing [their new Steam Machine](https://store.steampowered.com/sale/steammachine). While I don't have any immediate desire for it, I am fascinated by it as a gamer and tech enthusiast, and I'm very curious to see where it goes. There is a non-zero chance I pick one up at some point in teh future, depending on how things shake out with both the Steam Machine as a product, and the gaming industry as a whole.\n\nUp until now, I never had any interest in Valve's hardare products. Despite being a big handheld gamer, the Steam Deck did not appeal to me in the slightest. While it's certainly an impressive piece of kit, they sacrificed too much of what attracts me to handheld games in favor of raw power. The size, battery life, and relative complexity of the software ecosystem[^1], make the Steam Deck a non-starter for me.[^2]\n\nThe Steam Machine, by virtue of being a decidedly non-portable device, solves 2 out of the 3 issues I have with the Steam Deck. And honestly, depending on how well the hardware performs, and how much they can improve Proton (their compatibility layer for running Windows games on Linux), software compatibility might not even be that big of an issue.\n\nWhatever happens, it's not going to replace my PlayStation 5. But gaming has been going through a weird period, the hobby has been trending more expensive, even if you don't factor in tariffs affecting the price of hardware. By the time the PlayStation 6 rolls around, something like the Steam Machine, which could potentially have access to the last 15-20 years of gaming in addition to all the latest titles, might be a far better value proposition.\n\n[^1]: I'm primarily talking about software compatibility. For the Switch, any game on the eShop will 100% be compatibile, but not every game on Steam will work on the Steam Deck.\n\n[^2]: Incidentally, these are the same things that have made the Switch 2 less appealing to me","src/content/blog/2025/the-steam-machine.md","fa483510aa885766",{"html":1225,"metadata":1226},"\u003Cp>The big news in the tech and gaming worlds this past week is Valve announcing \u003Ca href=\"https://store.steampowered.com/sale/steammachine\">their new Steam Machine\u003C/a>. While I dont have any immediate desire for it, I am fascinated by it as a gamer and tech enthusiast, and Im very curious to see where it goes. There is a non-zero chance I pick one up at some point in teh future, depending on how things shake out with both the Steam Machine as a product, and the gaming industry as a whole.\u003C/p>\n\u003Cp>Up until now, I never had any interest in Valves hardare products. Despite being a big handheld gamer, the Steam Deck did not appeal to me in the slightest. While its certainly an impressive piece of kit, they sacrificed too much of what attracts me to handheld games in favor of raw power. The size, battery life, and relative complexity of the software ecosystem\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>, make the Steam Deck a non-starter for me.\u003Csup>\u003Ca href=\"#user-content-fn-2\" id=\"user-content-fnref-2\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">2\u003C/a>\u003C/sup>\u003C/p>\n\u003Cp>The Steam Machine, by virtue of being a decidedly non-portable device, solves 2 out of the 3 issues I have with the Steam Deck. And honestly, depending on how well the hardware performs, and how much they can improve Proton (their compatibility layer for running Windows games on Linux), software compatibility might not even be that big of an issue.\u003C/p>\n\u003Cp>Whatever happens, its not going to replace my PlayStation 5. But gaming has been going through a weird period, the hobby has been trending more expensive, even if you dont factor in tariffs affecting the price of hardware. By the time the PlayStation 6 rolls around, something like the Steam Machine, which could potentially have access to the last 15-20 years of gaming in addition to all the latest titles, might be a far better value proposition.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>Im primarily talking about software compatibility. For the Switch, any game on the eShop will 100% be compatibile, but not every game on Steam will work on the Steam Deck. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-2\">\n\u003Cp>Incidentally, these are the same things that have made the Switch 2 less appealing to me \u003Ca href=\"#user-content-fnref-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":1227,"localImagePaths":1229,"remoteImagePaths":1230,"frontmatter":1231,"imagePaths":1234},[1228],{"depth":292,"slug":293,"text":294},[],[],{"title":1218,"pubDate":1232,"tags":1233},"11/16/25",[178,18],[],"2025/thoughts-on-peronal-progress",{"id":1235,"data":1237,"body":1241,"filePath":1242,"digest":1243,"rendered":1244},{"title":1238,"pubDate":1239,"tags":1240},"Thoughts on Personal Progress",["Date","2025-04-09T04:00:00.000Z"],[41],"One of the things I've been working on recently in therapy is having a healthier outlook on personal progress. For a lot of my life, for as long as I've thought consciously about my progress as a human being, I've looked at progress as a line graph—the bottom is zero, and the top is whatever the end goal is. Forward progress towards the goal is represented by the plot on the graph heading upwards, while mistakes, failures, or whatever you want to call them, are represented by the plot moving down.\n\nMy therapist challenged me to look at progress in a different way and see progress not as a line that goes up and down, but as a journey, and to discover a new image to define my personal progress—one that still recognizes progress isn't always a straight line, but acknowledges that, while the trajectory of the line may change, it's always moving up.\n\nI struggled to think of what that image could be for me. But the other day, while I was working on a particularly tough programming issue, something clicked...\n\nThe journey of writing software isn't always a straight line either. But, if it worked the same way as in my image of personal progress, then code would just start deleting itself whenever we hit a roadblock. Imagine if every time you ran into a bug you needed to fix, bits of your software would just disappear. That's how I see personal progress, and when I think about it in those terms, it sounds ridiculous.\nSometimes things will go well; often, there will be stumbling blocks. These may impede progress, but they don't move it backwards, and challenges are just another step in the journey.","src/content/blog/2025/thoughts-on-peronal-progress.md","675e4dad10891d8b",{"html":1245,"metadata":1246},"\u003Cp>One of the things Ive been working on recently in therapy is having a healthier outlook on personal progress. For a lot of my life, for as long as Ive thought consciously about my progress as a human being, Ive looked at progress as a line graph—the bottom is zero, and the top is whatever the end goal is. Forward progress towards the goal is represented by the plot on the graph heading upwards, while mistakes, failures, or whatever you want to call them, are represented by the plot moving down.\u003C/p>\n\u003Cp>My therapist challenged me to look at progress in a different way and see progress not as a line that goes up and down, but as a journey, and to discover a new image to define my personal progress—one that still recognizes progress isnt always a straight line, but acknowledges that, while the trajectory of the line may change, its always moving up.\u003C/p>\n\u003Cp>I struggled to think of what that image could be for me. But the other day, while I was working on a particularly tough programming issue, something clicked…\u003C/p>\n\u003Cp>The journey of writing software isnt always a straight line either. But, if it worked the same way as in my image of personal progress, then code would just start deleting itself whenever we hit a roadblock. Imagine if every time you ran into a bug you needed to fix, bits of your software would just disappear. Thats how I see personal progress, and when I think about it in those terms, it sounds ridiculous.\nSometimes things will go well; often, there will be stumbling blocks. These may impede progress, but they dont move it backwards, and challenges are just another step in the journey.\u003C/p>",{"headings":1247,"localImagePaths":1248,"remoteImagePaths":1249,"frontmatter":1250,"imagePaths":1253},[],[],[],{"title":1238,"pubDate":1251,"tags":1252},"4/9/25",[41],[],"2025/learning-to-enjoy-react-forms",{"id":1254,"data":1256,"body":1260,"filePath":1261,"digest":1262,"rendered":1263},{"title":1257,"pubDate":1258,"tags":1259},"Learning to Enjoy Building Forms in React",["Date","2025-09-15T04:00:00.000Z"],[40,283],"Creating forms in a React app is something that used to often frustrate me. It was something I would dread doing, because if you wanted to something more complicated than a basic login form, it would quickly become a mess trying to manage state because, of course, why would we use anything except controlled inputs?\n\nThere are libraries like Formik and TanStack Form which proclaim to take a lot of the headache out of building forms in React. While they do simplify managing state in our forms, they still involve managing state and utilizing controlled inputs, which comes with its own set of problems.\n\nTo get at why using state for forms is not ideal, we first have to look at how state works in React; Put simply, state is a value or set of values in a component that, when changed, cause the entire component to re-render in order to reflect that change.\n\nHopefully you can see where I'm going with this.\n\nWith a controlled component, whenever the user makes a change the entire form is re-rendered, which means that, essentially, every keystroke by the user causes a re-render. If you're building a login page, or even a simple contact form, you likely won't see much of a performance hit, but you're still very likely over-engineering the problem.\n\nEnter the useRef hook...\n\nI've been aware of useRef for most of my time using React, but I'd never really explored its use. I've got comfortable with the common hooks like useState, useMemo, and useEffect (which I could write another post about by itself), but useRef proved to be somewhat elusive to me for a time. That was until I started seeing content about using it instead of useState for storing form values.\n\nSee, the great thing about useRef, at least in this use case, is it doesn't cause re-renders, and, if the component does happen to get re-rendered, the values will persist. Full disclosure, you do lose some of the benefits of using state, like using the value of a reference as a dependency for a useMemo or useEffect hook, however, I feel that, in most cases, the pros outweigh the cons.\n\nOf course, you can still read the values stored by useRef in your submission logic, otherwise there would be no point in utilizing this approach. But this means you can still perform validation, either yourself or with a library like Zod, and whatever else you might want to do with that data. You could even set it to state if you so desired.\n\nIf you're looking for a starting point, I whipped up a quick, somewhat contrived, and not at all secure, login form using useRef instead of useState. With some Radix UI sprinkled in because I apparently can't make a sample UI that doesn't look a little pretty, and it shows you can utilize this method with component libraries (but mostly the former).\n\n```js\nimport { useRef } from \"react\";\nimport { Button, Flex, TextField } from \"@radix-ui/themes\";\n\nexport default function Form() {\n const usernameRef = useRef\u003CHTMLInputElement>(null);\n const passwordRef = useRef\u003CHTMLInputElement>(null);\n\n const handleSubmit = (event: React.FormEvent\u003CHTMLFormElement>) => {\n event.preventDefault();\n const username = usernameRef.current?.value;\n const password = passwordRef.current?.value;\n\n if (username === \"user\" && password === \"password123\") {\n \tconsole.log(\"Success!\")\n } else {\n console.log(\"Failure\");\n }\n };\n\n return (\n \u003Cform onSubmit={handleSubmit}>\n \u003CFlex direction=\"column\" gap=\"4\">\n \u003CTextField.Root\n placeholder=\"Username\"\n ref={usernameRef}\n aria-label=\"Username\"\n />\n \u003CTextField.Root\n placeholder=\"Password\"\n type=\"password\"\n ref={passwordRef}\n aria-label=\"Password\"\n />\n \u003CButton type=\"submit\">Submit\u003C/Button>\n \u003C/Flex>\n \u003C/form>\n );\n}\n```","src/content/blog/2025/learning-to-enjoy-react-forms.md","092ac0fb1c622f7d",{"html":1264,"metadata":1265},"\u003Cp>Creating forms in a React app is something that used to often frustrate me. It was something I would dread doing, because if you wanted to something more complicated than a basic login form, it would quickly become a mess trying to manage state because, of course, why would we use anything except controlled inputs?\u003C/p>\n\u003Cp>There are libraries like Formik and TanStack Form which proclaim to take a lot of the headache out of building forms in React. While they do simplify managing state in our forms, they still involve managing state and utilizing controlled inputs, which comes with its own set of problems.\u003C/p>\n\u003Cp>To get at why using state for forms is not ideal, we first have to look at how state works in React; Put simply, state is a value or set of values in a component that, when changed, cause the entire component to re-render in order to reflect that change.\u003C/p>\n\u003Cp>Hopefully you can see where Im going with this.\u003C/p>\n\u003Cp>With a controlled component, whenever the user makes a change the entire form is re-rendered, which means that, essentially, every keystroke by the user causes a re-render. If youre building a login page, or even a simple contact form, you likely wont see much of a performance hit, but youre still very likely over-engineering the problem.\u003C/p>\n\u003Cp>Enter the useRef hook…\u003C/p>\n\u003Cp>Ive been aware of useRef for most of my time using React, but Id never really explored its use. Ive got comfortable with the common hooks like useState, useMemo, and useEffect (which I could write another post about by itself), but useRef proved to be somewhat elusive to me for a time. That was until I started seeing content about using it instead of useState for storing form values.\u003C/p>\n\u003Cp>See, the great thing about useRef, at least in this use case, is it doesnt cause re-renders, and, if the component does happen to get re-rendered, the values will persist. Full disclosure, you do lose some of the benefits of using state, like using the value of a reference as a dependency for a useMemo or useEffect hook, however, I feel that, in most cases, the pros outweigh the cons.\u003C/p>\n\u003Cp>Of course, you can still read the values stored by useRef in your submission logic, otherwise there would be no point in utilizing this approach. But this means you can still perform validation, either yourself or with a library like Zod, and whatever else you might want to do with that data. You could even set it to state if you so desired.\u003C/p>\n\u003Cp>If youre looking for a starting point, I whipped up a quick, somewhat contrived, and not at all secure, login form using useRef instead of useState. With some Radix UI sprinkled in because I apparently cant make a sample UI that doesnt look a little pretty, and it shows you can utilize this method with component libraries (but mostly the former).\u003C/p>\n\u003Cpre class=\"astro-code astro-code-themes github-light github-dark\" style=\"background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"js\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> { useRef } \u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\"> \"react\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> { Button, Flex, TextField } \u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\"> \"@radix-ui/themes\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">export\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> default\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> Form\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">() {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> const\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\"> usernameRef\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> useRef\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"><\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">HTMLInputElement\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>(\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> const\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\"> passwordRef\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> useRef\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"><\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">HTMLInputElement\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>(\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> const\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> handleSubmit\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#E36209;--shiki-dark:#FFAB70\">event\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">:\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> React\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">FormEvent\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"><\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">HTMLFormElement\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>) \u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> event.\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">preventDefault\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> const\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\"> username\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> usernameRef.current?.value;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> const\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\"> password\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> passwordRef.current?.value;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> if\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> (username \u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">===\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\"> \"user\"\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> &&\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> password \u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">===\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\"> \"password123\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> \tconsole.\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"Success!\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">else\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> console.\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"Failure\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\"> return\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> <\u003C/span>\u003Cspan style=\"color:#22863A;--shiki-dark:#85E89D\">form\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> onSubmit\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">{handleSubmit}>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> <\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">Flex\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> direction\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"column\"\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> gap\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"4\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> <\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">TextField.Root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> placeholder\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"Username\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> ref\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">{usernameRef}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> aria-label\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"Username\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> />\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> <\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">TextField.Root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> placeholder\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"Password\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"password\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> ref\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">{passwordRef}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> aria-label\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"Password\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> />\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> <\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">Button\u003C/span>\u003Cspan style=\"color:#6F42C1;--shiki-dark:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#D73A49;--shiki-dark:#F97583\">=\u003C/span>\u003Cspan style=\"color:#032F62;--shiki-dark:#9ECBFF\">\"submit\"\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>Submit</\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">Button\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> </\u003C/span>\u003Cspan style=\"color:#005CC5;--shiki-dark:#79B8FF\">Flex\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> </\u003C/span>\u003Cspan style=\"color:#22863A;--shiki-dark:#85E89D\">form\u003C/span>\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\"> );\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E;--shiki-dark:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>",{"headings":1266,"localImagePaths":1267,"remoteImagePaths":1268,"frontmatter":1269,"imagePaths":1272},[],[],[],{"title":1257,"pubDate":1270,"tags":1271},"9/15/25",[40,283],[],"2025/tinkering-with-linux",{"id":1273,"data":1275,"body":1280,"filePath":1281,"digest":1282,"rendered":1283},{"title":1276,"pubDate":1277,"tags":1278},"Tinkering With Linux",["Date","2025-10-27T04:00:00.000Z"],[18,1279],"Linux","For the last 8 or 9 months, I've been experimenting on and off with Linux. Specifically Fedora (via Asahi Linux) for those who are curious. I installed it on an M1 MacBook Air, which I keep around as an emergency backup, and I've been mostly pleased with how well it's been running.\n\nMost of the time I've spent with this Linux environment has just been tinkering, installing apps, and getting things like git and OhMyZSH set up and configured the way I like it. I haven't really had the chance to do anything productive or useful with it yet[^1], and so I don't have a fully informed opinion on the experience of using Linux as a daily driver. But I wanted to give my impressions, share potential difficulties I might have if I ever decide to make the full switch, and why I would even consider the possibility of making that switch.\n\nSo, to start, why am I even exploring Linux?\n\nWell, aside from my curiosity when it comes to all things tech, I'm also concerned about the direction of the Mac, and Apple as a company. Between the success of the iPhone, and the leadership of Tim Cook, I feel Apple has lost much of what made it special. I hesitate to use the words \"heart\" or \"soul\", since I don't think those words are appropriate for a corporation, and Apple has been a pretty corporate entity since the days of the Apple II, albeit one that [once flew a pirate flag on its campus](https://www.folklore.org/Pirate_Flag.html?sort=date?sort=date).\n\nWhile Apple certainly had its flaws under Steve Jobs, I struggle to see a reality where that Apple would have donated money to destroy part of an historical building for one man's vanity project, or given that same man a golden statue.\n\nAnd, even if you disagree with me on that, you can't deny that Apple's former attitude of \"build great products, and the money will follow\" has long since gone out the window. They still make world-class hardware, and I would argue that their Mac hardware is better than it has been in a _very_ long time, but their software has been slowly deteriorating. There was a time when Apple would delay software, especially a new OS, if it wasn't quite ready, and they wouldn't dream of aggressively pitching their various subscription services via notifications or system settings. Today's Apple will pump out multiple new OSes every September like clockwork, damn the consequences, and will prioritize whatever will bring more money to their coveted \"services revenue\".\n\nAnyway, that's my long-winded way of saying that, if current trends continue, making the jump to Linux seems more like a \"when\" than an \"if\". For the sake of the Mac, I hope things change, but I won't be overly optimistic unless there are some leadership changes at Apple.\n\nWhat do I think of Linux, then?\n\nThe thing that stands out to me the most about Linux is the level of customization, and while the default experience (in KDE Plasma at least) is very Windows-coded, that customization means I can craft something close to the Mac experience that I'm used to. I was able to do things like move the window controls to the left side, as God intended, and turn the top \"panel\" to something more akin to the macOS menu bar[^2].\n\nIt's also very fast. Granted, I am running it on an M1, and I don't have much in the way of background utilities and such running like I do on macOS, but Linux just feels so much more snappy and responsive. It doesn't seem like it's more memory-efficient than macOS, it seems to be using about 7ish GB of memory, out of the 8GB total in this MacBook, and even utilizing some swap, with just a web browser, terminal, and text editor open, but perhaps that's expected behavior on Linux.[^3]\n\nHowever, the largest barriers I can see to using Linux as a daily driver are the user experience, and the community.\n\nPerhaps this is due to the sheer level of customization on offer, but the Linux experience just doesn't compete with the Mac, even compared to macOS Tahoe. While I will admit my configuration looks a lot nicer to my eyes than the new Liquid Glass design, it's missing a lot of the little touches. Dragging windows feels slightly clunky in a way I'm not sure I can describe in words, and in many cases text rendering doesn't look as smooth or consistent. Also, many apps don't visually behave like you'd expect, like the aforementioned menu behavior, or they render their own window chrome, overriding the system and, as a result, your customizations.\n\nI also feel very much embedded in the Mac community, and that's a major aspect of what keeps me on the platform. From the many small companies and solo devs making great indie or open-source software, to the friends and acquaintances I've met online, and beyond. I'm sure much of that is some combination of tribalism and stereotypes, which, as we know, has _never_ been the source of close-minded attitudes (super big \"/s\" for those with broken sarcasm detectors). But that community is, I think, the lifeblood of the Mac, and it survived the dark days of 90's Apple, but if Apple continues to turn its nose up at that community I do wonder how much longer that community will be willing to stick around as much as it has been.\n\nGiven the course of Apple as a company, as well as its products, in addition to my own values around supporting and creating independant software, I feel it would be irresponsible of me to not keep tabs on Linux, and keep it in my back pocket as an alternative.\n\nI do, however, have some questions for the Linux community if any of you haven't been driven away from this post in anger or annoyance:\n\n- Is there a universal way to customize keyboard shortcuts to more closely match the Mac, for example making copy `command + C` instead of `control + C`?\n- Is there some setting I'm missing to tell apps with custom window chrome to respect the system settings? Same for displaying the \"Global Menu\".\n- Are there any decent app launchers like Raycast that have things like snippets and clipboard history?\n\nFeel free to reach out to me on [Mastodon](https://mastodon.social/@ghalldev).\n\n[^1]: However, to continue my series of gimicky posts, like when I [wrote about the Mac using Mac OS 7](/blog/2024/ramblings-on-the-macintosh), and [wrote about taking intentional analog time with pen and paper](/blog/2025/intentional-analog-time), I'm writing this blog post in Linux.\n\n[^2]: This annoyingly does not work for all apps, but I'm probably missing something obvious.\n\n[^3]: Of note, the Plasma shell itself seems to be the most memory intensive process, using about 500MB of RAM, which seems more than reasonable.","src/content/blog/2025/tinkering-with-linux.md","acc9b60fd2680a97",{"html":1284,"metadata":1285},"\u003Cp>For the last 8 or 9 months, Ive been experimenting on and off with Linux. Specifically Fedora (via Asahi Linux) for those who are curious. I installed it on an M1 MacBook Air, which I keep around as an emergency backup, and Ive been mostly pleased with how well its been running.\u003C/p>\n\u003Cp>Most of the time Ive spent with this Linux environment has just been tinkering, installing apps, and getting things like git and OhMyZSH set up and configured the way I like it. I havent really had the chance to do anything productive or useful with it yet\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup>, and so I dont have a fully informed opinion on the experience of using Linux as a daily driver. But I wanted to give my impressions, share potential difficulties I might have if I ever decide to make the full switch, and why I would even consider the possibility of making that switch.\u003C/p>\n\u003Cp>So, to start, why am I even exploring Linux?\u003C/p>\n\u003Cp>Well, aside from my curiosity when it comes to all things tech, Im also concerned about the direction of the Mac, and Apple as a company. Between the success of the iPhone, and the leadership of Tim Cook, I feel Apple has lost much of what made it special. I hesitate to use the words “heart” or “soul”, since I dont think those words are appropriate for a corporation, and Apple has been a pretty corporate entity since the days of the Apple II, albeit one that \u003Ca href=\"https://www.folklore.org/Pirate_Flag.html?sort=date?sort=date\">once flew a pirate flag on its campus\u003C/a>.\u003C/p>\n\u003Cp>While Apple certainly had its flaws under Steve Jobs, I struggle to see a reality where that Apple would have donated money to destroy part of an historical building for one mans vanity project, or given that same man a golden statue.\u003C/p>\n\u003Cp>And, even if you disagree with me on that, you cant deny that Apples former attitude of “build great products, and the money will follow” has long since gone out the window. They still make world-class hardware, and I would argue that their Mac hardware is better than it has been in a \u003Cem>very\u003C/em> long time, but their software has been slowly deteriorating. There was a time when Apple would delay software, especially a new OS, if it wasnt quite ready, and they wouldnt dream of aggressively pitching their various subscription services via notifications or system settings. Todays Apple will pump out multiple new OSes every September like clockwork, damn the consequences, and will prioritize whatever will bring more money to their coveted “services revenue”.\u003C/p>\n\u003Cp>Anyway, thats my long-winded way of saying that, if current trends continue, making the jump to Linux seems more like a “when” than an “if”. For the sake of the Mac, I hope things change, but I wont be overly optimistic unless there are some leadership changes at Apple.\u003C/p>\n\u003Cp>What do I think of Linux, then?\u003C/p>\n\u003Cp>The thing that stands out to me the most about Linux is the level of customization, and while the default experience (in KDE Plasma at least) is very Windows-coded, that customization means I can craft something close to the Mac experience that Im used to. I was able to do things like move the window controls to the left side, as God intended, and turn the top “panel” to something more akin to the macOS menu bar\u003Csup>\u003Ca href=\"#user-content-fn-2\" id=\"user-content-fnref-2\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">2\u003C/a>\u003C/sup>.\u003C/p>\n\u003Cp>Its also very fast. Granted, I am running it on an M1, and I dont have much in the way of background utilities and such running like I do on macOS, but Linux just feels so much more snappy and responsive. It doesnt seem like its more memory-efficient than macOS, it seems to be using about 7ish GB of memory, out of the 8GB total in this MacBook, and even utilizing some swap, with just a web browser, terminal, and text editor open, but perhaps thats expected behavior on Linux.\u003Csup>\u003Ca href=\"#user-content-fn-3\" id=\"user-content-fnref-3\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">3\u003C/a>\u003C/sup>\u003C/p>\n\u003Cp>However, the largest barriers I can see to using Linux as a daily driver are the user experience, and the community.\u003C/p>\n\u003Cp>Perhaps this is due to the sheer level of customization on offer, but the Linux experience just doesnt compete with the Mac, even compared to macOS Tahoe. While I will admit my configuration looks a lot nicer to my eyes than the new Liquid Glass design, its missing a lot of the little touches. Dragging windows feels slightly clunky in a way Im not sure I can describe in words, and in many cases text rendering doesnt look as smooth or consistent. Also, many apps dont visually behave like youd expect, like the aforementioned menu behavior, or they render their own window chrome, overriding the system and, as a result, your customizations.\u003C/p>\n\u003Cp>I also feel very much embedded in the Mac community, and thats a major aspect of what keeps me on the platform. From the many small companies and solo devs making great indie or open-source software, to the friends and acquaintances Ive met online, and beyond. Im sure much of that is some combination of tribalism and stereotypes, which, as we know, has \u003Cem>never\u003C/em> been the source of close-minded attitudes (super big “/s” for those with broken sarcasm detectors). But that community is, I think, the lifeblood of the Mac, and it survived the dark days of 90s Apple, but if Apple continues to turn its nose up at that community I do wonder how much longer that community will be willing to stick around as much as it has been.\u003C/p>\n\u003Cp>Given the course of Apple as a company, as well as its products, in addition to my own values around supporting and creating independant software, I feel it would be irresponsible of me to not keep tabs on Linux, and keep it in my back pocket as an alternative.\u003C/p>\n\u003Cp>I do, however, have some questions for the Linux community if any of you havent been driven away from this post in anger or annoyance:\u003C/p>\n\u003Cul>\n\u003Cli>Is there a universal way to customize keyboard shortcuts to more closely match the Mac, for example making copy \u003Ccode>command + C\u003C/code> instead of \u003Ccode>control + C\u003C/code>?\u003C/li>\n\u003Cli>Is there some setting Im missing to tell apps with custom window chrome to respect the system settings? Same for displaying the “Global Menu”.\u003C/li>\n\u003Cli>Are there any decent app launchers like Raycast that have things like snippets and clipboard history?\u003C/li>\n\u003C/ul>\n\u003Cp>Feel free to reach out to me on \u003Ca href=\"https://mastodon.social/@ghalldev\">Mastodon\u003C/a>.\u003C/p>\n\u003Csection data-footnotes=\"\" class=\"footnotes\">\u003Ch2 class=\"sr-only\" id=\"footnote-label\">Footnotes\u003C/h2>\n\u003Col>\n\u003Cli id=\"user-content-fn-1\">\n\u003Cp>However, to continue my series of gimicky posts, like when I \u003Ca href=\"/blog/2024/ramblings-on-the-macintosh\">wrote about the Mac using Mac OS 7\u003C/a>, and \u003Ca href=\"/blog/2025/intentional-analog-time\">wrote about taking intentional analog time with pen and paper\u003C/a>, Im writing this blog post in Linux. \u003Ca href=\"#user-content-fnref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-2\">\n\u003Cp>This annoyingly does not work for all apps, but Im probably missing something obvious. \u003Ca href=\"#user-content-fnref-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli id=\"user-content-fn-3\">\n\u003Cp>Of note, the Plasma shell itself seems to be the most memory intensive process, using about 500MB of RAM, which seems more than reasonable. \u003Ca href=\"#user-content-fnref-3\" data-footnote-backref=\"\" aria-label=\"Back to reference 3\" class=\"data-footnote-backref\">↩\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003C/section>",{"headings":1286,"localImagePaths":1288,"remoteImagePaths":1289,"frontmatter":1290,"imagePaths":1293},[1287],{"depth":292,"slug":293,"text":294},[],[],{"title":1276,"pubDate":1291,"tags":1292},"10/27/25",[18,1279],[],"2025/building-a-mac-app-without-xcode-part-1",{"id":1294,"data":1296,"body":1300,"filePath":1301,"digest":1302,"rendered":1303},{"title":1297,"pubDate":1298,"tags":1299},"Building a Mac App Without Xcode - Part 1",["Date","2025-12-01T05:00:00.000Z"],[61,119,283],"While I enjoy developing Mac apps, I find Xcode to be exceptionally clunky, especially when compared to the tools I use for web development. I thought it would be nice to be able to write and compile a fully-functional Mac application using any text editor, and without having to open Xcode.\n\nSo, I decided to try migrating my app, [AutoDock](https://github.com/ghall89/AutoDock), to this Xcode-free build process, and actually release it as the next update. I have a few requirements for this to be viable:\n\n1. Whichever editor I use, I need access to the Swift language server.\n2. The build process should produce a functional MacOS application bundle as a universal binary (for both Intel and ARM CPUs).\n3. I should be able to use regular security features available to apps built with Xcode, like sandboxing, hardened runtime, etc.\n4. The final binary should be signed with my developer certificate.\n\nTo prevent this blog post from being far too long, Ive decided to split it up into multiple parts. This first part will focus on LSP support, and building the application bundle.\n\n## Setting Up the Swift Language Server\n\nBeing the Mac nerd that I am, I felt it would be uncouth to not even try using BBEdit for writing and editing the actual Swift code. Thankfully, BBEdit has some pretty nice LSP support built in, so it was simply a matter of creating a symlink to the Swift language server in BBEdits Language Servers directory:\n\n`ln -s -f /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sourcekit-lsp ~/Library/Application\\ Support/BBEdit/Language\\ Servers/sourcekit-lsp`\n\nHowever, I found it to be a tad slow, so I opted for the lazy route and just installed [Zeds Swift extension](https://github.com/zed-extensions/swift). There is also [one for VSCode](https://marketplace.visualstudio.com/items?itemName=swiftlang.swift-vscode), for anyone who wants to go that route.\n\nHowever, now that I have it set up in BBEdit, I could just jump in and edit a file quickly if needed.\n\n## Building the Application Bundle\n\nWith a bit of research, I found this tool called [Swift Bundler](https://swiftbundler.dev/). While it's possible to make it all work without this tool, it enables you to configure your app bundle with a simple .toml file, and will even scaffold out a starter project for you based on [a variety of templates](https://github.com/stackotter/swift-bundler-templates).\n\nI created a new SwiftUI project with it, and copied the source code for AutoDock into the project. I also created a Taskfile.yml for my go-to task-runner, simply named [Task](https://taskfile.dev/) for running the various commands. This will especially come in handy for the later steps.\n\nAside from an error being thrown during build due to a possible race condition in my code (dont know why Xcode never caught this 🤷‍♂️), everything worked almost perfectly. The only issues I ran into were the Dock icon not hiding (AutoDock is a menubar-based application), and the app not seeing the user preferences from the Xcode build.\n\nThe first issue was down to an issue with the documentation, or perhaps my misunderstanding of it. In order to add additional properties to the applications Info.plist, such as setting `LSUIElement` to `true` for hiding the apps Dock icon. My read of the documentation was that I should add the following to the `Bundler.toml`:\n\n```\n[apps.AutoDock.plist]\nLSUIElement = \"True\"\n```\n\nHowever, upon doing a bit of digging, I found this was the correct way to add it:\n\n```\n[apps.AutoDock.extra_plist_entries]\nLSUIElement = \"True\"\n```\n\nThe second issue, the new build of AutoDock not being able to see the user settings from the Xcode build, is something I will have to dive into later, since I have the app in a state that I can begin testing in my everyday usage.\n\nOne huge benefit I noticed immediately was a significant reduction in bundle size. The Xcode build of AutoDock clocks in at 2 MB, which is by no means huge, but dwarfs the new build which clocks in at just 670 KB. It seems the only difference is an Assets.car file, which I assume holds images and such from the Assets.xcassets file, which in this case would just be redundant icon image files, and the apps accent color, which I can define elsewhere.\n\n*In the next part, Ill tackle code signing and notarization.*","src/content/blog/2025/building-a-mac-app-without-xcode-part-1.md","9d1dac9af56893e3",{"html":1304,"metadata":1305},"\u003Cp>While I enjoy developing Mac apps, I find Xcode to be exceptionally clunky, especially when compared to the tools I use for web development. I thought it would be nice to be able to write and compile a fully-functional Mac application using any text editor, and without having to open Xcode.\u003C/p>\n\u003Cp>So, I decided to try migrating my app, \u003Ca href=\"https://github.com/ghall89/AutoDock\">AutoDock\u003C/a>, to this Xcode-free build process, and actually release it as the next update. I have a few requirements for this to be viable:\u003C/p>\n\u003Col>\n\u003Cli>Whichever editor I use, I need access to the Swift language server.\u003C/li>\n\u003Cli>The build process should produce a functional MacOS application bundle as a universal binary (for both Intel and ARM CPUs).\u003C/li>\n\u003Cli>I should be able to use regular security features available to apps built with Xcode, like sandboxing, hardened runtime, etc.\u003C/li>\n\u003Cli>The final binary should be signed with my developer certificate.\u003C/li>\n\u003C/ol>\n\u003Cp>To prevent this blog post from being far too long, Ive decided to split it up into multiple parts. This first part will focus on LSP support, and building the application bundle.\u003C/p>\n\u003Ch2 id=\"setting-up-the-swift-language-server\">Setting Up the Swift Language Server\u003C/h2>\n\u003Cp>Being the Mac nerd that I am, I felt it would be uncouth to not even try using BBEdit for writing and editing the actual Swift code. Thankfully, BBEdit has some pretty nice LSP support built in, so it was simply a matter of creating a symlink to the Swift language server in BBEdits Language Servers directory:\u003C/p>\n\u003Cp>\u003Ccode>ln -s -f /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sourcekit-lsp ~/Library/Application\\ Support/BBEdit/Language\\ Servers/sourcekit-lsp\u003C/code>\u003C/p>\n\u003Cp>However, I found it to be a tad slow, so I opted for the lazy route and just installed \u003Ca href=\"https://github.com/zed-extensions/swift\">Zeds Swift extension\u003C/a>. There is also \u003Ca href=\"https://marketplace.visualstudio.com/items?itemName=swiftlang.swift-vscode\">one for VSCode\u003C/a>, for anyone who wants to go that route.\u003C/p>\n\u003Cp>However, now that I have it set up in BBEdit, I could just jump in and edit a file quickly if needed.\u003C/p>\n\u003Ch2 id=\"building-the-application-bundle\">Building the Application Bundle\u003C/h2>\n\u003Cp>With a bit of research, I found this tool called \u003Ca href=\"https://swiftbundler.dev/\">Swift Bundler\u003C/a>. While its possible to make it all work without this tool, it enables you to configure your app bundle with a simple .toml file, and will even scaffold out a starter project for you based on \u003Ca href=\"https://github.com/stackotter/swift-bundler-templates\">a variety of templates\u003C/a>.\u003C/p>\n\u003Cp>I created a new SwiftUI project with it, and copied the source code for AutoDock into the project. I also created a Taskfile.yml for my go-to task-runner, simply named \u003Ca href=\"https://taskfile.dev/\">Task\u003C/a> for running the various commands. This will especially come in handy for the later steps.\u003C/p>\n\u003Cp>Aside from an error being thrown during build due to a possible race condition in my code (dont know why Xcode never caught this 🤷‍♂️), everything worked almost perfectly. The only issues I ran into were the Dock icon not hiding (AutoDock is a menubar-based application), and the app not seeing the user preferences from the Xcode build.\u003C/p>\n\u003Cp>The first issue was down to an issue with the documentation, or perhaps my misunderstanding of it. In order to add additional properties to the applications Info.plist, such as setting \u003Ccode>LSUIElement\u003C/code> to \u003Ccode>true\u003C/code> for hiding the apps Dock icon. My read of the documentation was that I should add the following to the \u003Ccode>Bundler.toml\u003C/code>:\u003C/p>\n\u003Cpre class=\"astro-code astro-code-themes github-light github-dark\" style=\"background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>[apps.AutoDock.plist]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>LSUIElement = \"True\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>However, upon doing a bit of digging, I found this was the correct way to add it:\u003C/p>\n\u003Cpre class=\"astro-code astro-code-themes github-light github-dark\" style=\"background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>[apps.AutoDock.extra_plist_entries]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>LSUIElement = \"True\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>The second issue, the new build of AutoDock not being able to see the user settings from the Xcode build, is something I will have to dive into later, since I have the app in a state that I can begin testing in my everyday usage.\u003C/p>\n\u003Cp>One huge benefit I noticed immediately was a significant reduction in bundle size. The Xcode build of AutoDock clocks in at 2 MB, which is by no means huge, but dwarfs the new build which clocks in at just 670 KB. It seems the only difference is an Assets.car file, which I assume holds images and such from the Assets.xcassets file, which in this case would just be redundant icon image files, and the apps accent color, which I can define elsewhere.\u003C/p>\n\u003Cp>\u003Cem>In the next part, Ill tackle code signing and notarization.\u003C/em>\u003C/p>",{"headings":1306,"localImagePaths":1313,"remoteImagePaths":1314,"frontmatter":1315,"imagePaths":1318},[1307,1310],{"depth":292,"slug":1308,"text":1309},"setting-up-the-swift-language-server","Setting Up the Swift Language Server",{"depth":292,"slug":1311,"text":1312},"building-the-application-bundle","Building the Application Bundle",[],[],{"title":1297,"pubDate":1316,"tags":1317},"12/1/25",[61,119,283],[]]