<?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: Musa Nayyer</title>
    <description>The latest articles on DEV Community by Musa Nayyer (@muzasio).</description>
    <link>https://dev.to/muzasio</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%2F3889552%2Fea50db40-183c-4528-abe1-823df040d8ab.png</url>
      <title>DEV Community: Musa Nayyer</title>
      <link>https://dev.to/muzasio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muzasio"/>
    <language>en</language>
    <item>
      <title>CachyOS Wouldn't Install and My NVMe Was the Problem (Corrupted GPT + chwd Fix)</title>
      <dc:creator>Musa Nayyer</dc:creator>
      <pubDate>Fri, 29 May 2026 11:47:30 +0000</pubDate>
      <link>https://dev.to/muzasio/cachyos-wouldnt-install-and-my-nvme-was-the-problem-corrupted-gpt-chwd-fix-2heb</link>
      <guid>https://dev.to/muzasio/cachyos-wouldnt-install-and-my-nvme-was-the-problem-corrupted-gpt-chwd-fix-2heb</guid>
      <description>&lt;h1&gt;
  
  
  CachyOS Wouldn't Install and My NVMe Was the Problem (Corrupted GPT + chwd Fix)
&lt;/h1&gt;




&lt;p&gt;I was setting up CachyOS on a secondary laptop — i7 11th Gen, NVIDIA mobile GPU, Micron 2210 NVMe. Should've been a clean install. It wasn't. Two specific things broke and both of them looked like my fault until they weren't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 1: The NVMe with an Identity Crisis
&lt;/h2&gt;

&lt;p&gt;The CachyOS installer (Calamares) failed to create a partition table on the Micron 2210 NVMe. No useful error, just a failure. I dropped into the terminal and ran &lt;code&gt;gdisk&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="nb"&gt;sudo &lt;/span&gt;gdisk /dev/nvme0n1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three warnings. Then this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MBR: not present
BSD: not present
APM: not present
GPT: damaged
Found invalid MBR and corrupt GPT.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The drive had a corrupted GPT and ghost MBR headers from a previous install. The Calamares installer couldn't write a clean partition table because it was fighting old metadata it couldn't fully read or overwrite.&lt;/p&gt;

&lt;p&gt;The fix is a full zap from inside &lt;code&gt;gdisk&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="nb"&gt;sudo &lt;/span&gt;gdisk /dev/nvme0n1
&lt;span class="c"&gt;# at the prompt:&lt;/span&gt;
x        &lt;span class="c"&gt;# enter expert mode&lt;/span&gt;
z        &lt;span class="c"&gt;# zap GPT data — confirm with y&lt;/span&gt;
         &lt;span class="c"&gt;# then zap MBR — confirm with y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drive came out completely clean. Re-ran the installer, partition table created without issue.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;gdisk&lt;/code&gt; can't get there, hit it with &lt;code&gt;wipefs&lt;/code&gt; first:&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;sudo &lt;/span&gt;wipefs &lt;span class="nt"&gt;-a&lt;/span&gt; /dev/nvme0n1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Intel VMD note:&lt;/strong&gt; If you're on an 11th Gen Intel laptop, check your BIOS for Intel VMD (Volume Management Device). If it's enabled, Linux can see the NVMe drive but can't write to it properly. Disable VMD or switch from RAID to AHCI/NVMe mode before trying any of the above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 2: chwd Killed the Install Mid-Way
&lt;/h2&gt;

&lt;p&gt;After getting past the NVMe issue, the installer failed again — this time at &lt;code&gt;chwd&lt;/code&gt;, the CachyOS hardware detection tool. The online installer couldn't pull the driver profiles, likely a mirror timeout.&lt;/p&gt;

&lt;p&gt;The fix: switch to the offline installer.&lt;/p&gt;

&lt;p&gt;It installs a default desktop from the USB without pulling anything from the network. Once booted into the system, run hardware detection manually:&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;sudo &lt;/span&gt;chwd &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That scans your hardware and applies the right driver profiles — in my case, the Intel + NVIDIA hybrid (Optimus) setup for the laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  TIL
&lt;/h2&gt;

