JSON Feed Validator

Check whether your feed is valid. For more information about JSON Feed, see the specification.

{
  "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": "/2024/11/19/unusual-git-ids",
      "url": "https://www.bryanbraun.com/2024/11/19/unusual-git-ids/",
      "date_published": "2024-11-19T00:00:00-05:00",
      "date_modified": "2024-11-19T00:00:00-05:00",
      "title": "Unusual Git IDs",
      "summary": "You can search Github for unusual commit IDs:",
      "content_html": "<p>You can search Github for unusual commit IDs:</p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/github-commit-id-search.png\" alt=\"Github search page including a search for commits with an ID of 0000000\" />  <figcaption>There are over 2k commits starting with 0000000!</figcaption></figure><p>While looking for commits like these, I started to become suspicious that people were intentionally modifying their commits IDs to be unusual:</p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/eeeeeee.png\" alt=\"Github search result for a commits with and ID of 'eeeeeee'\" />  <figcaption>A commit ID of <code>eeeeeee</code>, with a message of \"eeeeeee\", created by a user named \"eeee\".</figcaption></figure><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/defaced.png\" alt=\"List of consecutive commits, all with an ID of 'defaced'\" />  <figcaption>What are the odds that this user happened to commit seven consecutive commits, all with an ID of \"defaced\"?</figcaption></figure><p>Sure enough, there are tools you can use to generate “vanity” commit IDs (like <a href=\"https://github.com/prasmussen/git-vanity-hash\">git-vanity-hash</a>). These tools work by using the “brute-force” method. Basically, they create a commit, check the hash, and if it doesn’t match, they increment a piece of data in the commit header and try again.</p><p>That’s pretty clever but I’m more interested in unusual commit IDs that occur naturally. How often do they happen? Have I ever created one before?</p><h2 id=\"searching-my-commits\">Searching my commits</h2><p>I decided to use Github’s CLI tool, <code class=\"language-plaintext highlighter-rouge\">gh</code>, to query the Github API and pull down a list of my public commits:</p><div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>gh search commits <span class=\"nt\">--author</span> bryanbraun <span class=\"nt\">--json</span> commit <span class=\"nt\">--jq</span> <span class=\"s2\">\".[].commit.tree.sha\"</span> <span class=\"nt\">--limit</span> 1000</code></pre></div></div><p>This worked but <a href=\"https://github.com/cli/cli/discussions/7010\">it has a maximum limit of 1000 commits</a> (my public total is closer to 4k). Eventually, I found a way to get them all by writing a bash script to break up my queries by year, generating one file per query, and combining the files when done:</p><div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\">#!/bin/bash</span><span class=\"c\"># To prevent API rate limits, set a personal access token to the GITHUB_TOKEN</span><span class=\"c\"># environment vairable in your terminal before running this script.</span><span class=\"nv\">username</span><span class=\"o\">=</span><span class=\"s2\">\"bryanbraun\"</span><span class=\"nv\">start_year</span><span class=\"o\">=</span>2012<span class=\"nv\">end_year</span><span class=\"o\">=</span>2024<span class=\"c\"># Create a file for each year</span><span class=\"k\">for </span>year <span class=\"k\">in</span> <span class=\"si\">$(</span><span class=\"nb\">seq</span> <span class=\"nv\">$start_year</span> <span class=\"nv\">$end_year</span><span class=\"si\">)</span><span class=\"p\">;</span> <span class=\"k\">do  </span><span class=\"nv\">next_year</span><span class=\"o\">=</span><span class=\"k\">$((</span>year <span class=\"o\">+</span> <span class=\"m\">1</span><span class=\"k\">))</span>  <span class=\"nb\">echo</span> <span class=\"s2\">\"Fetching commits from </span><span class=\"nv\">$year</span><span class=\"s2\"> to </span><span class=\"nv\">$next_year</span><span class=\"s2\">...\"</span>  gh api <span class=\"nt\">-X</span> GET <span class=\"se\">\\</span>    <span class=\"s2\">\"/search/commits?q=author:</span><span class=\"nv\">$username</span><span class=\"s2\">+committer-date:</span><span class=\"nv\">$year</span><span class=\"s2\">-01-01..</span><span class=\"nv\">$next_year</span><span class=\"s2\">-01-01\"</span> <span class=\"se\">\\</span>    <span class=\"nt\">--header</span> <span class=\"s2\">\"Accept: application/vnd.github.cloak-preview\"</span> <span class=\"se\">\\</span>    <span class=\"nt\">--paginate</span> <span class=\"se\">\\</span>    <span class=\"nt\">-q</span> <span class=\"s1\">'.items.[].sha'</span> <span class=\"o\">&gt;&gt;</span> <span class=\"s2\">\"commits-</span><span class=\"nv\">$year</span><span class=\"s2\">.txt\"</span><span class=\"k\">done</span><span class=\"c\"># Combine all files into one</span><span class=\"nb\">cat </span>commits-<span class=\"k\">*</span>.txt <span class=\"o\">&gt;</span> all_commits.txt<span class=\"c\"># Remove unused files</span><span class=\"k\">for </span>year <span class=\"k\">in</span> <span class=\"si\">$(</span><span class=\"nb\">seq</span> <span class=\"nv\">$start_year</span> <span class=\"nv\">$end_year</span><span class=\"si\">)</span><span class=\"p\">;</span> <span class=\"k\">do  </span><span class=\"nb\">rm</span> <span class=\"s2\">\"commits-</span><span class=\"nv\">$year</span><span class=\"s2\">.txt\"</span><span class=\"k\">done</span></code></pre></div></div><p>The result is a 4000-line file with one commit ID per line:</p><p><img src=\"https://www.bryanbraun.com/assets/images/all-commits.png\" alt=\"all commits\" /></p><p>Now I just needed to scan my commit IDs for unusual patterns. Grep is good at this kind of thing so I put together a bash script that uses grep to do various checks:</p><div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\">#!/bin/bash</span><span class=\"c\"># Define the input file containing commit SHAs</span><span class=\"nv\">input_file</span><span class=\"o\">=</span><span class=\"s2\">\"all_commits.txt\"</span><span class=\"nb\">echo</span> <span class=\"s2\">\"Analyzing patterns in the first 7 characters of commit SHAs...\"</span><span class=\"c\"># Check 1: SHAs where the first 7 characters are the same</span><span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">1. SHAs where the first 7 characters are the same:\"</span><span class=\"nb\">grep</span> <span class=\"nt\">-E</span> <span class=\"s1\">'^(.)\\1{6}'</span> <span class=\"s2\">\"</span><span class=\"nv\">$input_file</span><span class=\"s2\">\"</span><span class=\"c\"># Check 2: SHAs starting with a palindrome (e.g., \"abcdcba\")</span><span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">2. SHAs starting with a palindrome:\"</span><span class=\"nb\">grep</span> <span class=\"nt\">-E</span> <span class=\"s1\">'^(.)(.)(.)(.)\\3\\2\\1'</span> <span class=\"s2\">\"</span><span class=\"nv\">$input_file</span><span class=\"s2\">\"</span><span class=\"c\"># Check 3: SHAs where the first 7 characters form an ascending sequence</span><span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">4. SHAs where the first 7 characters form an ascending sequence:\"</span><span class=\"nb\">grep</span> <span class=\"nt\">-E</span> <span class=\"s1\">'^(0123456|1234567|2345678|3456789|456789a|56789ab|6789abc|789abcd|89abcde|9abcdef)'</span> <span class=\"s2\">\"</span><span class=\"nv\">$input_file</span><span class=\"s2\">\"</span><span class=\"c\"># Check 4: SHAs where the first 7 characters form a descending sequence</span><span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">5. SHAs where the first 7 characters form a descending sequence:\"</span><span class=\"nb\">grep</span> <span class=\"nt\">-E</span> <span class=\"s1\">'^(fedcba9|edcba98|dcba987|cba9876|ba98765|a987654|9876543|8765432|7654321|6543210)'</span> <span class=\"s2\">\"</span><span class=\"nv\">$input_file</span><span class=\"s2\">\"</span><span class=\"c\"># Check 5: SHAs where the first 7 characters form a repeating pattern (e.g., \"abababa\")</span><span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">6. SHAs where the first 7 characters form a repeating pattern:\"</span><span class=\"nb\">grep</span> <span class=\"nt\">-E</span> <span class=\"s1\">'^(.)(.)\\1\\2\\1\\2\\1'</span> <span class=\"s2\">\"</span><span class=\"nv\">$input_file</span><span class=\"s2\">\"</span><span class=\"c\"># Check 6: SHAs where the first 7 characters are vowels only</span><span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">7. SHAs where the first 7 characters are vowels only:\"</span><span class=\"nb\">grep</span> <span class=\"nt\">-E</span> <span class=\"s1\">'^[aeiouAEIOU]{7}'</span> <span class=\"s2\">\"</span><span class=\"nv\">$input_file</span><span class=\"s2\">\"</span></code></pre></div></div><p>I ran this and got something! One of my commits was a palindrome: <code>c5a7a5c</code></p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/my-palindrome-commit.png\" alt=\"Github search page including a commit with an ID of c5a7a5c\" />  <figcaption><code>c5a7a5c</code>, my most unusual commit ID, was created over ten years ago!</figcaption></figure><p>It’s not the most beautiful commit ID but I’m pretty happy that I found something.</p><h2 id=\"what-else-could-we-do\">What else could we do?</h2><p>My list of checks was pretty short, so we could expand it if we wanted. Here are some ideas:</p><ol>  <li>Check if the first seven characters are all letters, or all numbers (e.g., “afddcbf”, “2950312”).</li>  <li>Check if the first seven characters are composed of only two distinct characters (e.g., “a44aaa4”).</li>  <li>Check commit IDs against <a href=\"https://nedbatchelder.com/text/hexwords.html\">a list of words constructed from hexadecimal characters</a> (e.g., “baff1ed”).</li>  <li>Check if the first seven characters are in alphabetical order (e.g., “accdfff”).</li>  <li>Check if the first seven characters are in numerical order (e.g., “0035789”).</li>  <li>Check for interesting patterns outside of the first 7 characters of the commit ID.</li></ol><p>I actually tried that first idea but I found that the “all numbers” case was too common (it found over a dozen matches in my commit history). You gotta strike the right balance.</p><p>It would be fun to put together a web interface where people could put in their Github username and scan their own commits, but I’ve come to terms with the fact that there’s not enough time in the world to build all the interesting little websites that ought to exist.</p><p>I used ChatGPT to help me build the scripts, which made it possible to punch out this analysis in a single afternoon. If it took any longer, I likely wouldn’t have attempted it. This is a perfect example of <a href=\"https://simonwillison.net/2023/Mar/27/ai-enhanced-development/\">AI-enhanced development making me more ambitious with my projects</a>.</p><p>I put all the scripts in a public repo at <a href=\"https://github.com/bryanbraun/unusual-commit-ids\">bryanbraun/unusual-commit-ids</a>. Feel free to fork it, download it, and scan your own commits. If you find any unusual commits in your own history, you should share them in the comments (naturally occurring commits only)!</p><p>Finally, if you thought this was interesting, you may like my other git commit-related projects:</p><ul>  <li><a href=\"https://github.com/sparkbox/commit-colors\">Commit colors</a></li>  <li><a href=\"https://x.com/CommitHaikus\">Commit haikus (a now-retired twitter bot)</a></li></ul>"
    },
    {
      "id": "/2024/11/02/setting-up-your-now-page-with-an-rss-feed",
      "url": "https://www.bryanbraun.com/2024/11/02/setting-up-your-now-page-with-an-rss-feed/",
      "date_published": "2024-11-02T00:00:00-04:00",
      "date_modified": "2024-11-02T00:00:00-04:00",
      "title": "Setting up your /now page with an RSS feed",
      "summary": "I have a /now page, which I use to tell people what I’m up to these days.",
      "content_html": "<p>I have <a href=\"https://www.bryanbraun.com/now/\">a /now page</a>, which I use to tell people what I’m up to these days.</p><p>I like <a href=\"https://nownownow.com/about\">the concept of “now pages”</a> but I felt like it would be better if it had an RSS feed. The feed would give interested parties a way to subscribe to life changes.</p><p>The problem is that RSS feeds aren’t really designed for a single page. It’s more for a content collection, like blog posts or podcasts.</p><p>Still, is there a way to make it work? To have a single page, publishing to subscribers every time it’s updated?</p><h2 id=\"unique-ids\">Unique IDs</h2><p>In RSS feeds, each entry is supposed to have a unique ID. Here are some examples:</p><p><strong><a href=\"https://www.ietf.org/rfc/rfc4287.txt\">Atom</a></strong></p><div class=\"language-xml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nt\">&lt;entry&gt;</span>  <span class=\"nt\">&lt;id&gt;</span>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a<span class=\"nt\">&lt;/id&gt;</span>  <span class=\"nt\">&lt;title&gt;</span>Atom-Powered Robots Run Amok<span class=\"nt\">&lt;/title&gt;</span>  <span class=\"nt\">&lt;link</span> <span class=\"na\">href=</span><span class=\"s\">\"http://example.org/2003/12/13/atom03\"</span><span class=\"nt\">/&gt;</span>  <span class=\"nt\">&lt;updated&gt;</span>2003-12-13T18:30:02Z<span class=\"nt\">&lt;/updated&gt;</span>  <span class=\"nt\">&lt;summary&gt;</span>Some text.<span class=\"nt\">&lt;/summary&gt;</span><span class=\"nt\">&lt;/entry&gt;</span></code></pre></div></div><p><strong><a href=\"https://www.jsonfeed.org/version/1.1/\">JSONFeed</a></strong></p><div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nl\">\"items\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"w\">    </span><span class=\"p\">{</span><span class=\"w\">        </span><span class=\"nl\">\"id\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"1\"</span><span class=\"p\">,</span><span class=\"w\">        </span><span class=\"nl\">\"content_html\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"&lt;p&gt;Hello, world!&lt;/p&gt;\"</span><span class=\"p\">,</span><span class=\"w\">        </span><span class=\"nl\">\"url\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"https://example.org/initial-post\"</span><span class=\"w\">    </span><span class=\"p\">}</span><span class=\"w\"></span><span class=\"p\">]</span><span class=\"w\"></span></code></pre></div></div><p>These IDs are intended to be globally unique and unchanging:</p><blockquote>  <p>id (required, string) is unique for that item for that feed over time. If an item is ever updated, the <code class=\"language-plaintext highlighter-rouge\">id</code> should be unchanged. New items should never use a previously-used <code class=\"language-plaintext highlighter-rouge\">id</code>.</p>  <p><a href=\"https://www.jsonfeed.org/version/1/#items-a-name-items-a\">JSONFeed Version 1.1 Docs</a></p></blockquote><p>Changing the ID is bad because it causes old posts to resurface as new posts in people’s feed readers. Usually you don’t want this, even when you’re updating an old post.</p><p>But in my case we <em>do</em> want this. If I only publish a single entry and include the current date in the ID, it’s unique every time I rebuild the feed (i.e., whenever I update the <code class=\"language-plaintext highlighter-rouge\">/now</code> page). And just like that, every update is a new publish.</p><p style=\"text-align: center;\">  <img src=\"/assets/images/now-page-feed.jpg\" width=\"260\" alt=\"A list of /now page updates as shown in a feed reader\" /></p><h2 id=\"is-this-bad-and-should-i-feel-bad\">Is this bad and should I feel bad?</h2><p>I’m deliberately disobeying the spec to get the result I want. Often, in the dev world, these kinds of things come back to bite you. Is there a better way to do this?</p><p>Well, I could treat my <code class=\"language-plaintext highlighter-rouge\">/now</code> page as a content collection, with each new entry being published as new post, never deleting or overwriting old entries (basically a microblog just for life updates). It’s doable, but it diverges from the simplicity of having a single document at a single url. At that point, I might as well insert life updates into my normal blog, which works but isn’t appropriate for many types of blogs.</p><p>One issue with changing IDs is that small revisions to the <code class=\"language-plaintext highlighter-rouge\">/now</code> page republish the whole page, making it hard for subscribers to see what changed. I could mitigate this by including a link to the diff on Github (version control FTW!), but it’s not the most user-friendly solution.</p><hr class=\"section-divider\" /><p>Anyway, I’m going to roll with it for now. If anyone wants to do a similar experiment, feel free to check out the <a href=\"https://github.com/bryanbraun/bryanbraun.github.io/blob/main/_pages/now.z.json\">feed template in my repo</a>.</p>"
    },
    {
      "id": "/2024/10/25/before-you-buy-a-domain-name-first-check-to-see-if-its-haunted",
      "url": "https://www.bryanbraun.com/2024/10/25/before-you-buy-a-domain-name-first-check-to-see-if-its-haunted/",
      "date_published": "2024-10-25T00:00:00-04:00",
      "date_modified": "2024-10-25T00:00:00-04:00",
      "title": "Before you buy a domain name, first check to see if it's haunted",
      "summary": "In mid-2022 I bought a new domain name.",
      "content_html": "<p>In mid-2022 I bought a new domain name.</p><p>The name was <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code>. I got it for a side-project, an <a href=\"https://musicbox.fun\">interactive online music box</a> that I had built and hosted at <code class=\"language-plaintext highlighter-rouge\">musicboxfun.com</code>. The new name was shorter and more quirky. I felt lucky to have grabbed it.</p><p>Unfortunately, <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code> had a history. Before I bought it, the domain was used to host pirated music.</p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/old-music-box-fun.png\" alt=\"A screenshot of musicbox.fun as it existed in 2018, before I owned it\" />  <figcaption><code>musicbox.fun</code>, as it existed in 2018 (before I owned it)</figcaption></figure><p>From June 2018 to February 2021, the site racked up thousands of copyright violation complaints. Over 20,000 of its urls were delisted by Google (and other search engines) before the site went offline in 2022.</p><p>I had no idea, of course. It wasn’t until I had redirected all of my <code class=\"language-plaintext highlighter-rouge\">musicboxfun.com</code> traffic to <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code> that I noticed that something wasn’t right: my web traffic from organic search dropped to zero.</p><p>I assumed it was temporary so I double-checked my process and waited for awhile, but it never really recovered. It wasn’t until a year later that I discovered the copyright violations and learned that the domain name was compromised.</p><p>Apparently, this is a thing that happens to domain names, but as far as I know, there’s not really a name for it. When I described it to my wife, she said <em>“Oh, so it’s haunted.”</em></p><p>“Haunted” is the perfect word for this:</p><ul>  <li>Something terrible happened at the domain name in the past.</li>  <li>On the surface, nothing seems wrong with the domain name.</li>  <li>Then there are signs that something isn’t right.</li>  <li>Obligatory jump-scare when you discover what happened.</li>  <li>Internal debate: do you abandon it or try to fix it?</li>  <li>There’s a ton of superstition around how to fix it.</li>  <li>Superficial fixes don’t seem to work.</li></ul><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/ghostbusters.jpg\" alt=\"A scene from the movie Ghostbusters.\" />  <figcaption>When there's something strange with your domain name, who you gonna call?</figcaption></figure><p>So to summarize, I’m saying a domain name is “haunted” when something in its past gives it a poor reputation among search engines, affecting its ability to rank in search results, even after it changes ownership.</p><p>The inner-workings of search engines are notoriously opaque*, making it difficult to 1) know if you’re being affected and 2) know how to fix it. The following are my suggestions, based on my experience with <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code>.</p><h2 id=\"how-to-check-if-a-domain-name-is-haunted\">How to check if a domain name is haunted</h2><p>Before you buy a domain name, there’s a few ways to check if it’s haunted:</p><h3 id=\"1-check-the-wayback-machine-at-archiveorg\">1. Check the Wayback Machine at archive.org</h3><p>If you go to <a href=\"https://web.archive.org/\">web.archive.org</a> and put in your domain name, it will pull up archived web pages of whatever lived at the domain in the past. Here’s a couple things to look out for:</p><ol>  <li>Does anything in the past look illegal or sketchy (piracy, gambling, porn, etc)?</li>  <li>Is the history suspiciously empty?    <ul>      <li>If so, then possibly the past content was <a href=\"https://help.archive.org/help/how-do-i-request-to-remove-something-from-archive-org-2/\">removed by request</a> (I suspect this was the case for <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code>)</li>    </ul>  </li></ol><h3 id=\"2-search-dmca-complaints\">2. Search DMCA complaints</h3><p>DMCA stands for “Digital Millenium Copyright Act,” which is a US law that enables people to report copyright infractions to search engine companies (among other things). These reports are public, and you can look them up in a few ways:</p><ol>  <li>Search <a href=\"https://transparencyreport.google.com\">Google Transparency Report</a> for your domain, to find delist requests (you can <a href=\"https://transparencyreport.google.com/copyright/domains/musicbox.fun\">see the report for musicbox.fun here</a>).</li>  <li>Search <a href=\"https://lumendatabase.org\">lumendatabase.org</a> for your domain, to find copyright complaints (for an example, see <a href=\"https://lumendatabase.org/notices/search?term=%22https%3A%2F%2Fmusicbox.fun%22&amp;term-exact-search=true&amp;sort_by=\">these results for musicbox.fun</a>).</li></ol><p>Finding ANY copyright complaints for your domain is cause for concern, especially if there are a lot of them and they were filed recently.</p><h3 id=\"3-search-historical-seo-data\">3. Search historical SEO data</h3><p>If you’re considering buying an important domain name, you may also want to search historical SEO data. Advanced SEO tools like <a href=\"https://ahrefs.com\">ahrefs.com</a> can give you detailed information about backlinks, ranking history, and estimates for traffic and domain authority. Often, you’ll need to pay to get full access to this kind of data.</p><p>Interpreting this data is beyond the scope of this post, but a bit of research can help uncover problems here.</p><h2 id=\"ok-its-haunted-now-what-do-i-do\">Ok, it’s haunted. Now what do I do?</h2><h3 id=\"1-talk-to-the-search-engines\">1. Talk to the search engines</h3><p>Many search engines have tools for domain owners, like <a href=\"https://search.google.com/search-console\">Google Search Console</a> and <a href=\"https://www.bing.com/webmasters\">Bing Webmaster Tools</a>. Definitely set up a profile and get your domain name added. It can help surface past issues and it gives you a way to report when issues have been resolved. For more details about specific actions you can take here, see <a href=\"https://webmasters.stackexchange.com/a/145283/36576\">my stackexchange post</a> on the topic.</p><p>If your domain has DMCA complaints, you may be tempted to file a <a href=\"https://support.google.com/legal/troubleshooter/1114905?rd=2&amp;sjid=13861243148551035047-NC#ts=9814647%2C1115655%2C13630207%2C12999302%2C9814950%2C1115791\">DMCA counter-notice</a>. Don’t do it. Counter-notices are for <em>errorneous</em> copyright complaints, not complaints that were once valid but no longer relevant. Per Google’s counter-notice submission form:</p><blockquote>  <p>Please note: If the content on the page was infringing at the time the original removal request arrived, your counter notice is not legally valid. Do not submit a counter notice if there was illegal content, even if it’s now been removed.</p></blockquote><p>As far as I can tell, there’s not really anything you can do to make past, valid DCMA complaints go away.</p><h3 id=\"2-double-down-on-best-practices\">2. Double-down on best practices</h3><p>My SEO strategy has always been to do great work and make it easy for Google to see it. It usually works pretty well (at least for my non-haunted domains). For haunted domains, you have a bad reputation to overturn, which seems to require extra vigilence. SEO basics, like high-quality, structured, accessible, content on a fast-loading site, are table stakes.</p><p>If you’ve done any SEO work, you know that search engines treat links to your site as a massive signal of relevance and trust. I suspect that fresh incoming links are especially important for overturning a bad reputation, though I haven’t confirmed this personally. If you think <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code> is a useful project and you wield <a href=\"https://www.bryanbraun.com/2020/10/03/the-power-of-a-link/\">the power of a link</a>, consider posting a link to it, and maybe we’ll find out together.</p><h3 id=\"3-wait-for-a-while\">3. Wait for a while?</h3><p>In my research I found <a href=\"https://webmasters.stackexchange.com/a/99701/36576\">a detailed stackexchange post about trust scores and how they are affected by DMCA complaints</a>. This post suggested that recovery could take some time:</p><blockquote>  <p>It takes years to rebuild trust scores and for some sites, this may never happen.…the reality is that a domain can ruin its value beyond redemption.</p></blockquote><p>This post isn’t a primary source, but I also came across an Q&amp;A with a Google Search employee who fielded a similar question about DMCA violations. Their response said something similar, basically, that it can take time for the reputation effects to wear off (I’m struggling to find the video now, but I’ll link it when I do).</p><p>All of this is fairly disappointing. In a perfect world, when your legitimately good content isn’t being surfaced by Google, it’s a failure on <strong>their</strong> part, and <strong>their</strong> problem to solve, not yours. In practice, it’s <strong>your</strong> problem and you have to do a bunch of work to help them see that their current assessment of your domain name is no longer accurate.</p><p><img src=\"https://www.bryanbraun.com/assets/images/this-house-is-clean.jpg\" alt=\"Image of the medium from the movie 'Poltergeist' saying &quot;this house is clean&quot;\" /></p><hr class=\"section-divider\" /><p>Ideally, search engine algorithms would give new domain owners a fresh start. Yes, it would prevent “haunted domain issues” but it would also reduce <a href=\"https://macwright.com/2024/10/16/domain-second-thoughts\">squatting on trusted domains</a> (another issue I’ve been burned by). Unfortunately, we don’t live in that world*, so we only have a few options:</p><ol>  <li>Avoid buying haunted domain names</li>  <li>Abandon domain names, once you discover that they are haunted</li>  <li>Put in a bunch of time and effort to restore a haunted domain name’s low trust score</li></ol><p>For <code class=\"language-plaintext highlighter-rouge\">musicbox.fun</code>, I want to at least <em>try</em> #3. I’ve taken some of the steps above and it feels like I’m starting to see progress. It’s slow, but I’m not in a big hurry to restore traffic. The site is just a hobby and it was always a niche project for a niche audience.</p><p>Either way, I hope to post an update in a while to let you know if it improves over time.</p><hr /><p><small>* It’s easy to attribute issues like these to anti-competitive behavior or some other malicious cause, but I don’t blame Google here. If their reputation algorithm was more transparent (or forgiving), it could be more easily exploited by bad actors. Obscurity prevents exploitation but also adds to the mystery and superstition that plagues the SEO industry. It’s tempting to get sucked into the mystery, trying to figure out the algorithm despite its constant changes and intentional obscurity, but that’s not how I want to live my life.</small></p>"
    },
    {
      "id": "/2024/08/10/one-million-checkboxes-and-the-fear-of-viral-success",
      "url": "https://www.bryanbraun.com/2024/08/10/one-million-checkboxes-and-the-fear-of-viral-success/",
      "date_published": "2024-08-10T00:00:00-04:00",
      "date_modified": "2024-08-10T00:00:00-04:00",
      "title": "One Million Checkboxes and the fear of viral success",
      "summary": "When Nolen Royalty’s One Million Checkboxes site went viral, several people sent me links to it.",
      "content_html": "<p>When Nolen Royalty’s <a href=\"https://onemillioncheckboxes.com/\">One Million Checkboxes site</a> went viral, several people sent me links to it.</p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/one-million-checkboxes.gif\" alt=\"A screen-capture of onemillioncheckboxes.com, shortly after it launched.\" />  <figcaption>If you haven't heard of One Million Checkboxes, see <a href=\"https://en.wikipedia.org/wiki/One_Million_Checkboxes\" target=\"_blank\">the Wikipedia article</a> for more details.</figcaption></figure><p>I loved everything about One Million Checkboxes. It was simple but strangely compelling. You land on the site, start using a single brain cell to check some boxes, and then minutes later you’re <a href=\"https://www.thegamer.com/one-million-checkboxes-sent-me-into-an-existential-meltdown/\">in an existential crisis</a>. Seeing the project gave me the kind of professional jealousy that I imagine other people feel when a peer gets promoted.</p><p>Nolen wrote <a href=\"https://eieio.games/essays/scaling-one-million-checkboxes/\">a fantastic post</a> full of technical details about how he built and scaled the site. It was very generous of him to write it up. Knowing how to scale a web service feels like magic to someone without much experience at it (read: me) and this post stands as a great case-study.</p><p>But more than that, the post really challenged me as a creator on the web. In the past, I’ve been so afraid of this exact situation Nolen was in. You know, building a creative project with a backend component, having it go viral, watching the metered costs go through the roof, and either:</p><ol>  <li>leaving users with an unstable and broken experience</li>  <li>bankrupting myself</li>  <li>being forced to shut it down to avoid bankrupting myself</li>  <li>solving the problems perfectly on the fly, but still maybe bankrupting myself*</li></ol><figure class=\"center\">  <a href=\"https://x.com/itseieio/status/1806025147150745918\" target=\"_blank\"><img src=\"https://www.bryanbraun.com/assets/images/one-million-checkboxes-tweet-1.png\" alt=\"Any early tweet from Nolen Royalty after One Million Checkboxes went viral\" loading=\"lazy\" /></a>  <a href=\"https://x.com/itseieio/status/1806217752656351305\" target=\"_blank\"><img src=\"https://www.bryanbraun.com/assets/images/one-million-checkboxes-tweets.jpg\" alt=\"More tweets from Nolen Royalty after One Million Checkboxes went viral\" loading=\"lazy\" /></a>  Neal Agarwal ran into something similar with the success of his game <a href=\"https://neal.fun/infinite-craft/\" target=\"_blank\">Infinite Craft</a>.  <a href=\"https://x.com/nealagarwal/status/1757437669594771780\" target=\"_blank\"><img src=\"https://www.bryanbraun.com/assets/images/infinite-craft-tweets.jpg\" alt=\"Tweets from Neal Agarwal after Infinite Craft went viral\" loading=\"lazy\" /></a></figure><p>I’ve had little tastes of these experiences and they were stressful. Making these decisions while it feels like everyone is watching and your reputation is on the line is a lot of pressure!</p><p>Frankly, this is one reason why I’ve spent so much of my creative energy on projects without a backend component (like <a href=\"bryanbraun.github.io/after-dark-css/\">After Dark in CSS</a>, <a href=\"https://sparkbox.github.io/bouncy-ball\">Bouncy Ball</a> or <a href=\"https://www.bryanbraun.com/checkboxland/\">Checkboxland</a>). Client-side code is easier to scale and I <em>already know how to do it</em>. It’s simply less risky.</p><p>But that comes at a cost. One Million Checkboxes simply could not have been built as a client-side-only app. If I had come up with the idea for One Million Checkboxes, would I have ruled it out because of it’s backend component? Would I have been too afraid to try it?</p><p>You can do a lot, artistically, with client-side only apps. I wanted to believe that client-side only was good enough. But projects like One Million Checkboxes give evidence to the contrary. What if the space of server-enhanced creative projects is significantly under-explored simply because of the additional risk? If I got good at navigating the scaling gauntlet, would I be able to uncover a lot of opportunities?</p><p>Scaling backend stuff isn’t magic—Nolen’s post showed that. I can figure out how to write Go, network instances, and rate-limit IPs. Maybe it’s time that I try.</p><hr class=\"section-divider\" /><p><small>* If I’m being rational, then even a worst-case-scenario probably wouldn’t “bankrupt” me, but fears are seldom rational.</small></p>"
    },
    {
      "id": "/2024/08/02/links-10",
      "url": "https://www.bryanbraun.com/2024/08/02/links-10/",
      "date_published": "2024-08-02T00:00:00-04:00",
      "date_modified": "2024-08-02T00:00:00-04:00",
      "title": "Links #10",
      "summary": "How to Get on a Podcast - This is a short and invaluable post for anyone who wants to be a podcast guest. It puts you in the shoes of a podcaster, showing you what they need, and how you can be a “sure thing” for them. As usual, there are no short cuts. You gotta do the work!",
      "content_html": "<p><strong><a href=\"https://daverupert.com/2024/02/how-to-get-on-a-podcast/\">How to Get on a Podcast</a></strong> - This is a short and invaluable post for anyone who wants to be a podcast guest. It puts you in the shoes of a podcaster, showing you what they need, and how you can be a “sure thing” for them. As usual, there are no short cuts. You gotta do the work!</p><p><strong><a href=\"https://rosswintle.uk/2024/02/a-manifesto-for-small-static-web-apps/\">A manifesto for small, static, web apps</a></strong> - I’ve been pushing for this kind of web development for years (see <a href=\"https://www.youtube.com/watch?v=C8VQQYrGaO0\">here</a>, <a href=\"https://www.bryanbraun.com/2020/10/23/es-modules-in-production-my-experience-so-far/\">here</a>, <a href=\"https://www.bryanbraun.com/2019/09/11/alt-react/\">here</a>, <a href=\"https://www.bryanbraun.com/2021/08/27/a-minimalist-development-workflow-using-es-modules-and-esinstall/\">here</a>, and <a href=\"https://www.bryanbraun.com/2019/12/07/using-the-url-to-build-database-free-web-apps/\">here</a>), but this post does a great job of summarizing the whole idea all in one place (something I’ve failed to do thus far, apparently). Can you imagine an internet chock-full of these mini apps? I wish the philosophy behind them (and the techniques to build them) were more well-known and wide-spread.</p><p><strong><a href=\"https://kevingal.com/blog/mona-lisa-gol.html\">Finding the Mona Lisa in the game of life</a></strong> - A fun exploration. I enjoyed learning about boolean equations and SAT Solvers, and the gifs were great. Most of all, I love the approach to the whole post. Kevin isn’t trying to make some grand point, or prove some fundamental computer-science limits. He’s just saying, “here’s what I tried and here’s what I found.” Sometimes, I have ideas for technical posts like these but I talk myself out of writing them because I know I’ll overlook or misunderstand something which will undermine the entire <em>point</em> of the post. But do my posts even need to have a point? It’s tempting to frame my writing as something truly novel but it’s also a ton of pressure and I suspect it kills a lot of otherwise good writing. Having a mindset of “this is just me exploring something” feels healthier and less prone to getting stuck.</p><p><strong><a href=\"https://touchpianist.com/\">Touch Pianist</a></strong> - This app gives you a little taste of how it feels to be a pianist. It made me realize that memorizing your sheet music is valuable because it frees up more of your brain to focus on rhythm and dynamics. It’s hard to play with emotion when all your energy is focused on playing the right notes.</p><p><strong><a href=\"https://macwright.com/2024/01/28/work-hard-and-take-everything-seriously\">Work hard and take everything really seriously</a></strong> - Honest advice on the benefits that hard work brings, with all the nuance the topic deserves. <em>“I worked pretty hard and was pretty unrestrained in pursuing interests. It worked out fine. Now that I’m older, my priorities have shifted slightly and I spend a little more time on other things, and am slowly becoming more balanced. But balance isn’t how I got here. Balance isn’t how a lot of the people I admire got to where they are now.”</em> I think if we are honest with ourselves, we’d all agree.</p><p><strong><a href=\"https://stephango.com/earth\">Earth is Becoming Sentient</a></strong> - I read this post twice before I realized that it was about AI. Once I saw it, I had to tell someone. I ended up discussing it with my wife and we had some fun extending the metaphor even further than the author did. As a side note, Steph Ango’s blog is quickly becoming one of my favorites, and I’ve enjoyed finding more gems in the backlog (<a href=\"https://stephango.com/optimism\">Choose optimism</a> is also excellent).</p><p><strong><a href=\"https://www.noahpinion.blog/p/the-elemental-foe\">The elemental foe</a></strong> - From the comfort of our modern lives, it’s easy to forget that desperate survival is our birthright. It’s only in the last hundred years or so that industrial advancements have lifted <a href=\"https://ourworldindata.org/history-of-poverty-has-just-begun\"><em>some</em> of us</a> out of poverty. This is an aberration of history and instead of taking it for granted, we should double down in our efforts to reduce poverty in the places where it still exists. What a perspective.</p><p><strong><a href=\"https://buildtheearth.net/\">BuildTheEarth</a></strong> - An online community with the stated goal to create a 1:1 scale replicate of every building on Earth in the computer game Minecraft. They’ve completed 58,121 buildings so far, including 55.55% of Toronto. Only 99.9999765% of Earth’s land mass to go! More fun statistics <a href=\"https://buildtheearth.net/map/statistics\">here</a>.</p>"
    },
    {
      "id": "/2024/07/31/capability-makes-your-life-simpler",
      "url": "https://www.bryanbraun.com/2024/07/31/capability-makes-your-life-simpler/",
      "date_published": "2024-07-31T00:00:00-04:00",
      "date_modified": "2024-07-31T00:00:00-04:00",
      "title": "Capability makes your life simpler",
      "summary": "If you can tolerate discomfort, then you can camp much lighter. Camping lighter means you spend less time and energy packing, setting-up, tearing down, and unpacking. The same goes for travel. Fewer clothes and shoes means less luggage to carry, manage, and lose. You can board the plane in peace.",
      "content_html": "<p>If you can <strong>tolerate discomfort</strong>, then you can camp much lighter. Camping lighter means you spend less time and energy packing, setting-up, tearing down, and unpacking. The same goes for travel. Fewer clothes and shoes means less luggage to carry, manage, and lose. You can board the plane in peace.</p><p>If you have <strong>skills</strong>, you can swim without needing a flotation device, goggles, or a nose plug. You can prepare your food with a single good knife, instead of a drawer-full of specialized cutting tools. You can secure anything with a rope and some knots. You can do more with less.</p><p>If you have <strong>knowledge</strong>, you can get around your city without needing a navigation device. You can speak other languages, reducing stress and confusion when you travel. You can move through the world with confidence.</p><p>If your body is <strong>healthy</strong>, you can walk long distances, carry heavy things, and recover quickly from life’s little injuries without missing a beat. You don’t need to deal with medication, monitors, or support equipment. You can handle whatever the situation requires.</p><hr class=\"section-divider\" /><p>Capability makes your life simpler. Tolerance, skills, knowledge, and health are always with you, wherever you go. They are assets but they take up no space. They are stored in your body.</p><p>Some lack capability through no fault of their own, but anyone can increase their capability. It’s an investment that pays dividends every day.</p>"
    },
    {
      "id": "/2024/06/10/goodbye-evernote-hello-obsidian",
      "url": "https://www.bryanbraun.com/2024/06/10/goodbye-evernote-hello-obsidian/",
      "date_published": "2024-06-10T00:00:00-04:00",
      "date_modified": "2024-06-19T00:00:00-04:00",
      "title": "Goodbye Evernote, Hello Obsidian",
      "summary": "I use note-taking software every day. I use it for journaling, blogging, capturing ideas, researching technologies, managing my projects, and many other things. Writing is how I think through problems, and note-taking software makes all that thinking easy to search and navigate.",
      "content_html": "<p>I use note-taking software every day. I use it for journaling, blogging, <a href=\"https://sparkbox.com/foundry/joy_skill_career_and_money_how_i_choose_a_side_project\">capturing ideas</a>, researching technologies, managing <a href=\"https://www.bryanbraun.com/projects/\">my projects</a>, and many other things. Writing is how I think through problems, and note-taking software makes all that thinking easy to search and navigate.</p><p>For 10+ years I used Evernote because it was simple and cross-platform. Recently, however, I’ve watched Evernote deploy increasingly aggressive business tactics like feature restrictions, price increases, and upsell pop-ups. I started to realize that <em>my</em> writing was in <em>their</em> cloud, under <em>their</em> control. They could put it behind a paywall or restrict exports and there would be nothing I could do about it. I wanted to use something that gave me more control and ownership over my notes. Something that would last me for the <em>next</em> 10 years.</p><p>I looked at a lot of tools, like Roam, Obsidian, LogSeq, Notion, Joplin, Workflowy, Apple Notes, OneNote, and Bear. They were all fine but nothing seemed to fit the vision I had in my head. I even toyed with the idea of designing and building my own note-taking tool. 💀</p><p>One day, I was talking to my friend <a href=\"https://reeds.website/\">Reed</a> about what my ideal note-taking tool would look like. It would just be a usability layer over the file system, like VSCode, but with a built-in markdown editor that gets out of your way like Bear. To this, Reed just said, “dude, you should try <a href=\"https://obsidian.md/\">Obsidian</a>.”</p><p>The thing was, I had already ruled Obsidian out.</p><p>I once <a href=\"https://www.bryanbraun.com/books/#how-to-take-smart-notes\">read a book called “How to Take Smart Notes,”</a> which described a note-taking system called Zettelkasten. It was all about building networks of linked notes (which is particularly useful for research). While the book was fascinating, I decided that I didn’t want to adopt a strict Zettelkasten-based workflow, and that any note-taking tool designed around Zettelkasten would result in me fighting the tool. In my mind, Obsidian was a Zettelkasten tool.</p><p>If that wasn’t enough, I was concerned that Obsidian wasn’t open source. I’m not a <a href=\"https://en.wikipedia.org/wiki/Free_software_movement\">free software</a> purist but after my experience with Evernote, I worried that closed-source options would put me at risk of lock-in.</p><p>Fast forward to today: I’ve now been using Obsidian for over four months and it’s been amazing.</p><h2 id=\"what-about-fighting-the-tool\">What about fighting the tool?</h2><p>My concerns about Zettelkasten turned out to be unfounded. Yes, Obsidian is often used for Zettelkasten but it isn’t designed specifically for that use-case. Core Obsidian is un-opinionated, and the more specific workflows (like strict Zettelkasten) are supported by opt-in plugins.</p><p>Obsidian has a huge community (many of them developers), which results in a large library of user-contributed plugins, themes, and style snippets (most of which are open source). While onboarding, I occasionally faced minor issues, but I could always work around them. For some examples:</p><ul>  <li>I didn’t like the default image-save location but it was configurable so I changed it.</li>  <li>I wanted the search keyboard-shortcuts to be more similar to my code editor so I customized them.</li>  <li>I liked a certain theme except the heading sizes were too similar. I adjusted the CSS and now it’s perfect.</li></ul><p>I don’t have to fight the tool when I can customize it to meet my needs. Now every time I use Obsidian, it’s like putting on a pair of pants that fits really well.</p><h2 id=\"what-about-lock-in\">What about lock-in?</h2><p>Obsidian is local-first, or, as I might describe it, “a usability layer over the file system.” Every note you create is just a text file (markdown) and you can organize these files into folders while still using modern formatting, navigation, and search. “Local-first” seems like just a clever technical detail but it has huge implications for ownership and control. Ownership, because the files live on your computer and <a href=\"https://stephango.com/file-over-app\">text files have longevity</a>. Control, because text files are flexible. You can check them into git, and BAM you’ve got versioning. Or you can put them in Dropbox and BAM you’ve got syncing.</p><p>Now, I’ve been around long enough to watch many good apps go south (see: Evernote). That could happen to Obsidian too but it has a lot of things going for it, specifically, <a href=\"https://stephango.com/vcware\">being bootstrapped and 100% user-supported</a>. Val Agostino <a href=\"https://www.monarchmoney.com/blog/mint-shutting-down\">said</a> that “a company eventually becomes its business model*,” and Obsidian’s business model avoids the misaligned incentives that plague much of the industry. Time will tell whether they hold to <a href=\"https://obsidian.md/about\">their principles</a> but I’m optimistic that whatever happens, we won’t have to worry about lock-in.</p><blockquote>  <p>It is now possible for tiny teams to make principled software that millions of people use, unburdened by investors. Principled apps that put people in control of their data, their privacy, their wellbeing. These principles can be irrevocably built into the architecture of the app.</p>  <p><a href=\"https://stephango.com/vcware\">Steph Ango, CEO of Obsidian - 100% User Supported</a></p></blockquote><hr class=\"section-divider\" /><p>Using Obsidian is truly a joy. I love it, and I’m not the only one who feels that way (see: <a href=\"https://www.fastcompany.com/90960653/why-people-are-obsessed-with-obsidian-the-indie-darling-of-notetaking-apps\">The cult of Obsidian: Why people are obsessed with the note-taking app</a>).</p><p>If you’re not happy with your current note-taking system, I encourage you to give it a try.</p>"
    },
    {
      "id": "/2024/04/27/the-flood-of-ai-website-builders",
      "url": "https://www.bryanbraun.com/2024/04/27/the-flood-of-ai-website-builders/",
      "date_published": "2024-04-27T00:00:00-04:00",
      "date_modified": "2024-04-27T00:00:00-04:00",
      "title": "The flood of AI website builders",
      "summary": "There are so many of them.",
      "content_html": "<p>There are so many of them.</p><!-- We're using <img> instead of markdown to enable lazy-loading --><p><img src=\"https://www.bryanbraun.com/assets/images/ai-website-8.png\" loading=\"lazy\" alt=\"the limecube ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-1.png\" loading=\"lazy\" alt=\"the pineapple ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-2.png\" loading=\"lazy\" alt=\"the uncody ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-5.png\" loading=\"lazy\" alt=\"the pico ai web app builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-3.png\" loading=\"lazy\" alt=\"the vzy ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-4.png\" loading=\"lazy\" alt=\"the relume ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-10.png\" loading=\"lazy\" alt=\"the butternut ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-9.png\" loading=\"lazy\" alt=\"the code conductor ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-12.png\" loading=\"lazy\" alt=\"the gptengineer ai web app builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-14.png\" loading=\"lazy\" alt=\"the brizy ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-11.png\" loading=\"lazy\" alt=\"the lando ai landing page builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-13.png\" loading=\"lazy\" alt=\"the dorik ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-15.png\" loading=\"lazy\" alt=\"the webwave ai website builder\" /><img src=\"https://www.bryanbraun.com/assets/images/ai-website-16.png\" loading=\"lazy\" alt=\"the codedesign ai website builder\" /></p><hr /><p>How good are these site builders? <em>I don’t know.</em></p><p>Are you worried about job security? <em>I have two thoughts…</em></p><h2 id=\"1-weve-seen-this-before\">1. We’ve seen this before</h2><p>Wordpress, Squarespace, Shopify, Webflow… all these tools made it easier for anyone to spin up a basic website. And yet, the world has always needed more web developers. Why? Well, some people need more than just a basic website. Some people are trying to build apps and tools that have never been built before. A lot of my current work is supporting custom features that span multiple teams, codebases, and services. I think we’re still a long way from AI doing all of that.</p><h2 id=\"2-the-world-is-always-changing\">2. The world is always changing</h2><p>Maybe this time it’s different, and the tools really will make web developers obsolete (including me). If so, what then?</p><p>I’d lose my job. That sucks. But when I think about it, I don’t want a job per se. I want security and fulfillment.</p><p>There are a lot of paths to security and fulfillment and I don’t think my current job, or even my current career, is the only one. It takes some effort and creativity to get yourself into a career that works for you but I’ve done it before and I can do it again. I know my strengths and weaknesses, and there is no shortage of interesting problems in the world. Who knows, maybe I can use AI to help me solve some of them.</p><p>The world is always changing. We can try to resist it, or we can change with it.</p>"
    },
    {
      "id": "/2024/03/08/why-we-prefer-computers-over-consoles-when-introducing-kids-to-gaming",
      "url": "https://www.bryanbraun.com/2024/03/08/why-we-prefer-computers-over-consoles-when-introducing-kids-to-gaming/",
      "date_published": "2024-03-08T00:00:00-05:00",
      "date_modified": "2024-03-08T00:00:00-05:00",
      "title": "Why we prefer computers over consoles when introducing kids to gaming",
      "summary": "I grew up gaming on consoles like Nintendo 64 and Gamecube. I have a lot of fond memories playing games with my brothers on those devices.",
      "content_html": "<p>I grew up gaming on consoles like Nintendo 64 and Gamecube. I have a lot of fond memories playing games with my brothers on those devices.</p><p>But as my own kids have gotten older, my wife and I have decided to first introduce them to gaming with computers, instead of consoles.</p><figure class=\"center\">  <img src=\"https://www.bryanbraun.com/assets/images/home-computer-lab.jpg\" alt=\"A photo of four computer workstations all side-by-side on a table.\" />  <figcaption>The \"computer lab\" we set up in our kitchen. It grew out of the pandemic and we've expanded it as our kids have gotten older.</figcaption></figure><p>Here are some of the reasons we prefer computers over consoles:</p><h2 id=\"computers-are-better-for-creativity-consoles-are-better-for-consumption\">Computers are better for creativity… consoles are better for consumption</h2><p>Gaming can be a creative endeavor but the device you are using matters. With consoles, you can only do things that have been programmed into the platform or game by the developers. Some games might have a creative or sandbox mode but only if the developer added it intentionally.</p><p>Computers make it easy to take a screenshot and email it to a friend, or record a screen capture and upload it to Youtube. They allow more input devices like microphones, keyboards, and drawing tablets (in addition to controllers). Web-based games let you view source and access developer tools by default, but even “native” computer games tend to be more open than their console counterparts, by offering mods, special builds, and downloadable assets (like user-created characters and save files).</p><p>A computer is a general-purpose device that happens to run games. It’s that general-purpose-ness that expands what’s possible, and that’s something I value a lot.</p><h2 id=\"computer-gaming-teaches-you-computer-skills\">Computer gaming teaches you computer skills</h2><p>Time spent gaming on a computer is time spent practicing cross-functional computer skills. During an average gaming session, my kids might be doing things like typing, searching the web, downloading mods, navigating a filesystem, and troubleshooting simple audio or wifi issues. They use hotkeys, learn how to mitigate “lag,” and practice basic password management.</p><p>Some games open the door to advanced computer skills. Minecraft, Algodoo, <a href=\"https://www.bryanbraun.com/2021/01/18/the-powder-toy/\">The Powder Toy</a>, and others include an in-game console for running commands or simple scripts. This becomes a gateway to more ambitious customization like developing <a href=\"https://www.planetminecraft.com/texture-pack/pizzaluxe/\">resource packs</a> and mods, which uses graphic design and programming skills.</p><p>Multiplayer gaming on a computer exposes you to the basics of networking and hosting. My kids know how to look up their IP addresses so they can invite their siblings to a LAN game of Minecraft or Terarria. By using our family Minecraft server, they’ve learned about latency and server overload (there was an “incident” where a kid detonated a massive sphere of TNT, bringing the server to its knees 🤣).</p><p>You can learn a LOT about networking by troubleshooting lag. Who is lagging? Is it everyone, or just one person? Who is hosting the game—is it on a local computer or a server? Is the game lagging for the host? We ended up making <a href=\"https://www.instagram.com/p/CQSWlmglEh1/\" title=\"key takeaway: the person with the fastest computer should be the one hosting the LAN game\">a whiteboard lesson</a> to discuss these questions, and it was like Networking 101 for elementary school kids.</p><p>Computer skills are something you’ll use your whole life. I’m typing this post on a computer. Even if my kids don’t go into a computer-related field, I want them to be comfortable using computers and troubleshooting issues on their own, instead of feeling helpless around technology.</p><h2 id=\"a-relatively-safe-early-exposure-to-social-media\">A relatively safe, early exposure to social media</h2><p>When you’re gaming on a computer, the internet is right there as a resource for gaming tips and research. Every major game has a wiki and a subreddit, filled with moderated, user-contributed content. The wikis expose kids to new and interesting ways to play that would be difficult to discover on their own (challenges, advanced achievements, mods, etc). They start to recognize the names of prolific contributors and think about contributing themselves. <em>They’re not just playing a game… they’re joining a community</em>.</p><p>The first gaming community my kids joined was <a href=\"https://scratch.mit.edu/\">Scratch</a> and I can’t think of a better first exposure to social media. Unlike TikTok or Instagram, there were no algorithms, no attention harvesting, no ads, active moderation, and minimal clickbait.</p><p>All popular games have online communities. Some are safer than others, but if your kids are playing age-appropriate games, the communities are probably safer than whatever the TikTok or Instagram algorithm would deliver. Of course, it’s good idea to vet the community first!</p><p>With console gaming, you’re often playing by yourself in your own little world. That’s fine (especially for very young children), but a little exposure to topical online communities is good preparation for the adult communities we eventually join (be they professional, research-based, open-source, etc).</p><h2 id=\"case-study-minecraft-bedrock-edition-vs-minecraft-java-edition\">Case Study: Minecraft Bedrock Edition vs Minecraft Java Edition</h2><p>You can play Minecraft on both consoles and computers (like many games these days).</p><p>Consoles use a version called Minecraft: Bedrock Edition; computers support Minecraft: Java Edition. The gameplay is similar, but Java Edition (the computer one) supports modding, custom skins, custom textures, custom shaders, historical installations, and more.</p><p>Bedrock Edition tries to add this kind of flexibility through their DLC marketplace, but the marketplace is limited to registered businesses that have a formal partnership with Mojang. If you want to create your own skins or textures, you’re out of luck.</p><p>This isn’t just a Minecraft thing. A lot of the games we like (Terraria, Stardew Valley, Factorio, No Man’s Sky) are available for both computers and consoles, but the computer version supports mods and the console version doesn’t. The platform matters.</p><h2 id=\"the-benefits-of-consoles\">The Benefits of Consoles</h2><p>I’ve talked a lot about why we like computers for gaming but consoles are better at lot of things:</p><ul>  <li>They cost less.</li>  <li>They are more user-friendly.</li>  <li>Multiplayer is easier. Think “setting up a LAN” vs “handing someone a controller”. This is especially noticeable in “couch co-op” style games like “Overcooked” and “Untitled Goose Game,” which are available for computers but clearly designed with consoles in mind.</li>  <li>Stricter content moderation.</li></ul><p>Similar to smartphones, gaming consoles are polished, user-friendly, walled gardens that guide you down a pre-destined path. Gaming on computers are more like “the web.” Open. Expansive. Chaotic.</p><p>And while I praised the creativity and community features of computers, there are cases where console developers worked hard to build those features directly into their games, like Super Mario Maker, Gamebuilder Garage, and Nintendo Labo. So it can definitely be done.</p><p>I’m not anti-console. We’ll likely get a console at some point. But for now, we’re finding that computers are the best tool for creating the experience we want our kids to have while playing games.</p>"
    },
    {
      "id": "/2024/01/27/theres-never-going-to-be-time",
      "url": "https://www.bryanbraun.com/2024/01/27/theres-never-going-to-be-time/",
      "date_published": "2024-01-27T00:00:00-05:00",
      "date_modified": "2024-01-27T00:00:00-05:00",
      "title": "There's never going to be time",
      "summary": "A few years ago, a silly checkbox animation I made got some attention on Twitter:",
      "content_html": "<p>A few years ago, a silly checkbox animation I made got some attention on Twitter:</p><p><a href=\"https://twitter.com/doused_zi/status/1436285069082120235\"><img src=\"https://www.bryanbraun.com/assets/images/so-much-time.png\" alt=\"tweet text: y'all have so much time on your hands, I desperately want some\" /></a></p><p>Even years later, the comment above stuck with me:</p><blockquote>  <p><em>y’all have so much time on your hands, I desperately want some.</em></p></blockquote><p>They were probably joking, but it couldn’t have been further from the truth.</p><p>They didn’t know that I recorded that video at 1:30AM the night before, or that I’d been up that late working on it three nights in a row. They didn’t know that I had a sore throat and knew I needed the rest, but stayed up to work on it anyway. They didn’t see my overflowing email inbox or my Elder’s Quorum interview backlog. They didn’t see the hours I was putting in daily, raising 5 kids and maintaining a 70-yr-old house.</p><p>I bring this up, not because I want credit or pity. It’s because I want my future self to remember that <em>I didn’t have time for this but I made it anyway</em>.</p><p>In fact, looking back at my other projects, I’ve never had time for any of them:</p><ul>  <li><a href=\"https://www.bryanbraun.com/after-dark-css/\">After Dark in CSS</a>: I loved this idea so much that I put my side-business on hold and blocked out a week to work on it. I went to the public library so I could have uninterrupted focus-time to learn about web animations and figure out how to build this.</li>  <li><a href=\"https://powerpointkaraoke.com\">Powerpoint Karaoke</a>: My wife and I worked on this together during our 5th anniversary. We asked my sister-in-law to watch the kids and we spent most of the time building the first version of the website.</li>  <li><a href=\"https://sparkbox.github.io/bouncy-ball\">Bouncy Ball</a>: I set up an unconventional schedule at work, putting in extra hours on Monday-Thursday, so I could have free time to work on this on Fridays. Ultimately, this meant I had to come in early, leave late, take fewer breaks, and work with my clients to get it approved.</li>  <li><a href=\"https://musicbox.fun\">Music Box Fun</a>: I organized a trip to <a href=\"https://www.recurse.com/\">Recurse Center</a> to build an early version of this. Sparkbox covered part of the cost, but I needed to pay for the remainder myself and use some vacation days in order to stay the whole week.</li>  <li><a href=\"https://bryanbraun.com/lets-get-creative\">Let’s Get Creative</a>: My wife and kids agreed to cover my outdoor chores for me so I could spend a couple of Saturdays working on this. I ended up taking some vacation days to get it out the door.</li></ul><p>Basically, every time I wanted to make something non-trivial, life stood in the way. I’ve had to let house projects languish, retire existing projects (many which still had potential, but were high-maintenance), or interrupt momentum in one area to pursue an opportunity in another.</p><p>And while it’s tempting to feel resentful, the truth is that this is just what life looks like when you’re a capable adult. Your time is valuable so it gets put to good use.</p><p>There’s never going to be time to build something great, because <strong>it’s hard to do great work without giving it your undivided attention, and undividing your attention always has a cost</strong>. The trick is to become ok with that.</p><hr /><p><em>Note: this post was influenced by <a href=\"https://rachsmith.com/clearing-the-decks/\">Rachel Smith’s “I could spend the rest of my life clearing the decks, if I’m not careful”</a> and <a href=\"https://www.bryanbraun.com/books/#4000-weeks-time-management-for-mortals\">“4000 Weeks”, by Oliver Burkeman</a>. Read them both!</em></p>"
    }
  ]
}