<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>FalseBlue - devops</title>
      <link>https://falseblue.com</link>
      <description>The personal site of Ben Craton: software developer, project manager, and cybersecurity professional.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://falseblue.com/tags/devops/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 01 Jun 2017 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Evolution of the Magic Card Generator</title>
          <pubDate>Thu, 01 Jun 2017 00:00:00 +0000</pubDate>
          <author>Ben Craton</author>
          <link>https://falseblue.com/projects/magic-card-generator/</link>
          <guid>https://falseblue.com/projects/magic-card-generator/</guid>
          <description xml:base="https://falseblue.com/projects/magic-card-generator/">&lt;div class=&quot;admonition note&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-note&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;NOTE&lt;&#x2F;strong&gt;
        &lt;p&gt;If you’re wonder where the site is: see &lt;a href=&quot;https:&#x2F;&#x2F;falseblue.com&#x2F;posts&#x2F;self-hosting&#x2F;#magic-falseblue-com&quot;&gt;this post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;I like Magic: The Gathering and I like programming, so in 2017 I built a web page that let people make their own Magic cards: upload some art, fill in the card attributes, get a card. That’s it. That was the whole idea. It then proceeded to eat nearly a decade of my hobby time, one rewrite at a time, and by January 2024, strangers on the internet had made &lt;strong&gt;over 250,000 cards&lt;&#x2F;strong&gt; with it.&lt;&#x2F;p&gt;
&lt;p&gt;The honest framing: every version of this site was an excuse to learn whatever I’d just been exposed to at work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;version-1-php-like-an-honest-man&quot;&gt;Version 1: PHP, Like an Honest Man&lt;&#x2F;h2&gt;
&lt;p&gt;A basic PHP form and an image generator. Users typed in card text, the server composited it onto a card frame. It taught me web development fundamentals the traditional way: by breaking a live site repeatedly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;version-2-the-learning-platform-era&quot;&gt;Version 2: The Learning Platform Era&lt;&#x2F;h2&gt;
&lt;p&gt;When I came back to it, I rebuilt it as an excuse to learn the “grown-up” stack of the mid-2010s:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 3 &amp;amp; Django&lt;&#x2F;strong&gt; for the backend&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Neural networks &amp;amp; image recognition&lt;&#x2F;strong&gt; for automated analysis of uploaded card art&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bitbucket, Jenkins, Docker, Rancher&lt;&#x2F;strong&gt; (a real CI&#x2F;CD pipeline for a silly card site)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The unglamorous lesson came from migrating 250k existing images and their data to a new format. Nothing teaches you respect for data integrity like the possibility of destroying a quarter-million pieces of other people’s art with one bad script.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;version-3-peak-complexity&quot;&gt;Version 3: Peak Complexity&lt;&#x2F;h2&gt;
&lt;p&gt;Version 3 adopted whatever my DevOps colleagues were excited about that year:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vue.js&lt;&#x2F;strong&gt; frontend, &lt;strong&gt;Node.js &amp;amp; MongoDB&lt;&#x2F;strong&gt; backend, &lt;strong&gt;Redis&lt;&#x2F;strong&gt; caching&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;An AI NSFW filter&lt;&#x2F;strong&gt; (because the site had no accounts by design, and anonymous internet users plus an image uploader is exactly the moderation problem you think it is)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Docker &amp;amp; Kubernetes&lt;&#x2F;strong&gt; for orchestration, &lt;strong&gt;Azure DevOps Pipelines&lt;&#x2F;strong&gt; for deployment&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Yes, this is an absurd amount of infrastructure for a card generator. That was partly the point: I got to make my architecture mistakes on my own time instead of my employer’s.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-it-stands&quot;&gt;Where It Stands&lt;&#x2F;h2&gt;
&lt;p&gt;The site is down (see &lt;a href=&quot;https:&#x2F;&#x2F;falseblue.com&#x2F;posts&#x2F;self-hosting&#x2F;#magic-falseblue-com&quot;&gt;the self-hosting update&lt;&#x2F;a&gt; for why), and I doubt it’s coming back. But a quarter-million cards is a quarter-million small moments of someone making a thing and grinning at it, and every skill this project taught me got used professionally within a year or two of learning it. Not bad for a hobby project that started as one PHP file.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
