<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Beta</title>
    <description>The latest articles on DEV Community by Beta (@atbeta).</description>
    <link>https://dev.to/atbeta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F320001%2F94c96fc2-3710-4861-be61-4fd8d55e13dc.jpeg</url>
      <title>DEV Community: Beta</title>
      <link>https://dev.to/atbeta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/atbeta"/>
    <language>en</language>
    <item>
      <title>I Built a Self-Hosted Image Hosting Platform in Go — and Gave It an MCP Interface</title>
      <dc:creator>Beta</dc:creator>
      <pubDate>Fri, 08 May 2026 18:21:11 +0000</pubDate>
      <link>https://dev.to/atbeta/i-built-a-self-hosted-image-hosting-platform-in-go-and-gave-it-an-mcp-interface-4hgl</link>
      <guid>https://dev.to/atbeta/i-built-a-self-hosted-image-hosting-platform-in-go-and-gave-it-an-mcp-interface-4hgl</guid>
      <description>&lt;h2&gt;
  
  
  The Backstory
&lt;/h2&gt;

&lt;p&gt;I spent the latter half of last year Vibe Coding — a lot. First came &lt;a href="https://github.com/relaycraft/relaycraft" rel="noopener noreferrer"&gt;RelayCraft&lt;/a&gt; (an AI-native network traffic debugging tool, built with Tauri + Rust). Then PicFast, released more recently.&lt;/p&gt;

&lt;p&gt;PicFast is a self-hosted image hosting platform you can spin up in one Docker command. Clean management UI, multiple storage backends, ShareX integration, and a built-in MCP interface so your AI tools can actually &lt;em&gt;talk&lt;/em&gt; to your image host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp38fjappad25lkm08ul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp38fjappad25lkm08ul.png" alt="PicFast" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's how it came together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Build Another Image Host?
&lt;/h2&gt;

&lt;p&gt;If you've been around the block, you know the deal: image hosting services change policies, shut down, or start charging. Your images are on someone else's server — and that server isn't yours.&lt;/p&gt;

&lt;p&gt;With AI tools generating screenshots, document images, and visual assets constantly, images have become a real data asset. Letting someone else hold them feels... wrong.&lt;/p&gt;

&lt;p&gt;I actually looked. I spent real time searching for a self-hosted image host that didn't feel like a relic from 2010 — something with a modern UI, multi-user support, and ideally an API that AI tools could actually use. I came up empty.&lt;/p&gt;

&lt;p&gt;Most self-hosted options are either abandoned GitHub repos, PHP-era projects with no maintenance, or solutions so over-engineered they defeat the purpose of "simple."&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;

&lt;p&gt;PicFast exists for three reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data sovereignty&lt;/strong&gt; — your images, your server, your rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable cost&lt;/strong&gt; — PostgreSQL + Docker, nothing else&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-native by design&lt;/strong&gt; — MCP support out of the box&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  One Command to Running
&lt;/h2&gt;

&lt;p&gt;No lengthy tutorial here (the README covers that). The gist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/atbeta/picfast.git
&lt;span class="nb"&gt;cd &lt;/span&gt;picfast/docker
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# edit .env — replace with your domain、password and JWT salt&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point your browser at &lt;code&gt;http://your-server:18080&lt;/code&gt;, go through the setup wizard, and you're done. Production deploy with a domain + Caddy/Nginx reverse proxy for HTTPS takes another few minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack: Why Go + React
&lt;/h2&gt;

&lt;p&gt;I'm going to be honest — I had no production Go experience before this project. Here's why I picked it anyway:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt;: Go's concurrency model is a natural fit for I/O-heavy workloads like an image host. I went with Chi Router + pgx/v5 + sqlc. Type-safe SQL without the ORM baggage. Compile to a single binary, deploy anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt;: React 19 + TypeScript + Vite. Tailwind CSS v4 — honestly, it feels like it was built for the AI era. Fast iteration, utility-first, plays well with AI-generated styles. A proper multi-user admin dashboard needs a real UI framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL 16. User accounts, albums, storage policies — the metadata here is relational and pgx makes interacting with it clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP: Talk to Your Image Host with Natural Language
&lt;/h2&gt;

&lt;p&gt;This is the part that usually gets people's attention.&lt;/p&gt;

&lt;p&gt;PicFast implements the Model Context Protocol. Once configured, you can manage your image host from any MCP-compatible AI tool — Claude Desktop, Cursor, whatever you're using.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"picfast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@picfast/mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PICFAST_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-picfast.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PICFAST_API_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"img_xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can just ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Upload all my screenshots from today to PicFast and give me the links in Markdown."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI calls the PicFast API directly. No tab switching. No manual uploads. This is what a self-hosted image host looks like in the AI era.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other Stuff Worth Mentioning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storage backends&lt;/strong&gt;: Local disk, AWS S3 / MinIO (S3-compatible), Alibaba OSS, Tencent COS, Qiniu Kodo, WebDAV. Drop in a CDN-backed S3 bucket and your image URLs are fast globally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ShareX ready&lt;/strong&gt;: Download the config file from the admin panel, import it, done. Screenshots go straight to your server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-user + permissions&lt;/strong&gt;: Admin / regular user / guest, per-group storage limits, optional approval queue for public-facing instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API tokens&lt;/strong&gt;: Fine-grained rate limits, great for automation scripts and CI pipelines.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The upper limit of what AI can do far exceeded my expectations. Ideas that used to require a team, or months of grinding, can now become real products in weeks — sometimes days.&lt;/p&gt;

&lt;p&gt;That changes what it feels like to be a software engineer. You're no longer bottlenecked by whether you can theoretically build something. You're bottlenecked by what you can actually &lt;em&gt;think&lt;/em&gt; to build.&lt;/p&gt;

&lt;p&gt;PicFast started as a vague idea. I shipped the entire thing over one Labor Day holiday — a functional, deployed project in just a few days of focused work. RelayCraft took two months by comparison. That contrast still amazes me — the same AI tooling that powered RelayCraft compressed an entire traditional development cycle into a long weekend.&lt;/p&gt;

&lt;p&gt;I'm grateful for this era.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/atbeta/picfast" rel="noopener noreferrer"&gt;https://github.com/atbeta/picfast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://picfast.dev" rel="noopener noreferrer"&gt;https://picfast.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub&lt;/strong&gt;: &lt;code&gt;xbeta/picfast&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a star if you find it useful. Issues and PRs welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>selfho</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
