<?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: Mohammed AlShannaq</title>
    <description>The latest articles on DEV Community by Mohammed AlShannaq (@mshannaq).</description>
    <link>https://dev.to/mshannaq</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%2F3530287%2F056ecf1a-2eb4-4948-98ef-77318c8ffc67.png</url>
      <title>DEV Community: Mohammed AlShannaq</title>
      <link>https://dev.to/mshannaq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mshannaq"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Mohammed AlShannaq</dc:creator>
      <pubDate>Thu, 13 Nov 2025 23:25:07 +0000</pubDate>
      <link>https://dev.to/mshannaq/-icl</link>
      <guid>https://dev.to/mshannaq/-icl</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" alt="The DEV Team" width="800" height="800"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" alt="" width="400" height="400"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-2ah" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Top 7 Featured DEV Posts of the Week&lt;/h2&gt;
      &lt;h3&gt;Jess Lee for The DEV Team ・ Nov 11&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#top7&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>top7</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Run MkDocs on iPad with iSH and Browse It Locally 🎉</title>
      <dc:creator>Mohammed AlShannaq</dc:creator>
      <pubDate>Sat, 04 Oct 2025 01:49:01 +0000</pubDate>
      <link>https://dev.to/mshannaq/run-mkdocs-on-ipad-with-ish-and-browse-it-locally-2n7c</link>
      <guid>https://dev.to/mshannaq/run-mkdocs-on-ipad-with-ish-and-browse-it-locally-2n7c</guid>
      <description>&lt;p&gt;Have you ever thought about turning your iPad into a mini documentation server?&lt;br&gt;
With iSH (a Linux shell for iOS) and MkDocs, you can not only build documentation projects right on your iPad, but also serve and browse them locally in Chrome or Safari on the same device! 🚀&lt;/p&gt;

&lt;p&gt;Why do this?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📝 Write and preview your documentation on the go, without a laptop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💡 Turn your iPad into a self-contained dev and docs environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🌍 Browse your MkDocs site locally as if it’s hosted online — but it’s all happening inside your iPad.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 1: Install iSH
&lt;/h2&gt;

&lt;p&gt;Grab iSH Shell from the App Store. It runs Alpine Linux inside iOS — lightweight and perfect for experiments like this.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Install Python &amp;amp; Build Tools
&lt;/h2&gt;

&lt;p&gt;Inside iSH, update and install the required packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apk update
apk add python3 py3-pip build-base python3-dev libffi-dev openssl-dev
pip install --upgrade pip setuptools wheel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Install MkDocs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install mkdocs mkdocs-material

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check if it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdocs —version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Create a Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdocs new mydocs
cd mydocs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Serve the Site
&lt;/h2&gt;

&lt;p&gt;Here’s the magic part — run the built-in dev server on 127.0.0.1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdocs serve -a 127.0.0.1:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Browse on Your iPad 🎉
&lt;/h2&gt;

&lt;p&gt;Now open Chrome or Safari on your iPad and go to:&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:8000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom! You’re browsing your MkDocs site that’s being served locally inside iSH. No extra devices, no external servers — just your iPad.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Tip&lt;/strong&gt;: Keep the iSH app running in the foreground (or in split-screen with Chrome/Safari). If iSH is fully sent to the background, iOS will freeze the process and your local MkDocs server will stop responding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This little hack shows how powerful iSH can be. Pair it with MkDocs, and suddenly your iPad becomes a portable documentation lab. You can edit Markdown, rebuild instantly, and preview it live in your browser — all on one device.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;👉 Would you try running MkDocs (or maybe even other Python-based tools) on your iPad?&lt;/p&gt;

