1 line
508 KiB
JSON
1 line
508 KiB
JSON
[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.16.11","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,\"svgo\":false},\"legacy\":{\"collections\":false}}","blog",["Map",11,12,32,33,55,56,85,86,109,110,144,145,163,164,192,193,212,213,240,241,258,259,277,278,296,297,315,316,334,335,357,358,388,389,408,409,430,431,449,450,472,473,492,493,511,512,530,531,549,550,568,569,587,588,616,617,635,636,670,671,706,707,726,727,746,747,765,766,791,792,819,820,838,839,857,858,876,877,895,896,914,915,933,934,965,966,1015,1016,1043,1044,1062,1063,1081,1082,1101,1102,1121,1122,1140,1141,1159,1160,1179,1180,1198,1199,1218,1219,1237,1238,1258,1259,1277,1278,1298,1299,1318,1319,1353,1354,1372,1373,1392,1393,1420,1421,1440,1441,1468,1469,1497,1498,1516,1517],"2022/ask-the-darn-question",{"id":11,"data":13,"body":19,"filePath":20,"digest":21,"rendered":22},{"title":14,"pubDate":15,"tags":16},"Ask The Darn Question!",["Date","2022-11-05T00:00:00.000Z"],[17,18],"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 it’s a problem I’m stuck on, or something about the codebase I don’t quite understand, I’m 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\nIt’s not out of pride, at least I don’t think it is. It’s more about insecurity. I’m afraid asking for help will somehow reveal to the more experienced devs that I actually have no idea what I’m doing. I will expose myself as a fraud who doesn’t know the first thing about development, and I don’t deserve to get paid for it.\n\nOf course, logically speaking, this is not true. It’s a story told with a combination of imposter syndrome, an anxiety disorder, and a copious amount of logical fallacies. I’m not a fraud, I’m just inexperienced. I can write code, and it may not be the best code ever written but it generally works, and there’s room for me to improve.\n\nAll this to say, it’s ok to ask for help when you need it. I’m 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: you’re 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 wasn’t 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 wasn’t that I didn’t 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 couldn’t 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 couldn’t have known, I’d had zero AWS experience before this job and I’m 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 didn’t know.\n\nSo, if there’s one thing I hope we all can take away from this it’s that, if we’re truly stuck on something, there’s more harm in not asking questions. There will always be something you don’t know, and there will always be another way of looking at a problem you’re facing. As long as you’re not asking for help as a first resort, and you’re putting in the effort to try and solve the problem yourself, then just ask the darn question!\n\nAnd if you’re 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":23,"metadata":24},"\u003Cp>One of the areas I struggle with when it comes to working in a professional web development environment is asking questions. Whether it’s a problem I’m stuck on, or something about the codebase I don’t quite understand, I’m 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>It’s not out of pride, at least I don’t think it is. It’s more about insecurity. I’m afraid asking for help will somehow reveal to the more experienced devs that I actually have no idea what I’m doing. I will expose myself as a fraud who doesn’t know the first thing about development, and I don’t deserve to get paid for it.\u003C/p>\n\u003Cp>Of course, logically speaking, this is not true. It’s a story told with a combination of imposter syndrome, an anxiety disorder, and a copious amount of logical fallacies. I’m not a fraud, I’m just inexperienced. I can write code, and it may not be the best code ever written but it generally works, and there’s room for me to improve.\u003C/p>\n\u003Cp>All this to say, it’s ok to ask for help when you need it. I’m 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: you’re 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 wasn’t 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 wasn’t that I didn’t 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 couldn’t 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 couldn’t have known, I’d had zero AWS experience before this job and I’m 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 didn’t know.\u003C/p>\n\u003Cp>So, if there’s one thing I hope we all can take away from this it’s that, if we’re truly stuck on something, there’s more harm in not asking questions. There will always be something you don’t know, and there will always be another way of looking at a problem you’re facing. As long as you’re not asking for help as a first resort, and you’re putting in the effort to try and solve the problem yourself, then just ask the darn question!\u003C/p>\n\u003Cp>And if you’re 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":25,"localImagePaths":26,"remoteImagePaths":27,"frontmatter":28,"imagePaths":31},[],[],[],{"title":14,"pubDate":29,"tags":30},"2022-11-05",[17,18],[],"2022/creating-a-dating-profile-with-ai",{"id":32,"data":34,"body":40,"filePath":41,"assetImports":42,"digest":44,"rendered":45},{"title":35,"pubDate":36,"tags":37},"Creating a Dating Profile With AI",["Date","2022-12-10T00:00:00.000Z"],[38,39],"Life","Tech","I’ve been single for a few years now, and I haven’t had a whole lot of success in the dating game. I’m very introverted and socially anxious, so dating apps seemed like the way to go for me. Sadly, I’ve not had a lot of success, and since Covid it seems like the dating scene has only got worse. I’ve 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 doesn’t end in disaster, all my opening messages will be generated by an AI–all 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 I’m letting an AI create a dating profile for me, I want it to be somewhat genuine. Also I’m not looking to catfish anybody with this image I generated just to see how good AI could make me look:\n\n\n\nOriginally this was going to be one post I’d 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 Everypixel’s time to shine! I collected up 42 photos from the last few years—I wasn’t aiming for 42 but, as that’s 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 didn’t 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%. That’s 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 don’t mean to brag, but I got a couple 7’s. The problem though was I had 12 6’s, so I couldn’t 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 that’s the bed I’ve 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 I’m 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 doesn’t 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 I’ll be sure to follow up in part 2. 🙂","src/content/blog/2022/creating-a-dating-profile-with-ai.md",[43],"src/assets/blog/my-ai-portrait.jpg","58022db62b352a8b",{"html":46,"metadata":47},"\u003Cp>I’ve been single for a few years now, and I haven’t had a whole lot of success in the dating game. I’m very introverted and socially anxious, so dating apps seemed like the way to go for me. Sadly, I’ve not had a lot of success, and since Covid it seems like the dating scene has only got worse. I’ve 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 doesn’t end in disaster, all my opening messages will be generated by an AI–all 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 I’ve never used it before.\u003C/p>\n\u003Cp>I decided against using AI generated images because, even though I’m letting an AI create a dating profile for me, I want it to be somewhat genuine. Also I’m 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 I’d 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 Everypixel’s time to shine! I collected up 42 photos from the last few years—I wasn’t aiming for 42 but, as that’s 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 didn’t 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%. That’s 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.”\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 else’s face, and 3 that it absolutely refused to process, most likely because it couldn’t 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 don’t mean to brag, but I got a couple 7’s. The problem though was I had 12 6’s, so I couldn’t 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 that’s the bed I’ve 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 I’m 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 person’s 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 doesn’t have a field for a bio, but here it is anyway, for posterity.\u003C/p>\n\u003Cblockquote>\n\u003Cp>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!\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 I’ll be sure to follow up in part 2. 🙂\u003C/p>",{"headings":48,"localImagePaths":49,"remoteImagePaths":50,"frontmatter":51,"imagePaths":54},[],[43],[],{"title":35,"pubDate":52,"tags":53},"2022-12-10",[38,39],[43],"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"],[17,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 I’ve 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 weren’t the best ideas design-wise, and put things together in such a way that I couldn’t 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 didn’t 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 wouldn’t have taken a “nuke-and-pave” to cleanly integrate a blog.\n\nI’m also a much better developer than I was when I built version 2. Not saying I’m amazing, I’ve only been at this since late 2020 after all, but I’ve learned a lot about coding, and organizing code in a way that makes sense. Of course, a year from now I’ll 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\nI’m a relative newcomer to Next.js, as I’ve 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 it’s 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. I’m 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 I’ve 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 I’ve 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 weren’t the best ideas design-wise, and put things together in such a way that I couldn’t 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 didn’t 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 wouldn’t have taken a “nuke-and-pave” to cleanly integrate a blog.\u003C/p>\n\u003Cp>I’m also a much better developer than I was when I built version 2. Not saying I’m amazing, I’ve only been at this since late 2020 after all, but I’ve learned a lot about coding, and organizing code in a way that makes sense. Of course, a year from now I’ll 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>I’m a relative newcomer to Next.js, as I’ve 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 it’s 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. I’m 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 I’ve 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",[17,61],[],"2022/ileopard-a-retrospective",{"id":85,"data":87,"body":92,"filePath":93,"assetImports":94,"digest":98,"rendered":99},{"title":88,"pubDate":89,"tags":90},"iLeopard - A Retrospective",["Date","2022-12-26T00:00:00.000Z"],[39,91,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 I’ve 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 scene–specifically on the now-defunct MacThemes.net–around 2007, you probably remember a little project called iLeopard. Admittedly, the chance that you’re 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\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\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, it’s 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 you’re curious, [here’s a writeup](https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/10/) from John Siracusa’s 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 recall–and I could be totally wrong so if anybody knows better feel free to tell me–Extras.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 can’t 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 name–if you’re 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 we’ll 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 files–which if I recall was as easy as zipping them up and renaming them, but this was 15 years ago so I could definitely be misremembering–restarting 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 Leopard’s 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\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 it’s 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\nWhat’s been interesting as I’ve 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 Intel–interestingly, we’re currently in the midst of a transition from Intel to Apple Silicon–and 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 weren’t made to be tinkered with.","src/content/blog/2022/ileopard-a-retrospective.md",[95,96,97],"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":100,"metadata":101},"\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 I’ve 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 scene–specifically on the now-defunct MacThemes.net–around 2007, you probably remember a little project called iLeopard. Admittedly, the chance that you’re 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, it’s 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 you’re curious, \u003Ca href=\"https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/10/\">here’s a writeup\u003C/a> from John Siracusa’s 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 recall–and I could be totally wrong so if anybody knows better feel free to tell me–Extras.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 can’t 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 name–if you’re 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 we’ll 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 files–which if I recall was as easy as zipping them up and renaming them, but this was 15 years ago so I could definitely be misremembering–restarting 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 Leopard’s 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 it’s 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.\u003C/p>\n\u003Cp>What’s been interesting as I’ve 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 Intel–interestingly, we’re currently in the midst of a transition from Intel to Apple Silicon–and 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 weren’t made to be tinkered with.\u003C/p>",{"headings":102,"localImagePaths":103,"remoteImagePaths":104,"frontmatter":105,"imagePaths":108},[],[95,96,97],[],{"title":88,"pubDate":106,"tags":107},"2022-12-26",[39,91,61],[95,96,97],"2022/my-favorite-little-apps",{"id":109,"data":111,"body":116,"filePath":117,"digest":118,"rendered":119},{"title":112,"pubDate":113,"tags":114},"My Favorite Little Apps",["Date","2022-11-28T00:00:00.000Z"],[91,115],"Apps","There are a lot of apps on my Macs that I use every day. There’s 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. It’s 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. It’s highly customizable, and I’m going to be honest I haven’t 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\nIt’s 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. It’s another app I feel lost with if I’m 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":120,"metadata":121},"\u003Cp>There are a lot of apps on my Macs that I use every day. There’s 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. It’s 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. It’s highly customizable, and I’m going to be honest I haven’t 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>It’s 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. It’s another app I feel lost with if I’m 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":122,"localImagePaths":138,"remoteImagePaths":139,"frontmatter":140,"imagePaths":143},[123,126,129,132,135],{"depth":70,"slug":124,"text":125},"itsycal","Itsycal",{"depth":70,"slug":127,"text":128},"tot","Tot",{"depth":70,"slug":130,"text":131},"rectangle-pro","Rectangle Pro",{"depth":70,"slug":133,"text":134},"velja","Velja",{"depth":70,"slug":136,"text":137},"contexts","Contexts",[],[],{"title":112,"pubDate":141,"tags":142},"2022-11-28",[91,115],[],"2022/my-macos-home-directory-overview",{"id":144,"data":146,"body":150,"filePath":151,"digest":152,"rendered":153},{"title":147,"pubDate":148,"tags":149},"My MacOS Home Directory Overview",["Date","2022-12-23T00:00:00.000Z"],[91,39],"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 won’t go into the hidden items, because I don’t think either of us want that (with hidden items included, my home directory has 34 documents, and 47 folders 😅).\n\nAnyway, here’s my overview...\n\n- Applications - Honestly, all that’s in here are a handful of Shortcuts, and I’m not sure why because I never put them there.\n- Desktop - This is empty, because I don’t 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 there’s 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. I’m not a monster!\n- Postman - From when I tried Postman, and then immediately switched back to Insomnia.\n- Public - I don’t think I’ve 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 didn’t bother listing my Library folder because there’s not much to say about that–it’s the same as it is on anyone else’s 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 it’s squirreled away in the Library folder, cryptically named ‘Mobile Documents’.","src/content/blog/2022/my-macos-home-directory-overview.md","c1d7b4f1e53ad3d1",{"html":154,"metadata":155},"\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 won’t go into the hidden items, because I don’t think either of us want that (with hidden items included, my home directory has 34 documents, and 47 folders 😅).\u003C/p>\n\u003Cp>Anyway, here’s my overview…\u003C/p>\n\u003Cul>\n\u003Cli>Applications - Honestly, all that’s in here are a handful of Shortcuts, and I’m not sure why because I never put them there.\u003C/li>\n\u003Cli>Desktop - This is empty, because I don’t 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 there’s 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. I’m 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 don’t think I’ve 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 didn’t bother listing my Library folder because there’s not much to say about that–it’s the same as it is on anyone else’s 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 it’s squirreled away in the Library folder, cryptically named ‘Mobile Documents’.\u003C/p>",{"headings":156,"localImagePaths":157,"remoteImagePaths":158,"frontmatter":159,"imagePaths":162},[],[],[],{"title":147,"pubDate":160,"tags":161},"2022-12-23",[91,39],[],"2022/my-top-3-games-of-2022",{"id":163,"data":165,"body":170,"filePath":171,"digest":172,"rendered":173},{"title":166,"pubDate":167,"tags":168},"My Top 3 Games of 2022",["Date","2022-12-09T00:00:00.000Z"],[169],"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 compelling–namely; how the world ended up in the state it is in the game–was 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":174,"metadata":175},"\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 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.\u003C/p>\n\u003Ch3 id=\"xenoblade-chronicles-3\">Xenoblade Chronicles 3\u003C/h3>\n\u003Cp>I’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.\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 that’s 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 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.\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 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).\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 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.\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, I’m looking at you, Elden Ring). But I didn’t care, I wanted to see the next chapter in Aloy’s story.\u003C/p>\n\u003Cp>I 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 compelling–namely; how the world ended up in the state it is in the game–was 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 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!\u003C/p>",{"headings":176,"localImagePaths":186,"remoteImagePaths":187,"frontmatter":188,"imagePaths":191},[177,180,183],{"depth":70,"slug":178,"text":179},"xenoblade-chronicles-3","Xenoblade Chronicles 3",{"depth":70,"slug":181,"text":182},"tunic","Tunic",{"depth":70,"slug":184,"text":185},"horizon-forbidden-west","Horizon Forbidden West",[],[],{"title":166,"pubDate":189,"tags":190},"2022-12-09",[169],[],"2022/nextjs-13-and-exploring-new-technologies",{"id":192,"data":194,"body":199,"filePath":200,"digest":201,"rendered":202},{"title":195,"pubDate":196,"tags":197},"Next.js 13 and Exploring New Technologies",["Date","2022-10-28T00:00:00.000Z"],[17,198],"Learning","Next.js 13 was launched a few days ago ([More details here!](https://nextjs.org/blog/next-13)), and I’ve been slowly working my way through the new stuff. As a relative newcomer to the world of Next.js I’m very excited by what I see, but I also don’t want to get too bogged down in what’s new because I’m 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 I’m 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. I’m 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 you’re 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 you’re currently using on a daily basis. Whether you’re using an entirely different set of frameworks,, or if you’re like me and just using an older version of Next.js, the new shiny stuff will still be there when you’re ready. And possibly, by the time you’re 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":203,"metadata":204},"\u003Cp>Next.js 13 was launched a few days ago (\u003Ca href=\"https://nextjs.org/blog/next-13\">More details here!\u003C/a>), and I’ve been slowly working my way through the new stuff. As a relative newcomer to the world of Next.js I’m very excited by what I see, but I also don’t want to get too bogged down in what’s new because I’m 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 I’m 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. I’m 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 you’re 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 you’re currently using on a daily basis. Whether you’re using an entirely different set of frameworks,, or if you’re like me and just using an older version of Next.js, the new shiny stuff will still be there when you’re ready. And possibly, by the time you’re 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":205,"localImagePaths":206,"remoteImagePaths":207,"frontmatter":208,"imagePaths":211},[],[],[],{"title":195,"pubDate":209,"tags":210},"2022-10-28",[17,198],[],"2022/coding-with-depression",{"id":212,"data":214,"body":218,"filePath":219,"digest":220,"rendered":221},{"title":215,"pubDate":216,"tags":217},"Coding With Depression",["Date","2022-11-11T00:00:00.000Z"],[17,18],"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":222,"metadata":223},"\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, it’s not an easy topic by any means, as it’s something that profoundly affects me personally on a daily basis.\u003C/p>\n\u003Cp>For 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.\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 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.\u003C/p>\n\u003Cp>If 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.\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 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.\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. 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.\u003C/p>\n\u003Cp>It’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.\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, 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.\u003C/p>\n\u003Cp>But 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.\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 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.\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":224,"localImagePaths":234,"remoteImagePaths":235,"frontmatter":236,"imagePaths":239},[225,228,231],{"depth":70,"slug":226,"text":227},"getting-motivated","Getting Motivated",{"depth":70,"slug":229,"text":230},"navigating-the-fog","Navigating the Fog",{"depth":70,"slug":232,"text":233},"be-kind-to-yourself","Be Kind to Yourself",[],[],{"title":215,"pubDate":237,"tags":238},"2022-11-11",[17,18],[],"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"],[38,198,17],"When it comes to frameworks, I’ve been firmly stuck in the React–and React-adjacent–world. Basically, my “coding comfort zone” has been vanilla JavaScript, React, and Next.js. The world of web development is much broader than that, but I’m 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 what’s comfortable, and I have to work a little harder to branch out. I’m comfortable with React, so my tendency is to learn everything I can about React. I’m comfortable with JavaScript, so it’s more natural for me to try to master that language.\n\nBut there was a time I didn’t 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 isn’t as scary as it seems. Does this mean I’m going to go out and learn every framework? No, I don’t think that’s realistic or advisable for anybody to do. But it showed me how relatively easy it is to branch out, so I won’t be so nervous about stepping outside the comfort of the React world in the future.\n\nIf you’re feeling like you’re stuck in your comfort zone, using whatever technologies and languages you’re used to using, try mixing things up. Find a project you want to build, and try tackling it with a tool you’ve 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, I’ve been firmly stuck in the React–and React-adjacent–world. Basically, my “coding comfort zone” has been vanilla JavaScript, React, and Next.js. The world of web development is much broader than that, but I’m 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 what’s comfortable, and I have to work a little harder to branch out. I’m comfortable with React, so my tendency is to learn everything I can about React. I’m comfortable with JavaScript, so it’s more natural for me to try to master that language.\u003C/p>\n\u003Cp>But there was a time I didn’t 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 wouldn’t be anywhere near where I am as a web developer if I didn’t 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 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.\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 isn’t as scary as it seems. Does this mean I’m going to go out and learn every framework? No, I don’t think that’s realistic or advisable for anybody to do. But it showed me how relatively easy it is to branch out, so I won’t be so nervous about stepping outside the comfort of the React world in the future.\u003C/p>\n\u003Cp>If you’re feeling like you’re stuck in your comfort zone, using whatever technologies and languages you’re used to using, try mixing things up. Find a project you want to build, and try tackling it with a tool you’ve never used before.\u003C/p>\n\u003Cp>Also, if you’re 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":52,"tags":256},[38,198,17],[],"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"],[39,115,17],"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 I’m 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. I’ve tried more than I can name, and I haven’t even scratched the surface of what’s out there. The most popular out there is Visual Studio Code, and it’s no mystery why. It’s absolutely packed with features, code completion is top notch, and there’s an extension for just about anything you could ever imagine.\n\nBut I’m going to be honest, I’m a Mac user and a bit of a software snob. I do use good old VS Code when the mood strikes me, but I’ve come to far prefer Nova, a fantastic piece of software from the people at [Panic Inc.](https://www.panic.com/) It’s fast, it’s clean, and most importantly for me, it’s MacOS native.\n\nNova has its drawbacks. It’s extension support is nowhere near VS Code’s. It’s 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, it’s a lot less frustrating.\n\nBasically, I still use VS Code from time to time. I turn to it when I’m working my day job, which involves working on a fairly large Next.js codebase, and I need to collaborate on something, or if I’m 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 doesn’t really matter. Using a particular text editor isn’t going to make you a better developer. The only thing that really matters is you use the tool that you like. Don’t just use VS Code because it’s trendy, or Nova because I’m 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 I’m 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. I’ve tried more than I can name, and I haven’t even scratched the surface of what’s out there. The most popular out there is Visual Studio Code, and it’s no mystery why. It’s absolutely packed with features, code completion is top notch, and there’s an extension for just about anything you could ever imagine.\u003C/p>\n\u003Cp>But I’m going to be honest, I’m a Mac user and a bit of a software snob. I do use good old VS Code when the mood strikes me, but I’ve come to far prefer Nova, a fantastic piece of software from the people at \u003Ca href=\"https://www.panic.com/\">Panic Inc.\u003C/a> It’s fast, it’s clean, and most importantly for me, it’s MacOS native.\u003C/p>\n\u003Cp>Nova has its drawbacks. It’s extension support is nowhere near VS Code’s. It’s 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, it’s a lot less frustrating.\u003C/p>\n\u003Cp>Basically, I still use VS Code from time to time. I turn to it when I’m working my day job, which involves working on a fairly large Next.js codebase, and I need to collaborate on something, or if I’m 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 doesn’t really matter. Using a particular text editor isn’t going to make you a better developer. The only thing that really matters is you use the tool that you like. Don’t just use VS Code because it’s trendy, or Nova because I’m 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",[39,115,17],[],"2023/an-update-on-my-ai-dating-profile",{"id":277,"data":279,"body":283,"filePath":284,"digest":285,"rendered":286},{"title":280,"pubDate":281,"tags":282},"An Update on my AI Dating Profile",["Date","2023-01-14T00:00:00.000Z"],[38,39],"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 didn’t feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasn’t falsely representing me, but I still felt dirty. Like the few matches I did get weren’t 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 world–at least in my experience. 🤷♂️","src/content/blog/2023/an-update-on-my-ai-dating-profile.md","db64faaaad105b1a",{"html":287,"metadata":288},"\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 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.\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 didn’t feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasn’t falsely representing me, but I still felt dirty. Like the few matches I did get weren’t 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 world–at least in my experience. 🤷♂️\u003C/p>",{"headings":289,"localImagePaths":290,"remoteImagePaths":291,"frontmatter":292,"imagePaths":295},[],[],[],{"title":280,"pubDate":293,"tags":294},"2023-01-14",[38,39],[],"2023/handheld-gaming",{"id":296,"data":298,"body":302,"filePath":303,"digest":304,"rendered":305},{"title":299,"pubDate":300,"tags":301},"Handheld Gaming",["Date","2023-01-07T00:00:00.000Z"],[169],"I don’t know if it’s the particular mood I’ve 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 I’ve 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 that’s a touch dramatic…)\n\nThat’s not to say I didn’t ever play home consoles. I’ve had every Nintendo system since the SNES–yup, that includes the Wii U–and 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 dad’s house. But I spent a majority of my childhood at my mom’s, and she didn’t want those things around, and I was only allowed to have my GameBoy. To this day, I’m 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, Link’s 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 Link’s Awakening. The first game I put 100+ hours into? Pokémon Silver.\n\nHandheld gaming even kept me sane during lockdown in 2020. Let’s 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 games–notably, I replayed and re-completed Horizon Zero Dawn–but I practically wore out my original Switch Lite that year.\n\nMaybe there’s something nostalgic about handheld gaming that draws me in when I just want to get cozy, even if I’m playing a newer game that I’m 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":306,"metadata":307},"\u003Cp>I don’t know if it’s the particular mood I’ve 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 I’ve 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 that’s a touch dramatic…)\u003C/p>\n\u003Cp>That’s not to say I didn’t ever play home consoles. I’ve had every Nintendo system since the SNES–yup, that includes the Wii U–and 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 dad’s house. But I spent a majority of my childhood at my mom’s, and she didn’t want those things around, and I was only allowed to have my GameBoy. To this day, I’m 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, Link’s 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 Link’s 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. Let’s 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 games–notably, I replayed and re-completed Horizon Zero Dawn–but I practically wore out my original Switch Lite that year.\u003C/p>\n\u003Cp>Maybe there’s something nostalgic about handheld gaming that draws me in when I just want to get cozy, even if I’m playing a newer game that I’m 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":308,"localImagePaths":309,"remoteImagePaths":310,"frontmatter":311,"imagePaths":314},[],[],[],{"title":299,"pubDate":312,"tags":313},"2023-01-07",[169],[],"2023/finding-home-in-hyrule",{"id":315,"data":317,"body":321,"filePath":322,"digest":323,"rendered":324},{"title":318,"pubDate":319,"tags":320},"Finding Home in Hyrule",["Date","2023-05-22T04:00:00.000Z"],[169,18],"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 I’d never seen before.\n\nFast forward to last week, and I underwent another drastic life change; I moved from the apartment I’ve 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":325,"metadata":326},"\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 I’d never seen before.\u003C/p>\n\u003Cp>Fast forward to last week, and I underwent another drastic life change; I moved from the apartment I’ve 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":327,"localImagePaths":328,"remoteImagePaths":329,"frontmatter":330,"imagePaths":333},[],[],[],{"title":318,"pubDate":331,"tags":332},"5/22/23",[169,18],[],"2023/journal-app-impressions",{"id":334,"data":336,"body":340,"filePath":341,"digest":342,"rendered":343},{"title":337,"pubDate":338,"tags":339},"Apple's Journal App: First Impressions",["Date","2023-11-12T05:00:00.000Z"],[39,115,18],"With the upcoming iOS 17.2 update, we’ll 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 doesn’t have much going on, and I think that’s 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 doesn’t have the bells and whistles an app like Day One has, but when it comes to writing a journal entry you’re given the option to add photos, location, and even an audio recording. It’s pretty barebones, but I think that’s 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 don’t 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. That’s not at all how I like to journal, so I actually have those turned off. Apparently there’s an API that 3rd party apps can use, but we won’t 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 Apple’s platforms and I’m puzzled that it isn’t. Even just making it available on iPad would be acceptable, but as it stands now I don’t 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":344,"metadata":345},"\u003Cp>With the upcoming iOS 17.2 update, we’ll 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 doesn’t have much going on, and I think that’s 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 doesn’t have the bells and whistles an app like Day One has, but when it comes to writing a journal entry you’re given the option to add photos, location, and even an audio recording. It’s pretty barebones, but I think that’s 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 don’t 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. That’s not at all how I like to journal, so I actually have those turned off. Apparently there’s an API that 3rd party apps can use, but we won’t 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 Apple’s platforms and I’m puzzled that it isn’t. Even just making it available on iPad would be acceptable, but as it stands now I don’t 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":346,"localImagePaths":351,"remoteImagePaths":352,"frontmatter":353,"imagePaths":356},[347],{"depth":348,"slug":349,"text":350},2,"footnote-label","Footnotes",[],[],{"title":337,"pubDate":354,"tags":355},"11/12/23",[39,115,18],[],"2023/my-favorite-little-apps-part-2",{"id":357,"data":359,"body":363,"filePath":364,"digest":365,"rendered":366},{"title":360,"pubDate":361,"tags":362},"My Favorite Little Apps, Part 2",["Date","2023-01-21T00:00:00.000Z"],[91,115],"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":367,"metadata":368},"\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. 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.\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 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…\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, it’s 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 you’re into that.\u003C/p>\n\u003Cp>\u003Ca href=\"https://www.keka.io/en/\">Download Here\u003C/a>\u003C/p>",{"headings":369,"localImagePaths":382,"remoteImagePaths":383,"frontmatter":384,"imagePaths":387},[370,373,376,379],{"depth":70,"slug":371,"text":372},"vinegar","Vinegar",{"depth":70,"slug":374,"text":375},"rocket","Rocket",{"depth":70,"slug":377,"text":378},"qlmarkdown","QLMarkdown",{"depth":70,"slug":380,"text":381},"keka","Keka",[],[],{"title":360,"pubDate":385,"tags":386},"2023-01-21",[91,115],[],"2023/nostalgia",{"id":388,"data":390,"body":395,"filePath":396,"digest":397,"rendered":398},{"title":391,"pubDate":392,"tags":393},"Nostalgia",["Date","2023-03-04T00:00:00.000Z"],[38,169,394],"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 exist–or, 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 II–purely due to nostalgia, even though I can recognize and point out the movies many flaws–I'm perhaps not the best person to examine nostalgia vs. objective quality.","src/content/blog/2023/nostalgia.md","02495bfc28d1a357",{"html":399,"metadata":400},"\u003Cp>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.\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 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.\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 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.\u003C/p>\n\u003Cp>There’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 exist–or, more accurately, they are not mandatory, as motion controls can be turned on in the game’s settings.\u003C/p>\n\u003Cp>This 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.\u003C/p>\n\u003Cp>Maybe, 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.\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 II–purely due to nostalgia, even though I can recognize and point out the movies many flaws–I’m perhaps not the best person to examine nostalgia vs. objective quality.\u003C/p>",{"headings":401,"localImagePaths":402,"remoteImagePaths":403,"frontmatter":404,"imagePaths":407},[],[],[],{"title":391,"pubDate":405,"tags":406},"2023-03-04",[38,169,394],[],"2023/default-apps-2023",{"id":408,"data":410,"body":414,"filePath":415,"digest":416,"rendered":417},{"title":411,"pubDate":412,"tags":413},"Default Apps 2023",["Date","2023-11-25T05:00:00.000Z"],[115,39],"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":418,"metadata":419},"\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":420,"localImagePaths":424,"remoteImagePaths":425,"frontmatter":426,"imagePaths":429},[421],{"depth":70,"slug":422,"text":423},"honorable-mentions","Honorable Mentions",[],[],{"title":411,"pubDate":427,"tags":428},"11/25/23",[115,39],[],"2023/baldurs-gate-3-feels",{"id":430,"data":432,"body":436,"filePath":437,"digest":438,"rendered":439},{"title":433,"pubDate":434,"tags":435},"Baldur's Gate 3, and Lots of Feels About Video Games",["Date","2023-11-01T04:00:00.000Z"],[169,18],"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\nI’ve 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 Baldur’s 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. I’d played D&D before, but it wasn’t something I really got into until that point.\n\nIf I didn’t have this experience I don’t think I would have been open to playing Baldur’s 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 – Baldur’s 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, I’d 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 I’ll finish my plucky wood elf’s 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 game’s overall story.\n\nFor the Dark Urge I went with a human rogue, and I’ve had a lot more fun leaning into the game’s mechanics this time around. She’s 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 party’s 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 didn’t feel cheap because I wasn’t cheesing the mechanics, I was figuring out how to best use them to my advantage.\n\nOn the surface, Baldur’s 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 don’t think I can. I’ve 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 they’re 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. Baldur’s Gate 3 has given me a sense of camaraderie, albeit a virtual one, in a point in my life when I’ve been feeling alone and lost trying to find myself in a new city. No other game I’ve 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":440,"metadata":441},"\u003Cp>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.\u003C/p>\n\u003Cp>I’ve 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 Baldur’s 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. I’d played D&D before, but it wasn’t something I really got into until that point.\u003C/p>\n\u003Cp>If I didn’t have this experience I don’t think I would have been open to playing Baldur’s 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 – Baldur’s 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, I’d 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 I’ll finish my plucky wood elf’s 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 game’s overall story.\u003C/p>\n\u003Cp>For the Dark Urge I went with a human rogue, and I’ve had a lot more fun leaning into the game’s mechanics this time around. She’s 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, 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.\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 party’s 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 didn’t feel cheap because I wasn’t cheesing the mechanics, I was figuring out how to best use them to my advantage.\u003C/p>\n\u003Cp>On the surface, Baldur’s 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 don’t think I can. I’ve 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 they’re all very good games worthy of the spot, they just didn’t 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. Baldur’s Gate 3 has given me a sense of camaraderie, albeit a virtual one, in a point in my life when I’ve been feeling alone and lost trying to find myself in a new city. No other game I’ve played this year has been a fraction as meaningful as these two have been.\u003C/p>",{"headings":442,"localImagePaths":443,"remoteImagePaths":444,"frontmatter":445,"imagePaths":448},[],[],[],{"title":433,"pubDate":446,"tags":447},"11/1/23",[169,18],[],"2023/my-gunpla-adventure",{"id":449,"data":451,"body":455,"filePath":456,"assetImports":457,"digest":461,"rendered":462},{"title":452,"pubDate":453,"tags":454},"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\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\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\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",[458,459,460],"src/assets/blog/gunpla/box.jpg","src/assets/blog/gunpla/all-the-parts.jpg","src/assets/blog/gunpla/final.jpg","0d5b9fc581cc4ddd",{"html":463,"metadata":464},"\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 it’s a portmanteau of \u003Ca href=\"https://en.wikipedia.org/wiki/Gundam\">Gundam\u003C/a> and plastic. So simply put, it’s about building robots (sorry, mecha) out of plastic.\u003C/p>\n\u003Cp>I’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 \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 I’m not super big on buying merch for franchises I don’t 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 character’s 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 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.\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 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.\u003C/p>\n\u003Cp>I’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.\u003C/p>",{"headings":465,"localImagePaths":466,"remoteImagePaths":467,"frontmatter":468,"imagePaths":471},[],[458,459,460],[],{"title":452,"pubDate":469,"tags":470},"2023-01-28",[61],[458,459,460],"2023/on-using-chat-gpt",{"id":472,"data":474,"body":479,"filePath":480,"digest":481,"rendered":482},{"title":475,"pubDate":476,"tags":477},"Quick Thoughts On Using Chat GPT as a Coding Assistant",["Date","2023-04-30T04:00:00.000Z"],[198,478],"Programming","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 that’s in a book, online, or with a language model. You can’t know everything there is to know about programming, so you have to be good at looking things up when you don’t 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 I’ve been using ChatGPT in lieu of Google for looking up code examples when I’m stuck on a problem at work, or when working on side-projects. It’s been hugely beneficial to my productivity and workflow, but it’s not perfect.\n\nGoing in you need to have enough knowledge to be able to call it on its BS. I’ve found ChatGPT will get things wrong, give you code that maybe doesn’t quite do what you’re looking for, or sometimes try to get you to use non-existent or deprecated packages or language features.\n\nEspecially when I’m going in trying to learn something new, whether its a web technology I’m not experienced in, or trying to [learn Swift from scratch](/posts/2023/reflecting-on-building-my-first-app), I’ve found it helpful to go in at least knowing what I’m looking for. That means reading documentation, and trying a few things out on my own. If I’m stuck, or if the documentation has poor or non-existent sample code (looking at you Apple), I’ll 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":483,"metadata":484},"\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 that’s in a book, online, or with a language model. You can’t know everything there is to know about programming, so you have to be good at looking things up when you don’t 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 I’ve been using ChatGPT in lieu of Google for looking up code examples when I’m stuck on a problem at work, or when working on side-projects. It’s been hugely beneficial to my productivity and workflow, but it’s not perfect.\u003C/p>\n\u003Cp>Going in you need to have enough knowledge to be able to call it on its BS. I’ve found ChatGPT will get things wrong, give you code that maybe doesn’t quite do what you’re looking for, or sometimes try to get you to use non-existent or deprecated packages or language features.\u003C/p>\n\u003Cp>Especially when I’m going in trying to learn something new, whether its a web technology I’m not experienced in, or trying to \u003Ca href=\"/posts/2023/reflecting-on-building-my-first-app\">learn Swift from scratch\u003C/a>, I’ve found it helpful to go in at least knowing what I’m looking for. That means reading documentation, and trying a few things out on my own. If I’m stuck, or if the documentation has poor or non-existent sample code (looking at you Apple), I’ll use ChatGPT to generate some generic starter code I can use as a jumping off point.\u003C/p>",{"headings":485,"localImagePaths":486,"remoteImagePaths":487,"frontmatter":488,"imagePaths":491},[],[],[],{"title":475,"pubDate":489,"tags":490},"4/30/23",[198,478],[],"2023/reflecting-on-building-my-first-app",{"id":492,"data":494,"body":498,"filePath":499,"digest":500,"rendered":501},{"title":495,"pubDate":496,"tags":497},"Reflecting on Building My First App",["Date","2023-02-28T00:00:00.000Z"],[198,61,91,478],"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 wasn’t unfulfilled or bored. I was overwhelmed. SwiftUI can be a finicky beast for seasoned developers, but I’d 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 wasn’t 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 it’s what I know. I don’t 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 I’m 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, it’s something I already knew, but maybe I just needed to be reminded of: Start small, and don’t 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 I’m ready to dive back in, is start at step one. I know the fundamentals of programming, but that’s 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\nIt’s definitely hard for me when learning something new to not immediately put myself down for not being good at it on my first go. It’s unrealistic, and unproductive, but for some reason it’s 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":502,"metadata":503},"\u003Cp>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.\u003C/p>\n\u003Cp>I’ve 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 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.\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 I’d suggest using? Nope. But to be fair, I’d 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 wasn’t unfulfilled or bored. I was overwhelmed. SwiftUI can be a finicky beast for seasoned developers, but I’d 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 wasn’t 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 it’s what I know. I don’t 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 I’m 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, it’s something I already knew, but maybe I just needed to be reminded of: Start small, and don’t 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 I’m ready to dive back in, is start at step one. I know the fundamentals of programming, but that’s 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>It’s definitely hard for me when learning something new to not immediately put myself down for not being good at it on my first go. It’s unrealistic, and unproductive, but for some reason it’s 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":504,"localImagePaths":505,"remoteImagePaths":506,"frontmatter":507,"imagePaths":510},[],[],[],{"title":495,"pubDate":508,"tags":509},"2023-02-28",[198,61,91,478],[],"2023/thoughs-on-macos",{"id":511,"data":513,"body":517,"filePath":518,"digest":519,"rendered":520},{"title":514,"pubDate":515,"tags":516},"Thoughts on macOS",["Date","2023-06-04T04:00:00.000Z"],[91,39],"So, as of this writing, WWDC 2023 kicks off _tomorrow_. As a web developer who’s recently started dabbling in Swift, and building apps for Apple platforms, I’m excited to see what gets shown off that I can start sinking my teeth into. On the other hand, as a longtime Mac user, I’m a little apprehensive about what we’ll see there.\n\nHardware-wise, the Mac is in a fantastic place. We’re 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, we’re 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 there’s 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 I’ve been experiencing it longer). Or the fact that the TV app straight up doesn’t work most of the time.\n\nThen there’s Launchpad (which may not be long for this world as the dedicated key on Apple’s keyboard has been replaced with Spotlight) which I’ve 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 I’ve experienced is how unreliable network drives are. I have a Mac Mini set up as a home server, and the amount of times it’ll just fail to connect when I need to access one of the drives, or Time Machine just fails to recognize that there’s 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 I’ve mentioned. Others experience totally different issues that I’ve never run into. It’s 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 _don’t_ see a new version of macOS, and if we do, it’s 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":521,"metadata":522},"\u003Cp>So, as of this writing, WWDC 2023 kicks off \u003Cem>tomorrow\u003C/em>. As a web developer who’s recently started dabbling in Swift, and building apps for Apple platforms, I’m excited to see what gets shown off that I can start sinking my teeth into. On the other hand, as a longtime Mac user, I’m a little apprehensive about what we’ll see there.\u003C/p>\n\u003Cp>Hardware-wise, the Mac is in a fantastic place. We’re 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, we’re 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 there’s 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 I’ve been experiencing it longer). Or the fact that the TV app straight up doesn’t work most of the time.\u003C/p>\n\u003Cp>Then there’s Launchpad (which may not be long for this world as the dedicated key on Apple’s keyboard has been replaced with Spotlight) which I’ve 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 I’ve experienced is how unreliable network drives are. I have a Mac Mini set up as a home server, and the amount of times it’ll just fail to connect when I need to access one of the drives, or Time Machine just fails to recognize that there’s 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 I’ve mentioned. Others experience totally different issues that I’ve never run into. It’s 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>don’t\u003C/em> see a new version of macOS, and if we do, it’s 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":523,"localImagePaths":524,"remoteImagePaths":525,"frontmatter":526,"imagePaths":529},[],[],[],{"title":514,"pubDate":527,"tags":528},"6/4/23",[91,39],[],"2023/using-json-for-data-storage",{"id":530,"data":532,"body":536,"filePath":537,"digest":538,"rendered":539},{"title":533,"pubDate":534,"tags":535},"More Swift Learnings: Using JSON For Data Storage",["Date","2023-04-09T04:00:00.000Z"],[91,198,478],"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 I’d 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, I’ve been working on the incredibly cleverly named [SwiftGPT](https://github.com/ghall89/swiftgpt), and it’s 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\nI’m 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, you’ll be happy to know–unless there’s some better method I overlooked–that’s exactly what I used. Though I’m 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 I’m working with a small set of very simple data, I’m 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":540,"metadata":541},"\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 I’d 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, I’ve been working on the incredibly cleverly named \u003Ca href=\"https://github.com/ghall89/swiftgpt\">SwiftGPT\u003C/a>, and it’s 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>I’m 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, you’ll be happy to know–unless there’s some better method I overlooked–that’s exactly what I used. Though I’m 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 I’m working with a small set of very simple data, I’m 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":542,"localImagePaths":543,"remoteImagePaths":544,"frontmatter":545,"imagePaths":548},[],[],[],{"title":533,"pubDate":546,"tags":547},"4/9/23",[91,198,478],[],"2023/questlogger-from-ios-to-mac",{"id":549,"data":551,"body":555,"filePath":556,"digest":557,"rendered":558},{"title":552,"pubDate":553,"tags":554},"QuestLogger - From Closed-Source iOS App to Open-Source Mac App",["Date","2023-09-03T04:00:00.000Z"],[61,478,115],"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). That’s 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 would’t 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 wasn’t 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 didn’t want the to deal with the pressure of subscriptions and the demands that could bring. Maybe this would be something I’d 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 I’m 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 doesn’t 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. That’s 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 don’t think I wrote a single line of code for QuestLogger throughout the month of July. Then, in early August, I decided I didn’t 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 keys–which is, as I understand it, against Apple’s rules for the App Store–and 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, it’s reignited my interest in building this project, and honing my Swift skills. I don’t need to worry about optimal subscription prices, or making sure people are getting their money’s 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":559,"metadata":560},"\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>. That’s 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 would’t 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 wasn’t 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 didn’t want the to deal with the pressure of subscriptions and the demands that could bring. Maybe this would be something I’d 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 I’m 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 doesn’t 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. That’s 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 don’t think I wrote a single line of code for QuestLogger throughout the month of July. Then, in early August, I decided I didn’t 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 keys–which is, as I understand it, against Apple’s rules for the App Store–and 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, it’s reignited my interest in building this project, and honing my Swift skills. I don’t need to worry about optimal subscription prices, or making sure people are getting their money’s worth. I can just focus on making something I think is cool, and hopefully others do too.\u003C/p>",{"headings":561,"localImagePaths":562,"remoteImagePaths":563,"frontmatter":564,"imagePaths":567},[],[],[],{"title":552,"pubDate":565,"tags":566},"9/3/23",[61,478,115],[],"2023/reflecting-on-my-first-year-as-a-developer",{"id":568,"data":570,"body":574,"filePath":575,"digest":576,"rendered":577},{"title":571,"pubDate":572,"tags":573},"Reflecting On My First Year as a Developer",["Date","2023-08-07T04:00:00.000Z"],[38,198,478],"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. It’s 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 can’t 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\nI’ve grown a lot in the last year, not just as a developer, but also as a person. Financially, being a full time job, it’s given me stability I didn’t have doing contract work. Emotionally, it isn’t as overwhelming to deal with (when I’m not having a bout of Imposter Syndrome). It’s given me the space to work on myself in a way I haven’t 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 I’ve 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 I’ve 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 can’t” to a lot of things. “I can’t learn to code.” “I can’t handle working with databases.” “I can’t live in a new place.” “I can’t 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 it’s “impossible”. Yoda sighs and pulls the starfighter out of the swamp himself. Luke, upon seeing this, says, “I don’t 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 didn’t 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 year–and honestly, my entire journey into the world of software development–has 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":578,"metadata":579},"\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. It’s 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 can’t 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>I’ve grown a lot in the last year, not just as a developer, but also as a person. Financially, being a full time job, it’s given me stability I didn’t have doing contract work. Emotionally, it isn’t as overwhelming to deal with (when I’m not having a bout of Imposter Syndrome). It’s given me the space to work on myself in a way I haven’t 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 I’ve 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 I’ve 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 can’t” to a lot of things. “I can’t learn to code.” “I can’t handle working with databases.” “I can’t live in a new place.” “I can’t 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 it’s “impossible”. Yoda sighs and pulls the starfighter out of the swamp himself. Luke, upon seeing this, says, “I don’t 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 didn’t 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 year–and honestly, my entire journey into the world of software development–has 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":580,"localImagePaths":581,"remoteImagePaths":582,"frontmatter":583,"imagePaths":586},[],[],[],{"title":571,"pubDate":584,"tags":585},"8/7/23",[38,198,478],[],"2026/setting-my-music-free",{"id":587,"data":589,"body":594,"filePath":595,"digest":596,"rendered":597},{"title":590,"pubDate":591,"tags":592},"Setting My Music Free",["Date","2026-01-03T05:00:00.000Z"],[593,39,115],"Music","I've been a loyal Apple Music subscriber pretty much since it launched 10 years ago, and I've really got used to having almost any song I could imagine wanting right in my pocket. I liked the promise of carrying my existing music library into the world of music streaming, and having everything sync seamlessly between devices. I was very frustrated with how buggy and unreliable syncing music to iOS devices at the time (keep reading to find out if this will bite me in the butt again), so an all-you-can-eat buffet of music, combined with what was promised to be a seamless syncing method, was far too good to pass up.\n\n## The Final Straw\n\nHistorically I've been quite meticulous with how I organize my music – though I know there are people _far_ more meticulous than I am. That includes changing metadata for things like genre, because I don't need 15 variations on \"Alternative\" when just one will do. I also like changing track titles to remove extraneous information that could be gleaned from the metadata, like featured artist. Turns out, Apple Music does NOT like this, and it's a constant fight to keep things the way I like them.\n\nBut, even if you decide to throw in the towel like I eventually did, Apple Music often doesn't even like _its own_ metadata. Instead of just leaving things you've added to your library alone, it will just randomly change things around, which would be ok except it often doesn't propagate correctly, which leads to albums being split (at least, that's my theory as to why it happens). I even had it change album art to something completely unrelated to the album.\n\nWhat finally broke me however was when an album I had imported – not even from the iTunes Store, I got it in a Humble Music Bundle over a decade ago – became \"unavailable to play\". At some point in the last decade, Apple Music must have co-opted that album and then, when it was taken off streaming, decided I could no longer have access to it.\n\nOne thing became clear; with Apple Music, I don't even own the music that I own. Maybe I should have seen this coming, but better late than never I suppose.\n\n## Libera Musica\n\nAnyway, I began my quest to liberate my music, but it wasn't without issue. As I mentioned, at some point Apple Music co-opted a chunk of my music. There was no rhyme or reason to which albums, or even which individual tracks, got absorbed into the streaming machine. This meant a non-insignificant portion of my music was either just unavailable, or imprisoned behind DRM. Yes, that means Apple locked music I own and imported into their service behind a subscription!!! That's when I knew I was making the right call...\n\nMy first step was to see how much music I could rescue just by downloading the tracks that remained untouched and DRM-free. This is where I ran into the next major issue, but this time it was mostly my fault, and I could have saved myself _hours_ if I spent more time troubleshooting. See, a huge number of tracks downloaded as weird `.movpkg` files, which I couldn't really do anything with.\n\nTurns out, if I had just turned off \"Enable Lossless Audio\" in the Music app's settings, under the \"Playback\" tab, I could have saved myself a lot of time and headache...\n\nHowever, the silver lining is that, while I was downloading the handful of albums I purchased from Amazon over the years, I discovered that just about every vinyl record I ever bought from them was made available as a DRM-free digital download. A nice little bonus, considering it gave me a little bit of a head start on buying some music I only had access to through my subscription.\n\n## 8,000 Songs In My Pocket\n\nNow that I had my music all together, I needed some way to (obsessively) manage it all, and get it synced to my phone.\n\nI had hope that someone at Apple found it in their heart to fix the music syncing issues that cropped up in iOS well over a decade ago. Nope, apparently it's even worse, and a quick web search showed me I'm not imagining it. I'd also ruled out iTunes Match out the gate, because of the sub-par experience I had with it, and if they hadn't fixed manual syncing, I wasn't going to spend $25 to see if they fixed iTunes Match. The product page that clearly hasn't been touched since 2011 didn't inspire much confidence either.\n\nIf I wanted something reliable, I would have to look outside the slowly deteriorating mess that is Apple's music infrastructure.\n\nAfter a bit of searching, I came across an app called [Doppler](https://brushedtype.co/doppler/), for both iPhone and Mac. I've been trying it out, and it's been a pretty solid experience so far. It's a simpler app, but I think that works to its benefit. Getting music from the Mac to the iPhone using Doppler isn't as seamless as, say, getting music from iTunes to an iPod back in the day. It's for sure a more manual process. But it works, and can even be done wirelessly.\n\nIt sort of reminds me of loading music onto my first MP3 player back in like 2004, and I don't think I hate it. There's a certain charm to it, and I think it makes the whole process feel more intentional. Not quite putting on a vinyl record, or even a CD, but it adds a bit of soul to an otherwise cold and mechanical process. I think that was lost in the age of the smartphone, and even moreso since streaming really took hold.\n\nAm I romanticizing it a bit? Probably. On the other hand though, I might have a total breakdown, and buy an iPod Classic on eBay. Whatever happens though, I think I'm sticking with owning my music, and taking back control over how it's organized, for the foreseeable future.","src/content/blog/2026/setting-my-music-free.md","c36f3417482d6d28",{"html":598,"metadata":599},"\u003Cp>I’ve been a loyal Apple Music subscriber pretty much since it launched 10 years ago, and I’ve really got used to having almost any song I could imagine wanting right in my pocket. I liked the promise of carrying my existing music library into the world of music streaming, and having everything sync seamlessly between devices. I was very frustrated with how buggy and unreliable syncing music to iOS devices at the time (keep reading to find out if this will bite me in the butt again), so an all-you-can-eat buffet of music, combined with what was promised to be a seamless syncing method, was far too good to pass up.\u003C/p>\n\u003Ch2 id=\"the-final-straw\">The Final Straw\u003C/h2>\n\u003Cp>Historically I’ve been quite meticulous with how I organize my music – though I know there are people \u003Cem>far\u003C/em> more meticulous than I am. That includes changing metadata for things like genre, because I don’t need 15 variations on “Alternative” when just one will do. I also like changing track titles to remove extraneous information that could be gleaned from the metadata, like featured artist. Turns out, Apple Music does NOT like this, and it’s a constant fight to keep things the way I like them.\u003C/p>\n\u003Cp>But, even if you decide to throw in the towel like I eventually did, Apple Music often doesn’t even like \u003Cem>its own\u003C/em> metadata. Instead of just leaving things you’ve added to your library alone, it will just randomly change things around, which would be ok except it often doesn’t propagate correctly, which leads to albums being split (at least, that’s my theory as to why it happens). I even had it change album art to something completely unrelated to the album.\u003C/p>\n\u003Cp>What finally broke me however was when an album I had imported – not even from the iTunes Store, I got it in a Humble Music Bundle over a decade ago – became “unavailable to play”. At some point in the last decade, Apple Music must have co-opted that album and then, when it was taken off streaming, decided I could no longer have access to it.\u003C/p>\n\u003Cp>One thing became clear; with Apple Music, I don’t even own the music that I own. Maybe I should have seen this coming, but better late than never I suppose.\u003C/p>\n\u003Ch2 id=\"libera-musica\">Libera Musica\u003C/h2>\n\u003Cp>Anyway, I began my quest to liberate my music, but it wasn’t without issue. As I mentioned, at some point Apple Music co-opted a chunk of my music. There was no rhyme or reason to which albums, or even which individual tracks, got absorbed into the streaming machine. This meant a non-insignificant portion of my music was either just unavailable, or imprisoned behind DRM. Yes, that means Apple locked music I own and imported into their service behind a subscription!!! That’s when I knew I was making the right call…\u003C/p>\n\u003Cp>My first step was to see how much music I could rescue just by downloading the tracks that remained untouched and DRM-free. This is where I ran into the next major issue, but this time it was mostly my fault, and I could have saved myself \u003Cem>hours\u003C/em> if I spent more time troubleshooting. See, a huge number of tracks downloaded as weird \u003Ccode>.movpkg\u003C/code> files, which I couldn’t really do anything with.\u003C/p>\n\u003Cp>Turns out, if I had just turned off “Enable Lossless Audio” in the Music app’s settings, under the “Playback” tab, I could have saved myself a lot of time and headache…\u003C/p>\n\u003Cp>However, the silver lining is that, while I was downloading the handful of albums I purchased from Amazon over the years, I discovered that just about every vinyl record I ever bought from them was made available as a DRM-free digital download. A nice little bonus, considering it gave me a little bit of a head start on buying some music I only had access to through my subscription.\u003C/p>\n\u003Ch2 id=\"8000-songs-in-my-pocket\">8,000 Songs In My Pocket\u003C/h2>\n\u003Cp>Now that I had my music all together, I needed some way to (obsessively) manage it all, and get it synced to my phone.\u003C/p>\n\u003Cp>I had hope that someone at Apple found it in their heart to fix the music syncing issues that cropped up in iOS well over a decade ago. Nope, apparently it’s even worse, and a quick web search showed me I’m not imagining it. I’d also ruled out iTunes Match out the gate, because of the sub-par experience I had with it, and if they hadn’t fixed manual syncing, I wasn’t going to spend $25 to see if they fixed iTunes Match. The product page that clearly hasn’t been touched since 2011 didn’t inspire much confidence either.\u003C/p>\n\u003Cp>If I wanted something reliable, I would have to look outside the slowly deteriorating mess that is Apple’s music infrastructure.\u003C/p>\n\u003Cp>After a bit of searching, I came across an app called \u003Ca href=\"https://brushedtype.co/doppler/\">Doppler\u003C/a>, for both iPhone and Mac. I’ve been trying it out, and it’s been a pretty solid experience so far. It’s a simpler app, but I think that works to its benefit. Getting music from the Mac to the iPhone using Doppler isn’t as seamless as, say, getting music from iTunes to an iPod back in the day. It’s for sure a more manual process. But it works, and can even be done wirelessly.\u003C/p>\n\u003Cp>It sort of reminds me of loading music onto my first MP3 player back in like 2004, and I don’t think I hate it. There’s a certain charm to it, and I think it makes the whole process feel more intentional. Not quite putting on a vinyl record, or even a CD, but it adds a bit of soul to an otherwise cold and mechanical process. I think that was lost in the age of the smartphone, and even moreso since streaming really took hold.\u003C/p>\n\u003Cp>Am I romanticizing it a bit? Probably. On the other hand though, I might have a total breakdown, and buy an iPod Classic on eBay. Whatever happens though, I think I’m sticking with owning my music, and taking back control over how it’s organized, for the foreseeable future.\u003C/p>",{"headings":600,"localImagePaths":610,"remoteImagePaths":611,"frontmatter":612,"imagePaths":615},[601,604,607],{"depth":348,"slug":602,"text":603},"the-final-straw","The Final Straw",{"depth":348,"slug":605,"text":606},"libera-musica","Libera Musica",{"depth":348,"slug":608,"text":609},"8000-songs-in-my-pocket","8,000 Songs In My Pocket",[],[],{"title":590,"pubDate":613,"tags":614},"1/3/2026",[593,39,115],[],"2026/notes-on-last-fm",{"id":616,"data":618,"body":622,"filePath":623,"digest":624,"rendered":625},{"title":619,"pubDate":620,"tags":621},"Notes on Last.fm",["Date","2026-01-17T05:00:00.000Z"],[593],"After [freeing my music library](/blog/2026/setting-my-music-free), I knew the one thing I would miss from Apple Music was the discovery aspect. It was very easy to just open the music app and browse suggestions for new music to check out, or releases from artists I enjoy that maybe I haven’t heard yet.\n\nI’ve been using [Doppler](https://brushedtype.co/doppler/) on my Mac and iPhone to manage and listen to my library, and while poking around the settings I discovered [Last.fm](https://www.last.fm) integration. What a throwback!\n\nI signed up for an account – my old account is either connected to an email I no longer have access to, or long since deleted – and started “scrobbling\".\n\nOver the last week-and-a-half, I’ve listened to 668 different songs from 120 artists across 186 albums, and it’s been fun seeing some of the suggestions that have come from that. It’s been a good mix of stuff I have in my library but haven’t listened to in a while, and new music I probably never would have found otherwise.","src/content/blog/2026/notes-on-last-fm.md","851497889b7d2c9d",{"html":626,"metadata":627},"\u003Cp>After \u003Ca href=\"/blog/2026/setting-my-music-free\">freeing my music library\u003C/a>, I knew the one thing I would miss from Apple Music was the discovery aspect. It was very easy to just open the music app and browse suggestions for new music to check out, or releases from artists I enjoy that maybe I haven’t heard yet.\u003C/p>\n\u003Cp>I’ve been using \u003Ca href=\"https://brushedtype.co/doppler/\">Doppler\u003C/a> on my Mac and iPhone to manage and listen to my library, and while poking around the settings I discovered \u003Ca href=\"https://www.last.fm\">Last.fm\u003C/a> integration. What a throwback!\u003C/p>\n\u003Cp>I signed up for an account – my old account is either connected to an email I no longer have access to, or long since deleted – and started “scrobbling”.\u003C/p>\n\u003Cp>Over the last week-and-a-half, I’ve listened to 668 different songs from 120 artists across 186 albums, and it’s been fun seeing some of the suggestions that have come from that. It’s been a good mix of stuff I have in my library but haven’t listened to in a while, and new music I probably never would have found otherwise.\u003C/p>",{"headings":628,"localImagePaths":629,"remoteImagePaths":630,"frontmatter":631,"imagePaths":634},[],[],[],{"title":619,"pubDate":632,"tags":633},"1/17/2026",[593],[],"2023/using-tailwind-with-mui-base",{"id":635,"data":637,"body":642,"filePath":643,"digest":644,"rendered":645},{"title":638,"pubDate":639,"tags":640},"Using Tailwind With MUI Base",["Date","2023-03-11T05:00:00.000Z"],[17,641],"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":646,"metadata":647},"\u003Cp>I’ve 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. Here’s 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 that’s what I’ll be using. If you use NPM though the commands are similar so you’ll 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 that’s 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 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 \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 we’re ready to do some setup.\u003C/p>\n\u003Ch2 id=\"step-3-configuration\">Step 3: Configuration\u003C/h2>\n\u003Cp>First 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 \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 won’t 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 that’s it! We’re 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, 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’.\u003C/p>\n\u003Cp>First, we should delete everything we don’t 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>We’re 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’). 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!\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, 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 \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 you’re not familiar with any of what I’ve written about here.\u003C/p>",{"headings":648,"localImagePaths":664,"remoteImagePaths":665,"frontmatter":666,"imagePaths":669},[649,652,655,658,661],{"depth":348,"slug":650,"text":651},"step-1-set-up-nextjs","Step 1: Set Up Next.js",{"depth":348,"slug":653,"text":654},"step-2-install-mui-base--tailwind","Step 2: Install MUI Base & Tailwind",{"depth":348,"slug":656,"text":657},"step-3-configuration","Step 3: Configuration",{"depth":348,"slug":659,"text":660},"step-4-creating-your-first-component","Step 4: Creating Your First Component",{"depth":348,"slug":662,"text":663},"step-5-further-reading","Step 5: Further Reading",[],[],{"title":638,"pubDate":667,"tags":668},"3/11/23",[17,641],[],"2026/my-favorite-things-of-2025",{"id":670,"data":672,"body":676,"filePath":677,"assetImports":678,"digest":680,"rendered":681},{"title":673,"pubDate":674,"tags":675},"My Favoite Things of 2025",["Date","2026-01-02T05:00:00.000Z"],[38,198],"We're already a couple days into 2026, but due to family obligations, as well as getting far too absorbed into Ghost of Yōtei – mostly the latter, if I'm honest – I'm only getting around to doing this post now. \n\n2025 was a stressful year. On a personal level, I lost my job and have been scrambling to find one for over 6 months now. More importantly though, it's just felt like the world has been constantly on fire, and AI has been quickly turning everything good about the human experience into souless slop. That being said, it's not all bad, and I wanted to reflect on my favorite things/moments in 2025.\n\nI won't be talking any video games, as I [already covered that](/blog/2025/my-top-3-games-of-2025).\n\n## Catching Up On Movies\n\nOne positive that came from me losing my job was that I finally had the desire to watch movies again. Seeing as my job involved me being in front of a screen for 8 hours, I was very selective about how I spent my screen time outside of work, and that time primarily went to gaming. But over the last 6 months I've watched more movies than I had in a long time. These are some of my favorites:\n\n- The Batman\n- Kiki's Delivery Service\n- The Life of Chuck\n- Edge of Tomorrow\n\nThough only one is from 2025 (The Life of Chuck), these are all movies I watched for the first time last year.\n\n## Taskmaster Series 19 - 20\n\nOn the topic of watching things, 2025 saw 2 new ~~seasons~~ series of Taskmaster, and they both had some of my favorite lineups in the show.\n\nAs if that wasn't enough, we also got the 4th Champion of Champions, where the previous 5 winners compete against eachother. While it wasn't the strongest in terms of the actual tasks, the lineup made it work. Even Sam Campbell, who's brand of humor generally wasn't really to my taste in series 16, got a few chuckles out of me. \n\n\n\n## Music\n\n2025 wasn't a huge year for me in terms of music, but there were a couple albums that stood out for me. \n\nFirst, Ego Death At A Bachelorette Party from Hayley Williams was a standout as my most played album released this year, and might actually be my most played overall. Some standout tracks to me are \"Kill Me\", \"Mirtazapine\", and \"True Believer\".\n\nSecond, the soundtrack to Clair Obscur: Expedition 33[^1] is some of the most beautiful game music I've heard. It's up there with Journey, Nier Replicant, and The Witcher 3 for me. Like many others, I'm obsessed with the track \"Lumière\". But, another standout for me is \"Flying Waters - Rain From The Ground\", which brings in a synth track which sounds like a terrible idea on paper, but just adds to the odd atmosphere of the game.\n\nThe end of 2025 also saw the beginnings of my project to liberate my music library, and give up streaming altogether – much to the chagrin of my Mastodon followers, who have been bombarded with my grievences on the horrors of Apple Music.\n\n## The Lord of the Rings: Fate of the Fellowship\n\nI've played a lot of different board games in 2025, but the new release from the past year that I enjoyed the most was The Lord of the Rings: Fate of the Fellowship. It's yet another game designed around the core mechanics of Pandemic, but it introduced enough to make if feel distinct, but not overbloated (looking at you, World of Warcraft: Wrath of the Litch King).\n\nI tend to not enjoy board games based on existing IPs but, being a huge fan of The Lord of the Rings, I had to give it a shot, and I'm glad I did. \n\n## Learning New Stuff\n\nLast year was a year of learning for me, right from the get-go. In January I created an app called AutoDock, which involved me diving deeper into Mac development than I have in previous years, diving into system APIs to detect display changes - mainly resolution changes, and external displays getting connected/disconnected.\n\nI also expanded my horizons in the world of web development. I've primarily been a React developer, and, though I was aware of other frameworks, I never had the time or motivation to dive into them. But over the last 6 months I got up to speed with SolidJS and Svelte, and I've got pretty comfortable using them.\n\nIn addition to all that, I learned the basics of other languages: Rust, Go, and Ruby. While I wouldn't say I gained proficiency in any of those languages, I did gain a better understanding of things like memory management, and I think I'm going into 2026 a much better programmer than I was a year ago.\n\nI also learned how to play croquet over the Summer, though I clearly need a lot of practice if I ever want to be moderately okay at it.\n\n[^1]: I said I wouldn't be talking about _video games_. I said nothing about _video game soundtracks_. 😜","src/content/blog/2026/my-favorite-things-of-2025.md",[679],"src/assets/blog/gifs/destroy-taskmaster.gif","f15536db50f8ccaf",{"html":682,"metadata":683},"\u003Cp>We’re already a couple days into 2026, but due to family obligations, as well as getting far too absorbed into Ghost of Yōtei – mostly the latter, if I’m honest – I’m only getting around to doing this post now.\u003C/p>\n\u003Cp>2025 was a stressful year. On a personal level, I lost my job and have been scrambling to find one for over 6 months now. More importantly though, it’s just felt like the world has been constantly on fire, and AI has been quickly turning everything good about the human experience into souless slop. That being said, it’s not all bad, and I wanted to reflect on my favorite things/moments in 2025.\u003C/p>\n\u003Cp>I won’t be talking any video games, as I \u003Ca href=\"/blog/2025/my-top-3-games-of-2025\">already covered that\u003C/a>.\u003C/p>\n\u003Ch2 id=\"catching-up-on-movies\">Catching Up On Movies\u003C/h2>\n\u003Cp>One positive that came from me losing my job was that I finally had the desire to watch movies again. Seeing as my job involved me being in front of a screen for 8 hours, I was very selective about how I spent my screen time outside of work, and that time primarily went to gaming. But over the last 6 months I’ve watched more movies than I had in a long time. These are some of my favorites:\u003C/p>\n\u003Cul>\n\u003Cli>The Batman\u003C/li>\n\u003Cli>Kiki’s Delivery Service\u003C/li>\n\u003Cli>The Life of Chuck\u003C/li>\n\u003Cli>Edge of Tomorrow\u003C/li>\n\u003C/ul>\n\u003Cp>Though only one is from 2025 (The Life of Chuck), these are all movies I watched for the first time last year.\u003C/p>\n\u003Ch2 id=\"taskmaster-series-19---20\">Taskmaster Series 19 - 20\u003C/h2>\n\u003Cp>On the topic of watching things, 2025 saw 2 new \u003Cdel>seasons\u003C/del> series of Taskmaster, and they both had some of my favorite lineups in the show.\u003C/p>\n\u003Cp>As if that wasn’t enough, we also got the 4th Champion of Champions, where the previous 5 winners compete against eachother. While it wasn’t the strongest in terms of the actual tasks, the lineup made it work. Even Sam Campbell, who’s brand of humor generally wasn’t really to my taste in series 16, got a few chuckles out of me.\u003C/p>\n\u003Cp>\u003Cimg __ASTRO_IMAGE_=\"{"src":"src/assets/blog/gifs/destroy-taskmaster.gif","alt":"","index":0}\">\u003C/p>\n\u003Ch2 id=\"music\">Music\u003C/h2>\n\u003Cp>2025 wasn’t a huge year for me in terms of music, but there were a couple albums that stood out for me.\u003C/p>\n\u003Cp>First, Ego Death At A Bachelorette Party from Hayley Williams was a standout as my most played album released this year, and might actually be my most played overall. Some standout tracks to me are “Kill Me”, “Mirtazapine”, and “True Believer”.\u003C/p>\n\u003Cp>Second, the soundtrack to Clair Obscur: Expedition 33\u003Csup>\u003Ca href=\"#user-content-fn-1\" id=\"user-content-fnref-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1\u003C/a>\u003C/sup> is some of the most beautiful game music I’ve heard. It’s up there with Journey, Nier Replicant, and The Witcher 3 for me. Like many others, I’m obsessed with the track “Lumière”. But, another standout for me is “Flying Waters - Rain From The Ground”, which brings in a synth track which sounds like a terrible idea on paper, but just adds to the odd atmosphere of the game.\u003C/p>\n\u003Cp>The end of 2025 also saw the beginnings of my project to liberate my music library, and give up streaming altogether – much to the chagrin of my Mastodon followers, who have been bombarded with my grievences on the horrors of Apple Music.\u003C/p>\n\u003Ch2 id=\"the-lord-of-the-rings-fate-of-the-fellowship\">The Lord of the Rings: Fate of the Fellowship\u003C/h2>\n\u003Cp>I’ve played a lot of different board games in 2025, but the new release from the past year that I enjoyed the most was The Lord of the Rings: Fate of the Fellowship. It’s yet another game designed around the core mechanics of Pandemic, but it introduced enough to make if feel distinct, but not overbloated (looking at you, World of Warcraft: Wrath of the Litch King).\u003C/p>\n\u003Cp>I tend to not enjoy board games based on existing IPs but, being a huge fan of The Lord of the Rings, I had to give it a shot, and I’m glad I did.\u003C/p>\n\u003Ch2 id=\"learning-new-stuff\">Learning New Stuff\u003C/h2>\n\u003Cp>Last year was a year of learning for me, right from the get-go. In January I created an app called AutoDock, which involved me diving deeper into Mac development than I have in previous years, diving into system APIs to detect display changes - mainly resolution changes, and external displays getting connected/disconnected.\u003C/p>\n\u003Cp>I also expanded my horizons in the world of web development. I’ve primarily been a React developer, and, though I was aware of other frameworks, I never had the time or motivation to dive into them. But over the last 6 months I got up to speed with SolidJS and Svelte, and I’ve got pretty comfortable using them.\u003C/p>\n\u003Cp>In addition to all that, I learned the basics of other languages: Rust, Go, and Ruby. While I wouldn’t say I gained proficiency in any of those languages, I did gain a better understanding of things like memory management, and I think I’m going into 2026 a much better programmer than I was a year ago.\u003C/p>\n\u003Cp>I also learned how to play croquet over the Summer, though I clearly need a lot of practice if I ever want to be moderately okay at 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>I said I wouldn’t be talking about \u003Cem>video games\u003C/em>. I said nothing about \u003Cem>video game soundtracks\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":684,"localImagePaths":700,"remoteImagePaths":701,"frontmatter":702,"imagePaths":705},[685,688,691,693,696,699],{"depth":348,"slug":686,"text":687},"catching-up-on-movies","Catching Up On Movies",{"depth":348,"slug":689,"text":690},"taskmaster-series-19---20","Taskmaster Series 19 - 20",{"depth":348,"slug":692,"text":593},"music",{"depth":348,"slug":694,"text":695},"the-lord-of-the-rings-fate-of-the-fellowship","The Lord of the Rings: Fate of the Fellowship",{"depth":348,"slug":697,"text":698},"learning-new-stuff","Learning New Stuff",{"depth":348,"slug":349,"text":350},[679],[],{"title":673,"pubDate":703,"tags":704},"1/2/2026",[38,198],[679],"2025/a-note-on-file-naming-conventions",{"id":706,"data":708,"body":712,"filePath":713,"digest":714,"rendered":715},{"title":709,"pubDate":710,"tags":711},"A Note On File Naming Conventions",["Date","2025-09-26T04:00:00.000Z"],[17],"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":716,"metadata":717},"\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 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.\u003C/p>\n\u003Cp>Recently though, while tinkering with my own little side-projects, I’ve started using \u003Ccode>kebab-case\u003C/code> 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\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/\">it’s 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, I’m \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":718,"localImagePaths":720,"remoteImagePaths":721,"frontmatter":722,"imagePaths":725},[719],{"depth":348,"slug":349,"text":350},[],[],{"title":709,"pubDate":723,"tags":724},"9/26/25",[17],[],"2025/being-your-own-online-curator",{"id":726,"data":728,"body":733,"filePath":734,"digest":735,"rendered":736},{"title":729,"pubDate":730,"tags":731},"Skip the Algorithm: Be Your Own Online Curator",["Date","2025-03-01T05:00:00.000Z"],[39,732,115],"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":737,"metadata":738},"\u003Cp>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.\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 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.\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 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.\u003C/p>\n\u003Cp>Not 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.\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 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.\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 that’s 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 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 🙂).\u003C/p>",{"headings":739,"localImagePaths":740,"remoteImagePaths":741,"frontmatter":742,"imagePaths":745},[],[],[],{"title":729,"pubDate":743,"tags":744},"3/1/25",[39,732,115],[],"2025/announcing-autodock",{"id":746,"data":748,"body":752,"filePath":753,"digest":754,"rendered":755},{"title":749,"pubDate":750,"tags":751},"Announcing AutoDock",["Date","2025-01-17T05:00:00.000Z"],[91,115,478],"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 off–though I've somewhat mitigated this by checking the Dock's current autohide status and only applying the changes if there's actually a change–but 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":756,"metadata":757},"\u003Cp>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.\u003C/p>\n\u003Cp>While 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.\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 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.\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>It’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 off–though I’ve somewhat mitigated this by checking the Dock’s current autohide status and only applying the changes if there’s actually a change–but I’m not sure that’s 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 don’t think that’s very likely.\u003C/p>\n\u003Cp>If the app sounds useful to you, and you’d 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":758,"localImagePaths":759,"remoteImagePaths":760,"frontmatter":761,"imagePaths":764},[],[],[],{"title":749,"pubDate":762,"tags":763},"1/17/25",[91,115,478],[],"2025/building-a-mac-app-without-xcode-part-1",{"id":765,"data":767,"body":771,"filePath":772,"digest":773,"rendered":774},{"title":768,"pubDate":769,"tags":770},"Building a Mac App Without Xcode - Part 1",["Date","2025-12-01T05:00:00.000Z"],[61,91,478],"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, I’ve 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 BBEdit’s ‘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\n~~However, I found it to be a tad slow, so~~[^1] I opted for the lazy route and just installed [Zed’s 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 (don’t 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 application’s Info.plist, such as setting `LSUIElement` to `true` for hiding the app’s 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 app’s accent color, which I can define elsewhere.\n\n_In the [next part](/blog/2025/building-a-mac-app-without-xcode-part-2), I tackle code signing and notarization._\n\n[^1]: I have since discovered the slowness was user error, due to a setting in BBEdit that delayed completion suggestions for longer than I was used to.","src/content/blog/2025/building-a-mac-app-without-xcode-part-1.md","cca7afae71f619b8",{"html":775,"metadata":776},"\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, I’ve 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 BBEdit’s ‘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>\u003Cdel>However, I found it to be a tad slow, so\u003C/del>\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 opted for the lazy route and just installed \u003Ca href=\"https://github.com/zed-extensions/swift\">Zed’s 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 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 \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 (don’t 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 application’s Info.plist, such as setting \u003Ccode>LSUIElement\u003C/code> to \u003Ccode>true\u003C/code> for hiding the app’s 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 app’s accent color, which I can define elsewhere.\u003C/p>\n\u003Cp>\u003Cem>In the \u003Ca href=\"/blog/2025/building-a-mac-app-without-xcode-part-2\">next part\u003C/a>, I tackle code signing and notarization.\u003C/em>\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 have since discovered the slowness was user error, due to a setting in BBEdit that delayed completion suggestions for longer than I was used to. \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":777,"localImagePaths":785,"remoteImagePaths":786,"frontmatter":787,"imagePaths":790},[778,781,784],{"depth":348,"slug":779,"text":780},"setting-up-the-swift-language-server","Setting Up the Swift Language Server",{"depth":348,"slug":782,"text":783},"building-the-application-bundle","Building the Application Bundle",{"depth":348,"slug":349,"text":350},[],[],{"title":768,"pubDate":788,"tags":789},"12/1/25",[61,91,478],[],"2025/building-a-mac-app-without-xcode-part-2",{"id":791,"data":793,"body":797,"filePath":798,"digest":799,"rendered":800},{"title":794,"pubDate":795,"tags":796},"Building a Mac App Without Xcode - Part 2",["Date","2025-12-04T05:00:00.000Z"],[61,91,478],"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 build 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, I’ve decided to split it up into multiple parts. The [previous part](/blog/2025/building-a-mac-app-without-xcode-part-1) focused on LSP support, and building the application bundle. This part will focus on code signing, and uploading the application bundle to Apple for notarization so it can be distributed.\n\n## Code Signing\n\nIf you’re going to be distributing your app, it’s important to have it signed and notarized for the security of your app and its users. This process adds a digital certificate to your app that becomes invalidated if your app is ever modified by, for example, a malicious actor. It also can be revoked by Apple if you’re found to be distributing malware, which you, if you’re not a scumbag, won’t have to worry about. 🙂\n\nThis, I thought, was going to be the most annoying part of working outside of Xcode. Apple does provide `codesign` and `notarytool` as part of the Xcode CLI Tools, but I just assumed using them would be a headache.\n\nIn order to sign an application, you need a certificate and, due to me not really knowing what I was doing, this was where I ran into trouble. I tried using my Apple Distribution certificate, which made intuitive sense to me at the time, and I didn’t run into any issues at first. I didn’t run into any errors, and verifying the signature showed everything as a-okay. So I continued...\n\n## Notarization\n\nFor notarization, you have to use `notarytool` to upload either a ZIP file or a DMG disk image containing your application to Apple. I opted to go with a disk image, mainly because that was the method that was being used in the various Stack Overflow threads I came across. So, I created the disk image (I opted to use [create-dmg](https://github.com/create-dmg/create-dmg) to automate the process), and uploaded it to Apple. After a few moments, I received a response that my app was invalid.\n\nI reached out for help on Mastodon, and [Dmitry Rodionov](https://mastodon.social/@rodionovd), a developer at [Sketch](https://www.sketch.com/), was kind enough to point me in the right direction. Turns out, the Apple Distribution certificate I was using not what I should be using, what I needed to to was create a Developer ID Application certificate – which was the only part of this whole process I used Xcode for - and use that instead.\n\nI also want to shout out [David Bureš](https://mstdn.social/@davidbures), developer of [Cork]() – a must-have app if you use Homebrew – who’s response to my initial post asking for help is, I believe, how Dmitry found me. (I could be wrong, I just don’t want to leave anybody out 🙂)\n\nSo, I re-signed my application, created a new disk image, and uploaded that to be notarized by Apple, and just a few moments later I got a successful!\n\n## Final Thoughts\n\nDespite the challenges and quirks with trying to create Mac apps outside of Xcode, I think this is the process I’m sticking with going forward. The freedom to use the kinds of tools I’m more comfortable with is worth the drawbacks for me.\n\nHowever, if I weren’t simply developing Mac apps as a hobby, and I didn’t enjoy the act of tinkering, I might be looking at those drawbacks very differently. It would be interesting to explore ways the developer experience can be improved, but that will have to be a project for another time.\n\nFinally, for those who are interested in digging more into how I got this all to work, and perhaps follow my crazy example, I’ve created a [template repo on GitHub](https://github.com/ghall89/mac-app-template) you can check out.","src/content/blog/2025/building-a-mac-app-without-xcode-part-2.md","3c9eb28cb7bc16f4",{"html":801,"metadata":802},"\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 build 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, I’ve decided to split it up into multiple parts. The \u003Ca href=\"/blog/2025/building-a-mac-app-without-xcode-part-1\">previous part\u003C/a> focused on LSP support, and building the application bundle. This part will focus on code signing, and uploading the application bundle to Apple for notarization so it can be distributed.\u003C/p>\n\u003Ch2 id=\"code-signing\">Code Signing\u003C/h2>\n\u003Cp>If you’re going to be distributing your app, it’s important to have it signed and notarized for the security of your app and its users. This process adds a digital certificate to your app that becomes invalidated if your app is ever modified by, for example, a malicious actor. It also can be revoked by Apple if you’re found to be distributing malware, which you, if you’re not a scumbag, won’t have to worry about. 🙂\u003C/p>\n\u003Cp>This, I thought, was going to be the most annoying part of working outside of Xcode. Apple does provide \u003Ccode>codesign\u003C/code> and \u003Ccode>notarytool\u003C/code> as part of the Xcode CLI Tools, but I just assumed using them would be a headache.\u003C/p>\n\u003Cp>In order to sign an application, you need a certificate and, due to me not really knowing what I was doing, this was where I ran into trouble. I tried using my Apple Distribution certificate, which made intuitive sense to me at the time, and I didn’t run into any issues at first. I didn’t run into any errors, and verifying the signature showed everything as a-okay. So I continued…\u003C/p>\n\u003Ch2 id=\"notarization\">Notarization\u003C/h2>\n\u003Cp>For notarization, you have to use \u003Ccode>notarytool\u003C/code> to upload either a ZIP file or a DMG disk image containing your application to Apple. I opted to go with a disk image, mainly because that was the method that was being used in the various Stack Overflow threads I came across. So, I created the disk image (I opted to use \u003Ca href=\"https://github.com/create-dmg/create-dmg\">create-dmg\u003C/a> to automate the process), and uploaded it to Apple. After a few moments, I received a response that my app was invalid.\u003C/p>\n\u003Cp>I reached out for help on Mastodon, and \u003Ca href=\"https://mastodon.social/@rodionovd\">Dmitry Rodionov\u003C/a>, a developer at \u003Ca href=\"https://www.sketch.com/\">Sketch\u003C/a>, was kind enough to point me in the right direction. Turns out, the Apple Distribution certificate I was using not what I should be using, what I needed to to was create a Developer ID Application certificate – which was the only part of this whole process I used Xcode for - and use that instead.\u003C/p>\n\u003Cp>I also want to shout out \u003Ca href=\"https://mstdn.social/@davidbures\">David Bureš\u003C/a>, developer of \u003Ca href=\"\">Cork\u003C/a> – a must-have app if you use Homebrew – who’s response to my initial post asking for help is, I believe, how Dmitry found me. (I could be wrong, I just don’t want to leave anybody out 🙂)\u003C/p>\n\u003Cp>So, I re-signed my application, created a new disk image, and uploaded that to be notarized by Apple, and just a few moments later I got a successful!\u003C/p>\n\u003Ch2 id=\"final-thoughts\">Final Thoughts\u003C/h2>\n\u003Cp>Despite the challenges and quirks with trying to create Mac apps outside of Xcode, I think this is the process I’m sticking with going forward. The freedom to use the kinds of tools I’m more comfortable with is worth the drawbacks for me.\u003C/p>\n\u003Cp>However, if I weren’t simply developing Mac apps as a hobby, and I didn’t enjoy the act of tinkering, I might be looking at those drawbacks very differently. It would be interesting to explore ways the developer experience can be improved, but that will have to be a project for another time.\u003C/p>\n\u003Cp>Finally, for those who are interested in digging more into how I got this all to work, and perhaps follow my crazy example, I’ve created a \u003Ca href=\"https://github.com/ghall89/mac-app-template\">template repo on GitHub\u003C/a> you can check out.\u003C/p>",{"headings":803,"localImagePaths":813,"remoteImagePaths":814,"frontmatter":815,"imagePaths":818},[804,807,810],{"depth":348,"slug":805,"text":806},"code-signing","Code Signing",{"depth":348,"slug":808,"text":809},"notarization","Notarization",{"depth":348,"slug":811,"text":812},"final-thoughts","Final Thoughts",[],[],{"title":794,"pubDate":816,"tags":817},"12/4/25",[61,91,478],[],"2025/intentional-analog-time",{"id":819,"data":821,"body":825,"filePath":826,"digest":827,"rendered":828},{"title":822,"pubDate":823,"tags":824},"Intentional Analog Time",["Date","2025-09-19T04:00:00.000Z"],[38,18],"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":829,"metadata":830},"\u003Cp>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.\u003C/p>\n\u003Cp>Without 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.\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>It’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.\u003C/p>\n\u003Cp>I’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.\u003C/p>",{"headings":831,"localImagePaths":832,"remoteImagePaths":833,"frontmatter":834,"imagePaths":837},[],[],[],{"title":822,"pubDate":835,"tags":836},"09/19/2025",[38,18],[],"2025/default-apps-2025",{"id":838,"data":840,"body":844,"filePath":845,"digest":846,"rendered":847},{"title":841,"pubDate":842,"tags":843},"Default Apps 2025",["Date","2025-12-18T05:00:00.000Z"],[115,39],"An updated version of [this post](/posts/2024/default-apps-2024) from 2024, 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: [Fastmail](https://www.fastmail.com/)\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 Editing: [Affinity](https://www.affinity.studio/)\n\n📆 Calendar: [Calendar.app](https://support.apple.com/guide/calendar/welcome/mac)\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: [Zen](https://zen-browser.app/)\n\n💬 Chat: [Messages](https://support.apple.com/guide/messages/welcome/mac), [Discord](https://discord.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/)\n\n📺 Terminal: [Ghostty](https://ghostty.org/)\n\n🐘 Mastodon Client: [Ivory](https://tapbots.com/ivory/)","src/content/blog/2025/default-apps-2025.md","151ee4514fee107b",{"html":848,"metadata":849},"\u003Cp>An updated version of \u003Ca href=\"/posts/2024/default-apps-2024\">this post\u003C/a> from 2024, 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.fastmail.com/\">Fastmail\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 Editing: \u003Ca href=\"https://www.affinity.studio/\">Affinity\u003C/a>\u003C/p>\n\u003Cp>📆 Calendar: \u003Ca href=\"https://support.apple.com/guide/calendar/welcome/mac\">Calendar.app\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://zen-browser.app/\">Zen\u003C/a>\u003C/p>\n\u003Cp>💬 Chat: \u003Ca href=\"https://support.apple.com/guide/messages/welcome/mac\">Messages\u003C/a>, \u003Ca href=\"https://discord.com/\">Discord\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>\u003C/p>\n\u003Cp>📺 Terminal: \u003Ca href=\"https://ghostty.org/\">Ghostty\u003C/a>\u003C/p>\n\u003Cp>🐘 Mastodon Client: \u003Ca href=\"https://tapbots.com/ivory/\">Ivory\u003C/a>\u003C/p>",{"headings":850,"localImagePaths":851,"remoteImagePaths":852,"frontmatter":853,"imagePaths":856},[],[],[],{"title":841,"pubDate":854,"tags":855},"12/18/25",[115,39],[],"2025/getting-laid-off-and-the-state-of-tech",{"id":857,"data":859,"body":863,"filePath":864,"digest":865,"rendered":866},{"title":860,"pubDate":861,"tags":862},"On Getting Laid Off, and the State of Tech",["Date","2025-07-11T04:00:00.000Z"],[39,38],"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":867,"metadata":868},"\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 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.\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. 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.\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 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.\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 people’s ugly pamphlets designed in PowerPoint (sorry, not sorry 🫢).\u003C/p>\n\u003Cp>But, 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.\u003C/p>",{"headings":869,"localImagePaths":870,"remoteImagePaths":871,"frontmatter":872,"imagePaths":875},[],[],[],{"title":860,"pubDate":873,"tags":874},"7/11/25",[39,38],[],"2025/creating-my-perfect-smartphone",{"id":876,"data":878,"body":882,"filePath":883,"digest":884,"rendered":885},{"title":879,"pubDate":880,"tags":881},"Creating My Perfect Smartphone",["Date","2025-11-14T05:00:00.000Z"],[39,732],"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":886,"metadata":887},"\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, 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.\u003C/p>\n\u003Cp>I’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.\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 I’m at my computer, so I’m 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. It’s going to take a combination of experimentation and re-training my brain, but I think it can be done.\u003C/p>",{"headings":888,"localImagePaths":889,"remoteImagePaths":890,"frontmatter":891,"imagePaths":894},[],[],[],{"title":879,"pubDate":892,"tags":893},"11/14/25",[39,732],[],"2025/knarr-a-pretty-cool-game",{"id":895,"data":897,"body":901,"filePath":902,"digest":903,"rendered":904},{"title":898,"pubDate":899,"tags":900},"Knarr is a Pretty Cool Board Game",["Date","2025-05-11T04:00:00.000Z"],[169],"My latest board gaming obsession is quite an unlikely one for me. I’m not particularly fond of the viking aesthetic in general, and, while I don’t dislike engine-builder games, they’re not generally the type of game I’d 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\nThat’s 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 I’ve played, once you fall too far behind you don’t have a prayer of winning, but, at least in the games I’ve played, even the player lagging behind the most can catch up with a good turn or two. Just about every game I’ve 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, that’s the mark of a truly fun and engaging game.","src/content/blog/2025/knarr-a-pretty-cool-game.md","7c45d4ed13f50a3d",{"html":905,"metadata":906},"\u003Cp>My latest board gaming obsession is quite an unlikely one for me. I’m not particularly fond of the viking aesthetic in general, and, while I don’t dislike engine-builder games, they’re not generally the type of game I’d 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>That’s 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 I’ve played, once you fall too far behind you don’t have a prayer of winning, but, at least in the games I’ve played, even the player lagging behind the most can catch up with a good turn or two. Just about every game I’ve 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, that’s the mark of a truly fun and engaging game.\u003C/p>",{"headings":907,"localImagePaths":908,"remoteImagePaths":909,"frontmatter":910,"imagePaths":913},[],[],[],{"title":898,"pubDate":911,"tags":912},"5/11/25",[169],[],"2025/my-top-20-switch-games",{"id":914,"data":916,"body":920,"filePath":921,"digest":922,"rendered":923},{"title":917,"pubDate":918,"tags":919},"My Top 20 Nintendo Switch Games",["Date","2025-03-07T05:00:00.000Z"],[169],"It’s crazy that the Nintendo Switch has been around for 8 years now. While I didn’t get the Switch until about a year after it released, I think it just might be the console that I’ve 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, I’m not sure I’m ready to move on.\n\nThe Switch is also the console I’ve 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 I’m 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 haven’t played them or they weren’t as personally meaningful to me.\n\nAlso, I listed them in alphabetical order partly because I couldn’t 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- Assassin’s Creed: The Ezio Collection\n- Bayonetta\n- Final Fantasy IV Pixel Remaster\n- The Legend of Zelda: Link’s 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":924,"metadata":925},"\u003Cp>It’s crazy that the Nintendo Switch has been around for 8 years now. While I didn’t get the Switch until about a year after it released, I think it just might be the console that I’ve 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, I’m not sure I’m ready to move on.\u003C/p>\n\u003Cp>The Switch is also the console I’ve 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 I’m 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 haven’t played them or they weren’t as personally meaningful to me.\u003C/p>\n\u003Cp>Also, I listed them in alphabetical order partly because I couldn’t 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>Assassin’s 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: Link’s 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":926,"localImagePaths":927,"remoteImagePaths":928,"frontmatter":929,"imagePaths":932},[],[],[],{"title":917,"pubDate":930,"tags":931},"3/7/25",[169],[],"2025/my-favorite-analog-tech",{"id":933,"data":935,"body":939,"filePath":940,"digest":941,"rendered":942},{"title":936,"pubDate":937,"tags":938},"My Favorite Analog Tech",["Date","2025-10-16T04:00:00.000Z"],[39],"I’m a bit of a tech nerd, so it’s no surprise that I love my gadgets. While it is fun to talk about my computer setup, or how I use my smartphone, it’s not something I particularly enjoy writing about, unless I feel like I have something interesting to share, or I’m 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 aren’t 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. I’m 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 don’t think I can ever go back. They’re so fast, and you don’t 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, there’s 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 it’s 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\nI’ve historically eaten less fruit due to some digestive issues, which I won’t 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 don’t know what it is about it, but it’s 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, I’ve found cleaning to be much more agreeable when I’m sweeping the floor, and then, when I’m 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":943,"metadata":944},"\u003Cp>I’m a bit of a tech nerd, so it’s no surprise that I love my gadgets. While it is fun to talk about my computer setup, or how I use my smartphone, it’s not something I particularly enjoy writing about, unless I feel like I have something interesting to share, or I’m 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 aren’t 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. I’m 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 don’t think I can ever go back. They’re so fast, and you don’t 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, there’s 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 it’s 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>I’ve historically eaten less fruit due to some digestive issues, which I won’t 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 don’t know what it is about it, but it’s 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, I’ve found cleaning to be much more agreeable when I’m sweeping the floor, and then, when I’m 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":945,"localImagePaths":959,"remoteImagePaths":960,"frontmatter":961,"imagePaths":964},[946,949,952,955,958],{"depth":348,"slug":947,"text":948},"electric-kettle","Electric Kettle",{"depth":348,"slug":950,"text":951},"record-player","Record Player",{"depth":348,"slug":953,"text":954},"smoothie-blender","Smoothie Blender",{"depth":348,"slug":956,"text":957},"handheld-vacuum","Handheld Vacuum",{"depth":348,"slug":349,"text":350},[],[],{"title":936,"pubDate":962,"tags":963},"10/16/2025",[39],[],"2025/music-blog-challenge",{"id":965,"data":967,"body":972,"filePath":973,"digest":974,"rendered":975},{"title":968,"pubDate":969,"tags":970},"Blog Questions Challenge: Music Edition",["Date","2025-02-07T05:00:00.000Z"],[593,971],"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## What’s 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## What’s 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":976,"metadata":977},"\u003Cp>For my very first Blog Question Challenge, I’ve 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 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.\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, I’m 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 that’s 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 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.\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 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.\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 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.\u003C/p>\n\u003Ch2 id=\"whats-a-song-or-album-you-enjoy-that-you-wish-had-more-recognition\">What’s A Song Or Album You Enjoy That You Wish Had More Recognition?\u003C/h2>\n\u003Cp>I’m absolutely 100% biased here since I know the artist, but my pick is \u003Ca href=\"https://album.link/i/1598277466\">Here’s 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\">What’s Your Favorite Song Of All Time?\u003C/h2>\n\u003Cp>This 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.\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>I’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 🤷♂️).\u003C/p>\n\u003Cp>So, after much overthinking, those are my answers to these musical questions. Thanks again to Kyle for tagging me. I’m tagging \u003Ca href=\"https://blog.codemaclife.net\">Mark @ CodeMacLife\u003C/a>, good luck!\u003C/p>",{"headings":978,"localImagePaths":1009,"remoteImagePaths":1010,"frontmatter":1011,"imagePaths":1014},[979,982,985,988,991,994,997,1000,1003,1006],{"depth":348,"slug":980,"text":981},"what-are-5-of-your-favorite-albums","What Are 5 Of Your Favorite Albums?",{"depth":348,"slug":983,"text":984},"what-are-5-of-your-favorite-songs","What Are 5 Of Your Favorite Songs?",{"depth":348,"slug":986,"text":987},"favorite-instruments","Favorite Instrument(s)?",{"depth":348,"slug":989,"text":990},"what-song-or-album-are-you-currently-listening-to","What Song Or Album Are You Currently Listening To?",{"depth":348,"slug":992,"text":993},"do-you-listen-to-the-radio-and-if-so-how-often","Do You Listen To The Radio, And If So, How Often?",{"depth":348,"slug":995,"text":996},"how-often-do-you-listen-to-music","How Often Do You Listen To Music?",{"depth":348,"slug":998,"text":999},"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":348,"slug":1001,"text":1002},"whats-a-song-or-album-you-enjoy-that-you-wish-had-more-recognition","What’s A Song Or Album You Enjoy That You Wish Had More Recognition?",{"depth":348,"slug":1004,"text":1005},"whats-your-favorite-song-of-all-time","What’s Your Favorite Song Of All Time?",{"depth":348,"slug":1007,"text":1008},"has-your-taste-of-music-evolved-over-the-years","Has Your Taste Of Music Evolved Over The Years?",[],[],{"title":968,"pubDate":1012,"tags":1013},"2/7/25",[593,971],[],"2025/my-top-3-games-of-2025",{"id":1015,"data":1017,"body":1021,"filePath":1022,"digest":1023,"rendered":1024},{"title":1018,"pubDate":1019,"tags":1020},"My Top 3 Games of 2025",["Date","2025-12-20T00:00:00.000Z"],[169],"2025 has been a tough year Due to losing my job back in June, I haven’t spent nearly as much money on gaming as I have in past years. As such, I spent most of 2025 replaying old favorites, or finally finishing games that have been sitting in my backlog for ages.\n\nSo, my top 3 list this year is going to be very skewed towards early 2025, as the only post-June release I’ve even got to play was Hades II. So yes, from what I’ve seen, if I’d been able to pick up Ghost of Yōtei, it would have probably made this list.\n\n## Hades II\n\nI’m not a big rogue-like fan, but I did enjoy the original Hades back in 2020 (despite not actually finishing it), so I was very excited for the sequel. Unlike many rogue-likes that I've played, Hades has a very nice sense of progression, and Hades II expands on that in fun and interesting ways.\n\nIn my gaming journal, I had a hard time identifying what really grabbed me about this game that led me to actually finish it. But, upon further reflection, I think it's a combination of the more interesting progression system, and the fact that there were two paths to follow – a path down to Tarturus, and another up to Mount Olympus. This added enough gameplay variety that, when I was bored with o path, I'd just switch to trying to make progress in another.\n\nI also enjoyed the concrete goals, outside of the main objective of defeating Chronos, via \"prophecies\". It made me feel like I was accomplishing things even when failing runs, and they continue to keep me invested in playing even though I've finished the main story. \n\n## Clair Obscur: Expedition 33\n\nClair Obcur, in many ways, feels like the natural evolution Final Fantasy could have taken in another universe where they stuck with turn-based combat. Though visually, and in terms of story, it's very much its own thing. \n\nTo say this game has ruined turn-based JRPG style games for me is far from an understatement. Each party memeber not only has their own set of skills, they also have unique mechanics that make each feel very distinct, and makes combat strategy far more interesting than just picking a character's best skill for a given situation. Maelle is probably my favorite, with her stances that are applied by using certain moves – usually alongside some otehr condition – and apply different effects, like, \"Deal 50% more damage, but take 50% more damage\". \n\nI liked pretty much all the characters, which is a rarity for me. Generally there's one or two characters I cannot stand, but they're all so likable, and you come to care about all their stories, which makes a certain choice at the end of the game very heartbreaking. \n\nMy favorite character overall though is Esquie, who serves as this game's equivient of the classic Final Fantasy airship. He's sometimes sad, rad, or even bad. But never mad. \n\n## Xenoblade Chronicles X: Definitive Edition\n\nOk, this choice is a bit of a cheat, as this is a re-release of a game that I played when it originally launched on the Wii U back in 2015. But my other options for “games I played that released in 2025\" were Assassin’s Creed: Shadows and Lost Records: Bloom and Rage, neither of which I enjoyed as much.\n\nThe main draw for this game, unlike the other Xenoblade games, is not the main story. What I think makes this game so great is the focus on exploration and getting to know the characters, party members _and_ NPCs, through the various side quests on offer. It really makes you feel like you're all survivors on a dangerous alien planet, just trying to stay alive.\n\nMy only complaint is that the extra story content added in this new version of the game is pretty lackluster. Similar to the additional content in the remake of the original Xenoblade Chronicles that came out a few years ago, I just didn't find it all that compelling.","src/content/blog/2025/my-top-3-games-of-2025.md","b3ff3c0647cb6a69",{"html":1025,"metadata":1026},"\u003Cp>2025 has been a tough year Due to losing my job back in June, I haven’t spent nearly as much money on gaming as I have in past years. As such, I spent most of 2025 replaying old favorites, or finally finishing games that have been sitting in my backlog for ages.\u003C/p>\n\u003Cp>So, my top 3 list this year is going to be very skewed towards early 2025, as the only post-June release I’ve even got to play was Hades II. So yes, from what I’ve seen, if I’d been able to pick up Ghost of Yōtei, it would have probably made this list.\u003C/p>\n\u003Ch2 id=\"hades-ii\">Hades II\u003C/h2>\n\u003Cp>I’m not a big rogue-like fan, but I did enjoy the original Hades back in 2020 (despite not actually finishing it), so I was very excited for the sequel. Unlike many rogue-likes that I’ve played, Hades has a very nice sense of progression, and Hades II expands on that in fun and interesting ways.\u003C/p>\n\u003Cp>In my gaming journal, I had a hard time identifying what really grabbed me about this game that led me to actually finish it. But, upon further reflection, I think it’s a combination of the more interesting progression system, and the fact that there were two paths to follow – a path down to Tarturus, and another up to Mount Olympus. This added enough gameplay variety that, when I was bored with o path, I’d just switch to trying to make progress in another.\u003C/p>\n\u003Cp>I also enjoyed the concrete goals, outside of the main objective of defeating Chronos, via “prophecies”. It made me feel like I was accomplishing things even when failing runs, and they continue to keep me invested in playing even though I’ve finished the main story.\u003C/p>\n\u003Ch2 id=\"clair-obscur-expedition-33\">Clair Obscur: Expedition 33\u003C/h2>\n\u003Cp>Clair Obcur, in many ways, feels like the natural evolution Final Fantasy could have taken in another universe where they stuck with turn-based combat. Though visually, and in terms of story, it’s very much its own thing.\u003C/p>\n\u003Cp>To say this game has ruined turn-based JRPG style games for me is far from an understatement. Each party memeber not only has their own set of skills, they also have unique mechanics that make each feel very distinct, and makes combat strategy far more interesting than just picking a character’s best skill for a given situation. Maelle is probably my favorite, with her stances that are applied by using certain moves – usually alongside some otehr condition – and apply different effects, like, “Deal 50% more damage, but take 50% more damage”.\u003C/p>\n\u003Cp>I liked pretty much all the characters, which is a rarity for me. Generally there’s one or two characters I cannot stand, but they’re all so likable, and you come to care about all their stories, which makes a certain choice at the end of the game very heartbreaking.\u003C/p>\n\u003Cp>My favorite character overall though is Esquie, who serves as this game’s equivient of the classic Final Fantasy airship. He’s sometimes sad, rad, or even bad. But never mad.\u003C/p>\n\u003Ch2 id=\"xenoblade-chronicles-x-definitive-edition\">Xenoblade Chronicles X: Definitive Edition\u003C/h2>\n\u003Cp>Ok, this choice is a bit of a cheat, as this is a re-release of a game that I played when it originally launched on the Wii U back in 2015. But my other options for “games I played that released in 2025” were Assassin’s Creed: Shadows and Lost Records: Bloom and Rage, neither of which I enjoyed as much.\u003C/p>\n\u003Cp>The main draw for this game, unlike the other Xenoblade games, is not the main story. What I think makes this game so great is the focus on exploration and getting to know the characters, party members \u003Cem>and\u003C/em> NPCs, through the various side quests on offer. It really makes you feel like you’re all survivors on a dangerous alien planet, just trying to stay alive.\u003C/p>\n\u003Cp>My only complaint is that the extra story content added in this new version of the game is pretty lackluster. Similar to the additional content in the remake of the original Xenoblade Chronicles that came out a few years ago, I just didn’t find it all that compelling.\u003C/p>",{"headings":1027,"localImagePaths":1037,"remoteImagePaths":1038,"frontmatter":1039,"imagePaths":1042},[1028,1031,1034],{"depth":348,"slug":1029,"text":1030},"hades-ii","Hades II",{"depth":348,"slug":1032,"text":1033},"clair-obscur-expedition-33","Clair Obscur: Expedition 33",{"depth":348,"slug":1035,"text":1036},"xenoblade-chronicles-x-definitive-edition","Xenoblade Chronicles X: Definitive Edition",[],[],{"title":1018,"pubDate":1040,"tags":1041},"2025-12-20",[169],[],"2025/redoing-my-gaming-setup",{"id":1043,"data":1045,"body":1049,"filePath":1050,"digest":1051,"rendered":1052},{"title":1046,"pubDate":1047,"tags":1048},"Redoing My Gaming Setup",["Date","2025-04-13T04:00:00.000Z"],[169,39,38],"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":1053,"metadata":1054},"\u003Cp>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.\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 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).\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 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.\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 doesn’t always correctly pick up which console is powered on (maybe I just need to tinker with each console’s CEC config?).\u003C/p>\n\u003Cp>It’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. 🤢\u003C/p>\n\u003Cp>Another 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.\u003C/p>",{"headings":1055,"localImagePaths":1056,"remoteImagePaths":1057,"frontmatter":1058,"imagePaths":1061},[],[],[],{"title":1046,"pubDate":1059,"tags":1060},"4/13/2025",[169,39,38],[],"2025/ramblings-on-zen-browser",{"id":1062,"data":1064,"body":1068,"filePath":1069,"digest":1070,"rendered":1071},{"title":1065,"pubDate":1066,"tags":1067},"Ramblings on the Zen Browser",["Date","2025-05-30T04:00:00.000Z"],[39,115],"I’ve 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. It’s got its share of issues, but it’s 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\nThat’s not to say Zen doesn’t have its share of clunkiness at times, it’s definitely not as polished as Arc was. But it’s always improving, and, even at its clunkiest, it’s nowhere near as unpleasant as Vivaldi’s UX. But it works great 95% of the time, and that’s quite impressive for a relatively young open-source project that’s not backed by a big tech company.\n\nUnlike Arc, and indeed unlike most browsers these days, Zen doesn’t 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, it’s 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 – I’ll spare the lecture on why I believe Chromium has become far too ubiquitous.\n\nOn the web dev side, I’ve found the developer tools to be…fine. I’ve used the Firefox dev tools in the past, so I’m comfortable with them, and it didn’t take me long to adjust. While I much prefer the Chromium dev tools (which is about the only thing I _like_ about Chromium), I don’t find the Gecko dev tools that much worse. Which is more than I can say about Safari’s dev tools. 😬\n\nAnother major positive is battery life. I’d 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 won’t _actually_ last 11 hours, but that’s 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 DRM’d content online, specifically on streaming services (I’ve 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":1072,"metadata":1073},"\u003Cp>I’ve 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. It’s got its share of issues, but it’s 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>That’s not to say Zen doesn’t have its share of clunkiness at times, it’s definitely not as polished as Arc was. But it’s always improving, and, even at its clunkiest, it’s nowhere near as unpleasant as Vivaldi’s UX. But it works great 95% of the time, and that’s quite impressive for a relatively young open-source project that’s not backed by a big tech company.\u003C/p>\n\u003Cp>Unlike Arc, and indeed unlike most browsers these days, Zen doesn’t 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, it’s 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 – I’ll spare the lecture on why I believe Chromium has become far too ubiquitous.\u003C/p>\n\u003Cp>On the web dev side, I’ve found the developer tools to be…fine. I’ve used the Firefox dev tools in the past, so I’m comfortable with them, and it didn’t 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 don’t find the Gecko dev tools that much worse. Which is more than I can say about Safari’s dev tools. 😬\u003C/p>\n\u003Cp>Another major positive is battery life. I’d 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 won’t \u003Cem>actually\u003C/em> last 11 hours, but that’s 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 DRM’d content online, specifically on streaming services (I’ve 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.\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":1074,"localImagePaths":1075,"remoteImagePaths":1076,"frontmatter":1077,"imagePaths":1080},[],[],[],{"title":1065,"pubDate":1078,"tags":1079},"5/30/25",[39,115],[],"2025/the-new-ghall-dot-space",{"id":1081,"data":1083,"body":1088,"filePath":1089,"digest":1090,"rendered":1091},{"title":1084,"pubDate":1085,"tags":1086},"The New ghall.space",["Date","2025-09-01T04:00:00.000Z"],[1087,478,17],"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":1092,"metadata":1093},"\u003Cp>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.\u003C/p>\n\u003Cp>One 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.\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, 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 \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 didn’t fully appreciate Astro’s 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 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.\u003C/p>",{"headings":1094,"localImagePaths":1095,"remoteImagePaths":1096,"frontmatter":1097,"imagePaths":1100},[],[],[],{"title":1084,"pubDate":1098,"tags":1099},"9/1/25",[1087,478,17],[],"2025/the-steam-machine",{"id":1101,"data":1103,"body":1107,"filePath":1108,"digest":1109,"rendered":1110},{"title":1104,"pubDate":1105,"tags":1106},"Notes on the Steam Machine",["Date","2025-11-16T05:00:00.000Z"],[169,39],"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":1111,"metadata":1112},"\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 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.\u003C/p>\n\u003Cp>Up 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\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, 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.\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’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. \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":1113,"localImagePaths":1115,"remoteImagePaths":1116,"frontmatter":1117,"imagePaths":1120},[1114],{"depth":348,"slug":349,"text":350},[],[],{"title":1104,"pubDate":1118,"tags":1119},"11/16/25",[169,39],[],"2025/the-real-tragedy-of-ai",{"id":1121,"data":1123,"body":1127,"filePath":1128,"digest":1129,"rendered":1130},{"title":1124,"pubDate":1125,"tags":1126},"The Real Tragedy of AI",["Date","2025-12-02T05:00:00.000Z"],[39],"The other day, I read [a report from Eurogamer](https://www.eurogamer.net/fortnite-fans-are-saying-no-to-ai-slop-after-spotting-what-they-believe-are-ai-generated-images-in-game) about fans of the online shooter game Fortnite getting up-in-arms about alleged AI images in the game. Specifically an image of a character with nine toes - 5 on one foot, 4 on the other. After reading the article, and looking at the image, I was convinced the criticism was valid.\n\nEarlier today however, I read [an article on IGN](https://www.ign.com/articles/fortnite-artist-responds-as-fans-claim-game-now-includes-examples-of-blatant-ai-artwork-including-a-nine-toed-character-in-a-hammock) that raised some doubts for me about the use of generative AI artwork in Fortnite.\n\nThe truth is, I don’t know what to believe.\n\nArt in all its forms has become exhausting to consume, outside of creators I personally trust to not use AI tools to generate their creations. Stumbling upon some cool art online from someone I never heard of before used to be an exciting experience, but now I find myself immediately suspicious of everything I see.\n\nAs the articles I reference show, I’m clearly not alone in that attitude, and it’s hard not to be. I think that’s the real tragedy of generative AI; it causes us to doubt everything, including actual creative works from real, human artists. It makes what should be an enjoyable part of the human experience into a chore.\n\nThe constant AI vigilance has got to be something artists consider whenever they share something they created, how can it not be? Hell, it’s something I think about whenever I'm writing for this blog, something I wouldn’t consider remotely close to art. I’m constantly over-analyzing my writing, asking myself, “does this sound like something AI would write?”\n\nThe unfortunate truth is, even if the AI bubble pops tomorrow, the technology isn’t going away. The genie is out of the bottle. Given that reality, how do we stay vigilant without flagging someone’s work as AI slop when it isn’t?","src/content/blog/2025/the-real-tragedy-of-ai.md","91801dffc5052214",{"html":1131,"metadata":1132},"\u003Cp>The other day, I read \u003Ca href=\"https://www.eurogamer.net/fortnite-fans-are-saying-no-to-ai-slop-after-spotting-what-they-believe-are-ai-generated-images-in-game\">a report from Eurogamer\u003C/a> about fans of the online shooter game Fortnite getting up-in-arms about alleged AI images in the game. Specifically an image of a character with nine toes - 5 on one foot, 4 on the other. After reading the article, and looking at the image, I was convinced the criticism was valid.\u003C/p>\n\u003Cp>Earlier today however, I read \u003Ca href=\"https://www.ign.com/articles/fortnite-artist-responds-as-fans-claim-game-now-includes-examples-of-blatant-ai-artwork-including-a-nine-toed-character-in-a-hammock\">an article on IGN\u003C/a> that raised some doubts for me about the use of generative AI artwork in Fortnite.\u003C/p>\n\u003Cp>The truth is, I don’t know what to believe.\u003C/p>\n\u003Cp>Art in all its forms has become exhausting to consume, outside of creators I personally trust to not use AI tools to generate their creations. Stumbling upon some cool art online from someone I never heard of before used to be an exciting experience, but now I find myself immediately suspicious of everything I see.\u003C/p>\n\u003Cp>As the articles I reference show, I’m clearly not alone in that attitude, and it’s hard not to be. I think that’s the real tragedy of generative AI; it causes us to doubt everything, including actual creative works from real, human artists. It makes what should be an enjoyable part of the human experience into a chore.\u003C/p>\n\u003Cp>The constant AI vigilance has got to be something artists consider whenever they share something they created, how can it not be? Hell, it’s something I think about whenever I’m writing for this blog, something I wouldn’t consider remotely close to art. I’m constantly over-analyzing my writing, asking myself, “does this sound like something AI would write?”\u003C/p>\n\u003Cp>The unfortunate truth is, even if the AI bubble pops tomorrow, the technology isn’t going away. The genie is out of the bottle. Given that reality, how do we stay vigilant without flagging someone’s work as AI slop when it isn’t?\u003C/p>",{"headings":1133,"localImagePaths":1134,"remoteImagePaths":1135,"frontmatter":1136,"imagePaths":1139},[],[],[],{"title":1124,"pubDate":1137,"tags":1138},"12/2/25",[39],[],"2025/thoughts-on-peronal-progress",{"id":1140,"data":1142,"body":1146,"filePath":1147,"digest":1148,"rendered":1149},{"title":1143,"pubDate":1144,"tags":1145},"Thoughts on Personal Progress",["Date","2025-04-09T04:00:00.000Z"],[18],"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":1150,"metadata":1151},"\u003Cp>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.\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 isn’t always a straight line, but acknowledges that, while the trajectory of the line may change, it’s 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 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.\u003C/p>",{"headings":1152,"localImagePaths":1153,"remoteImagePaths":1154,"frontmatter":1155,"imagePaths":1158},[],[],[],{"title":1143,"pubDate":1156,"tags":1157},"4/9/25",[18],[],"2024/am-i-switching-to-zed",{"id":1159,"data":1161,"body":1165,"filePath":1166,"digest":1167,"rendered":1168},{"title":1162,"pubDate":1163,"tags":1164},"Am I Switching From Nova To Zed?",["Date","2024-04-14T13:20:00.000Z"],[115,478,17],"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":1169,"metadata":1170},"\u003Cp>For the past several days I’ve 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 wasn’t immediately sold. I even went so far as to \u003Ca href=\"https://mastodon.social/@ghalldev/112243389407945338\">toot\u003C/a> that I’d 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; 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.\u003C/p>\n\u003Cp>But it has one huge advantage over Nova; it’s 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, 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.\u003C/p>\n\u003Cp>This 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 \u003Ca href=\"https://zed.dev/roadmap\">roadmap\u003C/a> 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.\u003C/p>\n\u003Cp>On 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 \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, 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…\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: Nova’s TypeScript extension hasn’t 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":1171,"localImagePaths":1173,"remoteImagePaths":1174,"frontmatter":1175,"imagePaths":1178},[1172],{"depth":348,"slug":349,"text":350},[],[],{"title":1162,"pubDate":1176,"tags":1177},"4/14/24, 9:20 AM",[115,478,17],[],"2024/default-apps-2024",{"id":1179,"data":1181,"body":1185,"filePath":1186,"digest":1187,"rendered":1188},{"title":1182,"pubDate":1183,"tags":1184},"Default Apps 2024",["Date","2024-12-29T05:00:00.000Z"],[115,39],"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":1189,"metadata":1190},"\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":1191,"localImagePaths":1192,"remoteImagePaths":1193,"frontmatter":1194,"imagePaths":1197},[],[],[],{"title":1182,"pubDate":1195,"tags":1196},"12/29/24",[115,39],[],"2024/doctor-type-love",{"id":1198,"data":1200,"body":1204,"filePath":1205,"digest":1206,"rendered":1207},{"title":1201,"pubDate":1202,"tags":1203},"How I Learned to Stop Worrying and Love TypeScript",["Date","2024-02-21T05:00:00.000Z"],[198,478],"One of the first steps I took on my post-boot camp webdev journey was to learn TypeScript. It wasn't something that was covered–though I wish it had been, I'll get into why in a second–but 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 first–I 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":1208,"metadata":1209},"\u003Cp>One of the first steps I took on my post-boot camp webdev journey was to learn TypeScript. It wasn’t something that was covered–though I wish it had been, I’ll get into why in a second–but 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, I’ll 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 first–I 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, there’s 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 that’s something for another day…\u003C/p>\n\u003Cp>The 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.\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. 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.\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":1210,"localImagePaths":1212,"remoteImagePaths":1213,"frontmatter":1214,"imagePaths":1217},[1211],{"depth":348,"slug":349,"text":350},[],[],{"title":1201,"pubDate":1215,"tags":1216},"2/21/24",[198,478],[],"2024/finishing-stuff",{"id":1218,"data":1220,"body":1224,"filePath":1225,"digest":1226,"rendered":1227},{"title":1221,"pubDate":1222,"tags":1223},"Finishing Stuff",["Date","2024-07-08T04:00:00.000Z"],[18],"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":1228,"metadata":1229},"\u003Cp>It’s been a while, longer than usual, since I’ve posted something here.\u003C/p>\n\u003Cp>I 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.\u003C/p>\n\u003Cp>If 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.\u003C/p>\n\u003Cp>It 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.\u003C/p>\n\u003Cp>I have so many reasons for leaving things unfinished.\u003C/p>\n\u003Cp>When 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…).\u003C/p>\n\u003Cp>For 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.\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 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.\u003C/p>\n\u003Cp>I’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.\u003C/p>\n\u003Cp>In the meantime though, I did finish this blog post (finally), \u003Cem>and\u003C/em> posted it, so I’m going to have a mini celebratory cup of tea.\u003C/p>",{"headings":1230,"localImagePaths":1231,"remoteImagePaths":1232,"frontmatter":1233,"imagePaths":1236},[],[],[],{"title":1221,"pubDate":1234,"tags":1235},"7/8/24",[18],[],"2024/ai-and-creativity",{"id":1237,"data":1239,"body":1244,"filePath":1245,"digest":1246,"rendered":1247},{"title":1240,"pubDate":1241,"tags":1242},"AI & Creativity",["Date","2024-11-11T05:00:00.000Z"],[39,1243],"Creativity","Recently, I’ve been pondering generative AI and its effects. Not on jobs, the economy, or even the damage it’s done to our ability to trust information we see online (whether it’s something generated by a malicious actor looking to mislead, or a simple “hallucination” causing an innocent mistake). No, I’ve been pondering its effects on human creativity, and our capacity to learn and grow as creative creatures. This is something I’ve had in the back of my mind for a quite a while, and I think I’ve 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 didn’t feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasn’t falsely representing me, but I still felt dirty. Like the few matches I did get weren’t 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\nI’ve used AI on and off for different reasons since then. I’ve used it to help solve programming issues at work and on side projects, to generate images in various art styles that I don’t 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 be–and has been–argued 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 can’t 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 didn’t wake up one day and start making masterpieces, the best writers didn’t start writing classics from the moment they put pen to paper, and the best photographers weren’t 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 doesn’t 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 wouldn’t be any closer to understanding how I truly feel about whatever it is I’m writing about.\n\nWhy does any of this even matter? Perhaps, in the grand scheme of things, it doesn’t. But, I would argue that, whether it’s 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, it’s 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 Marvel’s 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 lives–I 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":1248,"metadata":1249},"\u003Cp>Recently, I’ve been pondering generative AI and its effects. Not on jobs, the economy, or even the damage it’s done to our ability to trust information we see online (whether it’s something generated by a malicious actor looking to mislead, or a simple “hallucination” causing an innocent mistake). No, I’ve been pondering its effects on human creativity, and our capacity to learn and grow as creative creatures. This is something I’ve had in the back of my mind for a quite a while, and I think I’ve 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 didn’t feel like I was presenting my authentic self. Yes, I vetted the text generated by the AI to ensure it wasn’t falsely representing me, but I still felt dirty. Like the few matches I did get weren’t 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>I’ve used AI on and off for different reasons since then. I’ve used it to help solve programming issues at work and on side projects, to generate images in various art styles that I don’t 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 be–and has been–argued 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 can’t 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 didn’t wake up one day and start making masterpieces, the best writers didn’t start writing classics from the moment they put pen to paper, and the best photographers weren’t 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 doesn’t 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 wouldn’t be any closer to understanding how I truly feel about whatever it is I’m writing about.\u003C/p>\n\u003Cp>Why does any of this even matter? Perhaps, in the grand scheme of things, it doesn’t. But, I would argue that, whether it’s 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, it’s 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 Marvel’s 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 lives–I 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":1250,"localImagePaths":1252,"remoteImagePaths":1253,"frontmatter":1254,"imagePaths":1257},[1251],{"depth":348,"slug":349,"text":350},[],[],{"title":1240,"pubDate":1255,"tags":1256},"11/11/24",[39,1243],[],"2025/learning-to-enjoy-react-forms",{"id":1258,"data":1260,"body":1264,"filePath":1265,"digest":1266,"rendered":1267},{"title":1261,"pubDate":1262,"tags":1263},"Learning to Enjoy Building Forms in React",["Date","2025-09-15T04:00:00.000Z"],[17,478],"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":1268,"metadata":1269},"\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 I’m 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 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.\u003C/p>\n\u003Cp>Enter the useRef hook…\u003C/p>\n\u003Cp>I’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.\u003C/p>\n\u003Cp>See, 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.\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 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).\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":1270,"localImagePaths":1271,"remoteImagePaths":1272,"frontmatter":1273,"imagePaths":1276},[],[],[],{"title":1261,"pubDate":1274,"tags":1275},"9/15/25",[17,478],[],"2025/tinkering-with-linux",{"id":1277,"data":1279,"body":1284,"filePath":1285,"digest":1286,"rendered":1287},{"title":1280,"pubDate":1281,"tags":1282},"Tinkering With Linux",["Date","2025-10-27T04:00:00.000Z"],[39,1283],"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":1288,"metadata":1289},"\u003Cp>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.\u003C/p>\n\u003Cp>Most 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\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 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.\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, 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 \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 man’s vanity project, or given that same man a golden statue.\u003C/p>\n\u003Cp>And, 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 \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 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”.\u003C/p>\n\u003Cp>Anyway, 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.\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 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\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>It’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.\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 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.\u003C/p>\n\u003Cp>I 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 \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 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.\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 haven’t 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 I’m 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>, I’m 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 I’m 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":1290,"localImagePaths":1292,"remoteImagePaths":1293,"frontmatter":1294,"imagePaths":1297},[1291],{"depth":348,"slug":349,"text":350},[],[],{"title":1280,"pubDate":1295,"tags":1296},"10/27/25",[39,1283],[],"2024/my-backup-solution",{"id":1298,"data":1300,"body":1305,"filePath":1306,"digest":1307,"rendered":1308},{"title":1301,"pubDate":1302,"tags":1303},"My Backup Solution",["Date","2024-01-27T05:00:00.000Z"],[39,1304],"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\" folder–where macOS stores iCloud Drive locally–are 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":1309,"metadata":1310},"\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 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.\u003C/p>\n\u003Cp>Since 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…\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 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.\u003C/p>\n\u003Cp>I’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.\u003C/p>\n\u003Cp>For 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.\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 I’d 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 don’t 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 it’s 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 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.\u003C/p>\n\u003Cp>Thirdly, 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” folder–where macOS stores iCloud Drive locally–are 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 \u003Ca href=\"https://mastodon.social/@ghalldev\">hit me up on Mastodon\u003C/a> if you have any.\u003C/p>\n\u003Cp>And 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.\u003C/p>\n\u003Cp>But 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 \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":1311,"localImagePaths":1312,"remoteImagePaths":1313,"frontmatter":1314,"imagePaths":1317},[],[],[],{"title":1301,"pubDate":1315,"tags":1316},"1/27/24",[39,1304],[],"2024/my-five-formative-games",{"id":1318,"data":1320,"body":1324,"filePath":1325,"digest":1326,"rendered":1327},{"title":1321,"pubDate":1322,"tags":1323},"My Five Formative Video Games",["Date","2024-07-18T04:00:00.000Z"],[169],"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 mine–sorry to everyone who loves this game–but 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":1328,"metadata":1329},"\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, 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.\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: 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.\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 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.\u003C/p>\n\u003Cp>It’s not what I’d call a favorite of mine–sorry to everyone who loves this game–but 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 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.\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. 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.\u003C/p>\n\u003Ch2 id=\"sim-copter\">Sim Copter\u003C/h2>\n\u003Cp>This 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.\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 that’s 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":1330,"localImagePaths":1347,"remoteImagePaths":1348,"frontmatter":1349,"imagePaths":1352},[1331,1334,1337,1340,1343,1346],{"depth":348,"slug":1332,"text":1333},"donkey-kong-country","Donkey Kong Country",{"depth":348,"slug":1335,"text":1336},"super-mario-land-2-six-golden-coins","Super Mario Land 2: Six Golden Coins",{"depth":348,"slug":1338,"text":1339},"pokémon-red1","Pokémon Red1",{"depth":348,"slug":1341,"text":1342},"the-legend-of-zelda-the-wind-waker","The Legend of Zelda: The Wind Waker",{"depth":348,"slug":1344,"text":1345},"sim-copter","Sim Copter",{"depth":348,"slug":349,"text":350},[],[],{"title":1321,"pubDate":1350,"tags":1351},"7/18/24",[169],[],"2024/playing-on-easy-mode",{"id":1353,"data":1355,"body":1359,"filePath":1360,"digest":1361,"rendered":1362},{"title":1356,"pubDate":1357,"tags":1358},"Playing on \"Easy Mode\"",["Date","2024-04-09T04:00:00.000Z"],[169],"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":1363,"metadata":1364},"\u003Cp>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.\u003C/p>\n\u003Cp>I’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.\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 didn’t 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. 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.\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 wasn’t too frustrating but still gave me a satisfying experience.\u003C/p>\n\u003Cp>While 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.\u003C/p>",{"headings":1365,"localImagePaths":1366,"remoteImagePaths":1367,"frontmatter":1368,"imagePaths":1371},[],[],[],{"title":1356,"pubDate":1369,"tags":1370},"4/9/24",[169],[],"2024/ramblings-on-the-macintosh",{"id":1372,"data":1374,"body":1378,"filePath":1379,"digest":1380,"rendered":1381},{"title":1375,"pubDate":1376,"tags":1377},"Ramblings On The Macintosh",["Date","2024-02-18T05:00:00.000Z"],[38,91,39],"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 drive–I 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":1382,"metadata":1383},"\u003Cp>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.\u003C/p>\n\u003Cp>That 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!\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 can’t 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 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 drive–I 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.\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 that’s 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 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.\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 it’s 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":1384,"localImagePaths":1386,"remoteImagePaths":1387,"frontmatter":1388,"imagePaths":1391},[1385],{"depth":348,"slug":349,"text":350},[],[],{"title":1375,"pubDate":1389,"tags":1390},"2/18/24",[38,91,39],[],"2024/my-terminal-setup",{"id":1392,"data":1394,"body":1398,"filePath":1399,"digest":1400,"rendered":1401},{"title":1395,"pubDate":1396,"tags":1397},"My Terminal Setup",["Date","2024-03-09T05:00:00.000Z"],[91,39],"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":1402,"metadata":1403},"\u003Cp>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.\u003C/p>\n\u003Cp>One 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.\u003C/p>\n\u003Ch3 id=\"the-basics\">The Basics\u003C/h3>\n\u003Cp>To 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 \u003Ca href=\"https://iterm2.com\">iTerm 2\u003C/a>. 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.\u003C/p>\n\u003Cp>For 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 \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. There’s 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 don’t 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. 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.\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 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 \u003Ca href=\"https://github.com/charmbracelet/gum/blob/main/README.md\">the readme\u003C/a> to see if it’s something you’d 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 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 \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 you’re like me and have the cd command burned into your brain, you can set cd as an alias of z.\u003C/p>",{"headings":1404,"localImagePaths":1414,"remoteImagePaths":1415,"frontmatter":1416,"imagePaths":1419},[1405,1408,1411],{"depth":70,"slug":1406,"text":1407},"the-basics","The Basics",{"depth":70,"slug":1409,"text":1410},"themes-and-plugins","Themes and Plugins",{"depth":70,"slug":1412,"text":1413},"useful-tools","Useful Tools",[],[],{"title":1395,"pubDate":1417,"tags":1418},"3/9/24",[91,39],[],"2024/rip-homepod-mini",{"id":1420,"data":1422,"body":1426,"filePath":1427,"digest":1428,"rendered":1429},{"title":1423,"pubDate":1424,"tags":1425},"RIP HomePod Mini",["Date","2024-05-02T04:00:00.000Z"],[39],"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":1430,"metadata":1431},"\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 (I’m not entirely sure \u003Cem>when\u003C/em> 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.\u003C/p>\n\u003Cp>I’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.\u003C/p>\n\u003Cp>But 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 \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 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.\u003C/p>\n\u003Cp>When 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!\u003C/p>\n\u003Cp>However, 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.\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 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; \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, 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.\u003C/p>\n\u003Cp>It’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 \u003Cem>if\u003C/em> I can find something like that, though I’m not crossing my fingers.\u003C/p>\n\u003Cp>So, RIP to my HomePod Mini, the most infuriating Apple product I’ve 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":1432,"localImagePaths":1434,"remoteImagePaths":1435,"frontmatter":1436,"imagePaths":1439},[1433],{"depth":348,"slug":349,"text":350},[],[],{"title":1423,"pubDate":1437,"tags":1438},"5/2/24",[39],[],"2024/my-top-3-games-of-2024",{"id":1440,"data":1442,"body":1446,"filePath":1447,"digest":1448,"rendered":1449},{"title":1443,"pubDate":1444,"tags":1445},"My Top 3 Games of 2024",["Date","2024-12-12T00:00:00.000Z"],[169],"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 Baldur’s Gate 3 blew me away that I couldn’t fathom selecting a third game that stood up to them. This year however, I’m 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 didn’t 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, I’ve 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 that’s 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. It’s clear the people behind the game are big fans of the universe George Lucas created.\n\nEven the typical Ubisoft open-world tropes didn’t 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 you’ll 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. It’s 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 Remake–the first entry in this trilogy-to-be of games re-imagining the classic 90’s RPG–when I originally played it during Covid lockdown in 2020, I found it very tedious when I revisited it a couple years ago In addition, 2023’s Final Fantasy XVI left me a bit down on the series as a whole. But I gave Rebirth a shot anyway, and I’m 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 XV’s real-time combat was tedious, while XVI’s 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 don’t.\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 it’s not so much that it’s 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 weren’t all bangers, but I did find myself engaging in Gwen…sorry, I mean, Queen’s 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 didn’t finish more games this year 😬).\n\n### The Legend of Zelda: Echoes of Wisdom\n\nIt goes without saying, if there’s a new Zelda game out it’s going to make my top 3 games of the year, no question. Like any other game, it’s 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\nIt’s the first Zelda game of this style to take on the open-world design of the 2 most recent 3D games–Breath of the Wild, and Tears of the Kingdom–and it really fit a lot better that I was expecting. In fact, I’d 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 didn’t 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":1450,"metadata":1451},"\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 Baldur’s Gate 3 blew me away that I couldn’t fathom selecting a third game that stood up to them. This year however, I’m 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 didn’t 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, I’ve 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 that’s 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. It’s 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 didn’t 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 you’ll 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. It’s 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 Remake–the first entry in this trilogy-to-be of games re-imagining the classic 90’s RPG–when I originally played it during Covid lockdown in 2020, I found it very tedious when I revisited it a couple years ago In addition, 2023’s Final Fantasy XVI left me a bit down on the series as a whole. But I gave Rebirth a shot anyway, and I’m 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 XV’s real-time combat was tedious, while XVI’s 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 don’t.\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 it’s not so much that it’s 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 weren’t all bangers, but I did find myself engaging in Gwen…sorry, I mean, Queen’s 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 didn’t 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 there’s a new Zelda game out it’s going to make my top 3 games of the year, no question. Like any other game, it’s 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>It’s the first Zelda game of this style to take on the open-world design of the 2 most recent 3D games–Breath of the Wild, and Tears of the Kingdom–and it really fit a lot better that I was expecting. In fact, I’d 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 didn’t quite work. Basically, what Tears of the Kingdom did for Breath of the Wild.\u003C/p>",{"headings":1452,"localImagePaths":1462,"remoteImagePaths":1463,"frontmatter":1464,"imagePaths":1467},[1453,1456,1459],{"depth":70,"slug":1454,"text":1455},"star-wars-outlaws","Star Wars: Outlaws",{"depth":70,"slug":1457,"text":1458},"final-fantasy-vii-rebirth","Final Fantasy VII Rebirth",{"depth":70,"slug":1460,"text":1461},"the-legend-of-zelda-echoes-of-wisdom","The Legend of Zelda: Echoes of Wisdom",[],[],{"title":1443,"pubDate":1465,"tags":1466},"2024-12-12",[169],[],"2024/notes-on-these-airpods",{"id":1468,"data":1470,"body":1474,"filePath":1475,"digest":1476,"rendered":1477},{"title":1471,"pubDate":1472,"tags":1473},"Notes on the AirPods 4",["Date","2024-09-24T01:10:00.000Z"],[39],"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":1478,"metadata":1479},"\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>I’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:\u003C/p>\n\u003Ch2 id=\"noise-cancellation\">Noise Cancellation\u003C/h2>\n\u003Cp>I’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).\u003C/p>\n\u003Cp>I’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.\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 don’t 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 I’ll 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 don’t 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":1480,"localImagePaths":1491,"remoteImagePaths":1492,"frontmatter":1493,"imagePaths":1496},[1481,1484,1487,1490],{"depth":348,"slug":1482,"text":1483},"noise-cancellation","Noise Cancellation",{"depth":348,"slug":1485,"text":1486},"passthrough","Passthrough",{"depth":348,"slug":1488,"text":1489},"misc-notes","Misc Notes",{"depth":348,"slug":349,"text":350},[],[],{"title":1471,"pubDate":1494,"tags":1495},"9/23/24, 9:10 PM",[39],[],"2026/revisiting-nova",{"id":1497,"data":1499,"body":1503,"filePath":1504,"digest":1505,"rendered":1506},{"title":1500,"pubDate":1501,"tags":1502},"Revisiting Nova",["Date","2026-01-27T05:00:00.000Z"],[115,478],"Almost 2 years ago, [I made the switch from Nova to Zed](/blog/2024/am-i-switching-to-zed/) for writing code. I’d been mostly happy with it during that time, but it never felt like a truly polished piece of software, despite being a pretty smooth experience in terms of its text-editing capabilities.\n\nOver the last few weeks, I’ve been giving Nova another try. I’ve been able to get the LSPs for TypeScript, Svelte, and Astro working for web development, in addition to Swift, Ruby, and Go for other projects. I do find myself having to restart the TypeScript language server at least once a day, but I had to do the same thing in Zed so maybe it’s not an editor problem.\n\nI get joy from coding with Nova in a way I don’t get from Zed, VS Code, or even Xcode (yuck!). It looks nice, it feels nice to use, and it doesn’t eat up system resources unnecessarily.\n\nThe primary con is the app's uncertain future. Panic, Inc. has been frustratingly uncommunicative about Nova's development, despite promises to be more transparent with the community. For an app that costs $100, plus another $50 every year for updates, and is a tool many of their users rely on for work, it feels a little bit like a betrayal.\n\nApparently built-in LSP support is on the way at some point, eventually, so we won't have to rely on extensions for that functionality. While I am excited for that feature, it feels less like an effort to make the app more appealing, and more like throwing in the towel. I hope I'm wrong, because Nova is the kind of top-tier Mac app that just doesn't get made anymore.","src/content/blog/2026/revisiting-nova.md","ecf3ef7aca34c121",{"html":1507,"metadata":1508},"\u003Cp>Almost 2 years ago, \u003Ca href=\"/blog/2024/am-i-switching-to-zed/\">I made the switch from Nova to Zed\u003C/a> for writing code. I’d been mostly happy with it during that time, but it never felt like a truly polished piece of software, despite being a pretty smooth experience in terms of its text-editing capabilities.\u003C/p>\n\u003Cp>Over the last few weeks, I’ve been giving Nova another try. I’ve been able to get the LSPs for TypeScript, Svelte, and Astro working for web development, in addition to Swift, Ruby, and Go for other projects. I do find myself having to restart the TypeScript language server at least once a day, but I had to do the same thing in Zed so maybe it’s not an editor problem.\u003C/p>\n\u003Cp>I get joy from coding with Nova in a way I don’t get from Zed, VS Code, or even Xcode (yuck!). It looks nice, it feels nice to use, and it doesn’t eat up system resources unnecessarily.\u003C/p>\n\u003Cp>The primary con is the app’s uncertain future. Panic, Inc. has been frustratingly uncommunicative about Nova’s development, despite promises to be more transparent with the community. For an app that costs $100, plus another $50 every year for updates, and is a tool many of their users rely on for work, it feels a little bit like a betrayal.\u003C/p>\n\u003Cp>Apparently built-in LSP support is on the way at some point, eventually, so we won’t have to rely on extensions for that functionality. While I am excited for that feature, it feels less like an effort to make the app more appealing, and more like throwing in the towel. I hope I’m wrong, because Nova is the kind of top-tier Mac app that just doesn’t get made anymore.\u003C/p>",{"headings":1509,"localImagePaths":1510,"remoteImagePaths":1511,"frontmatter":1512,"imagePaths":1515},[],[],[],{"title":1500,"pubDate":1513,"tags":1514},"1/27/2026",[115,478],[],"2026/my-gaming-journal",{"id":1516,"data":1518,"body":1522,"filePath":1523,"digest":1524,"rendered":1525},{"title":1519,"pubDate":1520,"tags":1521},"My Gaming Journal",["Date","2026-02-03T05:00:00.000Z"],[38,169],"For the last 2 years, I’ve kept a gaming journal in an actual, physical notebook to record my thoughts and feelings on the games I’ve finished.\n\nJournaling is something I’ve struggled to keep up with but have wanted to do for many years. I’ve gone through some fits and starts with it, but I’ve never been able to keep up with it consistently. So, it’s been nice to have something in that realm that I have been able to keep up with.\n\nFor me, it’s not just about getting away from the screen or the craft of writing by hand—my handwriting is atrocious and definitely not “crafty.” It’s about putting the ink to the paper and not being able to change it. Yes, you can scribble things out or tear out the page and start over, but in the end, you have to embrace the imperfections.\n\nThat’s a challenging thing for me. When I type, I sometimes find writing exhausting because I’m constantly editing, rewording, moving things around, and trying to make what I write some version of “perfect.” I find it difficult to just write and not worry about making mistakes or wording something poorly.\n\nWriting by hand forces me to just accept my mistakes and move on. That frees my brain up to just write, stream-of-consciousness-style. In the case of my gaming journal, I end up writing things that I maybe wouldn’t write if I were typing something out about the game for my blog.[^1]\n\nFor example, in my entry on Cyberpunk 2077, which I finished this past December, I wrote a little story about what happened to my V after the events of the game and about how she and Judy lived out their lives and grew old together. Something I would never have written if I was writing my thoughts in a review format.\n\nThere’s nothing in this journal that I would consider good writing, but that’s okay. It’s not for anybody but myself, and it’s a way to keep me journaling on a semi-regular basis. And the most embarrassing thing in it is the page I wrote on why I thought Queen’s Blood from Final Fantasy VII Rebirth is better than Gwent from The Witcher 3 (don’t @ me).\n\n[^1]: Incidentally, I have referred to my gaming journal when writing my yearly “Top 3 Games” posts.","src/content/blog/2026/my-gaming-journal.md","3d8a60b3e6a1b52c",{"html":1526,"metadata":1527},"\u003Cp>For the last 2 years, I’ve kept a gaming journal in an actual, physical notebook to record my thoughts and feelings on the games I’ve finished.\u003C/p>\n\u003Cp>Journaling is something I’ve struggled to keep up with but have wanted to do for many years. I’ve gone through some fits and starts with it, but I’ve never been able to keep up with it consistently. So, it’s been nice to have something in that realm that I have been able to keep up with.\u003C/p>\n\u003Cp>For me, it’s not just about getting away from the screen or the craft of writing by hand—my handwriting is atrocious and definitely not “crafty.” It’s about putting the ink to the paper and not being able to change it. Yes, you can scribble things out or tear out the page and start over, but in the end, you have to embrace the imperfections.\u003C/p>\n\u003Cp>That’s a challenging thing for me. When I type, I sometimes find writing exhausting because I’m constantly editing, rewording, moving things around, and trying to make what I write some version of “perfect.” I find it difficult to just write and not worry about making mistakes or wording something poorly.\u003C/p>\n\u003Cp>Writing by hand forces me to just accept my mistakes and move on. That frees my brain up to just write, stream-of-consciousness-style. In the case of my gaming journal, I end up writing things that I maybe wouldn’t write if I were typing something out about the game for my blog.\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>For example, in my entry on Cyberpunk 2077, which I finished this past December, I wrote a little story about what happened to my V after the events of the game and about how she and Judy lived out their lives and grew old together. Something I would never have written if I was writing my thoughts in a review format.\u003C/p>\n\u003Cp>There’s nothing in this journal that I would consider good writing, but that’s okay. It’s not for anybody but myself, and it’s a way to keep me journaling on a semi-regular basis. And the most embarrassing thing in it is the page I wrote on why I thought Queen’s Blood from Final Fantasy VII Rebirth is better than Gwent from The Witcher 3 (don’t @ me).\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>Incidentally, I have referred to my gaming journal when writing my yearly “Top 3 Games” posts. \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":1528,"localImagePaths":1530,"remoteImagePaths":1531,"frontmatter":1532,"imagePaths":1535},[1529],{"depth":348,"slug":349,"text":350},[],[],{"title":1519,"pubDate":1533,"tags":1534},"2/3/2026",[38,169],[]] |