Modular Fedora Workstation bootstrap for a .NET/Aspire development machine.
- Podman instead of Docker Engine; rootless/daemonless by default.
- .NET 10 SDK from Fedora repositories.
- Aspire CLI installed as the
Aspire.Cli.NET global tool. - Aspire configured for Podman and Linux development-certificate trust.
- Node.js/npm with a user-owned npm prefix, then OpenAI Codex CLI.
- Zsh + Oh My Zsh with Starship as the default prompt.
- Powerlevel10k is kept as an optional alternative in
optional/powerlevel10k.sh. - Nerd Fonts: JetBrainsMono, FiraCode and MesloLGS NF.
- GNOME, Nautilus, Flatpak apps, RPM Fusion codecs and optional NVIDIA drivers.
- Local user MIME catalog for development languages/tools and selected Windows formats.
- No automatic reboot.
chmod +x install.sh modules/*.sh diagnostics/*.sh optional/*.sh
./install.shThe full installer is non-interactive between modules. It may request the sudo password once at the beginning, then continues automatically.
Module numbers are only installation order. Prefer stable names:
./install.sh podman dotnet aspire
./install.sh zsh nerd-fonts starship
./install.sh mimeList all current modules:
./install.sh --listOld numbered names are also resolved by semantic name when possible, but scripts and documentation should use stable names.
Starship is selected by default through:
export FEDORA_PROMPT_ENGINE="starship"The repository includes a development-oriented configuration at:
config/starship/starship.toml
On first install it is copied to:
~/.config/starship.toml
If a Starship configuration already exists, it is left untouched.
To install and switch to Powerlevel10k instead:
./optional/powerlevel10k.shThen open a new terminal and run:
p10k configureTo switch back to Starship:
sed -i 's/FEDORA_PROMPT_ENGINE="powerlevel10k"/FEDORA_PROMPT_ENGINE="starship"/' ~/.zshenv
exec zshAspire is installed through the official .NET global tool package:
dotnet tool install -g Aspire.CliThe setup adds:
export ASPIRE_CONTAINER_RUNTIME=podman
export SSL_CERT_DIR="${SSL_CERT_DIR:+$SSL_CERT_DIR:}/etc/pki/tls/certs:$HOME/.aspnet/dev-certs/trust"Certificate refresh is executed non-interactively:
aspire certs clean --non-interactive --nologo
aspire certs trust --non-interactive --nologoMIME definitions are stored as separate files in:
config/mime/
The mime module installs all XML files from that directory into:
~/.local/share/mime/packages/
Run or reapply it with:
./install.sh mimeBefore installing, the module removes only previous fedora-setup-*.xml files, so deleted or renamed definitions do not remain stale.
GNOME normally classifies every zero-byte file as application/x-zerosize,
ignoring its extension for application selection. The MIME module installs a
small handler for that special type. It determines the type from the filename
and opens the original empty file with the application already configured for
that type—for example, an empty .cs uses the default C# application and an
empty .md uses the default Markdown application.
The Windows list is intentionally not copied verbatim: legacy aliases such as multiple MIME names for MP3/PNG/AVI are left to Fedora/shared-mime-info. windows-extra.xml focuses on Windows-specific formats useful for Nautilus recognition.
The nerd-fonts module installs user-local fonts into:
~/.local/share/fonts/NerdFonts
Default families:
- JetBrainsMono Nerd Font
- FiraCode Nerd Font
- MesloLGS NF (recommended for Powerlevel10k)
Run:
./install.sh nerd-fontsInstall only a subset:
NERD_FONTS="JetBrainsMono FiraCode" ./install.sh nerd-fontspodman.socket is intentionally not enabled by default. Aspire can use Podman directly. If a future tool specifically requires a Docker-compatible API:
systemctl --user enable --now podman.socket
export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/podman/podman.sock"After installation:
aspire doctor
./diagnostics/check-environment.sh
./diagnostics/check-mime.sh
./diagnostics/check-mime-defaults.shLog out and log back in (or reboot) so the default shell/session changes are applied. If NVIDIA packages were installed, allow akmods to finish before rebooting.