<?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: Isaac Alkhabaz</title>
    <description>The latest articles on DEV Community by Isaac Alkhabaz (@alkhabazdev).</description>
    <link>https://dev.to/alkhabazdev</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%2F3810663%2F14b9d5e1-a962-4f9e-8893-bffcef55688c.png</url>
      <title>DEV Community: Isaac Alkhabaz</title>
      <link>https://dev.to/alkhabazdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alkhabazdev"/>
    <language>en</language>
    <item>
      <title>How I Switched From Public Hosting to Private Hosting</title>
      <dc:creator>Isaac Alkhabaz</dc:creator>
      <pubDate>Thu, 12 Mar 2026 05:00:00 +0000</pubDate>
      <link>https://dev.to/alkhabazdev/how-i-switched-from-public-hosting-to-private-hosting-5e5a</link>
      <guid>https://dev.to/alkhabazdev/how-i-switched-from-public-hosting-to-private-hosting-5e5a</guid>
      <description>&lt;p&gt;In the beginning, I was hosting my main portfolio on GitHub Pages, and all of my side projects were being hosted through either Railway or Vercel. It worked. I never really had a reason to complain. Push your code, let the platform handle the rest, and move on with your life.&lt;br&gt;
But something about it never sat right with me.&lt;br&gt;
I didn't own any of it. My projects were living on someone else's infrastructure, running on someone else's terms. If GitHub decided to change something tomorrow, or Railway tweaked their free tier again, I'd be scrambling. I was building things I cared about on top of ground I didn't control.&lt;br&gt;
Enough was enough. I decided it was time to set up my own server.&lt;/p&gt;

&lt;p&gt;The Hardware;&lt;br&gt;
I had an older HP desktop sitting around — a Windows machine that wasn't being used anymore, just collecting dust on the bottom of my desk doing absolutely nothing. Perfect candidate.&lt;br&gt;
I went on Google, searched up ubuntu.com, and ended up downloading the Ubuntu Server ISO. No desktop environment, no GUI, just a clean terminal. That's all I needed.&lt;br&gt;
I grabbed a spare USB drive, flashed the ISO onto it, plugged it into the HP, and booted from USB. The Ubuntu Server installer walked me through the basics — setting up a user, picking a drive, configuring the network. Nothing crazy. Within maybe 20 minutes I had a fresh Linux server sitting on my desk.&lt;/p&gt;

&lt;p&gt;The Stack&lt;br&gt;
Once I was in, the first thing I did was update everything:&lt;br&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;br&gt;
Then I installed Docker. I knew from the start I didn't want to manage a bunch of services by hand — different ports, different dependencies, things stepping on each other. Docker lets me keep everything isolated and reproducible. One compose file to rule them all.&lt;br&gt;
The architecture is pretty straightforward. I have a single docker-compose.yml that defines every service I run. At the top sits Caddy, a reverse proxy that routes incoming requests to the right container based on the subdomain. Each project gets its own container, its own subdomain, its own resource limits. Nothing bleeds into anything else.&lt;br&gt;
Here's what the stack looks like:&lt;br&gt;
Internet → Cloudflare → cloudflared tunnel → Caddy → containers&lt;br&gt;
And here's what's running on it:&lt;/p&gt;

&lt;p&gt;alkhabaz.dev — my portfolio (Nginx Alpine, static files)&lt;br&gt;
ghost.alkhabaz.dev — Zahki Ghost (encrypted messaging)&lt;br&gt;
vault.alkhabaz.dev — Zahki Vault (secret sharing)&lt;br&gt;
radar.alkhabaz.dev — Zahki Radar (uptime monitoring)&lt;br&gt;
relay.alkhabaz.dev — Zahki Relay (HTTP request inspector)&lt;br&gt;
lang.alkhabaz.dev — Azkal Lang (programming language playground)&lt;br&gt;
ledger.alkhabaz.dev — Azkal Ledger (invoicing tool)&lt;br&gt;
pulse.alkhabaz.dev — Azkal Pulse (site audit docs)&lt;br&gt;
cli.alkhabaz.dev — Azkal CLI (scaffolding tool docs)&lt;br&gt;
galaxy.alkhabaz.dev — MyGalaxy (3D solar system)&lt;br&gt;
blocks.alkhabaz.dev — BlockBlaster (arcade game)&lt;br&gt;
viper.alkhabaz.dev — Viper (multiplayer snake)&lt;br&gt;
status.alkhabaz.dev — Uptime Kuma (monitoring dashboard)&lt;/p&gt;

