<?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: Sayem Chowdhury</title>
    <description>The latest articles on DEV Community by Sayem Chowdhury (@sayem314).</description>
    <link>https://dev.to/sayem314</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%2F318691%2Fa78824a8-ee64-44ed-819b-81a8d0a906e8.jpeg</url>
      <title>DEV Community: Sayem Chowdhury</title>
      <link>https://dev.to/sayem314</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sayem314"/>
    <language>en</language>
    <item>
      <title>Meet Lunarr: a self-hosted media server for local and SFTP libraries</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Sat, 13 Jun 2026 06:58:23 +0000</pubDate>
      <link>https://dev.to/sayem314/meet-lunarr-a-self-hosted-media-server-for-local-and-sftp-libraries-57f7</link>
      <guid>https://dev.to/sayem314/meet-lunarr-a-self-hosted-media-server-for-local-and-sftp-libraries-57f7</guid>
      <description>&lt;p&gt;I have been building &lt;strong&gt;Lunarr&lt;/strong&gt;, a self-hosted web media server for people who want to scan, organize, and watch their own movie and TV libraries in the browser.&lt;/p&gt;

&lt;p&gt;It is still early, but the core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add local or SFTP media libraries, scan them, match metadata, and play them through a clean web UI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lunarr is not trying to replace Plex or Jellyfin overnight. Those projects are mature and cover a huge surface area. Lunarr is currently focused on being small, direct, and practical for self-hosted setups where media may live on the same machine or on remote SFTP storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Lunarr does today
&lt;/h2&gt;

&lt;p&gt;Lunarr currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local movie and TV libraries&lt;/li&gt;
&lt;li&gt;SFTP movie and TV libraries&lt;/li&gt;
&lt;li&gt;TMDb metadata matching&lt;/li&gt;
&lt;li&gt;Movie, show, season, and episode organization&lt;/li&gt;
&lt;li&gt;Browser playback&lt;/li&gt;
&lt;li&gt;Direct streaming when the browser can play the file&lt;/li&gt;
&lt;li&gt;Temporary HLS remux/transcode when needed&lt;/li&gt;
&lt;li&gt;Seekable request-driven HLS playback&lt;/li&gt;
&lt;li&gt;Sidecar &lt;code&gt;.vtt&lt;/code&gt; subtitle detection&lt;/li&gt;
&lt;li&gt;Admin/user accounts&lt;/li&gt;
&lt;li&gt;Library sharing controls&lt;/li&gt;
&lt;li&gt;Manual scans, scheduled scans, and local file watching&lt;/li&gt;
&lt;li&gt;Docker deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SFTP support is one of the important parts for me. A lot of self-hosted setups do not keep media on the same machine as the web app. Lunarr can scan remote folders and, when possible, play seekable remote media without first copying the whole file locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playback model
&lt;/h2&gt;

&lt;p&gt;Lunarr tries direct playback first when the browser can handle the file.&lt;/p&gt;

&lt;p&gt;When direct playback is not suitable, Lunarr uses temporary HLS playback. Instead of transcoding an entire movie up front, it generates segments around what the player is actually requesting.&lt;/p&gt;

&lt;p&gt;For example, if you jump from 55 minutes to 13 minutes and then to 80 minutes, Lunarr does not transcode everything between those points. It repositions FFmpeg, generates the requested segment, and prepares a small lookahead window so playback can continue.&lt;/p&gt;

&lt;p&gt;That keeps CPU and disk usage more proportional to what the viewer is actually watching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start with Docker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; lunarr &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;AUTH_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;replace-with-a-random-secret-at-least-32-chars &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORIGIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; lunarr-data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /mnt/media:/media:ro &lt;span class="se"&gt;\&lt;/span&gt;
  sayem314/lunarr:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the first admin account, add a movie or TV library, and start a scan.&lt;/p&gt;

&lt;p&gt;For local media, mount your host media folder into the container and add the container path, for example &lt;code&gt;/media&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For SFTP media, add the remote connection from the Libraries page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build another media server?
&lt;/h2&gt;

&lt;p&gt;Mostly because I wanted a focused project with a modern web stack, clear internals, and first-class support for both local and SFTP libraries.&lt;/p&gt;

&lt;p&gt;Some goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep deployment simple&lt;/li&gt;
&lt;li&gt;Make scanning behavior visible&lt;/li&gt;
&lt;li&gt;Keep playback temporary and cleanup-friendly&lt;/li&gt;
&lt;li&gt;Avoid requiring users to reorganize everything perfectly&lt;/li&gt;
&lt;li&gt;Support browser playback without pretending every file is browser-native&lt;/li&gt;
&lt;li&gt;Build something easier to iterate on while still being useful&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;Lunarr is beta software. It works, but there are still areas where mature media servers are ahead, especially around the long tail of media containers, subtitle formats, adaptive bitrate streaming, and unusual timestamp/keyframe edge cases.&lt;/p&gt;