</description>
      <category>ipad</category>
      <category>python</category>
      <category>documentation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Run MkDocs on iPad with iSH and Browse It Locally 🎉</title>
      <dc:creator>Mohammed AlShannaq</dc:creator>
      <pubDate>Sat, 04 Oct 2025 01:29:02 +0000</pubDate>
      <link>https://dev.to/mshannaq/run-mkdocs-on-ipad-with-ish-and-browse-it-locally-4anc</link>
      <guid>https://dev.to/mshannaq/run-mkdocs-on-ipad-with-ish-and-browse-it-locally-4anc</guid>
      <description></description>
      <category>python</category>
      <category>tutorial</category>
      <category>linux</category>
      <category>ios</category>
    </item>
    <item>
      <title>How I Exported and Re-Imported a netcup Server Snapshot (raw.zst qcow2)</title>
      <dc:creator>Mohammed AlShannaq</dc:creator>
      <pubDate>Thu, 25 Sep 2025 21:57:30 +0000</pubDate>
      <link>https://dev.to/mshannaq/how-i-exported-and-re-imported-a-netcup-server-snapshot-rawzst-qcow2-ol1</link>
      <guid>https://dev.to/mshannaq/how-i-exported-and-re-imported-a-netcup-server-snapshot-rawzst-qcow2-ol1</guid>
      <description>&lt;p&gt;When you run servers on &lt;strong&gt;netcup&lt;/strong&gt; (VPS or root Servers), one of the features you get is the ability to take snapshots of your VM. These snapshots can be downloaded as a file and stored locally or on object storage like S3, so you always have a backup you control.&lt;/p&gt;

&lt;p&gt;In fact, one of the neat features netcup provides is the option to export snapshots as downloadable files. For many plans, a limited number of exports are included for free, and if you need more, you can purchase additional exports as an add-on.&lt;/p&gt;

&lt;p&gt;This gives you the ability to keep offline or external copies of your VM state without relying solely on the built-in snapshot system — especially useful if you ever optimize storage or lose the snapshots stored within netcup’s platform.&lt;/p&gt;

&lt;p&gt;🐛 &lt;strong&gt;But here’s the catch:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;netcup&lt;/strong&gt; lets you download snapshots in a compressed format:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vda_snapshot.raw.zst
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, when you try to re-upload the same &lt;code&gt;.raw.zst&lt;/code&gt; back into netcup’s Server Control Panel (SCP), it fails. Why? Because netcup does not support &lt;code&gt;.zst&lt;/code&gt; uploads — only &lt;code&gt;raw&lt;/code&gt;, &lt;code&gt;qcow&lt;/code&gt;, and &lt;code&gt;qcow2&lt;/code&gt; formats are officially supported and accepted.&lt;/p&gt;

&lt;p&gt;In this article explains how I hit this problem, the dead ends I faced, and the working solution to restore my server successfully from a snapshot that I have created before for the server and downloaded it locally on my pc (or store it in AWS S3)&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I downloaded my snapshot from netcup: &lt;code&gt;vda_alma10readysam1.raw.zst&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I wanted to re-import it via Upload Image → Generate Upload URL. (using netcup SCP) or even upload the image from my pc.&lt;/li&gt;
&lt;li&gt;But when I tried to use it directly, and start the server after I receive email says that image installed, the server wouldn’t boot: “&lt;strong&gt;no boot device found.&lt;/strong&gt;”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? After couple of tries I see that it happens because &lt;code&gt;.raw.zst&lt;/code&gt; is only useful for downloading. netcup won’t accept it as an upload format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Decompress the Snapshot
&lt;/h2&gt;

&lt;p&gt;First, you need to decompress the .zst file into a raw image. Install zstd if it’s missing:&lt;/p&gt;

&lt;p&gt;💡 Note: The decompressed raw file will be the same size as your original VM disk (e.g. a 250 GB VM will produce a 250 GB raw file). Make sure you have enough free space on your system before starting the decompression.&lt;/p&gt;

&lt;p&gt;First of all make sure &lt;code&gt;zstd&lt;/code&gt; is insalled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# AlmaLinux / Rocky
dnf install -y zstd