&lt;p&gt;Old partition metadata is silent until it isn't. Before installing anything on a drive that's been used before, zap it manually — don't trust the installer to do it cleanly.&lt;/p&gt;




&lt;h1&gt;
  
  
  muzasio #til #devlog #techexperiment #linux #cachyos #nvme #archlinux
&lt;/h1&gt;

</description>
      <category>archlinux</category>
      <category>devops</category>
      <category>opensource</category>
      <category>cachyos</category>
    </item>
    <item>
      <title>I Tried Building a Complex Security Tool with a 1.5B Local Model — Here's What Broke</title>
      <dc:creator>Musa Nayyer</dc:creator>
      <pubDate>Wed, 27 May 2026 20:06:50 +0000</pubDate>
      <link>https://dev.to/muzasio/i-tried-building-a-complex-security-tool-with-a-15b-local-model-heres-what-broke-2ld2</link>
      <guid>https://dev.to/muzasio/i-tried-building-a-complex-security-tool-with-a-15b-local-model-heres-what-broke-2ld2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; I had aider running on Lubuntu, three API keys configured, a detailed architecture diagram, and a clear goal — build a modular forensic data analysis pipeline. What I actually got was token walls, a model that replied "Ok." to everything, and a half-made project directory with nothing inside it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Installed aider via the official shell script on Lubuntu. Connected three models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI — failed outright, key didn't authenticate&lt;/li&gt;
&lt;li&gt;Grok — worked partially, got some directory scaffolding done before tokens ran out mid-session&lt;/li&gt;
&lt;li&gt;Ollama local (Qwen 2.5 Coder 1.5B) — connected fine after setting &lt;code&gt;OLLAMA_API_BASE=http://localhost:11434&lt;/code&gt;, but the model kept responding with "Ok." and two tokens flat
The architecture I was trying to build had seven layers: data acquisition, integrity hashing, normalization, schema mapping, anomaly detection, explainability, and 3D visualization with Three.js. Ambitious. Too much for a 1.5B model to hold in its head at once.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;First I threw the whole diagram at aider and asked it to scaffold everything. Grok started making directories. Tokens ended. Switched to local Ollama. Local model saw the repo map, said "Ok." — twice. No output, no errors, no explanation.&lt;/p&gt;

&lt;p&gt;I tried prompting it to list the project structure. Still "Ok." Tried asking it to read what happened in the folder. "Ok." The model wasn't broken — it was overwhelmed. A 1.5B model with a full repo map in context has almost no room left to actually generate code.&lt;/p&gt;

&lt;p&gt;Then I realized the real problem: I was treating a small local model like a senior engineer. It's not. It's a fast, cheap code-completer that needs a tight scope and a single task.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Worked
&lt;/h2&gt;

&lt;p&gt;Three things changed the outcome:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. One module at a time.&lt;/strong&gt; Instead of "build the pipeline," I asked for one function in one file. The model went from "Ok." to producing real code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;/read&lt;/code&gt; instead of &lt;code&gt;/add&lt;/code&gt;.&lt;/strong&gt; Using &lt;code&gt;/read&lt;/code&gt; for files the model doesn't need to edit cuts token usage significantly. The model gets context without burning its window on write permissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Git as memory across models.&lt;/strong&gt; When Grok's tokens ran out mid-session, I committed whatever it had produced. When I switched to Ollama, I opened with: &lt;em&gt;"The previous model created the acquisition and integrity folders. Look at the current files and continue with the normalization script."&lt;/em&gt; The local model picked up cleanly — because git was the real memory, not the chat history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Got a working &lt;code&gt;acquisition/&lt;/code&gt; module and a &lt;code&gt;schema/event_schema.json&lt;/code&gt; with the Canonical Event Schema defined. The hashing layer and normalization parser came from the local model once I stopped giving it too much context at once. The Three.js visualization is still pending — that's a job for Gemini's free tier, which handles frontend/creative code better than a 1.5B coder model.&lt;/p&gt;

&lt;p&gt;The pipeline isn't done. But the architecture is solid and every module has a defined input/output contract, which means any model can continue any piece without needing the full history.&lt;/p&gt;