&lt;p&gt;The current focus is reliability: scanning, playback sessions, seeking behavior, cleanup, and Docker-based deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;Lunarr currently uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SvelteKit&lt;/li&gt;
&lt;li&gt;Bun/Node&lt;/li&gt;
&lt;li&gt;SQLite/libSQL&lt;/li&gt;
&lt;li&gt;FFmpeg for remux/transcoding&lt;/li&gt;
&lt;li&gt;NodeAV for metadata/probing&lt;/li&gt;
&lt;li&gt;Docker for easier deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Docker image:&lt;br&gt;
&lt;a href="https://hub.docker.com/r/sayem314/lunarr" rel="noopener noreferrer"&gt;https://hub.docker.com/r/sayem314/lunarr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/lunarr-app/lunarr-go" rel="noopener noreferrer"&gt;https://github.com/lunarr-app/lunarr-go&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback is welcome, especially from people running self-hosted media setups with local disks, SFTP storage, or mixed libraries.&lt;/p&gt;

</description>
      <category>selfhosted</category>
      <category>mediaserver</category>
      <category>svelte</category>
      <category>docker</category>
    </item>
    <item>
      <title>Run Codex, Claude Code, and OpenCode in Docker — Without Giving Them Your Host</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Wed, 03 Jun 2026 12:30:03 +0000</pubDate>
      <link>https://dev.to/sayem314/run-codex-claude-code-and-opencode-in-docker-without-giving-them-your-host-1i3e</link>
      <guid>https://dev.to/sayem314/run-codex-claude-code-and-opencode-in-docker-without-giving-them-your-host-1i3e</guid>
      <description>&lt;p&gt;AI coding CLIs are powerful — and that power is the problem.&lt;/p&gt;

&lt;p&gt;Codex, Claude Code, and OpenCode can read your codebase, run shell commands, install packages, and edit files. When they run &lt;strong&gt;directly on your host&lt;/strong&gt;, a bad prompt, a confused model, or a compromised dependency can touch anything your user account can reach.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/sayem314/ai-agents" rel="noopener noreferrer"&gt;&lt;strong&gt;ai-agents&lt;/strong&gt;&lt;/a&gt; to put that workflow inside Docker instead.&lt;/p&gt;

&lt;p&gt;Over &lt;strong&gt;500 developers&lt;/strong&gt; have already pulled the images. This post explains what it does, what it actually protects, and how to set it up in under two minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;Instead of installing an AI CLI globally and letting it run on your OS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pull a pre-built Docker image&lt;/strong&gt; with the CLI + language tooling baked in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bind-mount your project&lt;/strong&gt; so edits are live on disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mount your existing login&lt;/strong&gt; (&lt;code&gt;~/.codex&lt;/code&gt;, &lt;code&gt;~/.claude&lt;/code&gt;, etc.) — no API keys in the image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run from any repo&lt;/strong&gt; with a shell alias&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No repo clone required. No custom Dockerfile per project. One alias in &lt;code&gt;~/.zshrc&lt;/code&gt; and you're done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│  Host OS — protected by Docker          │
│  ┌───────────────────────────────────┐  │
│  │  Container                        │  │
│  │  ┌─────────────────────────────┐  │  │
│  │  │  /workspace (your repo)     │  │  │  ← bind-mounted, writable
│  │  │  Codex / Claude / OpenCode  │  │  │
│  │  └─────────────────────────────┘  │  │
│  └───────────────────────────────────┘  │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker is the &lt;strong&gt;outer&lt;/strong&gt; sandbox. Inside the container, the CLI still gets full access to &lt;code&gt;/workspace&lt;/code&gt; and whatever auth dirs you mount — that's intentional. The agent needs to write code and run tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Three CLIs, one pattern:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Image tag&lt;/th&gt;
&lt;th&gt;Inner sandbox flag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/codex" rel="noopener noreferrer"&gt;OpenAI Codex&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sayem314/ai-agents:codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--sandbox danger-full-access&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sayem314/ai-agents:claude-code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opencode.ai/docs" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sayem314/ai-agents:opencode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;(none — Docker is the boundary)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;15 published tags&lt;/strong&gt; total: 3 tools × 5 language stacks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lang&lt;/th&gt;
&lt;th&gt;What's inside&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;full&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;Node, Python, Go, Rust + Playwright CLI + Chromium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node 24, npm, pnpm, bun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;python&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python 3.14, uv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go 1.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rust stable, clang, lld&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Examples: &lt;code&gt;codex&lt;/code&gt;, &lt;code&gt;codex-node&lt;/code&gt;, &lt;code&gt;claude-python&lt;/code&gt;, &lt;code&gt;opencode-rust&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Multi-arch (&lt;code&gt;amd64&lt;/code&gt; + &lt;code&gt;arm64&lt;/code&gt;) — works on Apple Silicon and Linux out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; &lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; installed, and sign in to your chosen CLI &lt;strong&gt;once on the host&lt;/strong&gt; (so &lt;code&gt;~/.codex&lt;/code&gt; or &lt;code&gt;~/.claude&lt;/code&gt; exists).&lt;/p&gt;

