Skip to content

Design Philosophy ​

Why this stack is built the way it is — and why it's different from enterprise solutions

The Fundamental Insight ​

This system is designed for home users who iteratively grow their storage, not enterprises planning rack deployments. That one distinction drives every architectural decision.

ENTERPRISE MINDSET              HOME USER REALITY
┌────────────────────┐          ┌────────────────────┐
│ "I need 40TB"      │          │ "I bought a drive" │
│ "Plan the RAID"    │          │ "Oh cool, another" │
│ "Buy it all now"   │          │ "Found one on sale" │
│ "Configure once"   │          │ "This one's bigger" │
└────────────────────┘          └────────────────────┘
        ↓                               ↓
  ZFS/UnRAID pool                JBOD + btrfs-per-drive
  (fixed, pooled)                (flexible, independent)

Core Principle: JBOD Over Pools ​

JBOD (Just a Bunch of Disks) means each drive is an independent filesystem. No pooling. No striping. No parity.

Why Not ZFS Pools? ​

ZFS is incredible technology — for enterprises. Here's why it's often wrong for home users:

ZFS Pool AssumptionHome User Reality
Buy all drives upfrontAcquire drives over years, opportunistically
Same capacity per vdev"I got a 4TB on sale, then an 8TB, then..."
Never remove drives"I want to take this drive camping"
Plan redundancy from day 1"Maybe I'll add a second drive someday"
Expansion = new vdevs"Wait, I can't just add a bigger drive?"

The ZFS rigidity problem: A ZFS raidz vdev cannot:

  • Add a single drive to expand capacity
  • Replace a drive with a larger one and reclaim the extra space (without rebuilding)
  • Remove a drive from the array without data loss

You're locked into the geometry you chose at creation time.

Why JBOD Works Better ​

With JBOD + btrfs-per-drive:

  • Buy any drive, any time — plug it in, mount it, done
  • Take drives anywhere — yank an exFAT drive, use it on your laptop, bring it back
  • No rigid pool geometry — each drive is independent
  • Transparent organization — "TV is on the 8TB, Movies on the 4TB" is simple mental model
  • Graceful degradation — one drive fails, you lose one drive's worth of data (not the whole pool)
JBOD MENTAL MODEL

Drive 1: 8TB             Drive 2: 4TB             Drive 3: 4TB
┌────────────────┐       ┌────────────────┐       ┌────────────────┐
│ /tv            │       │ /movies        │       │ /music         │
│ /downloads     │       │ /books         │       │ /backups       │
└────────────────┘       └────────────────┘       └────────────────┘

Loss of Drive 2 = You lose movies and books
                  TV, downloads, music, backups = FINE

Trade-offs We Accept ​

What we give up:

  • No automatic redundancy (solution: cloud backup, important stuff on multiple drives)
  • No pooled capacity ("I need 12TB contiguous" requires manual balancing)
  • Manual organization (you decide what goes where)

What we gain:

  • Complete flexibility
  • Zero lock-in
  • Hot-swap anything
  • Simple mental model
  • Use any drive from any source

Core Principle: Gaming-First, NAS-Attached ​

This isn't an UnRAID box that can run VMs for gaming. This is a gaming PC that happens to have storage attached.

The Bazzite Choice ​

UnRAID/TrueNAS                    Bazzite
┌──────────────────────────────┐  ┌──────────────────────────────┐
│         NAS OS               │  │      Fedora Atomic OS        │
│  ┌────────────────────────┐  │  │  ┌────────────────────────┐  │
│  │     VM Hypervisor      │  │  │  │    Steam/Gamescope     │  │
│  │  ┌──────────────────┐  │  │  │  │  (NATIVE, no VM)       │  │
│  │  │   Gaming VM      │  │  │  │  └────────────────────────┘  │
│  │  │   (Windows?)     │  │  │  │                              │
│  │  │   GPU passthru   │  │  │  │  ┌────────────────────────┐  │
│  │  └──────────────────┘  │  │  │  │   Docker containers    │  │
│  └────────────────────────┘  │  │  │   (Arr stack, Plex)    │  │
└──────────────────────────────┘  │  └────────────────────────────┘
                                  └──────────────────────────────┘

Why Native Gaming Matters ​

FeatureUnRAID VM GamingBazzite Native
Latency+2-5ms (hypervisor overhead)Native
GPU utilization~95% (passthrough loss)100%
Proton/GamescopeRequires Windows VMNative Linux
Steam Deck modeNoYes (Gamescope session)
Setup complexityGPU IOMMU groups, vfio-pciJust works
EmulationRetroArch in Windows VMNative EmuDeck