&lt;h2&gt;
  
  
  TIL
&lt;/h2&gt;

&lt;p&gt;A 1.5B local model isn't bad at coding — it's bad at holding a complex project in context. Split the work into single-function tasks, use git commits as handoff points between models, and let the repo map do the heavy lifting instead of bloating the chat history.&lt;/p&gt;




&lt;h1&gt;
  
  
  muzasio #til #devlog #techexperiment #aider #ollama #localai #cybersecurity #linux
&lt;/h1&gt;

</description>
      <category>ollama</category>
      <category>aider</category>
      <category>localai</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Signal QR Stuck on Spinner — University Firewall Was the Culprit</title>
      <dc:creator>Musa Nayyer</dc:creator>
      <pubDate>Sun, 24 May 2026 06:43:16 +0000</pubDate>
      <link>https://dev.to/muzasio/signal-qr-stuck-on-spinner-university-firewall-was-the-culprit-1ch7</link>
      <guid>https://dev.to/muzasio/signal-qr-stuck-on-spinner-university-firewall-was-the-culprit-1ch7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; I tried linking my iPhone as a secondary Signal device. The QR code just spun forever — a loading spinner inside a white box. No error. Just nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My setup:&lt;/strong&gt; Primary device — Redmi 13C (PTA), Signal registered and working. Secondary device — iPhone (non-PTA). University Wi-Fi. I wasn't doing a full registration or transfer. Just: &lt;em&gt;Settings → Linked Devices → Link New Device&lt;/em&gt; on iPhone. Dead silence from Signal.&lt;/p&gt;




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

&lt;p&gt;First assumption: it's the non-PTA iPhone. Maybe Signal's blocking it? Nope — PTA status is a cellular registration thing. It has zero effect on Wi-Fi app behavior.&lt;/p&gt;

&lt;p&gt;Second assumption: maybe I need to select "transfer from Android"? Nope — I didn't want a transfer. Just a secondary link. The flow is: iPhone shows QR → Redmi scans it.&lt;/p&gt;

&lt;p&gt;I got the flow backwards at first too. Thought Redmi generates QR, iPhone scans. Wrong. &lt;strong&gt;iPhone (secondary) generates the QR. Redmi (primary) scans it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The QR never loaded on iPhone. That's when it clicked — it's not the phone, it's the network.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Happened
&lt;/h2&gt;

&lt;p&gt;Signal's QR code generation isn't local. The iPhone hits Signal's provisioning API (&lt;code&gt;api.signal.org&lt;/code&gt;, &lt;code&gt;storage.signal.org&lt;/code&gt;) to create a time-sensitive token before displaying the code. My university network was blocking those endpoints.&lt;/p&gt;

&lt;p&gt;Why did Redmi register fine earlier? Probably a different time, different access point, or Android and iOS clients have different TLS fingerprints — and the firewall's application-layer inspection treats them differently. University-grade firewalls (Fortinet, Palo Alto) do this.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Proton VPN on both devices, same server location.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installed Proton VPN (free tier) on both iPhone and Redmi&lt;/li&gt;
&lt;li&gt;Connected both to the same server (Netherlands)&lt;/li&gt;
&lt;li&gt;On iPhone → Signal → Linked Devices → Link New Device&lt;/li&gt;
&lt;li&gt;QR code appeared instantly&lt;/li&gt;
&lt;li&gt;Redmi scanned it — linked successfully&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6. Redmi got logged out immediately after. That's not a bug — Signal logs out existing sessions when a new device links, by design. Re-registered with the phone number and everything was fine. Message history is local anyway; it doesn't sync across linked devices.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Key Insights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The QR code requires a live API call.&lt;/strong&gt; If Signal's servers are unreachable, the spinner loops forever with no error message. Signal could honestly show a better error here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS and Android Signal clients behave differently at the network level.&lt;/strong&gt; A firewall can block one and pass the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;University networks block more than you think.&lt;/strong&gt; VoIP, messaging APIs, certain CDN routes — it's not just torrents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free VPN is enough for this.&lt;/strong&gt; Proton VPN free tier worked fine. No speed requirements for a one-time provisioning handshake.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - &lt;strong&gt;Both devices need to be on the same network exit.&lt;/strong&gt; The provisioning token is bound to the originating network context. If iPhone generated it over VPN and Redmi scanned from plain university Wi-Fi, it failed with "QR code not valid."
&lt;/h2&gt;