&lt;p&gt;Add aliases to &lt;code&gt;~/.zshrc&lt;/code&gt; or &lt;code&gt;~/.bashrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Codex&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;codex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'docker run -it --rm -w /workspace \
  -v "$PWD:/workspace" \
  -v "$HOME/.codex:/root/.codex" \
  -v "$HOME/.config/codex:/root/.config/codex" \
  sayem314/ai-agents:codex --sandbox danger-full-access'&lt;/span&gt;

&lt;span class="c"&gt;# Claude Code&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;claude-code&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'docker run -it --rm -w /workspace \
  -v "$PWD:/workspace" \
  -v "$HOME/.claude:/root/.claude" \
  -v "$HOME/.config/claude:/root/.config/claude" \
  sayem314/ai-agents:claude-code --dangerously-skip-permissions'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;claude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'claude-code'&lt;/span&gt;

&lt;span class="c"&gt;# OpenCode&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;opencode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'docker run -it --rm -w /workspace \
  -v "$PWD:/workspace" \
  -v "$HOME/.config/opencode:/root/.config/opencode" \
  -v "$HOME/.local/share/opencode:/root/.local/share/opencode" \
  sayem314/ai-agents:opencode'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/my-app
codex          &lt;span class="c"&gt;# or claude-code / opencode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First run pulls the image automatically. Every run is ephemeral (&lt;code&gt;--rm&lt;/code&gt;) — no leftover container state.&lt;/p&gt;

&lt;h2&gt;
  
  
  How auth works
&lt;/h2&gt;

&lt;p&gt;You log in on your &lt;strong&gt;host&lt;/strong&gt; once. The alias mounts those config dirs into the container at &lt;code&gt;/root/...&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Host paths mounted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.codex&lt;/code&gt;, &lt;code&gt;~/.config/codex&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.claude&lt;/code&gt;, &lt;code&gt;~/.config/claude&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.config/opencode&lt;/code&gt;, &lt;code&gt;~/.local/share/opencode&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No tokens baked into the image. No keys in your shell rc unless you choose API-key auth for CI.&lt;/p&gt;

&lt;p&gt;For git push from inside the container, add read-only mounts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.gitconfig:/root/.gitconfig:ro"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.ssh:/root/.ssh:ro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Docker actually protects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Protected:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host filesystem outside mounted volumes&lt;/li&gt;
&lt;li&gt;Host processes, packages, and network namespace (unless you expose ports)&lt;/li&gt;
&lt;li&gt;Leftover state — container is removed on exit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not protected:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your bind-mounted repo — the agent can read, edit, and delete project files&lt;/li&gt;
&lt;li&gt;Mounted auth dirs — writable unless you add &lt;code&gt;:ro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Secrets in the repo (&lt;code&gt;.env&lt;/code&gt;, keys, credentials)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat the agent like a powerful local developer with access to everything you mounted. Review diffs before committing, same as always.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--sandbox danger-full-access&lt;/code&gt; / &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; flags &lt;strong&gt;relax the CLI's inner restrictions&lt;/strong&gt; so it can run builds, tests, and package installs freely &lt;strong&gt;inside the container&lt;/strong&gt;. Docker remains the outer boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use the official install?
&lt;/h2&gt;

&lt;p&gt;Fair question. Here's the trade-off:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Native CLI on host&lt;/td&gt;
&lt;td&gt;Fastest I/O, simplest setup&lt;/td&gt;
&lt;td&gt;Agent runs with your user permissions everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official OpenCode Docker image&lt;/td&gt;
&lt;td&gt;Maintained upstream&lt;/td&gt;
&lt;td&gt;Single tool, no lang variants, no unified pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ai-agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same alias pattern for 3 CLIs, 5 lang stacks, subscription auth mounts&lt;/td&gt;
&lt;td&gt;Bind-mount I/O overhead on macOS, runs as root inside container&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On macOS, add &lt;code&gt;:cached&lt;/code&gt; to volume mounts and enable VirtioFS in Docker Desktop for better performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/workspace:cached"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Picking an image
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your project&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Polyglot / general use&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;codex&lt;/code&gt;, &lt;code&gt;claude-code&lt;/code&gt;, &lt;code&gt;opencode&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node/TS only&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*-node&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python only&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*-python&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go module&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*-go&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust crate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*-rust&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full images are larger but work everywhere. Language-specific tags pull faster and use less disk.&lt;/p&gt;