&lt;p&gt;Fifteen containers. One machine. One compose file.&lt;br&gt;
The Caddyfile that ties it all together is dead simple. Each subdomain is just a few lines — listen on this hostname, proxy to that container:&lt;br&gt;
&lt;a href="http://alkhabaz.dev:80" rel="noopener noreferrer"&gt;http://alkhabaz.dev:80&lt;/a&gt; {&lt;br&gt;
    reverse_proxy portfolio:80&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ghost.alkhabaz.dev:80" rel="noopener noreferrer"&gt;http://ghost.alkhabaz.dev:80&lt;/a&gt; {&lt;br&gt;
    reverse_proxy zahki-ghost:3000&lt;br&gt;
}&lt;br&gt;
That's it. No complex routing logic, no rewrites, no middleware chains. Caddy handles it all on port 80 internally, and I'll get to why HTTPS isn't Caddy's job in a second.&lt;/p&gt;

&lt;p&gt;Making It Public (Without Opening a Single Port)&lt;br&gt;
This is the part where most self-hosting guides tell you to log into your router, forward ports 80 and 443, set up dynamic DNS, and pray your ISP doesn't block inbound traffic. I didn't do any of that.&lt;br&gt;
I used Cloudflare Tunnels instead.&lt;br&gt;
The idea is simple: instead of opening ports on your network and letting the internet reach in, you run a small agent called cloudflared on your server that reaches out to Cloudflare. It creates a persistent encrypted tunnel. Cloudflare then routes traffic from your domain through that tunnel to your server. From the outside, it looks like your site is hosted on Cloudflare's edge network. From the inside, your server has zero open ports. Nothing is exposed.&lt;br&gt;
In my compose file, it's just another container:&lt;br&gt;
yamlcloudflared:&lt;br&gt;
    image: cloudflare/cloudflared:latest&lt;br&gt;
    command: tunnel --no-autoupdate run --token ${CF_TUNNEL_TOKEN}&lt;br&gt;
I pointed my domain's DNS to Cloudflare, configured the tunnel in their dashboard to route each subdomain to Caddy, and that was it. No port forwarding. No dynamic DNS. No Certbot. Cloudflare terminates TLS at their edge, which is why Caddy only listens on port 80 — the encrypted connection happens between the user's browser and Cloudflare, and the tunnel handles the rest.&lt;br&gt;
I pulled up my phone, disconnected from WiFi, typed in my domain, and my site loaded. Served from the HP desktop under my desk. That was the moment it clicked.&lt;/p&gt;

&lt;p&gt;Deploying Changes&lt;br&gt;
I wrote a small deploy script that keeps things simple:&lt;br&gt;
bash./scripts/deploy.sh              # deploy everything&lt;br&gt;
./scripts/deploy.sh portfolio    # deploy just one service&lt;br&gt;
For a full deploy, it pulls the latest code from every project's repo, rebuilds all the containers, and brings them back up. For a single service, it just rebuilds and restarts that one container. No CI/CD pipeline, no webhook triggers — I push my code, SSH in, run the script, and it's live.&lt;/p&gt;

&lt;p&gt;Backups&lt;br&gt;
Some of my projects use SQLite databases — Ghost, Vault, Radar, and Uptime Kuma all store data locally. I wrote a backup script that runs every night and keeps 30 days of history:&lt;br&gt;
bashsqlite3 "$src" ".backup '${BACKUP_DIR}/${db}.db'"&lt;br&gt;
Anything older than 30 days gets cleaned up automatically. It's not fancy, but it means if something breaks, I can roll back to any day in the last month.&lt;/p&gt;

&lt;p&gt;Resource Limits&lt;br&gt;
Since everything shares one machine, I set memory and CPU limits on every container. The heavier apps like Azkal Lang and the Zahki tools get 256–512MB and a quarter of a CPU. The static sites and doc pages get 32MB and barely any CPU — they're just Nginx serving HTML. Viper gets a bit more since it runs a real-time multiplayer server. Nothing is allowed to go rogue and starve everything else.&lt;/p&gt;

&lt;p&gt;Was It Worth It?&lt;br&gt;
For most people, the answer is probably no. GitHub Pages and Vercel exist for a reason. They're fast, they're free, and they just work.&lt;br&gt;
But for me, it was never about convenience. It was about ownership. I wanted to know that when someone visits my site, it's being served from a machine I set up, running software I configured, on a network I control. There's no middleman. No platform that could pull the rug.&lt;br&gt;
The total cost of this setup is zero dollars. The HP was already mine. Docker is free. Caddy is free. Cloudflare's tunnel is free. The only recurring cost is the domain, which I was paying for anyway.&lt;br&gt;
Fifteen containers. Thirteen subdomains. Zero open ports. All of it managed with a compose file, a deploy script, and a Caddyfile shorter than most README files.&lt;br&gt;
If you've got an old machine lying around and you've been curious about self-hosting, go for it. The barrier to entry is way lower than you think. An afternoon, a USB stick, and some terminal commands — that's really all it takes.&lt;/p&gt;

