<?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: shiheb amri</title>
    <description>The latest articles on DEV Community by shiheb amri (@shihebamrii).</description>
    <link>https://dev.to/shihebamrii</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4005514%2F2ad64fea-a68b-49ba-8644-5f31594c77e7.jpg</url>
      <title>DEV Community: shiheb amri</title>
      <link>https://dev.to/shihebamrii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shihebamrii"/>
    <language>en</language>
    <item>
      <title>Vessel Update: One-click Docker setup, container runner, and multi-logs tailing</title>
      <dc:creator>shiheb amri</dc:creator>
      <pubDate>Mon, 29 Jun 2026 09:38:05 +0000</pubDate>
      <link>https://dev.to/shihebamrii/vessel-update-one-click-docker-setup-container-runner-and-multi-logs-tailing-4eo0</link>
      <guid>https://dev.to/shihebamrii/vessel-update-one-click-docker-setup-container-runner-and-multi-logs-tailing-4eo0</guid>
      <description>&lt;p&gt;Based on comments from my first post, I updated Vessel (the local-first VPS panel built with Rust and Tauri) to include a few missing features.&lt;/p&gt;

&lt;p&gt;Here is what was added in the latest push:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Automatic Docker Detection &amp;amp; Installer&lt;br&gt;
When you connect, Vessel checks if the Docker daemon is available. If missing, it renders an installer panel. Clicking "Install Docker &amp;amp; Compose" downloads and runs the official installation script, streaming the terminal output in real-time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-Container Logs Tailing&lt;br&gt;
You can check multiple containers from the sidebar to stream their outputs into a single pane.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Color-coded prefix tags for each container.&lt;/li&gt;
&lt;li&gt;Live keyword search highlighting.&lt;/li&gt;
&lt;li&gt;Performant backend: Multiplexes container tailing commands into a single SSH channel to stay under MaxSessions SSH limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Deploy Containers from the UI
A "+ Run Container" form to start containers directly. You can set:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Image name and Container name.&lt;/li&gt;
&lt;li&gt;Port mappings.&lt;/li&gt;
&lt;li&gt;Environment variables.&lt;/li&gt;
&lt;li&gt;Restart policies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub Repo (MIT): &lt;a href="https://github.com/shihebamrii/vessel" rel="noopener noreferrer"&gt;https://github.com/shihebamrii/vessel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>opensource</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built a local-first VPS panel in Rust to kill web-panel bloat</title>
      <dc:creator>shiheb amri</dc:creator>
      <pubDate>Sun, 28 Jun 2026 23:49:45 +0000</pubDate>
      <link>https://dev.to/shihebamrii/i-built-a-local-first-vps-panel-in-rust-to-kill-web-panel-bloat-3e17</link>
      <guid>https://dev.to/shihebamrii/i-built-a-local-first-vps-panel-in-rust-to-kill-web-panel-bloat-3e17</guid>
      <description>&lt;p&gt;A few days ago, I shared why I walked away from heavy web panels like aaPanel and Plesk to build Vessel—a local-first desktop control plane that manages your servers over standard SSH with zero server overhead.&lt;/p&gt;