&lt;p&gt;Need browser automation? Playwright CLI + Chromium ships only on &lt;strong&gt;full&lt;/strong&gt; tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's under the hood
&lt;/h2&gt;

&lt;p&gt;Two-layer build:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Language layer&lt;/strong&gt; — official base images (&lt;code&gt;node:24-bookworm&lt;/code&gt;, &lt;code&gt;python:3.14-bookworm&lt;/code&gt;, etc.) + shared deps (git, curl, build tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool layer&lt;/strong&gt; — CLI installed via official scripts on top&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Codex installs to &lt;code&gt;/opt/codex&lt;/code&gt; (not &lt;code&gt;~/.codex&lt;/code&gt;) so mounting &lt;code&gt;~/.codex&lt;/code&gt; for auth doesn't hide the Linux binary. Language layers stay local; only the 15 tool tags are published to Docker Hub.&lt;/p&gt;

&lt;p&gt;CI publishes updated images on a staggered schedule — Codex, Claude, and OpenCode each get their own workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations (honest)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs as root inside the container.&lt;/strong&gt; Files created in your project may be root-owned on the host. &lt;code&gt;--user $(id -u):$(id -g)&lt;/code&gt; won't work today — CLIs live in &lt;code&gt;/root/.local/bin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a security silver bullet.&lt;/strong&gt; If you mount &lt;code&gt;$HOME&lt;/code&gt; or your entire disk, you've undone the isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume/history&lt;/strong&gt; depends on mounting the correct auth paths and running from the same project directory. Session storage is tool-specific — see the &lt;a href="https://github.com/sayem314/ai-agents/tree/main/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull sayem314/ai-agents:codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or browse the full docs, image matrix, and troubleshooting guide on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/sayem314/ai-agents" rel="noopener noreferrer"&gt;github.com/sayem314/ai-agents&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Star the repo if it's useful — and open an issue if something breaks. 500+ pulls in and I'm still iterating.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions? Drop a comment or open a GitHub issue. What AI CLI do you run — and do you sandbox it?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Devo: a code-first alternative to n8n and Activepieces</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Tue, 26 May 2026 06:12:21 +0000</pubDate>
      <link>https://dev.to/sayem314/devo-a-code-first-alternative-to-n8n-and-activepieces-5cpj</link>
      <guid>https://dev.to/sayem314/devo-a-code-first-alternative-to-n8n-and-activepieces-5cpj</guid>
      <description>&lt;p&gt;I’m building &lt;strong&gt;Devo&lt;/strong&gt;, a self-hosted automation builder for people who prefer code over workflow canvases.&lt;/p&gt;

&lt;p&gt;Think &lt;strong&gt;n8n&lt;/strong&gt; or &lt;strong&gt;Activepieces&lt;/strong&gt;, but code-first instead of canvas-first.&lt;/p&gt;

&lt;p&gt;Instead of wiring nodes together, every automation is a small JavaScript/TypeScript task. Each task has its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means tasks can import npm packages, use normal code patterns, and be reviewed like regular source code.&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%2F36ifu4rkszyrbgcklpoo.gif" 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%2F36ifu4rkszyrbgcklpoo.gif" alt="Devo demo" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I’m building it
&lt;/h2&gt;

&lt;p&gt;Visual workflow tools are great for simple integrations.&lt;/p&gt;

&lt;p&gt;But once an automation becomes more complex, node graphs can become harder to reason about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business logic gets split across many nodes&lt;/li&gt;
&lt;li&gt;error handling becomes awkward&lt;/li&gt;
&lt;li&gt;testing is not natural&lt;/li&gt;
&lt;li&gt;reviewing changes is difficult&lt;/li&gt;
&lt;li&gt;reuse is limited&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many automations, code is simply a better interface.&lt;/p&gt;

&lt;p&gt;Devo tries to keep the good parts of automation platforms, while making the actual logic plain JavaScript/TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The main UI is an AI chat plus a browser editor.&lt;/p&gt;

&lt;p&gt;You can ask the agent something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a webhook that receives Shopify orders and stores them in Postgres.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Devo generates TypeScript code, shows it in the editor, and lets you edit it before saving/deploying.&lt;/p&gt;

&lt;p&gt;Tasks can currently run from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manual runs&lt;/li&gt;
&lt;li&gt;webhook endpoints&lt;/li&gt;
&lt;li&gt;cron schedules with timezone support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because every task has a &lt;code&gt;package.json&lt;/code&gt;, you can use npm packages just like a normal project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;A webhook task can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;webhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;received order&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The task can then be deployed behind an opaque webhook URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosted by default
&lt;/h2&gt;

&lt;p&gt;Devo is built for local and self-hosted use.&lt;/p&gt;

&lt;p&gt;It stores app data locally and runs task code as child processes with timeouts and output limits.&lt;/p&gt;

&lt;p&gt;Important note: this is still early MVP software. The current runtime is &lt;strong&gt;not&lt;/strong&gt; a secure multi-tenant sandbox. It is meant for trusted self-hosted use right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SvelteKit / Svelte 5&lt;/li&gt;
&lt;li&gt;Better Auth&lt;/li&gt;
&lt;li&gt;Kysely + SQLite/libSQL&lt;/li&gt;
&lt;li&gt;Monaco editor&lt;/li&gt;
&lt;li&gt;OpenAI Agents SDK&lt;/li&gt;
&lt;li&gt;Bun or Node task execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sayem314/devo" rel="noopener noreferrer"&gt;https://github.com/sayem314/devo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker quick start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; devo-data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;AUTH_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-base64&lt;/span&gt; 32&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORIGIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://127.0.0.1:3000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  sayem314/devo:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Feedback wanted
&lt;/h2&gt;

&lt;p&gt;I’d love feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the “code-first automation” direction makes sense&lt;/li&gt;
&lt;li&gt;what triggers/runtimes should come next&lt;/li&gt;
&lt;li&gt;how task isolation should work for self-hosted users&lt;/li&gt;
&lt;li&gt;whether this feels meaningfully different from existing workflow tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’ve used n8n, Activepieces, Zapier, Temporal, Val Town, or similar tools, I’d especially like to hear where this approach feels useful or not useful.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>selfhosted</category>
      <category>typescript</category>
      <category>automation</category>
    </item>
    <item>
      <title>Shiprr, a Git-based PaaS for deploying web apps with regional runtime placement</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Mon, 04 May 2026 18:40:00 +0000</pubDate>
      <link>https://dev.to/sayem314/shiprr-a-git-based-paas-for-deploying-web-apps-with-regional-runtime-placement-43lo</link>
      <guid>https://dev.to/sayem314/shiprr-a-git-based-paas-for-deploying-web-apps-with-regional-runtime-placement-43lo</guid>
      <description>&lt;p&gt;I built Shiprr, a Git-based platform for deploying web apps without having to wire up your own deployment pipeline, runtime fleet, or control plane.&lt;/p&gt;

&lt;p&gt;It is aimed at long-running web apps, where you want the convenience of a PaaS but still need control over region, resources, domains, and access.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Shiprr does
&lt;/h2&gt;

&lt;p&gt;Shiprr supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub and GitLab repositories&lt;/li&gt;
&lt;li&gt;Source builds&lt;/li&gt;
&lt;li&gt;Automatic framework detection&lt;/li&gt;
&lt;li&gt;Regional runtime placement&lt;/li&gt;
&lt;li&gt;Custom domains&lt;/li&gt;
&lt;li&gt;Managed TLS&lt;/li&gt;
&lt;li&gt;Access controls&lt;/li&gt;
&lt;li&gt;App sizing from the dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to make the path from Git push to a live app as direct as possible, while still keeping deployment behavior understandable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;A lot of deployment tools fall into one of two extremes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;very simple, but limited&lt;/li&gt;
&lt;li&gt;very flexible, but operationally heavy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted something in between: a platform that feels lightweight, but still supports real production workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;p&gt;Shiprr is not trying to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a serverless platform&lt;/li&gt;
&lt;li&gt;a general infrastructure control plane&lt;/li&gt;
&lt;li&gt;a replacement for all cloud services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is focused on deploying web apps cleanly, with sane defaults and enough control for production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current direction
&lt;/h2&gt;

&lt;p&gt;The main focus is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git-based deployments&lt;/li&gt;
&lt;li&gt;regional runtime placement&lt;/li&gt;
&lt;li&gt;predictable app sizing&lt;/li&gt;
&lt;li&gt;basic operational visibility&lt;/li&gt;
&lt;li&gt;a workflow that stays simple for smaller teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;I would especially appreciate feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether the positioning makes sense&lt;/li&gt;
&lt;li&gt;what would make it easier to adopt&lt;/li&gt;
&lt;li&gt;what you would expect from a PaaS before trusting it for a real app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Site: &lt;a href="https://shiprr.app" rel="noopener noreferrer"&gt;https://shiprr.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>paas</category>
      <category>webdev</category>
      <category>devops</category>
      <category>deployment</category>
    </item>
    <item>
      <title>13 Free Web-Based Developer Tools You'll Actually Use</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Sat, 24 May 2025 11:00:00 +0000</pubDate>
      <link>https://dev.to/sayem314/13-free-web-based-developer-tools-youll-actually-use-3j4p</link>
      <guid>https://dev.to/sayem314/13-free-web-based-developer-tools-youll-actually-use-3j4p</guid>
      <description>&lt;p&gt;As developers, we often need quick access to various tools for debugging, testing, and data manipulation. While there are many great tools out there, they often come with a price tag or require installation. Today, I want to share a collection of web-based developer tools that are completely free, run in your browser, and focus on privacy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Web-Based Tools?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No installation required&lt;/li&gt;
&lt;li&gt;Access from any device&lt;/li&gt;
&lt;li&gt;Privacy-focused (client-side processing where possible)&lt;/li&gt;
&lt;li&gt;Zero cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Network &amp;amp; Security Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. DNS Lookup
&lt;/h3&gt;

&lt;p&gt;Quickly check DNS records using Google's DNS-over-HTTPS. Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifying DNS configurations&lt;/li&gt;
&lt;li&gt;Troubleshooting domain issues&lt;/li&gt;
&lt;li&gt;Checking record propagation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. SSL Certificate Checker
&lt;/h3&gt;

&lt;p&gt;Verify SSL certificates and their chain of trust. Great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security audits&lt;/li&gt;
&lt;li&gt;Certificate expiration monitoring&lt;/li&gt;
&lt;li&gt;SSL configuration validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. HTTP Headers Analyzer
&lt;/h3&gt;

&lt;p&gt;Analyze HTTP headers for any website. Useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security header verification&lt;/li&gt;
&lt;li&gt;Server configuration checks&lt;/li&gt;
&lt;li&gt;CORS policy validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. WHOIS Lookup
&lt;/h3&gt;

&lt;p&gt;Get detailed domain registration information. Handy for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain ownership verification&lt;/li&gt;
&lt;li&gt;Registration date checks&lt;/li&gt;
&lt;li&gt;Contact information lookup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Ping Tool
&lt;/h3&gt;

&lt;p&gt;Test network connectivity and response times. Essential for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network troubleshooting&lt;/li&gt;
&lt;li&gt;Latency monitoring&lt;/li&gt;
&lt;li&gt;Basic connectivity tests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  API Development Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6. Request Debugger
&lt;/h3&gt;

&lt;p&gt;A Postman-like interface for testing HTTP requests. Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple HTTP method support&lt;/li&gt;
&lt;li&gt;Header management&lt;/li&gt;
&lt;li&gt;Request body editing&lt;/li&gt;
&lt;li&gt;Response inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. WebSocket Debugger
&lt;/h3&gt;

&lt;p&gt;Test and debug WebSocket connections with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time message monitoring&lt;/li&gt;
&lt;li&gt;Bi-directional communication&lt;/li&gt;
&lt;li&gt;Connection status tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. GraphQL Explorer
&lt;/h3&gt;

&lt;p&gt;A basic tool for GraphQL API testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute query&lt;/li&gt;
&lt;li&gt;Schema exploration&lt;/li&gt;
&lt;li&gt;Real-time response viewing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Developer Utilities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9. JSON Beautifier
&lt;/h3&gt;

&lt;p&gt;Format and validate JSON data with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Syntax highlighting&lt;/li&gt;
&lt;li&gt;Error detection&lt;/li&gt;
&lt;li&gt;Pretty printing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. Base64 Encoder/Decoder
&lt;/h3&gt;

&lt;p&gt;Quick conversion between text and Base64:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encode text to Base64&lt;/li&gt;
&lt;li&gt;Decode Base64 to text&lt;/li&gt;
&lt;li&gt;Copy to clipboard functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11. Text Diff Checker
&lt;/h3&gt;

&lt;p&gt;Compare text differences with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Side-by-side comparison&lt;/li&gt;
&lt;li&gt;Syntax highlighting&lt;/li&gt;
&lt;li&gt;Line-by-line diff view&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12. Regex Tester
&lt;/h3&gt;

&lt;p&gt;Test and validate regular expressions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time matching&lt;/li&gt;
&lt;li&gt;Sample text testing&lt;/li&gt;
&lt;li&gt;Common pattern examples&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  13. CSV/TSV Viewer
&lt;/h3&gt;

&lt;p&gt;View and analyze tabular data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sort and filter capabilities&lt;/li&gt;
&lt;li&gt;Table formatting&lt;/li&gt;
&lt;li&gt;Export options&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Privacy and Security
&lt;/h2&gt;

&lt;p&gt;All these tools are designed with privacy in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client-side processing where possible&lt;/li&gt;
&lt;li&gt;No data storage&lt;/li&gt;
&lt;li&gt;No tracking&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;You can access all these tools at &lt;a href="https://kvmpods.com/tools" rel="noopener noreferrer"&gt;https://kvmpods.com/tools&lt;/a&gt;. They're completely free to use and don't require any registration.&lt;/p&gt;

&lt;p&gt;Having quick access to these tools can significantly improve your development workflow. Whether you're debugging an API, checking network configurations, or manipulating data, these web-based tools can save you time and effort.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
      <category>networking</category>
    </item>
    <item>
      <title>Deploy Your Ghost Blog in Minutes with KVMPods</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Sat, 23 Nov 2024 13:13:00 +0000</pubDate>
      <link>https://dev.to/sayem314/deploy-your-ghost-blog-in-minutes-with-kvmpods-2o2h</link>
      <guid>https://dev.to/sayem314/deploy-your-ghost-blog-in-minutes-with-kvmpods-2o2h</guid>
      <description>&lt;p&gt;Want to start a professional blog without the hassle of complex infrastructure? Let's deploy Ghost - an open source publishing platform - using KVMPods pre-made template or your own Docker Compose configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Ghost?
&lt;/h2&gt;

&lt;p&gt;Ghost is a modern publishing platform that offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean, minimalist design&lt;/li&gt;
&lt;li&gt;Built-in SEO tools&lt;/li&gt;
&lt;li&gt;Native newsletter system&lt;/li&gt;
&lt;li&gt;Member subscriptions&lt;/li&gt;
&lt;li&gt;Custom themes&lt;/li&gt;
&lt;li&gt;Markdown support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Option 1: Quick Deploy with KVMPods Template
&lt;/h2&gt;

&lt;p&gt;The fastest way to get started is using &lt;a href="https://kvmpods.com/app-templates/ghost" rel="noopener noreferrer"&gt;this template&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into your KVMPods dashboard&lt;/li&gt;
&lt;li&gt;Navigate to Templates&lt;/li&gt;
&lt;li&gt;Find the Ghost template&lt;/li&gt;
&lt;li&gt;Click "Deploy"&lt;/li&gt;
&lt;li&gt;Follow the setup wizard&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Option 2: Custom Deployment
&lt;/h2&gt;

&lt;p&gt;If you prefer to customize your setup, here's production-ready Docker Compose template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ghost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghost:5-alpine&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghost&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2368:2368"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GHOST_URL}&lt;/span&gt;
      &lt;span class="na"&gt;database__client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_USER}&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_PASSWORD}&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_DATABASE}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./ghost/content:/var/lib/ghost/content&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ghost-network&lt;/span&gt;

  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghost-mysql&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_ROOT_PASSWORD}&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_DATABASE}&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_USER}&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MYSQL_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./mysql/data:/var/lib/mysql&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mysqladmin"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ping"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-h"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ghost-network&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ghost-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key features of this template:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health checks for MySQL&lt;/li&gt;