&lt;p&gt;If you have questions about any part of the process, feel free to reach out. I'm always down to talk, or help. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built 3 open-source tools for developers and freelancers — here's what I learned.</title>
      <dc:creator>Isaac Alkhabaz</dc:creator>
      <pubDate>Fri, 06 Mar 2026 22:29:09 +0000</pubDate>
      <link>https://dev.to/alkhabazdev/i-built-3-open-source-tools-for-developers-and-freelancers-heres-what-i-learnedpublished-false-331a</link>
      <guid>https://dev.to/alkhabazdev/i-built-3-open-source-tools-for-developers-and-freelancers-heres-what-i-learnedpublished-false-331a</guid>
      <description>&lt;ol&gt;
&lt;li&gt;azkal-cli — AI project scaffolder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem: Every new project starts the same way. Spend 30 minutes setting up folder structure, configs, tsconfig, eslint, tailwind, .gitignore... before writing a single line of actual code.&lt;/p&gt;

&lt;p&gt;The fix: Describe your project in plain English, and AI picks the stack and generates everything.&lt;/p&gt;

&lt;p&gt;Run: npx azkal "build me a SaaS with auth, payments, and a dashboard"&lt;/p&gt;

&lt;p&gt;It analyzes your description, picks the optimal stack (Next.js, Express, Vite, etc.), and generates a complete project with working configs, boilerplate, README, and .gitignore.&lt;/p&gt;

&lt;p&gt;Built with TypeScript, Commander.js, and Claude AI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Ialkyyyy/azkal-cli" rel="noopener noreferrer"&gt;https://github.com/Ialkyyyy/azkal-cli&lt;/a&gt; | &lt;a href="https://www.npmjs.com/package/azkal" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/azkal&lt;/a&gt;&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;azkal-pulse — Site audit Chrome extension&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem: Lighthouse tells you what's wrong with a site but not how to fix it. And when a client asks "what's wrong with my website?" you have to manually translate scores into actionable advice.&lt;/p&gt;

&lt;p&gt;The fix: One-click audit that gives you scores AND copy-paste code fixes, plus a PDF report you can send to clients.&lt;/p&gt;

&lt;p&gt;Run an audit on any page in one click. 30+ checks across performance, SEO, and accessibility. Click "Get AI Fix Suggestions" and get actual code snippets. Export a professional PDF report for your client.&lt;/p&gt;

&lt;p&gt;The Client Report feature is the real killer. Send a prospect a PDF showing exactly what's broken on their site and how you'd fix it. Natural upsell.&lt;/p&gt;

&lt;p&gt;Built with React, Tailwind, Manifest V3, and Claude AI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Ialkyyyy/azkal-pulse" rel="noopener noreferrer"&gt;https://github.com/Ialkyyyy/azkal-pulse&lt;/a&gt;&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;azkal-ledger — Invoice generator&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem: Most invoice tools are ugly, expensive, or require you to create an account just to generate a PDF.&lt;/p&gt;

&lt;p&gt;The fix: Open a browser tab, fill in your info, pick a template, download a PDF. Done.&lt;/p&gt;

&lt;p&gt;8 beautiful templates (Modern, Minimal, Bold, Classic, Creative, Executive, Neon, Elegant). Live preview that updates as you type. Auto-calculates subtotals, tax, and discounts. Supports 10 currencies. No sign-up, no backend, no fees.&lt;/p&gt;

&lt;p&gt;Built with React, TypeScript, @react-pdf/renderer, and Tailwind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Ialkyyyy/azkal-ledger" rel="noopener noreferrer"&gt;https://github.com/Ialkyyyy/azkal-ledger&lt;/a&gt; | &lt;a href="https://azkal-ledger.vercel.app" rel="noopener noreferrer"&gt;https://azkal-ledger.vercel.app&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What I learned shipping 3 projects in a week&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ship ugly, then polish. Every one of these started as a rough prototype. I got the core working first, then cleaned up the UI. If I'd tried to make them perfect before shipping, none of them would exist yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solve your own problems. I didn't research what repos get the most stars. I built tools I actually wanted. The CLI saves me time on every new project. The audit extension helps me land freelance clients. The invoice tool replaced a paid service I was using.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI makes solo dev insanely productive. I used Claude throughout the build process. Not to generate entire codebases — but to move faster on boilerplate, catch edge cases I'd miss, and iterate on ideas quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;README is marketing. A good README with clear screenshots and a one-liner install command is the difference between 0 stars and actual users. Spend time on it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Try them out&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Ialkyyyy/azkal-cli" rel="noopener noreferrer"&gt;https://github.com/Ialkyyyy/azkal-cli&lt;/a&gt; — scaffold a project in seconds&lt;br&gt;
&lt;a href="https://azkal-ledger.vercel.app" rel="noopener noreferrer"&gt;https://azkal-ledger.vercel.app&lt;/a&gt; — generate an invoice right now&lt;br&gt;
&lt;a href="https://github.com/Ialkyyyy/azkal-pulse" rel="noopener noreferrer"&gt;https://github.com/Ialkyyyy/azkal-pulse&lt;/a&gt; — audit any site&lt;/p&gt;

&lt;p&gt;All MIT licensed. PRs welcome. If any of these save you time, a star on GitHub goes a long way.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