&lt;p&gt;The response from this community was incredible (shoutout to Nazar Boyko &lt;a class="mentioned-user" href="https://dev.to/nazar_boyko"&gt;@nazar_boyko&lt;/a&gt;  for the suggestion to aggregate multi-container logs—I'm currently mapping out the Rust backend for that!). &lt;/p&gt;

&lt;p&gt;Since that post, I've spent the last 72 hours straight overhauling the frontend and hardening the security model. Here is exactly how it works under the hood, how I avoided common security pitfalls in agentless tools, and what the new UI looks like.&lt;/p&gt;

&lt;p&gt;The project is 100% open-source (MIT): &lt;a href="https://github.com/shihebamrii/vessel" rel="noopener noreferrer"&gt;Vessel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Tech Stack: Why Tauri + SolidJS?&lt;/p&gt;

&lt;p&gt;Electron apps are notorious for eating 500MB of RAM just to idle. For a tool meant to save server resources, that felt hypocritical.&lt;/p&gt;

&lt;p&gt;I paired Tauri v2 (Rust) with SolidJS for the frontend. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rust Backend: Handles multi-threaded SSH connections, SFTP streams, and native OS API calls.&lt;/li&gt;
&lt;li&gt;SolidJS Frontend: Provides fine-grained reactivity. When server metrics stream back over the Tauri IPC bridge, only the exact DOM nodes for the CPU/RAM graphs update. &lt;/li&gt;
&lt;li&gt;The Result: A premium, glassmorphic UI that compiles into a featherweight native binary (~15MB) and uses almost zero idle desktop memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hardening an Agentless System (The Security Details)&lt;/p&gt;

&lt;p&gt;Because Vessel installs absolutely nothing on your VPS, it has to execute commands remotely via SSH channels. If you don't handle user input flawlessly, you invite nightmare vulnerabilities. &lt;/p&gt;

&lt;p&gt;Here is how the security architecture is set up to prevent that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Zero Configuration Files for Secrets
Your SSH private keys and passwords never touch a plain text file or an unencrypted app database. Vessel interfaces directly with your operating system's native secure storage:&lt;/li&gt;
&lt;li&gt;macOS: Keychain Services&lt;/li&gt;
&lt;li&gt;Windows: Credential Manager&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux: Secret Service API via libsecret&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shell Injection Defenses&lt;br&gt;
When you restart a systemd service or toggle a Docker container in the UI, Vessel doesn't just pass strings into a raw remote shell (sh -c). We structure commands as explicit argument arrays directly via the SSH subsystem. This completely eliminates standard shell injection vectors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Path Traversal &amp;amp; File Protection&lt;br&gt;
The built-in SFTP file manager applies strict null-byte filtering and alphanumeric sanitization on the Rust layer before sending file system requests. This prevents malicious or accidental path traversal exploits (../../etc/passwd).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What's Inside the New Build&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Engine Dashboard: Instantly view container states, toggle lifecycles, and stream live container logs.&lt;/li&gt;
&lt;li&gt;Secure File Manager: Inline code editor, file permission management, and binary file protection over SFTP.&lt;/li&gt;
&lt;li&gt;Reverse Proxy &amp;amp; SSL: Clean configuration generation for Nginx and Caddy without altering the rest of your server layout.&lt;/li&gt;
&lt;li&gt;Real-time Monitoring: WebGL-accelerated graphs tracking CPU, RAM, disk, and uptime via low-overhead Linux metrics parsing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source Code &amp;amp; Pre-built Binaries&lt;/p&gt;

&lt;p&gt;Vessel is free, open-source, and ready to use. I’ve compiled binaries for Windows (.exe/.msi), Linux (.deb), and macOS (.dmg).&lt;/p&gt;

&lt;p&gt;If you want to look at the security implementation, build it from source, or try it out:&lt;br&gt;
GitHub Repo: &lt;a href="https://github.com/shihebamrii/vessel" rel="noopener noreferrer"&gt;Vessel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like the local-first approach to dev tools, dropping a star on the repository helps immensely with visibility and keeps the project moving forward!&lt;/p&gt;

&lt;p&gt;Let me know what you think of the security model or what feature you'd want to see added next in the comments.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>security</category>
      <category>software</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why I Abandoned Web VPS Panels and Built My Own Desktop Control Plane in Rust</title>
      <dc:creator>shiheb amri</dc:creator>
      <pubDate>Sat, 27 Jun 2026 14:51:05 +0000</pubDate>
      <link>https://dev.to/shihebamrii/why-i-abandoned-web-vps-panels-and-built-my-own-desktop-control-plane-in-rust-5ca1</link>
      <guid>https://dev.to/shihebamrii/why-i-abandoned-web-vps-panels-and-built-my-own-desktop-control-plane-in-rust-5ca1</guid>
      <description>&lt;p&gt;Let's be honest. Web-based VPS control panels are great—until you check your server resource logs and see they're consuming 15% of your RAM, or you realize your root SSH private key is sitting in a MySQL database on the web.&lt;/p&gt;

&lt;p&gt;I wanted a dashboard to manage my Docker containers and Nginx configs, but without the security risk or the resource bloat.&lt;/p&gt;

&lt;p&gt;So, I built one. Here's why I chose a local-first approach using Tauri and Rust.&lt;/p&gt;

&lt;p&gt;Vessel is fully open-source (MIT) and free to use. You can download the pre-built binaries or check out the code: &lt;a href="https://github.com/shihebamrii/vessel" rel="noopener noreferrer"&gt;https://github.com/shihebamrii/vessel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have a question for you: If you could add one feature to a local-first VPS control panel to make it replace your current command-line workflow, what would it be? Let's discuss in the comments!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