&lt;li&gt;Persistent volume storage&lt;/li&gt;
&lt;li&gt;Secure networking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deployment Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Log into your KVMPods dashboard&lt;/li&gt;
&lt;li&gt;Click "New Server" &lt;/li&gt;
&lt;li&gt;Select your preferred location&lt;/li&gt;
&lt;li&gt;Choose a plan&lt;/li&gt;
&lt;li&gt;Once your server is ready, go to the Apps section&lt;/li&gt;
&lt;li&gt;Click "Create New App"&lt;/li&gt;
&lt;li&gt;Paste the Docker Compose file above and set env variables&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Post-Deployment Configuration
&lt;/h2&gt;

&lt;p&gt;Access your Ghost admin panel at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;SERVER_IP&amp;gt;:2368/ghost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initial setup steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create your admin account&lt;/li&gt;
&lt;li&gt;Configure your blog details&lt;/li&gt;
&lt;li&gt;Select a theme&lt;/li&gt;
&lt;li&gt;Create your first post&lt;/li&gt;
&lt;li&gt;Set up newsletters (optional)&lt;/li&gt;
&lt;li&gt;Configure memberships (optional)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cost Optimization
&lt;/h2&gt;

&lt;p&gt;KVMPods offers exceptional value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plans start at just €10/month&lt;/li&gt;
&lt;li&gt;Host multiple apps on a single server&lt;/li&gt;
&lt;li&gt;All plans include:

