Skip to content

NexusOne23/noid-privacy-workstation

🛡️ NoID Privacy Workstation 44

Fully-Hardened Security + Privacy OS — built for the AI-agent workflow

Based on Fedora 44 · GNOME 50

Fedora Version Tests Modules Reproducible Website

The Linux distribution for Dev · Admin · Creator · AI workflows — zero telemetry, daily-driver & hardened by default.

📥 Download · Quick Start · What You Get · Scope · Threat Model · AI Workspace · Comparison · Docs

NoID Privacy Workstation 44 — first-boot GNOME 50 Activities overview with the NoID Privacy Setup dialog open (Critical / System Updates / Hardware Privacy sections visible), welcome notification toast, GNOME default `drool` wallpaper (CC-BY-SA-3.0), and the dock showing Firefox / Thunderbird / GNOME Software / Files / Terminal / Settings / Setup-launcher icons


A hardened, privacy-trimmed Fedora Workstation 44 desktop that still works like one — 40 modules layer defense across kernel, network, identity, integrity, firmware, services and browser, plus first-party apps, CLIs and docs, packaged as a single reproducible-from-source ISO with its own branding.

It's also built for the AI-agent workflow: a ready VSCodium + Claude Code workspace ships with a privacy-default settings.json, a system-wide CLAUDE.md engineering doctrine, and 39 AI-navigable docs — opt-in, telemetry-off, with a fully-local AI path (RamaLama / Ollama / LM Studio) so your AI never has to leave the box.

Hardening is additive: security defaults ship ON without subtracting daily-driver function. It stays a complete GNOME 50 desktop — Flatpak, NetworkManager, Firefox + uBO, dnf, GNOME polish intact; Intel + AMD GPUs run out of the box on Mesa, NVIDIA defaults to the open nouveau+NVK stack (proprietary NVIDIA + CUDA opt-in). Bluetooth / Location / Camera / Microphone ship default-off with one-toggle opt-in (noid-toggle-bluetooth / noid-toggle-location / GNOME Settings → Privacy), and every noid-toggle-* is fully reversible without breaking the system. LUKS2 + Btrfs + Snapper give system-state rollback (root subvol only; /home preserved by design as a separate subvolume).

Threat model: privacy + surveillance-resistance on any network you join — not state-level anonymity. Per-module rationale lives inline in each .ks lock-history header; deeper trade-offs across docs/.

⚠️ Trademark: "Fedora" is a registered trademark of Red Hat, Inc. NoID Privacy Workstation is an independent derivative work, not affiliated with, endorsed by, or sponsored by the Fedora Project or Red Hat, Inc.details.


📥 Download the ISO