&lt;h2&gt;
  
  
  TIL
&lt;/h2&gt;

&lt;p&gt;Signal's device linking QR is a remote token, not a local code — and if your network blocks Signal's API endpoints, you'll get an endless spinner with zero explanation.&lt;/p&gt;

</description>
      <category>signal</category>
      <category>vpn</category>
      <category>till</category>
      <category>muzasio</category>
    </item>
    <item>
      <title>Firefox Profiles Frozen and Corrupted on CachyOS — What Broke and How psd Was the Culprit</title>
      <dc:creator>Musa Nayyer</dc:creator>
      <pubDate>Fri, 22 May 2026 12:35:15 +0000</pubDate>
      <link>https://dev.to/muzasio/firefox-profiles-frozen-and-corrupted-on-cachyos-what-broke-and-how-psd-was-the-culprit-39hc</link>
      <guid>https://dev.to/muzasio/firefox-profiles-frozen-and-corrupted-on-cachyos-what-broke-and-how-psd-was-the-culprit-39hc</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Opened Firefox one morning and the profile picker showed up. Clicked my main profile — nothing happened. Hover worked, tooltips appeared, but clicks registered nowhere. Profile 1 was already dead the day before. Only the third profile (sss) responded. Main profile had six accounts in it.&lt;/p&gt;

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

&lt;p&gt;Keyboard navigation — nothing. Tab and Enter didn't work either.&lt;/p&gt;

&lt;p&gt;Checked the Firefox profile directory and found this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;lrwxrwxrwx  lbjm2hpz.Profile 2 -&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/run/user/1000/psd/user-firefox-lbjm2hpz.Profile 2
&lt;span class="gp"&gt;lrwxrwxrwx  xcpk3xfu.default   -&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/run/user/1000/psd/user-firefox-xcpk3xfu.default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Symlinks. Not real directories. psd (profile-sync-daemon) moves Firefox profiles to RAM and replaces them with symlinks. The RAM targets were either empty or broken.&lt;/p&gt;

&lt;p&gt;Ran &lt;code&gt;psd preview&lt;/code&gt; — confirmed psd was managing both profiles. &lt;code&gt;xcpk3xfu.default&lt;/code&gt; showed profile size 0. That profile was already gone.&lt;/p&gt;

&lt;p&gt;Tried &lt;code&gt;psd resync&lt;/code&gt; — ran without errors but didn't fix the picker clicks.&lt;/p&gt;

&lt;p&gt;Tried launching directly from terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firefox &lt;span class="nt"&gt;--profile&lt;/span&gt; &lt;span class="s2"&gt;"/home/user/.config/mozilla/firefox/lbjm2hpz.Profile 2"&lt;/span&gt;
firefox &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="s2"&gt;"default-release"&lt;/span&gt; &lt;span class="nt"&gt;--no-remote&lt;/span&gt;
&lt;span class="nv"&gt;MOZ_ENABLE_WAYLAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 firefox &lt;span class="nt"&gt;--profile&lt;/span&gt; &lt;span class="s2"&gt;"/home/user/.config/mozilla/firefox/lbjm2hpz.Profile 2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three kept opening the sss profile instead. The &lt;code&gt;--no-remote&lt;/code&gt; attempts threw repeated channel errors because Firefox was already running.&lt;/p&gt;

&lt;p&gt;Checked &lt;code&gt;about:profiles&lt;/code&gt; — confirmed the current window was actually running &lt;code&gt;default-release&lt;/code&gt; (the main profile), but it was completely empty. No accounts, no history, nothing. The 49M of data was somewhere but Firefox wasn't seeing it.&lt;/p&gt;

&lt;p&gt;Stopped psd, deleted the broken profile directory, tried restoring from the &lt;code&gt;-backup&lt;/code&gt; folder — backup had disappeared when psd stopped (psd overwrites it on shutdown with whatever is in RAM). Only a crashrecovery folder from earlier that morning survived with 49M of actual data.&lt;/p&gt;