# Ubuntu / Debian
apt install -y zstd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then decompress the &lt;code&gt;.raw.zst&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unzstd vda_alma10readysam1.raw.zst -o vda_alma10readysam1.raw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a &lt;code&gt;.raw&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; The raw file size always equals the full disk size of your VM. For example, if your VM had a 250 GB disk, the exported &lt;code&gt;.raw&lt;/code&gt; file will be 250 GB — even if you only used 5 GB of actual data.&lt;br&gt;
Trying to upload that 250 GB raw file would be a huge mistake: most of it is just empty space (zeros), so you’d be wasting time, bandwidth, and money moving around data that doesn’t really exist.&lt;/p&gt;

&lt;p&gt;That’s exactly why converting to qcow2 is the smarter approach&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Convert Raw → qcow2
&lt;/h2&gt;

&lt;p&gt;To save space and make uploads feasible, convert the raw image to qcow2. Install qemu-img if not already installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# AlmaLinux / Rocky
dnf install -y qemu-img

# Ubuntu / Debian
apt install -y qemu-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert the raw file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qemu-img convert -p -O qcow2 vda_alma10readysam1.raw vda_alma10readysam1.qcow2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qemu-img info vda_alma10readysam1.qcow2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image: vda_alma10readysam1.qcow2
file format: qcow2
virtual size: 256 GiB (274877906944 bytes)
disk size: 7.01 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
Child node '/file':
    filename: vda_alma10readysam1.qcow2
    protocol type: file
    file length: 7.01 GiB (7531462656 bytes)
    disk size: 7.01 GiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 &lt;strong&gt;Notice&lt;/strong&gt; how the virtual size is still 256 GB, but the actual file size is just 7 GB. That’s the power of qcow2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Upload to netcup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Log into SCP → Media → Upload Image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Generate Upload URL. (enter the file name for example vda_alma10readysam1.qcow2 ) and generate Upload Url, and the portal will give you Pre-signed URL to upload the file into using &lt;code&gt;curl&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use curl or aws s3 cp to upload your qcow2 file:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url --progress-bar 'https://upload.url.from.netcup...fullurlofuploadurl...' --upload-file vda_alma10readysam1.qcow2 | cat

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Once uploaded, select the image and deploy it to a new server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After this, my server booted normally again 🎉.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Note:&lt;/strong&gt; You don’t have to use the Generate Upload URL method if you don’t want to. netcup’s SCP also allows you to upload the image directly from your local machine — simply browse for the &lt;code&gt;.qcow2&lt;/code&gt; file and upload it through the web interface. This can be easier for smaller images, but for larger files I still recommend using the upload URL approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Store Your Snapshots Safely
&lt;/h2&gt;

&lt;p&gt;Instead of keeping snapshots only in netcup, you can store them externally (after you export it)&lt;/p&gt;

&lt;p&gt;This way, you can always re-import the image later, or even run it on another virtualization platform that supports qcow2 (Proxmox, KVM, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.raw.zst&lt;/code&gt; is &lt;strong&gt;download-only&lt;/strong&gt;. You can’t re-import it to netcup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You must convert it to &lt;strong&gt;raw, qcow, or qcow2&lt;/strong&gt; — with qcow2 being my most efficient choice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Always verify your qcow2 image with qemu-img info before uploading.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Storing qcow2 snapshots externally (S3, local disk, NAS) makes disaster recovery much easier.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;What started as a frustrating “no boot device 🤯” error turned into a neat learning experience. By decompressing and converting the snapshot, I was able to restore my VM cleanly and keep smaller, portable backups for the future.&lt;/p&gt;

&lt;p&gt;To give you a sense of the savings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original snapshot (.raw.zst) was 4.6 GB.&lt;/li&gt;
&lt;li&gt;After decompression to raw, it exploded to 256 GB (matching the full disk size).&lt;/li&gt;
&lt;li&gt;Once converted to qcow2, it shrank back down to just 7.4 GB — small enough to store and upload efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re running servers on netcup, don’t just rely on downloading .raw.zst snapshots. Convert them, back them up properly, and make sure you can re-import them when needed. Your future self will thank you.&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>devops</category>
      <category>virtualization</category>
      <category>virtualmachine</category>
    </item>
  </channel>
</rss>