&lt;ul&gt;
&lt;li&gt;Dedicated VM resources&lt;/li&gt;
&lt;li&gt;NVMe storage&lt;/li&gt;
&lt;li&gt;Automated backups (charges applicable)&lt;/li&gt;
&lt;li&gt;Technical support&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Pro Tip&lt;/strong&gt;: Maximize your server's value by hosting multiple applications. One of our customers runs 6 different apps on a single server, bringing their per-app cost down to just €1.66!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>ghost</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>KVMPods: Run Docker Compose Apps with True VM Isolation</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Fri, 22 Nov 2024 12:08:03 +0000</pubDate>
      <link>https://dev.to/sayem314/kvmpods-run-docker-compose-apps-with-true-vm-isolation-143b</link>
      <guid>https://dev.to/sayem314/kvmpods-run-docker-compose-apps-with-true-vm-isolation-143b</guid>
      <description>&lt;p&gt;Ever tried running Docker Compose in production and hit limitations? KVMPods gives you your own KVM virtual machine where you can run multiple Docker Compose apps with true isolation from other users.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Traditional Container Platforms
&lt;/h2&gt;

&lt;p&gt;Most container platforms share resources between containers and users, which can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Noisy neighbor problems&lt;/li&gt;
&lt;li&gt;Kernel feature limitations &lt;/li&gt;
&lt;li&gt;Resource contention&lt;/li&gt;
&lt;li&gt;Security concerns&lt;/li&gt;
&lt;li&gt;Restricted Docker Compose features
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# On traditional platforms&lt;/span&gt;
&lt;span class="c1"&gt;# You often can't use certain features&lt;/span&gt;
&lt;span class="c1"&gt;# Or face resource conflicts with other users 😕&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghost:latest&lt;/span&gt;
    &lt;span class="c1"&gt;# Will this actually work as expected?&lt;/span&gt;
    &lt;span class="c1"&gt;# Are you sharing resources with others?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Enter KVMPods