&lt;p&gt;Restored from crashrecovery, started psd again — psd immediately created a new symlink pointing to RAM and the profile went missing again. psd was overwriting the restore on every start.&lt;/p&gt;

&lt;p&gt;The GUI click issue turned out to be a separate Wayland input problem with the Firefox profile picker — unrelated to psd but compounding the mess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root Cause
&lt;/h2&gt;

&lt;p&gt;psd syncs browser profiles to RAM for speed. On unclean shutdowns or crashes, the sync back to disk fails. The &lt;code&gt;-backup&lt;/code&gt; folder gets overwritten on the next psd start with whatever empty state is in RAM. Over time this had been happening repeatedly — the profile directory had 64 crash recovery folders going back months, all showing the same pattern.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;xcpk3xfu.default&lt;/code&gt; was already fully gone. &lt;code&gt;lbjm2hpz.Profile 2&lt;/code&gt; survived only because a crashrecovery snapshot existed from earlier that same day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;Disabled Firefox in psd by adding this to &lt;code&gt;~/.config/psd/psd.conf&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="nv"&gt;BROWSERS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;google-chrome&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restarted psd. Firefox now reads directly from disk. No more symlinks, no more RAM sync, no more silent corruption on shutdown.&lt;/p&gt;

&lt;p&gt;Also ran &lt;code&gt;psd clean&lt;/code&gt; to delete the accumulated crash recovery folders and reclaim disk space.&lt;/p&gt;

&lt;h2&gt;
  
  
  TIL
&lt;/h2&gt;

&lt;p&gt;psd is a silent data risk on systems that crash or suspend frequently — it will eat your browser profiles and leave behind only empty backup folders.&lt;/p&gt;

</description>
      <category>till</category>
      <category>devlog</category>
      <category>tech</category>
      <category>experiment</category>
    </item>
    <item>
      <title>How I got out of dependency hell with Docker (SpiderFoot OSINT lab)</title>
      <dc:creator>Musa Nayyer</dc:creator>
      <pubDate>Mon, 20 Apr 2026 20:47:23 +0000</pubDate>
      <link>https://dev.to/muzasio/how-i-got-out-of-dependency-hell-with-docker-spiderfoot-osint-lab-5e6d</link>
      <guid>https://dev.to/muzasio/how-i-got-out-of-dependency-hell-with-docker-spiderfoot-osint-lab-5e6d</guid>
      <description>&lt;p&gt;I wanted to try SpiderFoot – an OSINT tool. Thought it would be a simple &lt;code&gt;pip install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nope.&lt;/p&gt;

&lt;p&gt;It crashed on &lt;code&gt;lxml&lt;/code&gt;. Something about headers and versions. Classic dependency hell on Arch.&lt;/p&gt;

&lt;p&gt;I didn't want to mess up my main system. So I gave up on virtual environments and used Docker instead.&lt;/p&gt;

&lt;p&gt;Here's what worked.&lt;br&gt;
Set this up so you don't need sudo for every command.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Docker permissions
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
newgrp docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  2. Clone and build
&lt;/h2&gt;

&lt;p&gt;Grab the source and build the image locally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/smicallef/spiderfoot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;spiderfoot
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; spiderfoot &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Run it (the easy way)
&lt;/h2&gt;

&lt;p&gt;I used the VS Code Docker extension. Built the image, then ran the container from the UI. The extension shows all running containers on my system, so I could start/stop it with one click.&lt;/p&gt;

&lt;p&gt;If you prefer the command line, this works too:&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;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 5001:5001 &lt;span class="nt"&gt;--name&lt;/span&gt; spiderfoot-app spiderfoot
Either way, open http://localhost:5001 and SpiderFoot is there.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why I'm doing this&lt;br&gt;
I'm a beginner in cybersecurity. I don't want to install random tools directly on my laptop. With Docker, I can try anything and delete it later without breaking stuff.&lt;/p&gt;

&lt;p&gt;This worked for me. Might work for you too.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>osint</category>
      <category>cybersecurity</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