Bottom line: If gaming is primary, start with a gaming OS. Attach storage around it.

Core Principle: Btrfs for Data Integrity ​

Every drive in this system uses btrfs with these mount options:

bash
-o noatime,compress=zstd:1,discard=async

Why Btrfs? ​

  1. Checksums — Every block is checksummed. Silent corruption is detected.
  2. Compression — zstd:1 gives ~20-40% space savings on video with near-zero CPU cost
  3. Copy-on-Write — Snapshots are instant and free (same data, different pointer)
  4. Modern kernel support — Linux 6.1+ with btrfs-progs 6.1+ is rock-solid

Why Not ext4? ​

ext4 is reliable, but:

  • No checksums (corruption goes undetected)
  • No compression (waste space)
  • No native snapshots (need LVM complexity)

For media storage where you're writing large files and reading them repeatedly, btrfs' trade-offs make sense.

Core Principle: Docker for Services, Native for Gaming ​

┌─────────────────────────────────────────────────────────────────┐
│                        BAZZITE HOST                            │
│                                                                │
│  ┌─────────────────────────┐  ┌─────────────────────────────┐  │
│  │    NATIVE PROCESSES     │  │    DOCKER CONTAINERS        │  │
│  │                         │  │                             │  │
│  │  • Steam                │  │  • Sonarr, Radarr, Prowlarr │  │
│  │  • Gamescope            │  │  • SABnzbd, Transmission    │  │
│  │  • EmuDeck              │  │  • Plex, Komga, Kavita      │  │
│  │  • Sunshine streaming   │  │  • Overseerr, Bazarr        │  │
│  │                         │  │  • Portainer, Netdata       │  │
│  └─────────────────────────┘  └─────────────────────────────┘  │
│                                                                │
│  Gaming = bare metal performance                               │
│  Services = isolated, reproducible, restartable                │
└─────────────────────────────────────────────────────────────────┘

Why This Split? ​

Native gaming because:

  • Zero latency overhead
  • Full GPU access (no containerized graphics)
  • Steam/Proton expect native environment
  • Gamescope needs direct DRM access

Containerized services because:

  • Isolation (one bad app doesn't take down others)
  • Reproducibility (docker-compose.yml is the config)
  • Easy updates (pull new image, restart)
  • No dependency conflicts

The Resulting System ​

Your Workflow:
┌──────────────────────────────────────────────────────────────────┐
│                                                                  │
│   ACQUIRE          PROCESS           SERVE            ENJOY     │
│                                                                  │
│   ┌─────────┐      ┌─────────┐      ┌─────────┐      ┌────────┐ │
│   │ Prowlarr│─────▶│ SABnzbd │─────▶│ Sonarr/ │─────▶│  Plex  │ │
│   │ indexes │      │downloads│      │ Radarr  │      │ streams│ │
│   └─────────┘      └─────────┘      │ imports │      └────────┘ │
│                                     └─────────┘           │     │
│                                          │                │     │
│                                          ▼                ▼     │
│                                     ┌─────────────────────────┐ │
│                                     │   JBOD Storage          │ │
│                                     │   /mnt/drive1/tv        │ │
│                                     │   /mnt/drive2/movies    │ │
│                                     │   /mnt/drive3/music     │ │
│                                     └─────────────────────────┘ │
│                                                                  │
│   Meanwhile:  ┌─────────────────────────────────────────────┐   │
│               │ Steam + Gamescope + EmuDeck running native  │   │
│               │ Full GPU, full performance, same machine    │   │
│               └─────────────────────────────────────────────┘   │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

Summary ​

DecisionChoiceWhy
Storage architectureJBOD (independent drives)Flexibility for organic growth
Filesystembtrfs per driveChecksums, compression, CoW
Base OSBazzite (Fedora Atomic)Native gaming + immutable core
GamingNative Steam/GamescopeZero-overhead, full GPU
ServicesDocker containersIsolation, reproducibility
PoolingNone (manual organization)No lock-in, hot-swap anything
RedundancyCloud backup, not RAIDAccept single-drive failure risk

This is a gaming machine that runs a media server, not a NAS that tries to game.


Built for home users who accumulate drives over time and want to play games without compromise.

Built with ❤️ following Bell Labs standards. Dedicated to Stan Eisenstat.