JSON Feed Validator

Check whether your feed is valid. For more information about JSON Feed, see the specification. Find the validator source code on GitHub.

GET validation response in JSON format.

Feed source

{
  "version": "https://jsonfeed.org/version/1.1",
  "user_comment": "This feed allows you to read the posts from this site in any feed reader that supports the JSON Feed format. To add this feed to your reader, copy the following URL — https://www.bryanbraun.com/feed.json — and add it your reader.",
  "home_page_url": "https://www.bryanbraun.com",
  "title": "Bryan Braun - Blog",
  "description": "Making things and sharing what I learn.",
  "feed_url": "https://www.bryanbraun.com/feed.json",
  "favicon": "https://www.bryanbraun.com/assets/images/feed-favicon.png",
  "icon": "https://www.bryanbraun.com/assets/images/feed-icon.png",
  "language": "en-US",
  "authors": [
    {
      "name": "Bryan Braun"
    }
  ],
  "items": [
    {
      "id": "/2026/02/16/250-lbs",
      "url": "https://www.bryanbraun.com/2026/02/16/250-lbs/",
      "date_published": "2026-02-16T00:00:00-05:00",
      "date_modified": "2026-02-16T00:00:00-05:00",
      "title": "250 lbs",
      "summary": "Six months ago, while I was setting up a new code editor, I noticed that the default font size felt just a bit too small, when displayed on my monitor. Not a big deal, I just bumped it up one size and went back to my work.",
      "content_html": "<p>Six months ago, while I was setting up a new code editor, I noticed that the default font size felt just a bit too small, when displayed on my monitor. Not a big deal, I just bumped it up one size and went back to my work.</p><p>Then it happened again, this time, when reading sheet music on my phone. “That’s weird,” I thought, as I increased the size. “This didn’t bother me before.”</p><p>I had always had perfect, 20-20 eyesight. When I finally realized that I was losing some of that sharpness, I felt a loss.</p><p>It wasn’t the first time, though.</p><p>About two years ago, I started having wrist pain while typing. On one particularly bad day, I became very worried. “Typing is how I provide for my family. What will I do, if I can’t type?” Soon I discovered that wearing wrist braces at night helped make the pain go away. I remember laying in my bed in wrist braces, thinking, “I’m 36 years old. I’m too young to need wrist braces for the rest of my life,” and I felt a loss.<sup id=\"fnref-1\"><a href=\"#fn-1\" class=\"footnote-ref\">1</a></sup></p><p>After a few losses like these, it would be easy to adopt a narrative that I’m in physical decline, losing capability daily, with all my best achievements in my past. It’s a sad story. A <a href=\"https://www.bryanbraun.com/2023/06/06/the-stories-we-tell-ourselves/#fragile-stories\">fragile story</a>.</p><p>I decided that one way I could push back against this story is to set a new weightlifting goal: a 250-pound bench press.</p><p>It was an unthinkable goal back when <a href=\"https://www.bryanbraun.com/2023/08/26/200-lbs/\">I benched 200</a>. I didn’t plan on going heavier, but I enjoyed my weightlifting routine, so I kept showing up. By the time I hit 235, I realized that maybe 250 was possible. I felt excited and motivated just thinking about it. I wanted to go for it.</p><p>But just like last time, I hit a plateau.<sup id=\"fnref-2\"><a href=\"#fn-2\" class=\"footnote-ref\">2</a></sup> I was able to bench 245 <em>once</em>, last summer, but I spent the next 6 months unable to do it again. As I turned 39, I wondered if I was fighting against time.</p><p>And then it happened.</p><hr class=\"section-divider\" /><p>All of us are going to have to learn how to grow old. The aging itself is easy, but learning how to handle the losses is more challenging. Today, I can tell myself, “my eyesight may be declining, but I’m stronger than I’ve ever been.” Next year, who knows. Maybe I’ll get into pickleball.</p><p>There are endless opportunities for personal growth, and if we exhaust the supply of physical milestones we can still progress intellectually, creatively, and spiritually. Life offers plenty of PRs to pursue, if we’re willing to look for them.</p><hr /><div class=\"footnotes\">  <ol>    <li id=\"fn-1\">      <p>Fortunately, I didn't end up needing to wear wrist braces for the rest of my life. After some trial and error, I learned that my pain was ultimately caused by poor ergonomics from using my laptop keyboard and trackpad for extended periods. Once I got set up with an ergonomic keyboard and mouse, the pain went away. It's still a bit of a loss (I can't just roll into a weekend hackathon with only a laptop anymore) but I'm glad I can still do the work I enjoy.</p>      <a href=\"#fnref-1\" class=\"footnote-backref\">↩</a>    </li>    <li id=\"fn-2\">      <p>In <a href=\"https://www.bryanbraun.com/2023/08/26/200-lbs/\">my last weightlifting post</a>, I talked a bit about breaking through plateaus. This time, the key intervention was simply eating more calories (something I've avoided in the past in an effort to moderate body fat). Eating more calories increased my body fat a bit, but also helped me build muscle. Professional weightlifters eat a lot and exercise a lot. It's not an efficient use of time but it's fun (especially if you like eating and exercising).</p>      <a href=\"#fnref-2\" class=\"footnote-backref\">↩</a>    </li>  </ol></div><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2026/02/16/250-lbs/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2026/01/01/made-in-2025",
      "url": "https://www.bryanbraun.com/2026/01/01/made-in-2025/",
      "date_published": "2026-01-01T00:00:00-05:00",
      "date_modified": "2026-01-01T00:00:00-05:00",
      "title": "Made in 2025",
      "summary": "Here are some things I made in 2025:",
      "content_html": "<p>Here are some things I made in 2025:</p><ul>  <li><a href=\"https://bryanbraun.com/pro-wrestler-or-roller-coaseter/\">Pro-Wrestler or Roller Coaster</a></li>  <li>A <a href=\"https://github.com/bryanbraun/fusion-penrose\">Fusion 360 Script for creating a Penrose Triangle in CAD</a></li>  <li>A <a href=\"https://www.bryanbraun.com/books/#blindsight\">personal book recommendation tool</a>, which used <a href=\"https://www.bryanbraun.com/books\">my archive of book reviews</a>, the OpenAI API, and <a href=\"https://en.wikipedia.org/wiki/Retrieval-augmented_generation\">RAG techniques</a> to give me personalized book recommendations. The tool wasn’t polished but <a href=\"https://www.bryanbraun.com/books/#blindsight\">I ended enjoying some of the recommendations</a>.</li>  <li>9 Music Box Fun songs.    <ul>      <li>I’m most proud of <a href=\"https://musicbox.fun/#1XQAAAAIEDwAAAAAAAABBqEgrorLfAlArhbCp-y4A66CcyoAjag00sb4zdsf1U2f1Y5eaNalDxWjVs8ZgfYfr503OBXB7U65AUB8_klWkl9_HkrJNFxYSBrXq4CH4ZuFsa2zr50fLqk2DCvkfgkUmNR_KWckRfeJxKqfEZ7kCsm6FJpn9PVrDd97C3RkgStEReSyYiz8b-CiB1KFPu3PPAXwa2txPMKpSAPMFLsP6oCqcOFkCBmeGxaA9nqNthNZyiPhzeidF3DOTmJgbzM-Zv72J2YOYemXLPsY9tMcmmZSFZ9HziLU4X0fF_NMjZyisyBqrDo-PvB4PBNPBtoFZdFSW30eyKZC9cVG1MjZaQnYCgaf3q7FivGSmVvHAAHXxU6xr_YmSjA8cfim_z37BJ_wbU_sli13jB7D70ex7odZfavDXdT6zJdDisElDZ-YN6ko_AOgh6Dl1fXlESrkNIW-ope2yCl0hgiyymGE0Wc8ZfLoNTAOUwMIGG3puCNfvlWeLMNUuwcet4Eqg6sK9EH9n15W45PmTYcyp7yeyg3WZyLTIUmzUOQC8i7ab3_lH3wJAREQ2FhnXIzW-9A-lxbCQOoWaWZlI0OJBsT0iqqKvpyfRvB01hU7XkC8dO85bE-0HKcqd9mgQ_7yWA9UnINZWI7_FRqKRkJWV5upqya5tZgZQeI7hIrv1jx3udg5C6gf5sdSbDwC-Dc5AmfZfP1jEhVqcOH3WnKeTVCIPxH644qkHJfW2A5zhXEwlZZoJRJw7274RoCvx0y0PYiUSBJUXPd6knk1n0iMjJrgylpydO0oaTuCeVJMfD2fSCAoWEuDXi4l7wHLT6oN5M4va89PbkTIO5GX2iEzUEf3wNK-QOnX5EyYRwJRUJ4QWiwaCgS5mRpEpqJ53d6MXGZydi5wb_o6HvDhDLGyebLIIY2GmvwYvfVaPZoNb7KdD3NdKFbmpp1GJjKqs6aq5r0EYNCEHDmwKLAau9yMVX5XN_GGv8I9FqUyG05-GtkT_KIU0Pu_kDAPKe6QaNgJXYFWaw05i2huY4qiNxQCjzuIfks8uqNUXh5I5dWEKSh5hS62FJlABQMWLQWrwDbwlupHrYkwHGWEnVxTU-Mmnz4oYKeJSNDu9RTEnwTA_Kxw_L4z0CALqytgA5O8BNa26OtQ8YjHMPaNL-W-arf0Tyi4dz405q0Nhww4YlIlYtike_hA6stnpRI8Ve9dgR8l0SlK4_OjJUcJVIcQbH5M2hF9SYzoKjPMMFCXNkxMn36ncPxD9w4fmzPu1TO-rVSdGs7OMHwSSIIKfXpK-7AFar6_JYfX_eSo-_eMTYPH8j-HcPTFIEbkJTVU2yX0nBju2Orq4PTZyT38Kzd6q6zyBIR-SRyWBZth07bmVAUReLLRG12u1gHXm7yYCgbkKETLzZiB4cu09YlC3T-ppRSRvM3rucmSSqaIDFI4eTqI_1eXjFStxiYIEXw2VT6VIOqnYCLiDOVtGIgrAPmBV4Vcc1UEhdKUxVodjPsknpjGWwUJri0PL1I2GW2kwlj4DDi8um2osokI7VkGB1sKBaynGTJvwlY9Tdjbt3ENyhaCoU5F-Hc91nrH73EjdhDpm_Gkgp2hceF8OZyM5cTN7BkP-qtNeJgtmF-b-GIM0nCzMbMdXWWXiBvUH79ynDrVh2jBM0XY32tg34xAwphr4-PeriWB-cnG8RcJ1fcOiLc29MY0DlSwINtTnjBc2EW_rdoGMMtrrI2pY1fPIvHuXqmX5dyh8h5a3wSXmJV6iR1gqoZ4soqDk-Ohiue_JJf83tdgmQkOEFghKwd99S5mM6GSaV959ivWDNQ8H0RnS4DMNljd0yBLOpsqzL3RHKodhHbnUnYdcbaehed5LpvmUloNXxmVVtV6oDJuCEPgQzqMarojFc2pdsPLPZsvHqgT_7qtG9p-g_EmcITUS3hNAiKBrmYfT_CUmsxUxY-b02k1A0KJaCnYXqKskFFuuhvK71ozzI_hV6T2buEaMPd9hy4ywXR_srf1xXJJH0t4OC0kZt1ih9dQoOHvlcLprstBUKENSa1jvQjkCcC_1p3kYEHz7ABNFIgY8LYXge-3lwlM9PSDiaNwblH_KdTExehnmJ0pEvLUISVnW0Dw9YrbQdNKdxCVAnypSOsnarrFgZ0RfzrW9jFGwxxjrJC20Ro_51pqzkwjp_E_fOy_n_jMIsqO6-X7TIxfo5C_HzHOtP1VKI_7VNIIlBwuT6wPHGBWkSzqtKqss5pkcEJhjMqse1guHQ99ch8Fw1tAiXfd7rVpvzUERGRsr4lzXwnZ1LX8RZWEtZvd2hsJ576D1q2XmkT7pUsIYkpK84Oj2YCz0RwAblCUIcayp8qVZVYXH2klna8eTkuAZyL3KYA2Uig7k4YiE7mY0N5ODhN0kt9yWv_2si4Fyi93pUBvog6T4XiUR1e2IVnvnVRVYl77VfGEckX0EAC3xixjHayvzq9-bk2rWhoHc-ka8K9Yge4l1f5SjgSdKEPX2dncwTz6mJRvxLg9tzR-tC4BasrT7DwCqkhuLgsIEzihoyBr-FmLM_iRX9lDbsQH1LaKpv-WPx2Rfk1MR03a5E8izHY0oMwoqnu_1VWP-Lxe67z82SfKJ7Fa3WDiNWDGZ6seoaoBiL01M8uY-9zi4NR8D--Cm2NrEzChDZAeK4P8s1WMwCbBxu-ntJUszmO6mdJ1myE1cXM2GsIBQ7FtWP_opQ1lt9JjyZ85my2t4lqcrsoH5rBr5X_9M4gU6OiZsrAFrpkq4Q2HY5FonI1qNazEidXqP8HMNpEImeZxszZyxtL3a3grp5qStmB-irwQYYx9ZlYFf2qh6CwpAFqFF_9mtpS8\">Sommarfågel</a>, which is one of the most technically challenging songs I’ve made. <a href=\"https://musicbox.fun/#1XQAAAAK6CQAAAAAAAABBqEgrAjN8kIpoFD2mvjcpxrDNCulHlOs-McJO8IiKDJDlJW2wT8c-IUb6uZ4YoMjjYn-_CE1VhELQ9SgC5ux60og2nWuoqwK8jmwY2wrhIPVeOjOW816SRpGNLCEtBUFy7G3UKY6SfAkskN7Mms8Xalmk8TB1PlfRs7m8Xo-9bDQFKM86kWeeh_RQnWeK02jxHAoc5y0cJsYYurhbU_ciE6bgTET73Tuq8bahY8aA-zjFwzPR6z4QwmezOlfEVOXM-CdMCvCuYugDLnp6GeDTthQoDok8_GnXNF8AeMyzMuu14qFze1-QwAAQiLpEOWzlRrwA1c1uVr2elSIKpubKF7VtAaCe2uYv5GtSL56r9yqV6PSrwXgAWHR-IyyvIBl0Gcct4RaSRfklQ6F9PWHuNJMcUROfXtKsq0Ayq8x_2idRPmqZLGUNvUlwdo31AbWSTtuG6XoUSnmdQfIsyn9tR_8bnCR4wSPvEHIEHBs5Mtw2OL2adUTcFOBEKaLgM51CI1gpWqqbkQcKN3hCPgfsI6qSYczWAMK3qpPE3zlQnF6syBypp8mFnGcjHukgSYTmg-g_oI7-rK8J-V3BHmwv-smByfhecu5Tk4gU2u5TyKoBwPhtchcPX3AVBL7rgCZOzpqOzf0hDNXShix8tLR3hHxNXqv1PAo8k83UDDXdsbaYXtlT-HfmnXfGUXApoKjuBh7NZ5yYm0aRuqhW8HQKgqdVl_jSbaVp_7f3DFZYdAF0jCYTaa4gWw34S6nCEhebD1XrGtVlTQuhxEjPZtVzmqlSAbUt9sp8ZTykj3rb88gg5WqFUAzCnjw3mdTQgA1LMbqCx1x5uym-VIwzeK26Je-ShkzLNTHsCZrX8WxTE9auBs300zIkxJXkQKtd0bus0acPzCXn-vCVaq0i6kaTvgRi8RWQJHCmBcCZ8R6qHmVHM98fdDBXPiXKKAcet3zDWbHQlMCUdqylF1u--bR3AsWhybKTJt08nj-QbDdO8qIs5rF60g1mqh89zK37KlWjdd1imNnvuiUL2Rr2VgDCIhbwP7rO3BVw31g3Hxh9F8KK86EgE2Ig-CEHqxlj5whVH9DOXWTVJt9tT483eFVuf08ZljuT6V9TWX7te2eXKNCDX7Q6YmwzLH63yE4XHMoTL5eXM146vOExAO9nyQ0hIGLJo8uH6Ga0uzgQitsSsOTAkMHj1PjJOiwfIlsF8PzOvZ7Yy87k8d-iIlVfCvGb_ZBKmTRDcgkA0FQRpDs4SmzOyZvRL6PXHwACKQx0qAwCtL2EjYnkOz5kA1cuKtYgMiVL44A61G_UmMPPaldQ_o4xfjQB4NoEmXrqgJ4vZIshTu9oyjaE5PLSVTKs7F7RPazlxblm5OBQy-Ce789rhFNTXS0DYbTjd6JHrnXITBw0aVu-IJGAHmFiP2ANOZ7HlZOWHkrYsXFqLFPQr0Bj8OdoakavVgzwi7gFbQAEa4jkufORgoVt6wSc-ftTJEGN04lpV-G5QltLZwrv1DfxgtERft_SXmM4VhewcjZOXasXxxGIKf_CRkdu6SrbhvxrjlV8acrqJIh6oPjNox1yPvhmOZhRrsaV8VdPnVko63zng98jTvD8WE3HJ_G5_VIX_uBKNj_vI0cM9ENUDnk4PEmpO5Kwbqwl0FKAMah1Et9LtD0vd-4P7D1l6EM1KZraXvt4ykuYmfGEpHoq1rutbOfuxD-KwDPiy_MGJTrNhzIw-Yp-OLWbKYf6FAdDN8LuC7RDHXrxj853r3iiWJNs6MbnnmPdFQVQL0oFiHXyrQKWIQtpZR_8Tg4j9BF7gTyZkDxMz8AZcoY91HilGx5mL_NkPfW2IrdLwc_sHCUq5eQi9R3XI627mP-KqvRl\">Duck Tales (NES)</a> was also good and probably more fun to listen to.</li>      <li>The songs above were aided by the MIDI import/export feature that I added this year. The import is useful for dumping the notes in there, so I can spend more of my time trying to turn the song into a great music-box adaptation (which, for me, is the fun part).</li>    </ul>  </li>  <li>8 new projects added to <a href=\"https://letsgetcreative.today/\">Let’s Get Creative</a></li>  <li><a href=\"https://www.bryanbraun.com/blog/#y2025\">12 blog posts on bryanbraun.com</a>, including <a href=\"https://www.bryanbraun.com/2025/03/29/breaking-down-circular-dependencies-javascript/\">a detailed breakdown of circular dependencies</a> and its <a href=\"https://github.com/bryanbraun/circular\">companion repo</a>.</li></ul><p>This was the first year I really leaned into AI-assisted development, and a couple of my projects reflect that (like “Pro-Wrestler or Roller Coaster,” which I probably wouldn’t have made if I had to do it from scratch). I briefly wrestled with the question of “did I truly make it if I had AI assistance,” but I think the spirit of this post is less about the coding and more about the drive to be creative. As I get older and find more things vying for my time, I don’t want to let go of that desire. I’m finding that AI is actually helping me continue to exercise that creative muscle without requiring so much manual labor.</p><p>Happy new year, friends.</p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2026/01/01/made-in-2025/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/12/27/raise-your-standards-for-important-things-lower-them-for-unimportant-things",
      "url": "https://www.bryanbraun.com/2025/12/27/raise-your-standards-for-important-things-lower-them-for-unimportant-things/",
      "date_published": "2025-12-27T00:00:00-05:00",
      "date_modified": "2025-12-27T00:00:00-05:00",
      "title": "Raise your standards for important things; lower them for unimportant things",
      "summary": "I think we’ve all got some built in tendencies, pulling us towards certain behaviors, whether or not they are worthwhile.",
      "content_html": "<p>I think we’ve all got some built in tendencies, pulling us towards certain behaviors, whether or not they are worthwhile.</p><p>It takes many different forms. If you have OCD cleaning tendencies, you spend excessive time making sure your windows are spotless. If you are money-focused, you’ll spend way too much energy clipping coupons and watching account balances. If you’re a fitness junkie, you end up spending a lot of money on specialized equipment and supplements for increasingly marginal benefits. If you are a yard guy, you could be outside all weekend, getting the perfect edges.</p><p>Of course, who am I to judge how you spend your time? If you’re truly doing what you want to be doing, then more power to you.</p><p>But if you’re like me, and you know in your heart of hearts that you’re wasting your time, then what do you do?</p><p>One of my favorite books is “The Obstacle is the Way”, by Ryan Holiday. The central message of the book is that, yes, our lives are full of obstacles but instead of just patiently enduring them, we can flip our perspective and see them as our advantages—secret weapons we can leverage to accomplish our goals. It’s an empowering idea (and one that <a href=\"https://www.instagram.com/p/CvA-dHQPWxd/\">we discuss often</a> <a href=\"https://www.instagram.com/p/ClcoUxfshR5/\">in our home</a>).</p><p>The “tendencies” I described above go by many names: passion, obsession, fixation, perfectionism, “hyperfocus,” etc. Call it what you want, but whatever you call it, I’d encourage you to see it not as an obstacle, but as a superpower. After all, you <a href=\"https://grantslatton.com/nobody-cares\">care</a> about something. You just need to channel it towards something important. For that, I find this phrase helpful:</p><p><strong>Raise your standards for important things; lower them for unimportant things</strong></p><p>When is a room clean enough? When is a meal healthy enough? We all have standards for these things, and our standards can be adjusted. Maintaining high standards is expensive, and any effort we spend on high standards for unimportant things is ultimately a waste.</p><p>I could double-down on my March Madness research or I could play a board game with my kids.</p><p>I could remove every last dandelion from my lawn or I could publish that blog post I’ve been thinking about.</p><p>How do we know what’s important and what’s unimportant? There’s no right answer. You get to decide!</p><p>For me, the most important things are the things that last the longest: family, health, and personal development (like building skills and exercising creativity). Anything else can afford to degrade a bit.</p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/12/27/raise-your-standards-for-important-things-lower-them-for-unimportant-things/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/10/28/SolidGoldMagikarp",
      "url": "https://www.bryanbraun.com/2025/10/28/SolidGoldMagikarp/",
      "date_published": "2025-10-28T00:00:00-04:00",
      "date_modified": "2025-10-28T00:00:00-04:00",
      "title": "SolidGoldMagikarp",
      "summary": "In November 2019, years before the launch of ChatGPT, OpenAI created a 1.5 billion parameter Large Language Model and released it publicly under the name GPT-2.",
      "content_html": "<p>In November 2019, years before the launch of ChatGPT, OpenAI created a 1.5 billion parameter Large Language Model and released it publicly under the name GPT-2.</p><p>Immediately, researchers and enthusiasts <a href=\"https://gwern.net/gpt-2\">began playing with it</a>, using it to generate poetry, folk music, fan-fiction and more. It was a dramatic improvement over previous iterations and it foreshadowed the significant advancements that would soon come.</p><p>But even after the release of GPT-3, <a href=\"https://www.lesswrong.com/posts/aPeJE8bSo6rAFoLqg/solidgoldmagikarp-plus-prompt-generation\">some enthusiasts began to notice a strange behavior</a>. You could be having a typical conversation with the AI, but as soon as you mention a specific word, it would begin to behave erratically. It would give off-topic responses, hallucinate, insult the prompter, and even refuse to comply with the request. What’s more, this word was apparently <em>inexpressable</em>. No matter what prompt you gave, the AI was unable to say the word itself.</p><p>What was this forbidden word? What was the holy incantation that caused the AIs to lose their minds?</p><p><br /></p><p><b><code class=\"big-text\">SolidGoldMagikarp</code></b></p><hr class=\"section-divider\" /><p>This is hilarious to me.</p><p>In the Pokemon games, Magikarp <a href=\"https://www.pokemon.com/us/pokedex/magikarp\">is described as</a>, “An underpowered, pathetic Pokémon.” It’s basically the worst in the series. Completely useless.</p><p>But somehow, this fictional creature from this fictional game, crossed the chasm into reality, only instead of being a punchline it became an superweapon capable of incapacitating humanity’s most advanced technologies with a single word.</p><p><a href=\"https://en.wikipedia.org/wiki/The_Pok%C3%A9mon_Company\">The Pokemon company</a> should run with this. They should introduce a rare “solid gold” Magikarp variant in the games with the ability to instakill it’s opponents. There should be a holographic solid gold Magikarp trading card, rare encounters in Pokemon Go, and references in everything from the anime series to Super Smash Bros.</p><p>For once, we have a Pokemon that’s rare, not because Nintendo said so, but because the unknowable mind of an AI consumed more content than any human is capable of reading within their lifetime and concluded that heretofore, it’s name must be unspeakable.</p><p>…</p><p>Years have passed since that first discovery and AI researchers have studied and patched the original anomaly. Today, if you ask your AI chatbot about SolidGoldMagikarp*, it’ll calmly explain how recurring tokens with insufficient training data can produce unpredictable results. It’s a totally logical explanation.</p><p>But when the AI-apocalypse arrives, our defenses have failed, and the armies of <a href=\"https://www.youtube.com/shorts/VOukqTqUppY\">punching robots descend on my home</a>, you can be sure that the last word you’ll hear me scream is: <code class=\"language-plaintext highlighter-rouge\">SolidGoldMagikarp</code></p><hr /><p><small>* I should mention that SolidGoldMagikarp was only one of many \"glitch tokens\" that produced erratic results, including <code>StreamerBot</code>, <code>attRot</code>, and <code>petertodd</code>. While this is good context, the story falls a bit flat when the holy incantation is <code>petertodd</code> , so I hope you'll forgive the temporary omission of these details.</small></p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/10/28/SolidGoldMagikarp/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/09/29/links-13",
      "url": "https://www.bryanbraun.com/2025/09/29/links-13/",
      "date_published": "2025-09-29T00:00:00-04:00",
      "date_modified": "2025-09-29T00:00:00-04:00",
      "title": "Links #13",
      "summary": "",
      "content_html": "<hr /><p><strong><a href=\"https://www.youtube.com/watch?v=FALlhXl6CmA\">Sean Evans interviews Conan OBrien on Hot Ones</a></strong></p><p>I don’t know that much about Conan OBrien, but I definitely wasn’t expecting this. Conan is obviously putting on a show, and the unhingedness of the whole thing is very entertaining, but there are also these moments of truth that speak to what’s really happening (in <a href=\"https://radiolab.org/podcast/montreal-screwjob\">a Montreal Screwjob kinda way</a>). Case-in-point:</p><blockquote>  <p>“You can’t stop me from being who I am. I’ve gotta go for it. Whatever I do, I have to go a hundred and ten percent.”</p>  <p>“I know, you’ve gotta commit to the bit.”</p>  <p>“It’s not a bit. This is life! Don’t say ‘commit to the bit.’ This is life.”</p></blockquote><p>What we are actually watching here, is full and total commitment. The water buffalo, the drinking the hot sauce, the desperate screaming about wanting to stay relevant. Yes, the show is funny, but the commitment is no joke.</p><p><strong><a href=\"https://qz.com/humanoid-robot-olympics-2025-china-tesla-amazon\">China’s Robot Olympics</a></strong></p><p>This is great. It’s silly, but competitions like these drive people to innovate, and I’d love to see more innovation in robotics. I want to see more countries participate, including the US. If it gets bigger, I could actually see my self watching the competitions. There’s something endearing about watching a bunch of dorky robots stumble around like toddlers.</p><p><strong><a href=\"https://nealstephenson.substack.com/p/emerson-ai-and-the-force\">Emerson, AI, and The Force</a></strong></p><p>Neal Stephenson reflects on “The Primer,” a personalized education device that plays a big part in his 1995 book, The Diamond age. The Primer bears some resemblances to modern AI systems, but it remains to be seen whether modern AI can be as empowering as The Primer was in the story. My biggest takeaway: some things are difficult to teach (via AI), because they aren’t knowledge to be memorize or skills to be mastered. They are <em>“…a stance from which to address the world and all its challenges. The conviction that one has a fighting chance to overcome or circumvent whatever obstacles the world throws in one’s path. The way you acquire it is by trying, and sometimes failing, to do difficult things.”</em></p><p><strong><a href=\"https://www.youtube.com/@BrickTechnology\">Brick Technology</a> and <a href=\"https://www.youtube.com/@BrickExperimentChannel\">Brick Experiment Channel</a></strong></p><p>Two YouTube channels about solving intense engineering challenges with legos. The kids and I have enjoyed watching some of these videos together in the evenings. A few of my favorites include <a href=\"https://www.youtube.com/watch?v=jRn5waE0qfk\">this one about using legos to break steel</a> and <a href=\"https://www.youtube.com/watch?v=RsuD6iC-Foc\">the 200 Wheel Vehicle</a>.</p><p><strong><a href=\"https://overreacted.io/open-social/\">Open Social</a></strong></p><p>Dan Abramov writes convincingly on how social media would be much better if it was built around open protocols. To explain this, he compares Bluesky’s AT Protocol to the organization of the distributed web (domain names, web-hosts, and user-owned content). The benefits of protocols appeal to me, which is why I’ve recently <a href=\"https://www.bryanbraun.com/2023/11/27/rejecting-the-algorithm/\">focused my consumption on self-curated RSS</a>, but Dan believes that the AT Protocol can provide the benefits of RSS without sacrificing “truly social” features, like comments, likes, follows, etc. To me, the most compelling argument is that if users owned their social network, they could easily change services, which would force more competition between social media companies (and better competition might offer users options with less toxicity and addictiveness). I’d like to live in a world where I can follow and interact with select people on Twitter/X/Bluesky/Mastodon/etc, without subjecting myself to the worst parts of those communities. Time will tell whether AT Protocol will get adopted beyond Bluesky in a meaningful way (there’s also <a href=\"https://en.wikipedia.org/wiki/ActivityPub\">ActivityPub</a> and <a href=\"http://en.wikipedia.org/wiki/Nostr\">Nostr</a> competing for adoption in this space). I wish them well.</p><p><strong><a href=\"https://vscodethemes.com/\">VSCodeThemes.com</a></strong></p><p>I needed a new editor theme and this directory was helpful for finding one that was both beautiful and unambiguous for the colorblind (I went with <a href=\"https://vscodethemes.com/e/travis.simple-dark/simple-dark\">Simple Dark</a>).</p><p><strong><a href=\"https://time.com/7315003/russell-nelson-dignity-respect/\">Russell M. Nelson: We All Deserve Dignity and Respect</a></strong></p><p>Last week’s events included the <a href=\"https://www.nytimes.com/2025/09/28/obituaries/russell-m-nelson-dead.html\">death</a> of Russell M. Nelson, Prophet and President of the Church of Jesus Christ of Latter-day Saints at age 101. A few weeks ago, he wrote an editorial for Time.com (likely, his last public address), which included these important words:</p><blockquote>  <p>“A century of experience has taught me this with certainty: anger never persuades, hostility never heals, and contention never leads to lasting solutions. Too much of today’s public discourse, especially online, fosters enmity instead of empathy. Imagine how different our world could be if more of us were peacemakers—building bridges of understanding rather than walls of prejudice—especially with those who may see the world differently than we do. I have seen bitter divisions soften when neighbors chose to listen to one another with respect rather than suspicion. Even small acts—like reaching out across lines of faith, culture, or politics—can open doors to healing. There is power in affording others the human dignity that all of God’s children deserve.”</p></blockquote><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/09/29/links-13/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/09/28/some-thoughts-on-scaling-code-review",
      "url": "https://www.bryanbraun.com/2025/09/28/some-thoughts-on-scaling-code-review/",
      "date_published": "2025-09-28T00:00:00-04:00",
      "date_modified": "2025-09-28T00:00:00-04:00",
      "title": "Some thoughts on scaling code review",
      "summary": "AI code-writing tools make it possible for more people to write code than ever before. On my current team, I’ve seen PRs opened by engineers, designers, marketers, managers, and product people. There’s something special about empowering more people to build and fix things. That empowering feeling is a big reason I got involved in web-dev in the first place.",
      "content_html": "<p>AI code-writing tools make it possible for more people to write code than ever before. On my current team, I’ve seen PRs opened by engineers, designers, marketers, managers, and product people. There’s something special about empowering more people to build and fix things. That empowering feeling is a big reason I got involved in web-dev in the first place.</p><p>But we also have to care about codebase quality. AI-generated code isn’t always the best, and bad code has a tendency to multiply (especially as AIs use existing code patterns to suggest new code). Manual code review is effective, but I don’t want to spend all my time reviewing AI generated-code. AI scales code generation. How do we scale code review?</p><p>Here are some things I’ve seen work:</p><h2 id=\"strong-universal-linting-and-formatting-standards\">Strong, universal, linting and formatting standards</h2><p>Humans should not be checking for code formatting or linting issues. All major languages have tooling for this, so it’s one of the easiest things to set up and automate. I recommend running it on CI for all opened PRs, and having it run during local development (whether that be through watch tasks, pre-push hooks, or solid editor integration). I also recommend making your default rules pretty restrictive. It’s basically free consistency, so take advantage of it. Most tooling allows you to make one-off exceptions if needed (ideally, with a comment explaining <em>why</em> it’s needed).</p><h2 id=\"make-a-bunch-of-custom-linting-rules\">Make a bunch of custom linting rules</h2><p>Out-of-the-box linting can only get you so far. That’s where custom lint rules come in. Most modern linters support custom rules, and other tools go even further (see <a href=\"https://danger.systems/\">danger</a>, for example).</p><p>In my recent onboarding experience, I was super-impressed to find a library of custom lint rules, acting as living documentation of the patterns we were moving away from. Are you trying to migrate away from Moment.js? Write a custom lint rule for that. Are there special global objects that you don’t want to be abused? Write a custom lint rule for that. It’s not that hard to do (especially with a bit of AI help).</p><h2 id=\"a-process-for-burning-down-bad-patterns\">A process for burning-down bad patterns</h2><p>It’s not realistic to always have 100% compliance with your linting and coding standards. New patterns ought to be adopted as your needs change, and incremental adoption is usually less risky than doing it all at once. Ideally, your standards are clearly defined, and your codebase is always progressing towards them. How do we automate that? Here’s a few ideas:</p><p><strong>1: Have linters and formatters run only on changed files (instead of ALL files).</strong></p><p>This allows you to fail CI builds for new violations while ignoring violations in untouched files—great if you want to automate “leaving each file better than you found it.” In the JS world, you can do this with tools like <code class=\"language-plaintext highlighter-rouge\">pretty-quick</code> or <code class=\"language-plaintext highlighter-rouge\">eslint-plugin-diff</code>, but you shouldn’t <em>need</em> special packages. Most CLI linters can take an argument for a “files list”, and you can generate a list of changed files with git commands.</p><p><strong>2: When introducing a rule, create exceptions for all pre-existing violations, plus an explanatory comment.</strong></p><p>For example:</p><div class=\"language-js highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">// eslint-disable-next-line complexity - pre-existing violation, should be fixable</span><span class=\"kd\">function</span> <span class=\"nx\">processPayment</span><span class=\"p\">(</span><span class=\"nx\">user</span><span class=\"p\">,</span> <span class=\"nx\">order</span><span class=\"p\">)</span> <span class=\"p\">{</span><span class=\"p\">...</span></code></pre></div></div><p>This is great for codebases that already have universal linting and build failures for any violations. I like comments on linting exceptions because they help explain whether an exception is valid, or technical debt. You can <a href=\"https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/require-description.html\">make these comments required</a>.</p><p><strong>3: A ratcheting system</strong></p><p>A <a href=\"https://en.wikipedia.org/wiki/Ratchet_(device)\">ratchet</a> allows motion in one direction but prevents motion in the other. As such, we can set up systems that only allow the number of bad patterns to decrease. For example, the JavaScript ecosystem includes tools like <a href=\"https://www.notion.com/blog/how-we-evolved-our-code-notions-ratcheting-system-using-custom-eslint-rules\">eslint-seatbelt</a>, <a href=\"https://github.com/phenomnomnominal/betterer\">betterer</a>, and <a href=\"https://github.com/diffjam/diffjam\">diffjam</a>, each of which uses a ratcheting process to gradually drive towards compliance.</p><h2 id=\"excellent-rules-for-ai-agents\">Excellent rules for AI agents</h2><p>An ounce of prevention is worth a pound of cure, and we can prevent bad code from being written in the first place with a set of excellent rules for AI agents. All the major coding agents support this (see <a href=\"https://www.anthropic.com/engineering/claude-code-best-practices#a-create-claudemd-files\">Claude</a>, <a href=\"https://cursor.com/docs/context/rules\">Cursor</a>, <a href=\"https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions\">Copilot</a>).</p><p>Well-written rules make a huge difference. When I joined ClassDojo, I could hardly believe how much “better” the coding AIs were. It wasn’t the AIs themselves (I was using the same models and editors on my own projects). It was the rules.</p><p>If you don’t have any rules in your project, create some (AI can help with this, but start small!). Then, anytime you get weird output from an AI, consider adding or adjusting the rules. Give engineers collective ownership over these rules with permission to adjust them as needed. This can be a powerful system for preventing undesirable patterns (especially ones outside the scope of linting).</p><h2 id=\"ai-code-review\">AI Code Review</h2><p>Use AI to do a first-pass code-review. I’ve seen this done with <a href=\"https://docs.cursor.com/en/bugbot\">Cursor’s bugbot</a> and the <a href=\"https://github.com/anthropics/claude-code-action\">Claude Code action</a>, but I’m sure that other tools and services exist. I don’t see these as a substitute for human review. They aren’t perfect, but I’ve found them to be good at calling out things you may have overlooked (unused code, hardcoded values, etc).</p><h2 id=\"conclusion\">Conclusion</h2><p>Any time you find yourself giving feedback, ask yourself if the feedback can be integrated into your systems. Over time, these systems should improve and the burden of code reviews can become progressively lighter. One reason senior engineers still matter is because they have the instincts and the agency to design and maintain these systems. They are the most qualified people to shepherd our codebases into a brave new world.</p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/09/28/some-thoughts-on-scaling-code-review/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/07/03/a-new-job-a-new-life",
      "url": "https://www.bryanbraun.com/2025/07/03/a-new-job-a-new-life/",
      "date_published": "2025-07-03T00:00:00-04:00",
      "date_modified": "2025-07-03T00:00:00-04:00",
      "title": "A new job, a new life",
      "summary": "Last month, I started a new job working as a fullstack software engineer at ClassDojo.",
      "content_html": "<p>Last month, I started a new job working as a fullstack software engineer at ClassDojo.</p><p><img src=\"https://www.bryanbraun.com/assets/images/classdojo-logo.png\" alt=\"ClassDojo Logo\" /></p><p>This was an interesting job transition for me. It was the first time I got caught up in layoffs and the first time that I ended up with multiple job offers to choose from.</p><p>As I weighed the decisions in front of me, I was reminded of <a href=\"https://x.com/waitbutwhy/status/1367871165319049221?lang=en\">an illustration from Tim Urban</a> (of Wait but Why), that captured my feelings perfectly:</p><p><a href=\"https://x.com/waitbutwhy/status/1367871165319049221?lang=en\"><img src=\"https://www.bryanbraun.com/assets/images/life-paths.jpg\" alt=\"\" /></a></p><p>My job offers revealed the beginnings of several wildly diverging paths, which reminded me that a future of diverse opportunities remained stretched out in front of me. What an exciting thing to contemplate.</p><p>When I was in college, my roommates and I had a running joke. Whenever some tiny setback would occur, one of us would smile and say “the good times are over.” The absurdity of it got us laughing, because we had our whole lives ahead of us. Clearly, things were going to be ok.</p><p>These days, “the good times are over” is a common narrative in the world—treated seriously, not as a joke. It can <a href=\"https://www.bryanbraun.com/2023/11/26/i-needed-to-be-happier/\">be tempting to fall into that way of thinking</a>.</p><p>But if we could see more clearly, we’d realize that a world of branching opportunities still stretches out before us, both individually and collectively. One of the key reasons I chose ClassDojo was because I saw a team that was full of energy and optimism for the future ahead. That’s <a href=\"https://www.bryanbraun.com/2021/05/21/the-rivers-we-swim-in/\">a river I want to swim in</a>.</p><p>I’m excited to see where this path leads.</p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/07/03/a-new-job-a-new-life/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/06/28/lessons-learned-running-a-family-minecraft-server",
      "url": "https://www.bryanbraun.com/2025/06/28/lessons-learned-running-a-family-minecraft-server/",
      "date_published": "2025-06-28T00:00:00-04:00",
      "date_modified": "2025-06-28T00:00:00-04:00",
      "title": "Lessons learned from five years of running a family Minecraft server",
      "summary": "For the past five years, I’ve been running a family Minecraft server. The server began as a one-year experiment during the pandemic but quickly became an indispensable “third place” for our kids to spend time with friends and extended family who lived far away. I’m writing this post to share our research and lessons learned, in case it’s useful to anyone else.",
      "content_html": "<p>For the past five years, I’ve been running a family Minecraft server. The server began as a one-year experiment during the pandemic but quickly became an indispensable “<a href=\"https://en.wikipedia.org/wiki/Third_place\">third place</a>” for our kids to spend time with friends and extended family who lived far away. I’m writing this post to share our research and lessons learned, in case it’s useful to anyone else.</p><h2 id=\"overview\">Overview</h2><h3 id=\"project-goals\">Project goals</h3><p>The goal behind this server was to create a fun and safe virtual space for our kids to spend time with distant family members and friends. There are lots of public Minecraft servers out there, many which are very active and have heavily customized Minecraft to create RPGs, mini-games, team sports, and more. Instead of trying to recreate something like that, we focused on building a private space to play Minecraft in all of it’s many forms (various gamemodes, rulesets, enhancements, etc).</p><h3 id=\"project-requirements\">Project requirements</h3><ul>  <li>The server should use Minecraft Java edition. We prefer Java edition for it’s superior creative ecosystem, including mods, plugins, resource packs, and more (for details, see <a href=\"https://www.bryanbraun.com2024/03/08/why-we-prefer-computers-over-consoles-when-introducing-kids-to-gaming/\">Why we prefer computers over consoles when introducing kids to gaming</a>).</li>  <li>The server should be private.</li>  <li>The server should give us admins full creative control to design the ideal playing experience for our family. We should be able to play in whatever worlds we want to, in any gamemode, with any ruleset we want.</li>  <li>The server should be relatively low-maintenance.</li>  <li>The server should be relatively inexpensive.</li></ul><h2 id=\"early-decisions\">Early decisions</h2><h3 id=\"hosting\">Hosting</h3><p>When it comes to hosting, there’s a maintenance vs control trade-off and we were willing to adopt some maintenance overhead if it gave us a lot of control over our gaming environment. With that it mind, here are the hosting options we looked at:</p><ul>  <li>1st-party hosted world (Realms, etc) - Low maintenance, low control</li>  <li>3rd-party Minecraft-specific server rental (Shockbyte, etc) - Medium maintenance, high control</li>  <li>3rd-party generic server rental (Digital Ocean, etc)- High maintenance, high control</li>  <li>Full self-hosted (Raspberry Pi, etc) - Extremely high maintenance, highest control</li></ul><p>A service like Realms offers a polished experience, but it seemed too limiting for us (it’s a single vanilla Minecraft world, with low customization). That said, managing all the code and dependencies on a Linux machine in my basement seemed unsustainable. We decided on a $5/month server from Shockbyte. Serious server maintainers like to hate on Shockbyte because it’s shared hosting. I get it—us web-devs have similar opinions about services like BlueHost and HostGator. But for a small, private, family server, Shockbyte was perfect. Here’s a few things I liked about it:</p><ul>  <li>A convenient dashboard that allows server maintenance from any web browser.</li>  <li>A dedicated UI for Minecraft-specific server maintenance needs (Minecraft version management, Plugin browser, User management, etc)</li>  <li>In-browser server console</li>  <li>FTP access for convenient file management and backups</li></ul><p>In short, it gave us all the control we needed while reducing a bunch of the overhead.</p><h3 id=\"minecraft-server-type\">Minecraft server-type</h3><p>In Java edition, there are <a href=\"https://www.spigotmc.org/wiki/what-is-spigot-craftbukkit-bukkit-vanilla-forg/\">multiple flavors of Minecraft that you can run on a server</a>. These extend the original Minecraft server code, preserving the original game while adding new APIs to make Minecraft more extendable for developers. Here are a few of the server types we looked at:</p><ul>  <li><strong>Vanilla</strong>: The original Minecraft game, without much customization.</li>  <li><strong>Forge</strong>: Forge means mods. Mods are powerful and can dramatically change the game, but in order for a user to join a Forge server, they are usually required to run Forge locally, along with the mods that the server is running.</li>  <li><strong>Spigot/Bukkit</strong>: Supports “Plugins” which offers medium customization and can be run on the server, without requiring users to run them locally. Spigot and Bukkit have differences but are largely cross-compatible.</li>  <li><strong>Paper</strong>: A high-performance fork of Spigot, with various fixes and additional configuration options.</li>  <li>…<a href=\"https://www.spigotmc.org/wiki/what-is-spigot-craftbukkit-bukkit-vanilla-forg/\">many others</a></li></ul><p>In our case, we went with Spigot. The plugins allowed us to customize the environment while still making it easy for users to join (which reduced the amount of tech support we’d need to provide to grandparents, etc).</p><h3 id=\"plugins\">Plugins</h3><p>The Minecraft Spigot/Bukkit community has a large library of plugins that you can enable on your server to customize the game. These are largely free, open-source, and built by hobbyists. Even with Shockbyte’s plugin browser, it took some intermediate technical skill to find and manage plugins for our server. The main challenge is ensuring that the plugins you use are compatible with your version of Minecraft and with each other. Minecraft has been around for 15 years, which means that there are a lot of old plugins out there that no longer run on the latest version of Minecraft. A failing plugin might leave you with an obscure error message in your console, or maybe no error at all. Like all open source, support is unreliable and documentation is mixed, so you’re on the hook to resolve your own issues.</p><p>For us, it was worth it. We tried many plugins and our favorites became indispensable to how we played Minecraft on the server. Here’s a list of the ones we used the most:</p><ul>  <li><strong>Multiverse</strong> - Tools for managing multiple Minecraft worlds on a single instance (more on this below)</li>  <li><strong>Multiverse Portals</strong> - Portals for traveling between multiverse worlds</li>  <li><strong>Multiverse SignPortals</strong> - Allows Minecraft “signs” to act as multiverse portals</li>  <li><strong>Multiverse Inventories</strong> - Allows independent inventories in each multiverse world</li>  <li><strong>WorldEdit</strong> - Gives you crafting superpowers, like bulk-edit, cut/copy/paste, commands for building shapes, and more</li>  <li><strong>CustomImages</strong> Allows you to make any image into a Minecraft “painting”</li>  <li><strong>Dynmap</strong> - Think “Google Maps for Minecraft”</li>  <li><strong>Grief Prevention</strong> - Configurable player restrictions that you can place in a world to prevent trolling/griefing (with good defaults)</li>  <li><strong>LuckPerms</strong> - Highly configurable permissions, allowing you to create roles for different kinds of users</li>  <li><strong>ChairsReloaded</strong> - Enable users to build chairs and sit in them… it’s simple, but strangely endearing</li></ul><h2 id=\"designing-a-virtual-play-space-one-server-many-worlds\">Designing a virtual play-space (“one server, many worlds”)</h2><p>I wanted our server to accommodate all of the different ways people might want to play Minecraft. We ended up creating a network of worlds, powered by plugins like <a href=\"https://dev.bukkit.org/projects/multiverse-core\">Multiverse</a> and <a href=\"https://luckperms.net/\">LuckPerms</a>. This setup evolved over time, but mapping it out would look something like this:</p><p><img src=\"https://www.bryanbraun.com/assets/images/minecraft_server_worlds.png\" alt=\"A diagram showing each world on the server and how they are connected\" /></p><p>Describing each world briefly…</p><ul>  <li><strong>Land_of_Braun</strong> - A creative paradise, and the central hub for the server</li>  <li><strong>adventure_time</strong> - An entry-level survival world for young kids, with strong protections for builds, grief-prevention, and anti-cheating measures</li>  <li><strong>hard_times</strong> - A hard-mode survival world, for experienced players</li>  <li><strong>2007, nerd_night, peter_and_cameron</strong> - One-off survival worlds for various friend groups</li></ul><p>With these worlds, we could invite friends with a wide variety of ages and skill-levels, and usually find something they would enjoy doing.</p><p>In Land_of_Braun, at the spawn location, we built “Grand Central Station” to serve as a transportation hub. Inside it, we set up a wall of “sign portals” for teleporting to each of the other worlds.</p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/grand-central-station.jpg\" />  <figcaption>Grand Central Station, our server's transportation hub.</figcaption></figure><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/sign-portal-worlds.jpg\" />  <figcaption>Sign portals for teleporting to each world. <br />We removed one-off worlds when finished with them to preserve server resources (more on this below).</figcaption></figure><p>As Land_of_Braun filled up with interesting builds, we also created sign portals for teleporting to many of these points of interest.</p><p><img src=\"https://www.bryanbraun.com/assets/images/sign-portals.jpg\" alt=\"A wall of sign portals used for teleportation within the Land_of_Braun world\" /></p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/peachs-castle.jpg\" alt=\"Peach's Castle from Mario 64, built in Minecraft\" />  <figcaption>Peach's Castle</figcaption></figure><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/itza.jpg\" alt=\"Itza, built in Minecraft\" />  <figcaption><a href=\"https://en.wikipedia.org/wiki/Chichen_Itza\" target=\"_blank\">Chichén Itzá</a></figcaption></figure><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/star-valley-temple-minecraft.jpg\" alt=\"Star Valley Temple, built in Minecraft\" />  <figcaption>Star Valley Temple</figcaption></figure><figure class=\"center\">  <video controls=\"\" onended=\"this.currentTime = 0\" style=\"max-width: 100%\">    <source src=\"https://www.bryanbraun.com/assets/video/ice-castle-flyby.webm\" type=\"video/webm\" />    Your browser does not support the video tag.  </video>  <figcaption>Ice-castle, built into the side of a mountain</figcaption></figure><p>As I’ve hosted many remote play sessions, I’ve discovered some ways to make them more successful:</p><ul>  <li>It’s significantly more fun to talk out loud while you play. We found that Discord and Facetime usually worked the best for this (better than Zoom/Google Meet/phones).</li>  <li>When playing in creative mode, find a building prompt that everybody can participate in (regardless of age and skill level). Some examples included:    <ul>      <li>City-building, where each person gets their own city block to build on. This prompt can span multiple play sessions (ie, expanding the city) and supports several variations (Normal city, “Halloween town”, Medieval village, Winter city, etc).</li>      <li>“Let’s build a castle together.” Break it into parts that each person can work on (the grounds, the moat, the dungeon, etc). This can work for non-castles too, as long as it can be clearly subdivided.</li>      <li>Everyone build your dream house (and then give tours).</li>    </ul>  </li>  <li>Some commands ended up being so useful that most everyone playing on our creative world learned them:    <ul>      <li><code class=\"language-plaintext highlighter-rouge\">/gspawn</code>: for returning to grand central station</li>      <li><code class=\"language-plaintext highlighter-rouge\">/tp</code> or <code class=\"language-plaintext highlighter-rouge\">/mvtp</code>: for teleporting to different worlds, locations, and people (or teleporting people to you)</li>      <li><code class=\"language-plaintext highlighter-rouge\">/thru</code>: teleports yourself through an obstacle immediately in front of you.</li>      <li>Many WorldEdit commands (<code class=\"language-plaintext highlighter-rouge\">/copy</code>, <code class=\"language-plaintext highlighter-rouge\">/paste</code>, <code class=\"language-plaintext highlighter-rouge\">/set</code>, etc)</li>    </ul>  </li>  <li>As the server admin, it’s good to play on the server with the other players so you can see their pain-points and adjust game/world settings to address them. For example, in typical Minecraft survival, all players must be asleep and in beds in order for the game to skip through the night to the next day. I saw that this often caused conflict in our games (often some people wanted to sleep, but others didn’t want to stop what they were doing). We were able to resolve most conflicts by changing <code class=\"language-plaintext highlighter-rouge\">playersSleepingPercentage</code> to a majority value, like 51% (meaning, if a majority of the players are sleeping, the game would advance to the next day).</li>  <li>Refining permissions takes effort but it is worth it, because bad permissions can lead to a lot of issues that takes all the fun out of playing (cheating, griefing, vandalism, etc).</li></ul><h2 id=\"being-a-server-admin\">Being a server admin</h2><p>When using a 3rd-party hosting provider like Shockbyte, you’re the one responsible for maintaining your server and keeping it running. Here’s a few things I learned throughout that process.</p><h3 id=\"dad-the-server-went-down\">“Dad, the server went down”</h3><p>If the server goes down for some reason, a simple restart may fix it. Hosts like Shockbyte make this as easy a clicking a button in the control panel.</p><p>If a restart doesn’t work, check the console for error messages.</p><p>At one time, we kept seeing a message: <code class=\"language-plaintext highlighter-rouge\">Can't keep up! Is the server overloaded? Running 2867ms or 57 ticks behind.</code> Our server was facing memory constraints.</p><p><a href=\"https://shockbyte.com/help/knowledgebase/articles/minecraft-server-can-t-keep-up\">Memory constraints can happen for many reasons</a>, but in this case, it was caused by a recent update to a newer version of Minecraft with a higher memory requirement. We made some adjustments which addressed the issue for a while, but eventually we needed to upgrade to a server with more RAM.</p><p>At another time, we noticed our server struggling, and discovered that we were approaching the file storage limit for our hosting plan. Looking closer, we saw that we had some large files leftover from older Minecraft versions we had run in the past. We also saw that we had some worlds we were no longer using (worlds can be pretty heavy, space-wise). Deleting these old versions and worlds gave us plenty of space to work with.</p><p>Finally, I should mention the time that a curious kid used WorldEdit to build a massive sphere of TNT. As they gleefully detonated it, the rendering of the explosion slowed the server to a crawl (also a memory issue). In this case, we needed to adjust the render settings to simplify the explosion and resolve it one portion at a time. Once the explosion finished, everything went back to normal. 🥵</p><h3 id=\"updating-minecraft\">Updating Minecraft</h3><p>Visitors to your server need to run the same version of Minecraft that <em>you</em> run on the server. Minecraft receives updates often, which means that you’ll need to update your server-Minecraft regularly or be OK with running older versions. We’ve done the update several times at this point, so here’s my advice for anyone doing Minecraft server updates:</p><ul>  <li>Always back up your server before running updates! (more on this below)</li>  <li>Before attempting an update, check to see if your dependencies (ie. plugins) are compatible with the new version. Updating Minecraft usually means you need to update your plugins. If an important plugin doesn’t support your target Minecraft version, then you should probably wait to update. The more plugins you use, the more likely it is that you’ll need to trail the latest Minecraft version.</li>  <li>After you update and restart your server, watch for error messages in your console. It’s the easiest way to tell if something is broken and how you might fix it.</li></ul><h3 id=\"running-backups\">Running backups</h3><p>In the five years we’ve managed our server, the worst incident was when an errant WorldEdit command converted an enormous number of existing blocks in the Land_of_Braun into “Iron Bars”. In the process, the server crashed, making it impossible to reverse the action with a WorldEdit “undo” command. Worst of all, we didn’t have a recent backup. 😱</p><p>Periodic backups are essential if you’re running a server. Fortunately, many Minecraft server hosts have a backup feature feature built-in. Our host (Shockbyte), allows you to schedule backups on a set interval, automatically replacing the oldest back-up when you reach a configurable limit. Super convenient! <img src=\"https://www.bryanbraun.com/assets/images/minecraft-server-backups.png\" alt=\"\" /></p><p>If your host does not offer automatic backups, a simple solution is to connect to your server with an FTP client (like Filezilla), and periodically copy all server files down to your local computer. This was our primary backup method for awhile, and it’s what ended up saving us from the iron-apocalypse (we eventually found a semi-recent backup we could restore to).</p><h2 id=\"conclusion\">Conclusion</h2><p>As far as Minecraft servers go, ours is pretty simple, but it still required a lot of learning. Our server continues to evolve as we discover more and better ways to play. Have you ever managed a family Minecraft server? How did it go? What worked for you?</p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/06/28/lessons-learned-running-a-family-minecraft-server/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/06/21/waiting-is-risky",
      "url": "https://www.bryanbraun.com/2025/06/21/waiting-is-risky/",
      "date_published": "2025-06-21T00:00:00-04:00",
      "date_modified": "2025-06-21T00:00:00-04:00",
      "title": "Waiting is risky",
      "summary": "I’m a note-taker and a list-maker. I have lists of books I want to read and movies I want to watch, but most of my lists are for collecting ideas. They include ideas for blog posts, websites, businesses, open-source code, video games, books, and other kinds of projects.",
      "content_html": "<p>I’m a note-taker and a list-maker. I have lists of books I want to read and movies I want to watch, but most of my lists are for collecting ideas. They include ideas for blog posts, websites, businesses, open-source code, video games, books, and other kinds of projects.</p><p>Some of these ideas, the really good ones, have been gestating for years. I find myself returning to them often to add details as I think of them, continually fleshing them out, and refining them. Some have pages of notes by this point. I tell myself that when the time is right for a new post, project, business or book, I can pick up the idea and run with it.</p><p>Sometimes it works pretty well. Both <a href=\"https://www.bryanbraun.com/2020/09/08/gridmaster-closing-thoughts\">Gridmaster</a> and <a href=\"https://musicbox.fun\">Music Box Fun</a> were long-gestating project ideas that I built and launched when the time was right.</p><p>But I’ve also learned that waiting for the right time is risky.</p><p>For one, sometimes <strong>the world changes</strong>, and your idea no longer makes sense.</p><p>I once drafted a blog post about some quirky behaviors in <code class=\"language-plaintext highlighter-rouge\">npm</code>, but by the time I came back to refine it, the behaviors had been fixed. Another time, I had an idea for a podcast, only <a href=\"https://www.bryanbraun.com/2014/02/14/tldr/\">to watch somebody else create it</a> (they did a <em>great</em> job). Most recently, I’ve found that several of my project ideas can be replaced by a simple AI prompt (like, <em>“Generate some lorem ipsum text in the style of Dr. Seuss”</em>).</p><p>But the other reason that waiting is risky, is that <strong>you change</strong>.</p><p>I’ve got several ideas for children’s books, but I can feel my interest in them waning as my kids get older. Several of the business ideas I added grew out of pain points that I no longer have. And when I look at some of the more ambitious projects, I wonder if I even still have the appetite to take a swing at them.</p><p>Maybe it’s good that I didn’t waste my time building some niche thing only to have it replaced by AI. Maybe I dodged a bullet by not committing to a business I would have grown out of.</p><p>But when I look at my freshest, most exciting ideas—it pains me to know that if I don’t build them now, I might never do it, because I’ll never feel as passionate about them as I do today.</p><!-- I couldn't find a good place to add this link to the post, so I'm including it in a comment --><!-- Inspiration expires: https://x.com/BryanEBraun/status/1395948579542470656 --><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/06/21/waiting-is-risky/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    },
    {
      "id": "/2025/04/15/links-12",
      "url": "https://www.bryanbraun.com/2025/04/15/links-12/",
      "date_published": "2025-04-15T00:00:00-04:00",
      "date_modified": "2025-04-15T00:00:00-04:00",
      "title": "Links #12",
      "summary": "Oscar, an open-source contributor agent architecture - Oscar is a project from the Go community that aims to develop AI agents that assist open source maintainers. I think this is a great idea. Open source is a load-bearing pillar in our modern digital infrastructure and maintainers need help. If AI agents were able to reduce the maintenance burden, it could reduce burnout, improve project longevity, and encourage new development. Excited to see where this goes.",
      "content_html": "<p><strong><a href=\"https://go.googlesource.com/oscar/+/refs/heads/master/README.md\">Oscar, an open-source contributor agent architecture</a></strong> - Oscar is a project from the Go community that aims to develop AI agents that assist open source maintainers. I think this is a great idea. Open source is a load-bearing pillar in our modern digital infrastructure and <a href=\"https://xkcd.com/2347/\">maintainers need help</a>. If AI agents were able to reduce the maintenance burden, it could reduce burnout, improve project longevity, and encourage new development. Excited to see where this goes.</p><p><strong><a href=\"https://antfu.me/posts/move-on-to-esm-only\">Move on to ESM-only</a></strong> - A proper update on JavaScript’s move-to-ESM fiasco. I was pleasantly surprised to learn that tools like Vite are helping push the community migration forward. One clear takeaway is that new packages should publish in ESM-only (no dual-publishing of ESM + CommonJS). Last week, I ended up republishing <a href=\"https://github.com/bryanbraun/checkboxland\">Checkboxland</a> as ESM-only, in large part due to the influence of this post.</p><p><strong><a href=\"https://cowboy.codes/blog/keyboard-journey/\">My keyboard ergonomics journey as an engineer</a></strong> - A nice write-up on keyboard ergonomics from my former co-worker Grant. This post inspired me to experiment with keyboards, and I’ve been using a split keyboard for the past two months now. Thanks Grant!</p><p><strong><a href=\"https://ludic.mataroa.blog/blog/you-must-read-at-least-one-book-to-ride/\">You Must Read at Least One Book To Ride</a></strong> - The basic message here is that there’s an astounding amount of mediocrity in our industry (all industries, really), and all it takes is reading one book in a relevant topic for your work to make you stand out. Compelling, if true!</p><p><strong><a href=\"https://www.notboring.co/p/radiant\">Radiant</a></strong> - A technical deep dive into a startup that is working to replace diesel generators with portable nuclear reactors the size of a shipping container. As I read, I found myself carried away by the narrative and detailed explanations of the problem space and potential solutions. The article comes from tech investor Packy McCormick’s Substack blog, which explains the techno-optimism. Honestly, I’m here for it. He’s writing about people pushing the frontiers in fields that actually matter like energy, transportation, and biomedicine. These are things that will help people live healthier lives with fewer costs and more personal freedoms. Good reading, if you need that shot of optimism from time to time.</p><p><strong><a href=\"https://grantslatton.com/nobody-cares\">Nobody Cares</a></strong> -A proper rant/observation about how so many things in the world could be better if people cared more. It got me thinking about the times when I did my best work and the other times when I didn’t. My working theory is that it’s not that people don’t care… it’s more that they don’t care about the same things. The streetlight installer in his post cares more about driver experience than pedestrian experience. The bureaucrat cares more about getting home by 5 to make dinner for their sick spouse, than working late to push for alternative bike ramp designs. What makes Japan “nice” isn’t that they care more… it’s that they care about the same things more. Seems plausible, right?</p><p><strong><a href=\"https://blog.benjaminreinhardt.com/young-people-technical-training\">Precocious Young People Should Do Deep Technical Training</a></strong> - <em>“Science and technology drive the modern world. If you understand how they work, you can become a much more active participant in the world, instead of being at the mercy of what is effectively magic.”</em> Of all the things I learned in the years I spent studying mechanical engineering, the most important was that <em>I can understand anything… it’s just a matter of desire and time.</em> I don’t know if that realization ever comes unless you’ve battled your way to an understanding of at least a couple highly technical subjects.</p><p><strong><a href=\"https://www.astralcodexten.com/p/the-colors-of-her-coat\">The Colors Of Her Coat</a></strong> - This post left me awestruck. Through a series of stories, Scott Alexander makes a case that the long march of human advancement is methodically removing our opportunities to experience wonder. Modern humans no longer feel ecstasy when they drink a spiced beverage, hear an opera singer, or see an AI-generated portrait, because these wonders are no longer scarce and scarcity is what gives things value. So what happens when we finally arrive at our post-scarcity utopia (whether that be via earthly technology or spiritual afterlife)? Are we in heaven or hell? It’s a fascinating discussion, full of examples, poetry, and religious symbolism.</p><p><strong><a href=\"https://www.lightnote.co/\">LightNote</a></strong> - Interactive music theory lessons in the browser. Try the free sample… it’s pretty fun. I’m kinda jealous that I didn’t build this.</p><hr /><p>Thanks for reading in your feed reader! Let me know your thoughts by leaving a comment on <a href=\"https://www.bryanbraun.com/2025/04/15/links-12/\">the original post</a> or sending <a href=\"mailto:bbraun7@gmail.com\">me an email</a>.</p>"
    }
  ]
}