<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ideochrom on Mitchell Cohen</title><link>https://blog.mitch-cohen.com/tags/ideochrom/</link><description>Recent content in Ideochrom on Mitchell Cohen</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 08 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.mitch-cohen.com/tags/ideochrom/index.xml" rel="self" type="application/rss+xml"/><item><title>How Claude Code Saved My Application from a Catastrophic Deletion</title><link>https://blog.mitch-cohen.com/posts/ideochrom-disaster-recovery-with-claude-code/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.mitch-cohen.com/posts/ideochrom-disaster-recovery-with-claude-code/</guid><description>How I used Claude Code to recover a DigitalOcean droplet after accidentally deleting critical system files — and why documentation became the most important part of the rebuild.</description><content:encoded><![CDATA[<p><a href="https://ideochrom.com">Ideochrom</a> is a free web tool I built for generating publication-ready chromosome karyotype ideograms. I don&rsquo;t make money from it — if anything, I lose money. It pales in comparison to my surf fishing hobby, where lures, terminal tackle, and other gear I buy to &ldquo;assure&rdquo; I&rsquo;ll catch something add up by the end of the season. But it&rsquo;s a hobby project that genuinely helps my colleague and his lab, so I keep it running.</p>
<p>Part of keeping it running means occasional maintenance. In an ambitious cleanup effort, one of my goals was removing old, unneeded deployment backups that GitHub Actions had accumulated. With the help of my less-than-great Linux command knowledge, I somehow <strong>deleted files that left my DigitalOcean droplet unable to run or restart</strong>. The repository had all the source code — but I had never signed up for DigitalOcean&rsquo;s weekly backups. Not ideal.</p>
<p><img alt="Server racks in a data center" loading="lazy" src="/images/blog-disaster-server-room.jpg"></p>
<h2 id="what-needed-to-be-rebuilt">What needed to be rebuilt</h2>
<p>If this were an enterprise application, I&rsquo;d have been in serious trouble. But I had a good friend: Claude. I knew how the application worked at a high level, had the GitHub Actions YAML, and just needed to map out what a full restore would require. Here&rsquo;s what I outlined:</p>
<ul>
<li><code>nginx</code> configurations for <code>dev.ideochrom.com</code> and <code>ideochrom.com</code></li>
<li>SSL setup for HTTPS via <a href="https://letsencrypt.org/">Let&rsquo;s Encrypt</a></li>
<li>A <code>cron</code> job to handle monthly SSL certificate renewal</li>
<li>A background service that fetches band files from the NCBI cytogenetic data repository, with another <code>cron</code> job that fires monthly to check for and add any missing files</li>
<li>SSH key setup and updating the corresponding secret in GitHub&rsquo;s <strong>Settings &gt; Secrets &gt; Actions</strong></li>
</ul>
<h2 id="the-recovery-process">The recovery process</h2>
<p><img alt="Code on a screen reflected in eyeglasses" loading="lazy" src="/images/blog-disaster-recovery-code.jpg"></p>
<p>I spun up a new DigitalOcean droplet using the same Ubuntu server image as before, opened Claude Code inside Ideochrom&rsquo;s source repo, and got to work. Claude handled most of the changes inside the GitHub Actions YAML. The rebuild actually came out slightly better than what was there before — for example, deployment directories were isolated rather than reused, which reduced the risk of the same cleanup mistake happening again.</p>
<p>A few things I handled manually throughout the process:</p>
<ul>
<li>Copied and pasted logs from failed GitHub Actions workflow runs so Claude could diagnose errors</li>
<li>Scoped all deployments during the restore to <code>dev.ideochrom.com</code>, so my colleague could test on his end before anything went to production</li>
<li>Created a new <code>infrastructure/</code> folder with <code>services/</code> and <code>nginx/</code> subfolders to organize all service files, <code>cron</code> jobs, and nginx configurations in one place — rather than scattered across the repo as before</li>
</ul>
<p>One constraint worth noting: I don&rsquo;t give Claude access to the GitHub CLI to trigger workflows or SSH into the droplet directly. Everything infrastructure-side had to go through me.</p>
<h2 id="the-most-important-thing-we-did">The most important thing we did</h2>
<p><img alt="Hands writing notes in a notebook" loading="lazy" src="/images/blog-disaster-readme-notes.jpg"></p>
<p>I had Claude generate a <code>README</code> documenting every step required to bring the application back online from a bare droplet. <strong>This was the most valuable output of the entire recovery.</strong> Whether the next incident is another catastrophic mistake, a planned migration to a new droplet, or a move to AKS, that document means we&rsquo;re not starting from scratch — we&rsquo;re handing a known playbook to Claude or any other tool and getting straight to work.</p>
<h2 id="results">Results</h2>
<p>The process took about <strong>4 hours</strong> to get the application back online. Without Claude, this would have taken weeks — tasks like SSL renewal with a <code>cron</code> job are not in my Linux administration wheelhouse. In the end, my colleague was back to using the application, and we came out of it with better infrastructure organization and documentation than we had going in.</p>
<p>The lesson: keep your source code in version control, document your infrastructure as if you&rsquo;ll need to rebuild it from scratch (because someday you will), and don&rsquo;t run cleanup commands you&rsquo;re not confident in on a production server.</p>
]]></content:encoded></item></channel></rss>