&lt;/h2&gt;

&lt;p&gt;With KVMPods, you get:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your own KVM virtual machine (server)&lt;/li&gt;
&lt;li&gt;Run multiple Docker Compose apps within your server&lt;/li&gt;
&lt;li&gt;Complete isolation from other users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Just paste your Docker Compose file and deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Your docker-compose.yml&lt;/span&gt;
&lt;span class="c1"&gt;# Works exactly as expected! 🎉&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;wordpress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="na"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
      &lt;span class="na"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
      &lt;span class="na"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wordpress_data:/var/www/html&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mariadb:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;somewordpress&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/mysql&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;wordpress_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔒 True Isolation
&lt;/h3&gt;

&lt;p&gt;Your own KVM virtual machine - no resource sharing with other users&lt;/p&gt;

&lt;h3&gt;
  
  
  💪 Full Docker Compose Support
&lt;/h3&gt;

&lt;p&gt;All Docker Compose features work as expected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Volumes&lt;/li&gt;
&lt;li&gt;Networks
&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Port mappings&lt;/li&gt;
&lt;li&gt;Everything!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Enterprise Infrastructure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;NVMe storage&lt;/li&gt;
&lt;li&gt;Dedicated RAM&lt;/li&gt;
&lt;li&gt;Support for both x86 and ARM&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://kvmpods.com" rel="noopener noreferrer"&gt;kvmpods.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create your KVM server&lt;/li&gt;
&lt;li&gt;Paste your Docker Compose files and deploy!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's that simple. No CLI tools, no complex configurations - just pure Docker Compose as it was meant to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfect For:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Production Docker Compose deployments&lt;/li&gt;
&lt;li&gt;Multiple applications on one server&lt;/li&gt;
&lt;li&gt;Microservices architectures&lt;/li&gt;
&lt;li&gt;Any workload needing true isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Starting at €10/month for your own KVM virtual machine where you can run multiple Docker Compose applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Start deploying your Docker Compose apps today at &lt;a href="https://kvmpods.com" rel="noopener noreferrer"&gt;kvmpods.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions? Comments? Let me know below! 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;KVMPods - Your KVM Server for Docker Compose Apps&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>cloud</category>
      <category>containers</category>
    </item>
    <item>
      <title>Introducing KVMPods – Effortless Docker Compose Hosting</title>
      <dc:creator>Sayem Chowdhury</dc:creator>
      <pubDate>Wed, 13 Nov 2024 15:45:00 +0000</pubDate>
      <link>https://dev.to/sayem314/introducing-kvmpods-effortless-docker-compose-hosting-16m2</link>
      <guid>https://dev.to/sayem314/introducing-kvmpods-effortless-docker-compose-hosting-16m2</guid>
      <description>&lt;p&gt;🚀 &lt;strong&gt;After 8 months of development, I’m excited to introduce KVMPods!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;KVMPods is built for anyone who wants a simple, fast way to host their favorite apps with Docker Compose. It lets you launch public or private apps directly from a Docker Compose file, all while skipping the usual VPS setup headaches. You get everything needed in one place to deploy and run Docker Compose apps easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why KVMPods?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Hassle&lt;/strong&gt;: Deploy any Docker Compose app, no need to set up a VPS or configure servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast and Reliable&lt;/strong&gt;: Experience top-tier performance at an affordable price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparent Pricing&lt;/strong&gt;: Straightforward pricing—no hidden fees or surprises.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Who Is It For?
&lt;/h3&gt;

&lt;p&gt;KVMPods is perfect for developers, startups, small teams, or anyone who wants Docker Compose without the usual VPS maintenance. Whether you’re a power user or just looking to host a few apps without server management, KVMPods makes it easy.&lt;/p&gt;

&lt;p&gt;Ready to give it a try? Check out &lt;a href="https://kvmpods.com" rel="noopener noreferrer"&gt;KVMPods.com&lt;/a&gt; and let me know what you think!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>selfhosting</category>
    </item>
  </channel>
</rss>
