Complete guide to the Fedora Desktop Configuration Manager.
First time setup:
- Read Installation Guide - Get up and running
- Browse Playbooks Reference - See what optional features you can add
- Check Configuration Guide - Learn how to customize
Quick answers:
- "How do I install this?" → One-command installation
- "I just DNF-upgraded Fedora and things are broken" → Post-Upgrade Repair Guide
- "What does it install?" → Core playbooks
- "How do I add Docker?" → Optional playbooks
- "How do I set up DDEV?" → DDEV Guide
- "What's the difference between LXC, Docker, and Distrobox?" → Containerization Guide
- "My
git pushto GitHub hangs on this WiFi" → GitHub SSH over Port 443
Everything you need to get started:
- Prerequisites and system requirements
- One-command installation walkthrough
- What happens during installation
- Manual installation steps
- Common installation issues and fixes
Time to read: 5 minutes | Time to install: 10-30 minutes
Headless Server Install — Unattended IaC Runbook — start here
A precise, copy-paste, step-by-step runbook (download → secret files → vars file → run), optimised to be followed by a human or an LLM agent. Includes a full cloud-init example and a one-shot install script.
Headless / Unattended Provisioning — the reference
The what behind the how: when headless mode triggers, the full RUN_BASH_* environment
contract (non-secret config + 0600 secret file pointers), the security model, and the
fail-fast, fail-loud guarantee.
The authoritative contract is also built into the script: ./run.bash --help-run-headless.
Complete catalog of available features:
- Core features (automatic)
- Development tools (Docker, Python, Go, VS Code)
- Container platforms (LXC, Docker, Distrobox)
- Hardware support (NVIDIA, DisplayLink, audio)
- Desktop enhancements (GNOME, Firefox, VPN)
- How to run optional playbooks
- Creating custom playbooks
Time to read: 10 minutes | Quick reference format
Comprehensive comparison and usage guide:
- LXC vs Docker vs Distrobox comparison table
- When to use each technology
- Installation and configuration
- Real-world usage examples
- Docker-in-LXC for isolated development
- Troubleshooting container issues
Time to read: 15 minutes | Includes decision tree
Containerised Claude Code running with --dangerously-skip-permissions:
- What the container does and does not expose (the security model)
- Named OAuth token pool, separate from desktop Claude Code
- Per-project container images, networks, and SSH key handling
- The supervisor: automatic compaction so long sessions do not stall
- Full flag reference and troubleshooting
Time to read: 15 minutes | Daily driver for agent work
Learn how to make it yours:
- User configuration (name, email, vault)
- System configuration (DNF, bash, SSH, Git)
- Optional feature configuration
- Ansible patterns and best practices
- Adding custom playbooks and files
- Debugging configuration issues
Time to read: 10 minutes | Reference guide
Deep dive into project structure:
- Directory structure and organization
- Execution flow (bootstrap → main → optional)
- Configuration management patterns
- Variable hierarchy
- File management
- Security model
Time to read: 8 minutes | For contributors and curious minds
Everything for contributors:
- Development environment setup
- Branching strategy (version-specific branches)
- Ansible style guide and patterns
- Testing and debugging procedures
- Contribution workflow
- Pull request guidelines
- Security considerations
Time to read: 12 minutes | Essential for contributors
# One-command install (fresh Fedora)
(source <(curl -sS https://raw.githubusercontent.com/LongTermSupport/fedora-desktop/HEAD/run.bash?$(date +%s)))
# Re-run main playbook
cd ~/Projects/fedora-desktop
ansible-playbook playbooks/playbook-main.yml --ask-become-pass
# Check what's installed
ansible desktop -m setup | grep ansible_distributioncd ~/Projects/fedora-desktop
# Install rootful Docker (optional — needed for DDEV; Podman is the default engine)
ansible-playbook playbooks/imports/optional/common/play-docker.yml
# Install Distrobox
ansible-playbook playbooks/imports/optional/common/play-distrobox.yml
# Install Python environment (core — also runs automatically via main playbook)
ansible-playbook playbooks/imports/play-python.yml
# Add VS Code (core — also runs automatically via main playbook)
ansible-playbook playbooks/imports/play-vscode.yml
# Install DDEV (local PHP/CMS development)
ansible-playbook playbooks/imports/optional/common/play-ddev.yml# Edit settings (plain YAML file — open in any normal editor)
$EDITOR environment/localhost/host_vars/localhost.yml
# Encrypt a new secret value to paste into localhost.yml
ansible-vault encrypt_string 'sensitive-value' --name 'variable_name'
# Check DNF optimization
grep max_parallel /etc/dnf/dnf.conf
# Test playbook without applying changes
ansible-playbook playbook.yml --check# LXC: Create container
sudo lxc-create -n mycontainer -t download -- -d ubuntu -r jammy -a amd64
sudo lxc-start -n mycontainer
# Docker: Run service
docker run -d -p 8080:80 nginx
# Distrobox: Create dev environment
distrobox create --name dev --image ubuntu:22.04
distrobox enter dev# Start a session in the current project
ccy
# Token management
ccy --create-token
ccy --list-tokens
# Rebuild after changing .claude/ccy/Dockerfile
ccy --rebuild
# Manage running CCY containers
ccy --top~/Projects/fedora-desktop/
├── docs/ # Documentation (you are here)
│ ├── README.md # This index
│ ├── installation.md # Setup guide
│ ├── playbooks.md # Feature catalog
│ ├── configuration.md # Customization guide
│ ├── containerization.md # Container tech comparison
│ ├── architecture.md # Technical deep dive
│ └── development.md # Contributor guide
│
├── playbooks/ # Ansible automation
│ ├── playbook-main.yml # Main orchestrator (automatic)
│ └── imports/
│ ├── play-*.yml # Core playbooks
│ └── optional/
│ ├── common/ # General features
│ ├── hardware-specific/ # Hardware drivers
│ └── experimental/ # Bleeding-edge features
│
├── environment/localhost/ # Configuration
│ ├── hosts.yml # Inventory (localhost)
│ └── host_vars/localhost.yml # User settings (plain YAML with !vault values)
│
├── files/ # Static files deployed to system
│ ├── etc/ # System configs
│ └── var/ # Scripts and data
│
├── vars/ # Project variables
│ └── fedora-version.yml # Target Fedora version
│
├── run.bash # Bootstrap installer
├── ansible.cfg # Ansible configuration
├── vault-pass.secret # Vault password (gitignored)
└── CLAUDE.md # AI coding assistant instructions
Architecture & Design
Configuration & Customization
Containerization
CCY (Claude Code YOLO)
- CCY guide — Containerised Claude Code with permission prompts disabled
- Security model — What the container can and cannot reach
- Tokens — Named OAuth token pool
- Command reference — Every flag
- The supervisor — Automatic compaction for long sessions
- CCY changelog — Release notes for the launcher and container image
- CCY debug mounts — Mounting host directories into CCY containers
DDEV
Development & Contributing
Features
- Feature documentation index — all feature guides in one place
- Speech-to-Text — Press-and-hold Insert key transcription with auto-paste
- Claude Devtools —
ccdthelper for Claude Code development containers
GitHub
- Multi-account management — Setup, commands, adding/removing accounts
- SSH over Port 443 — Keep Git-over-SSH working on networks that block port 22
Headless / Server Provisioning
- Headless Server Install — Unattended IaC Runbook — Step-by-step: download run.bash, create secret files, write the vars file, run (with cloud-init + one-shot script)
- Headless / Unattended Provisioning — Reference: the full
RUN_BASH_*contract, trigger rules, and security model run.bashchangelog — What eachRUN_BASH_VERSIONmeans, and the plan behind it
Networking
- UniFi Setup Guide — Controller deployment, mesh AP adoption, troubleshooting
Installation & Setup
- Prerequisites
- Quick install
- Manual installation
- Verifying installation
- Post-upgrade repair (after
dnf system-upgrade) - Troubleshooting
Playbooks & Features
- Core playbooks
- Optional features
- Running playbooks
- Creating playbooks
- Fast File Manager —
lf-based file manager setup and usage - NordVPN Installation — OpenVPN-based NordVPN setup via NetworkManager
Terminal
- Kitty configuration & usage — managed settings, keybindings, URL copy workflow
- Installation fails: Installation troubleshooting
- Version mismatch: Version troubleshooting
- Container issues: Container troubleshooting
- Configuration errors: Configuration debugging
- Playbook debugging: Testing guide
- GitHub SSH blocked on this network (port 22): SSH over Port 443
- Bug reports: GitHub Issues
- Questions & discussions: GitHub Discussions
- Source code: GitHub Repository
- Main README: Back to main page
Current branch: Fedora 44 (F44)
This documentation matches the configuration in this branch. Other Fedora versions have separate branches with version-specific changes.
Check your installed version:
cat /etc/fedora-release # Your system version
cat ~/Projects/fedora-desktop/vars/fedora-version.yml # Target versionIf versions don't match, checkout the appropriate branch:
cd ~/Projects/fedora-desktop
git fetch origin
git checkout F44 # or your version