The ready-to-flash v1.2 ISO (~3 GB, GPG-signed) lives on the NoID Privacy download page → — hosted on the project site, not GitHub Releases (a 3 GB ISO exceeds GitHub's 2 GB asset cap).

Always verify before you boot:

gpg --import noid-privacy-release.asc      # one-time: import the release key
gpg --verify SHA256SUMS.asc SHA256SUMS     # → "Good signature"
sha256sum -c SHA256SUMS                    # → "...x86_64.iso: OK"

Release signing-key fingerprint 1ACB FCE4 9687 FEBB 9101 0E52 F8E3 F11D 6962 256F (download the key).

Prefer to build it yourself from the kickstart source? See Quick Start below.


⚡ Quick Start

Build the ISO yourself on a Fedora 44 host:

# On a Fedora 44 build host:
sudo dnf install lorax-lmc-novirt anaconda spin-kickstarts pykickstart
git clone https://github.com/NexusOne23/noid-privacy-workstation.git
cd noid-privacy-workstation
sudo ./scripts/build-iso.sh        # ~25–40 min  →  build-output/*.iso (~3 GB)

scripts/build-iso.sh is the single supported build path — it handles ksflatten, the Anaconda patch, branding staging, and audit-tool SHA pinning. Full guide: docs/build.md.

Always VM-test before bare-metal:

bash tests/run-all.sh              # 51 structural tests
sudo ./tests/smoke/run-all.sh      # bwrap smoke tests (needs bubblewrap)

📦 What Ships in the Repo

A kickstart image recipe — not a pre-built ISO:

  • 42 kickstart filesmaster.ks + 40 module snippets (hardening + first-party apps + branding + docs) + 99-finalize.ks cross-module verifier. The snippets span the hardening surface (sysctl, firewall, USBGuard, AIDE, SELinux, kernel-module blacklist, …), first-party NoID Privacy apps and CLIs, user-doc bundles, branding, and post-install cleanup — not all are "hardening" in the narrow sense. The wrapper scripts/build-iso.sh flattens them and feeds livemedia-creator to produce a bootable live ISO.
  • 39 user-doc pages shipped inside the image at /usr/share/doc/noid-privacy/ — written for humans and structured so an AI-agent (e.g., a Claude Code session) can navigate + read them on demand.
  • 40+ user-facing CLI helpers (noid-status, noid-help, noid-update-all.sh, noid-update GUI, noid-network GUI, noid-welcome.sh, noid-integrity-check, noid-toggle-wan-strict, noid-toggle-bluetooth, noid-toggle-location, noid-toggle-aide, noid-snap-pre, noid-luks-backup.sh, noid-firefox-harden-profile, noid-firefox-create-isolated-profile, noid-mei-restore-submodules, noid-lan-allow, noid-claude-install, noid-nvidia-install.sh, …) in /usr/local/bin and /usr/local/sbin.
  • 51 structural + 4 smoke regression tests covering critical module invariants — current state 51/51 PASS.

Once built and installed (LUKS2 full-disk encryption, Btrfs layout), the result is a Fedora Workstation that matches or exceeds stock Fedora in every hardening dimension. Side-by-side against Kicksecure + secureblue → Comparison.


🏰 What You Get

Area Hardening
🤖 AI workspace (USP) Claude Code CLI + hardened VSCodium + privacy-default settings.json + system-wide engineering doctrine + 39 AI-navigable user docs. Full breakdown → AI-Agent-Ready Workspace
🔥 LAN isolation block-lan-out drops every RFC1918 / link-local / multicast egress + firewalld L3/4 DROP inbound + layer-2 ARP hardening → invisible & unreachable on café / hotel / office WiFi. Surgical per-IP allow-list via the noid-network GTK4 app
🛰️ VPN killswitch Provider-neutral (Proton / Mullvad / IVPN / NordVPN / OpenVPN / manual WireGuard) — when the tunnel drops, traffic stops. No hardcoded provider dependency
🧠 Kernel & sysctl 120 install-time sysctl params (114 hardening + 3 audit-fixes + 1 userns + 2 privacy-network; +1 wan-ipv6-off at firstboot = 121 runtime; KSPP + Kicksecure security-misc + NoID Privacy), 52 baseline kernel-cmdline tokens (+ up to 7 hardware-conditional), 109 module blacklists, 35+ sandboxed systemd services with Protect* / Restrict* layers
🔐 Firmware Intel ME: KT/SOL PCI driver_override across 27 PCI IDs (6th–17th gen + Sapphire Rapids) + mei/mei_me loaded for BootGuard attestation (fwupd HSI caps at 1! on Fedora 44 — MemoryProtection firmware-bound, transitional + upstream-tracked, see docs/known-failures.md) / IOMMU / lockdown=integrity. No default MEI sub-module blacklists (Kicksecure-consensus per security-misc Issue #239) — mei_hdcp/mei_pxp/mei_wdt opt-in block via noid-mei-restore-submodules --block (4K HDCP / HuC HW-decode / iAMT-watchdog trade-offs explicit). AMD PSP: ccp loaded for fTPM + fwupd HSI, opt-in ccp blacklist (PSP hardware-locked since Zen 3 — no software disable; PSB OTP-fuse + CVE-2025-2884 doc'd). Plus fwupd HSI attestation + USBGuard whitelist-only
🔍 Integrity & audit SELinux enforcing (+ custom NoID Privacy module), auditd immutable (63 rules, -e 2), AIDE daily scans + re-baseline workflow, one-screen noid-status, curated known-FP list
🦊 Browser NoID Privacy Firefox Hardening (derived from arkenfox v144.0) + uBlock Origin (SHA-pinned) + FPP overrides + Quad9 DoH (TRR mode 3) + dFPI cookie-isolation + Canvas/WebGL randomization; separate Playground profile; optional Thunderbird hardening (M35)
🔇 Silent machine 98 systemd units masked source-deployed (M08 87 attack-surface + M05 8 avahi/wsdd/cups + M11 1 timesyncd + M24 2 fwupd-refresh; passim shared M08↔M24) + M27 thermald masked at firstboot on hardware with platform thermal-management (DYTC) (~100 live incl. Fedora-preset chrony masks; covers mDNS / SSDP / cups / firmware-poll / …; location/GeoClue is off via gsettings, not masking), 6 GNOME telemetry channels closed, no auto-update timers, gnome-software autostart-suppressed via dual-layer (systemd user-unit /dev/null mask + D-Bus session-service shadow org.gnome.Software.service Exec=) — manual launch via app-grid still works
💾 Storage LUKS2 AES-XTS-512 + Argon2id KDF (passphrase-only by design — TPM2 auto-unlock deliberately NOT enrolled per privacy threat model: hardware-binding ties drive to motherboard + evil-maid attack-surface via unattended-unlock + supply-chain trust requirement, see docs/22-disk-encryption.md), Btrfs + Snapper pre-update snapshots with snapper rollback CLI recovery
🕒 30-day forensic retention Strict 30-day cap on every persistent forensic source (audit logs, AIDE archive, snapper snapshots, install-time artifacts, libvirt/tuned/dnf5-rotated logs, UPower battery history, NetworkManager seen-bssids / timestamps). After day 31 the disk reveals nothing about prior activity. Saved WiFi profiles + paired Bluetooth devices stay user-managed (= no daily re-auth). Full source-by-source table in docs/log-retention.md.
🔄 Updates & UX noid-update-all.sh orchestrator + noid-update GTK4 GUI front-end (live VTE terminal, askpass dialog, snapshot → dnf → flatpak → fwupd → AIDE rebaseline), noid-welcome setup-dialog (M13, GTK4 + libadwaita, 10 PreferencesGroup sections incl. App Autostart picker — NoID Privacy-canonical GTK4 replacement for the missing GNOME 50 autostart UI), 40+ noid-* CLI helpers, 39 user docs
🎮 Gaming (opt-in) Hardening built gaming-aware (vm.max_map_count, userns, /home exec, SMT, ntsync all left game-friendly; no hardened_malloc to fight) — a single Gaming-Mode toggle in the Setup app relaxes the only 2 real blockers (ia32_emulation 32-bit exec + selinuxuser_execmod Wine W^X), installs Steam on demand, SELinux stays Enforcing, fully reversible → docs/gaming.md

Module-by-module breakdown → INDEX.md · per-module rationale → docs/.


🎯 Scope — what it IS / is NOT

✅ Does ❌ Does not
Stay invisible + unreachable on any LAN (inbound and outbound blocked) Replace Tails / Whonix for whistleblowing anonymity
Block ISP tracking + browser fingerprinting (DoH, FPP, arkenfox, uBO) Provide VM-level isolation like Qubes OS
Mitigate Intel ME (multi-layer, KT/SOL PCI + IOMMU + fwupd HSI) + document AMD PSP trade-offs Protect against a compromised VPN provider
Enforce SELinux + auditd + LUKS2 + Secure Boot Defeat physical coercion (xkcd 538)
Run as a working GNOME 50 + Flatpak desktop Run on ARM / Raspberry Pi (x86_64 only)
Daily AIDE monitoring + Snapper rollback Centrally manage via AD / LDAP / Intune

This image combines configuration hardening (the foundation) with AIDE integrity detection and auditd behavioral monitoring (63 immutable rules) — detection layers catch what hardening can't prevent.

Best for: privacy-aware Fedora power-users · mobile professionals on hostile networks · security researchers (reproducible image, explicit per-module rationale) · developers & admins who accept a WAN-only workflow. Not for: multi-user / family systems (LAN-iso blocks shared services) · enterprise AD/LDAP (sssd removed) · home-server / NAS · ARM · non-UEFI / non-TPM-2.0 hardware. Gaming: opt-in via Gaming-Mode (Setup app) — relaxes the two real hardening blockers (32-bit exec + Wine W^X) and installs Steam on demand; reversible, SELinux stays Enforcing. Not tuned as a gaming-first rig, but Steam/Proton run. See docs/gaming.md.


🛡️ Threat Model

See docs/threat-model.md for the long version. Short form:

Protects against — ad/tracker fingerprinting (FPP, arkenfox, uBO); ISP + local-network surveillance (DoH, optional VPN, LAN-iso); data-broker profiling (dFPI, MAC randomization); LAN attacks (block-lan-out, ARP hardening); browser memory-corruption exploits (Firefox Fission + seccomp + namespaces); kernel exploits (sysctl + module-blacklist + kargs); USB attack devices (USBGuard); evil-maid at rest (LUKS2 + Secure Boot); firmware-persistence (Intel ME multi-layer: KT/SOL PCI driver_override + IOMMU + lockdown + fwupd HSI; AMD PSP awareness with opt-in ccp blacklist — PSP is hardware-locked on Ryzen and cannot be disabled in software). Package supply-chain uses Fedora primary repos with GPG signatures verified; third-party repos (RPM Fusion, VSCodium) are TOFU on first install — see docs/gpg-trust-chain.md.

Does NOT protect against — state-level global traffic analysis; targeted endpoint exploits (no VM boundary like Qubes); a compromised VPN provider; account-linking via logged-in services (Gmail / GitHub defeat pseudonymity); physical coercion (xkcd 538); zero-days between disclosure and patch; upstream supply-chain attacks on Fedora itself (xz-utils-style); social-engineering / phishing; Anthropic-side exposure of AI conversations IF you opt in to Claude Code (cloud API, US-jurisdiction; opt-out paths + fully-local alternative → docs/ai-workspace.md). Full out-of-scope list → docs/scope.md.


🤖 AI-Agent-Ready Workspace

Layer Detail
Bundled Hardened VSCodium (telemetry / auto-update / AI-surfaces off) with the claude-code extension SHA-pinned in /etc/skel/.vscode-oss/extensions/ — the extension bundles the Claude Code CLI binary, so the AI panel works on first launch without marketplace. Opt-in system-wide CLI install via noid-claude-install (wraps Anthropic's signed install.sh with consent + content inspection)
Privacy defaults /etc/skel/.claude/settings.json ships CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 (auto-update ping + error reporter + non-critical analytics + usage-stats off), CLAUDE_CODE_HIDE_CWD=1 (working directory hidden from CLI banner), cleanupPeriodDays=7 (transcripts auto-purged after 7 days; upstream default = 30)
System directives /etc/claude-code/CLAUDE.md ships system-wide engineering doctrine (Native > Hacky, Root-Cause First, priority hierarchy Correctness > Security > Privacy > UX > Stability > Simplicity > Performance) so agents inherit consistent posture across the system
AI-navigable docs corpus 39 user docs at /usr/share/doc/noid-privacy/ shipped as flat Markdown so an agent can navigate + read on demand — per-module rationale + threat-model + trade-off notes all available

User-overridable in ~/.claude/settings.json — the template is a privacy default, not an enforced managed-settings layer. Built for the people who actually live in a terminal + IDE + AI-agent loop.

Opt-in by design: no Anthropic traffic until you invoke Claude. Trade-offs (conversations go to Anthropic API, US-jurisdiction, closed-source) + 6 opt-out levels + fully-local alternative → docs/ai-workspace.md. Local-AI stack (RamaLama / Ollama / LM Studio + Continue.dev) → docs/28-local-ai.md.


📊 Comparison

Kicksecure secureblue NoID Privacy WS 44
Kernel/sysctl baseline ✅ (security-misc) ✅ (120 install-time sysctl + 52 cmdline tokens)
MAC framework AppArmor SELinux + user-ns confinement SELinux enforcing (+ custom NoID Privacy module)
Hardened memory allocator ❌ (deprecated upstream — AMD64-only + Flatpak-breakage) ✅ GrapheneOS-based globally enabled via LD_PRELOAD ❌ deliberate — Firefox LD_PRELOAD incompat (Bugzilla #1668674), see design-decisions
Hostile-LAN isolation ⚠️ partial (ARP-hardening sysctls) ✅ (block-lan-out + ARP + per-iface)
Intel ME mitigation ❌ (Issue #239: MEI blacklists removed 2024) ⚠️ kernel-module blacklist ✅ active KT/SOL PCI driver_override=none block (27 IDs, dracut-enforced) — the one real ME-specific mitigation — + BootGuard attestation + IOMMU + opt-in sub-module blocks; rest is generic Secure Boot / AMT-disable / NIC docs — detail
AMD PSP awareness ⚠️ partial (kvm_amd.sev=1 sev_es=1 sev_snp=1 kargs) ⚠️ awareness / docs only — PSP is hardware-locked; ccp stays loaded for fTPM/HSI, generic IOMMU + Secure Boot + fwupd HSI apply anyway, + a PSB-OTP / CVE-2025-2884 doc — detail
File-integrity (AIDE) ❌ (rpm-ostree immutable base instead) ✅ daily
Default browser hardening ⚠️ Firefox-ESR + AppArmor (phase-out planned; Tor via tb-updater) ✅ Trivalent (Vanadium-derived Chromium, --jitless) ✅ Firefox (arkenfox + FPP + uBO + Quad9 DoH) — detail
Privilege escalation sudo + su restrictions run0 replaces sudo/su/pkexec entirely sudo (timestamp_timeout=3, CIS 4.3.6) + faillock
AI-agent workspace ✅ (Claude Code + VSCodium)
Gaming (Steam / Proton) ⚠️ not gaming-oriented — installs Debian-style, but its hardening (SMT off + strict CPU mitigations + restricted module-loading) fights games; community advises a gaming distro instead ⚠️ possible but clunky (own tracker #284: Flatpak Steam unverified, global hardened_malloc crashes games, ptrace_scope blocks anti-cheat) ✅ one-toggle Gaming-Mode (Setup app) — gaming-aware hardening, 2 surgical relaxations, SELinux stays Enforcing, reversible — detail
Base Debian Fedora Atomic (immutable) Fedora Workstation (mutable)

NoID Privacy complements these references with a mutable Workstation base, AIDE daily FIM, Firefox-side hardening (vs Chromium-side), and LAN-isolation by default. Full matrix → docs/comparison.md.


⚖️ Design Decisions — three deliberate non-features

Full rationale + sources → docs/design-decisions.md.

  • No hardened_malloc — Firefox is structurally incompatible with LD_PRELOAD allocator replacements (Mozilla Bugzilla #1668674). secureblue solves this by shipping Trivalent (Chromium / PartitionAlloc); NoID Privacy keeps Firefox + arkenfox + full uBO (MV2) instead — that's the side getting the largest AI-driven security-audit pipeline (Anthropic × Mozilla Feb 2026, 22 CVE-fixes in FF148 via Claude Opus 4.6 + Claude Mythos audit April 2026, 271 additional bug-fixes in FF150 — Mozilla's Firefox CTO Bobby Holley: "the defects are finite, and we are entering a world where we can finally find them all") and where full uBO still runs after Chrome killed MV2 in July 2025.
  • No Immutable (no rpm-ostree) — layering + reboot per package change is heavy friction for daily dev / admin / CUDA / Local-AI workflows. Snapper on Btrfs delivers pre-update snapshots + transactional rollback (snapper rollback) + 30-day forensic retention without the image-mode constraints.
  • No cross-time byte-reproducible ISObuild-iso.sh ships SOURCE_DATE_EPOCH + TZ=UTC + fixed VOLID (single-build determinism). Cross-time blocked upstream: Fedora has no snapshot.debian.org equivalent and signing keys are ephemeral by design. Audit substitute = SHA256SUMS + .asc + build log + git-signed source. See docs/build-reproducibility.md for the honest accounting.

⚙️ Requirements

Architecture x86_64 only
Firmware UEFI, Secure Boot capable
TPM 2.0 chip present (used for fwupd/BootGuard attestation only — not for LUKS2 auto-unlock; passphrase-required unlock by design per docs/22-disk-encryption.md)
RAM 8 GB minimum, 16 GB recommended (SELinux + auditd + Firefox Fission)
CPU Intel 6th-gen+ or AMD Ryzen 1000+ (firmware mitigations target a modern stack)
Disk 30 GB minimum, 60+ GB recommended (Btrfs snapshots + AIDE database)
Build host Fedora 44 with lorax-lmc-novirt ≥ 44.0

Release ISOs ship a detached GPG signature over SHA256SUMS, signed by the NoID Privacy release key (fingerprint 1ACB FCE4 9687 FEBB 9101 0E52 F8E3 F11D 6962 256F).


🔒 Privacy Promise

NoID Privacy practices what it preaches: no telemetry from the OS itself (6 GNOME telemetry channels closed), no analytics, no tracking, no auto-phone-home. The only outbound traffic the OS initiates without user action is DHCP (network configuration) and NTS NTP (clock sync via chrony to 12 EU sovereign servers, ZERO US-jurisdiction) — plus periodic DNS-health probes via Quad9 DoT if you keep noid-dns-health.timer enabled (opt-out one-toggle). No fwupd-refresh, no dnf-makecache, no packagekit poll, no Flathub auto-fetch, no avahi/wsdd/cups announcement.

The AI workspace inherits the same posture: telemetry off, CWD hidden, 7-day transcript retention. Full settings breakdown → AI-Agent-Ready Workspace.

Unlike "privacy" distributions that add their own telemetry on top of Fedora's, NoID Privacy removes everything that calls home and ships the disable-list in the source tree where you can audit it yourself — inspect the kickstart, the helpers, and the test-suite.


🔗 The NoID Privacy Ecosystem

Platform
🌐 Website NoID-Privacy.com — all platforms, pricing, docs
🪟 Windows NoID Privacy — open-source PowerShell engine (630+ settings, 7 modules, BAVR pattern, GPL-3.0); commercial NoID Privacy Pro GUI wraps the engine
🐧 Linux audit tool NoID Privacy for Linux — read-only audit (420+ checks, 42 sections, pure Bash, zero deps, --ai flag for AI-agent-readable remediation output)
🏰 Linux distro You're here.
📱 Android NoID Privacy on Google Play — 87 checks, 10 categories, permission audit, Chrome hardening, anti-theft

🤝 Contributing · 🔐 Security · 📜 License

  • ContributingCONTRIBUTING.md: the pre-LOCK gate (bash -n sweep + regression tests + docs update) required before any module change lands. Code of conduct: CODE_OF_CONDUCT.md.
  • Security — report vulnerabilities per SECURITY.md; do not open public issues for security-sensitive findings.
  • License — build code (kickstart/, tests/, scripts/) GPL-3.0-or-later (COPYING); docs CC BY-SA 4.0; NoID Privacy-original branding (name, logo, plymouth theme, app icons, avatar) proprietary; default wallpaper is GNOME's drool (CC-BY-SA-3.0, from gnome-backgrounds); embedded Firefox/Thunderbird hardening derived from arkenfox / HorlogeSkynet (MIT, retained in-file); vendored uBlock Origin (GPL-3.0), DKIM Verifier (MIT/X11), and kernel-hardening-checker (GPL-3.0) retain upstream licenses. Full breakdown → LICENSING.md.

Built onFedora Workstation (base distribution); hardening references from Kicksecure security-misc (sysctl + module-blacklist), secureblue (Fedora-Atomic hardening patterns), KSPP (kernel recommendations), arkenfox/user.js (Firefox), and HorlogeSkynet/thunderbird-user.js (Thunderbird).

Hardening verified withkernel-hardening-checker by Alexander Popov (GPL-3.0): kconfig + cmdline + sysctl audit against KSPP / CLIP OS / GrapheneOS / a13xp0p0v / CIS Benchmark baselines.


Made with 🛡️ for the privacy-aware Linux community

Report Bug · Website

Releases

No releases published

Packages

 
 
 

Contributors