| title | Contributor's Guide |
|---|---|
| slug | /contributing |
Welcome to contribute.projectbluefin.io
This guide provides detailed instructions for contributing to Bluefin. Whether you're fixing bugs, adding features, or improving documentation, this guide will help you contribute effectively using the workflows established by the Bluefin team.
:::tip
You don't need permission to contribute to your own destiny.
-- Amber Graner
:::
:::info First Time Contributing? Start small! Documentation improvements or simple additions are great first contributions. Don't hesitate to ask questions in issues or discussions. :::
Bluefin is made via lazy concensus, which means that we trend towards "Just Do It" because if it was too crazy someone would say something. This is a nice casual way to open source, and is inspired by Kubernetes.
- Check todo.projectbluefin.io to check work that is either new or in progress
- Check done.projectbluefin.io to check work that has recently been completed
- Items in Draft are
- Things that need to happen but aren't claimed or specced out
- Or transient things that don't need much planning like "Improve contributor guide" or "Fix up this just recipe". These are things that are identified as being needed but don't need much planning, "just send a sysadmin" style tasks.
- Convert a Draft task into an issue to design and specify something
- Design and spec are for the good of the project and don't come with an implementation commitment.
Bluefin's customization are kept in OCI containers, and are then assembled with other containers and base images to create the different Bluefin images.
See Understanding Bluefin's Architecture below for the full component diagram and assembly flow.
If you are reading this, then you may also be a Kubernetes nerd. You are the target audience for Bluefin. Welcome!
Bluefin follows a loose Apache Lazy Consensus:
- Assume consensus unless objections raised
- Allow time for feedback (account for timezones/holidays)
- Opinionated decisions encouraged
- Post issues for major changes requiring feedback and tag them with
enhancement
Bluefin is a predator and may snap at you occasionally, and is opinionated for a reason:
- The userspace is mostly stable, we are not planning on making major changes to the layout - it's just the Ubuntu desktop.
- Our infrastructure velocity comes from infrastructure work
- This is the projects main focus because you can't deliver a product without the best infrastructure, bootc is cloud native tech, we choose to build on it for a reason.
- If you're "The Linux person on a Kubernetes platform team" this is the place for you
- Our product velocity comes from the workload
- Ship a kickass GNOME experience and all the best upstream tech
- Deliver a premiere cloud native developer experience
- Abstract the operating system away from the user
- Sustainability is vital to the project
- Sometimes not shipping a thing is better than the maintenance burden
- We tend to say no
- But don't take it personally, we can't eat cheeseburgers every day, maybe someday. That's what brought you here!
Bluefin is a combination of a set of configuration OCI containers which are then shipped on different images.
- Bluefin common: @projectbluefin/common - Most of Bluefin's opinion is here
- ujust, motd, service units, GNOME and CLI configuration, application choices, etc. Most things that have to do with the workload should live in this repo
- @ublue-os/artwork - Art assets
- Homebrew via an OCI: @ublue-os/brew and associated @ublue-os/homebrew-tap
- Bluefin stable: @projectbluefin/bluefin - generates Fedora-based Bluefin OCI container
- Bluefin LTS @projectbluefin/bluefin-lts - generates a CentOS-based Bluefin OCI container
- Bluefin distroless prototype (aka Dakotaraptor) @projectbluefin/dakota - generates a GNOME OS based Bluefin OCI container
:::info Distroless This is opposite of the traditional Linux distribution model, the value is in the other OCI layers, not the base image. This is what we mean by "distributions don't matter", since you can use any base image it's just another choice in the long list of decisions we have to make. It's still important, it just doesn't matter. And since you can source software from anywhere, the idea of "who gets you the same software better" doesn't make much sense when you can just automate that. :::
The different components are then assembled in this order. This is done via GitHub actions and heavy use of Renovate to automate the entire build process:
flowchart TB
subgraph oci["Bluefin OCI Containers"]
common["<strong>@projectbluefin/common</strong><br/>Desktop Configuration<br/>Shared with Aurora"]
brew["<strong>@ublue-os/brew</strong><br/>Homebrew Integration<br/>Shared with Aurora and Bazzite"]
artwork["<strong>@ublue-os/artwork</strong><br/>Artwork<br/>Shared with Aurora and Bazzite"]
branding["<strong>@projectbluefin/branding</strong><br/>Branding Assets"]
end
subgraph base["Base Images"]
ublue["<strong>Universal Blue</strong><br/>Base Image<br/>Shared with Bazzite GNOME"]
centos["<strong>CentOS Stream</strong><br/>Base Image"]
gnome_base["<strong>GNOME OS</strong><br/>Base Image"]
end
subgraph images["Final Images"]
bluefin["bluefin:stable"]
lts["bluefin:lts<br/>bluefin:lts-hwe<br/>bluefin-gdx"]
distroless["Dakotaraptor Prototype<br/>bluefin:distroless"]
end
common --> ublue
common --> centos
common --> gnome_base
brew --> ublue
brew --> centos
brew --> gnome_base
artwork --> ublue
artwork --> centos
artwork --> gnome_base
branding --> ublue
branding --> centos
branding --> gnome_base
ublue --> bluefin
centos --> lts
gnome_base --> distroless
style oci fill:#708ee3
style base fill:#4a69bd
style images fill:#8a97f7
Bluefin uses OCI container images as the distribution mechanism. Every commit to the repository triggers builds that create bootable OS images. This architecture means:
Bluefin images are built using:
- Containerfile: Defines the base image layers and build arguments
- Build scripts: Located in
build_files/directory, organized by stage - GitHub Actions: Automated workflows in
.github/workflows/ - Renovate Bot: Automated dependency updates (60% of all commits)
We're making containers here with bash and a little bit of Python, it's not the space shuttle.
| Channel | Purpose | Update Frequency | Fedora Version |
|---|---|---|---|
| latest | Daily builds | Multiple times per day | 43 (current) |
| stable | Weekly builds | Weekly | 43 |
Required Knowledge:
- Git workflow basics
- Container concepts (Podman/Docker)
- Bash scripting fundamentals
- GitHub Actions basics (for CI/CD changes)
Required Tools:
- git
- Text editor (VS Code, vim, etc.)
- GitHub account with 2FA enabled
- Podman or Docker (for local builds)
Optional but Recommended:
- Bluefin installation (for testing)
- Involvement the issues and understanding the problem before committing
-
Fork the repository on GitHub to your account:
# Navigate to https://github.com/projectbluefin/bluefin # Click "Fork" in the upper right
-
Clone your fork:
git clone https://github.com/YOUR_USERNAME/bluefin.git cd bluefin -
Add upstream remote:
git remote add upstream https://github.com/projectbluefin/bluefin.git git fetch upstream
-
Verify your setup:
git remote -v # Should show: # origin https://github.com/YOUR_USERNAME/bluefin.git (fetch) # origin https://github.com/YOUR_USERNAME/bluefin.git (push) # upstream https://github.com/projectbluefin/bluefin.git (fetch) # upstream https://github.com/projectbluefin/bluefin.git (push)
- pullrequests.projectbluefin.io - Pull Request reviews are always appreciated, even if you don't have permissions to merge you can help out by validating that the PR works and is tested.
- issues.projectbluefin.io - Participation and triage of issues is always appreciated!
- 🐛 Bug fixes: Issues labeled
bug - 📦 Package additions: Issues labeled
enhancement - 📝 Documentation: Issues labeled
documentation - 🔧 Build improvements: Issues labeled
justorgithub_actions - 🎨 Developer features: Issues labeled
dx
-
Always branch from main:
git checkout main git pull upstream main
-
Create a descriptive feature branch:
# For a bug fix git checkout -b fix/cockpit-startup-crash # For a feature git checkout -b feat/add-bazaar-integration # For documentation git checkout -b docs/improve-local-build-guide # For chores/maintenance git checkout -b chore/update-copr-repos
-
Branch naming conventions:
fix/: Bug fixesfeat/: New featuresdocs/: Documentation changeschore/: Maintenance tasksrefactor/: Code refactoring
bluefin/
├── .github/
│ └── workflows/ # GitHub Actions CI/CD
│ ├── build-image-*.yml # Image build workflows
│ ├── reusable-build.yml # Shared build logic
│ └── clean.yml # Cleanup workflows
├── build_files/
│ ├── base/ # Base image build scripts
│ ├── shared/ # Shared utilities and scripts
│ └── dx/ # Developer edition scripts
├── system_files/
│ └── shared/ # Files copied into the image
├── flatpaks/ # Flatpak app lists
├── just/ # Just recipes (ujust commands)
├── iso_files/ # ISO-specific configurations
├── packages.json # Package manifest
└── Containerfile # Main image definition
1. Adding a Package
Edit packages.json:
vim packages.jsonAdd your package to the appropriate array:
{
"all": {
"include": {
"rpm": [
"existing-package",
"your-new-package"
]
}
}
}3. Adding a Just Recipe
Create or edit a file in just/:
vim just/60-custom.justAdd your recipe:
# Install custom development tool
install-custom-tool:
#!/usr/bin/env bash
set -euxo pipefail
echo "Installing custom tool..."
toolbox run sudo dnf install -y custom-tool4. Modifying Build Scripts
Build scripts are numbered by execution order. Common scripts:
04-packages.sh: Package installation05-override-install.sh: RPM overrides07-base-image-changes.sh: System modifications17-cleanup.sh: Cleanup operations
Always test your changes with a local build (see Testing section).
5. Adding Flatpaks
Edit the appropriate flatpak list file:
# For all Bluefin variants
edit flatpaks/bluefin-list.txt
# For DX variant only
edit flatpaks/bluefin-dx-list.txtAdd Flatpak IDs (one per line):
com.example.NewApp
:::caution Important Bluefin uses Conventional Commits enforced by CI. Your PR will fail if commit messages don't follow this format! :::
Format:
<type>(<scope>): <subject>
<body>
<footer>
Types:
feat: New featurefix: Bug fixdocs: Documentation changeschore: Maintenance tasksrefactor: Code refactoringtest: Testing additions/changesstyle: Code style changesperf: Performance improvements
Examples from Actual Bluefin Commits:
# Simple fix
git commit -m "fix: remove cockpit and brew setup functions"
# Feature addition
git commit -m "feat: add bazaar flatpak to default installation"
# Chore with scope
git commit -m "chore(deps): update ghcr.io/ublue-os/silverblue-main:latest docker digest to 9168d7d"
# Documentation
git commit -m "docs: explain hat wobble"
# Multi-line with explanation
git commit -m "fix: Remove unused terminal and VFIO configurations
These configurations were causing conflicts with default GNOME settings
and are no longer needed with the updated kernel modules."Commit Message Tips:
- Keep subject line under 72 characters
- Use imperative mood ("add" not "added" or "adds")
- Don't end subject line with a period
- Provide context in the body for complex changes
- Reference issues with
Fixes #123orCloses #456
AI agents must disclose the tool and model used in the commit footer with an "Assisted-by" trailer. The AGENTS.md used in Bluefin's repo will tell your agent to enforce this policy:
Assisted-by: [Model Name] via [Tool Name]
Example:
Assisted-by: Claude 4.5 Opus via GitHub Copilot
# Stage your changes
git add path/to/modified/file.sh
# Or stage all changes
git add .
# Review what you're committing
git diff --cached
# Commit with message
git commit -m "feat(just): add custom development tool installer"
# Or use an editor for multi-line commits
git commit# Push to your fork
git push origin feat/add-bazaar-integration
# If you need to force push after amending (use with caution)
git push origin feat/add-bazaar-integration --force-with-lease:::tip Testing is Key Always test your changes locally or via PR builds before merging. Broken builds affect everyone! :::
Option 1: Full Container Build (Recommended for maintainers)
# Build the base image
podman build -t bluefin-test:latest .
# Build with specific arguments
podman build \
--build-arg FEDORA_MAJOR_VERSION=42 \
--build-arg IMAGE_NAME=bluefin \
-t bluefin-test:latest \
.Option 2: Script Testing (Faster for script changes)
# Test a specific build script
podman run --rm -it \
-v "$(pwd)/build_files:/build_files:ro" \
ghcr.io/ublue-os/silverblue-main:42 \
bash /build_files/base/04-packages.shOption 3: GitHub Actions Build (Use PR builds)
When you open a PR, GitHub Actions automatically builds your changes. Check the Actions tab for:
- Build logs
- Success/failure status
- Build artifacts
:::warning Testing on Your System Rebasing to PR images is powerful but comes with risk. Always have a backup plan to revert to stable! :::
Using PR Images:
Every PR generates a test image. You can rebase to it:
# Find the PR number (e.g., #3322)
# Rebase to the PR image
sudo bootc switch ghcr.io/projectbluefin/bluefin:pr-3322
# Reboot to test
sudo systemctl reboot
# If it works, leave feedback on the PR
# If it doesn't work, revert to stable
sudo bootc switch ghcr.io/projectbluefin/bluefin:stable
sudo systemctl rebootTesting Just Recipes:
# List available recipes
ujust
# Test your new recipe
ujust install-custom-tool
# Check for errors in the outputShell Script Linting:
# Install shellcheck if not present
brew install shellcheck
# Lint shell scripts
shellcheck build_files/base/*.shContainer Linting:
# Use hadolint for Containerfile
podman run --rm -i hadolint/hadolint < ContainerfileJSON Validation:
# Validate packages.json
jq empty packages.json && echo "Valid JSON" || echo "Invalid JSON"- Code follows existing patterns in the repository
- Commit messages use Conventional Commits format
- Changes are tested (locally or via understanding of impact)
- Documentation updated if needed
- No unrelated changes included
- Branch is up-to-date with upstream main
-
Push your branch (if not already done):
git push origin your-branch-name
-
Open PR on GitHub:
- Navigate to https://github.com/projectbluefin/bluefin
- Click "Pull requests" → "New pull request"
- Click "compare across forks"
- Select your fork and branch
- Click "Create pull request"
-
Fill out PR description:
## Description
Brief description of what this PR does.
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Code refactoring
- [ ] Build/CI improvement
## Testing Done
- Local build: Yes/No
- Tested on running system: Yes/No
- Just recipes tested: Yes/No
## Related Issues
Fixes #123What Happens Next:
- Automated checks run: CI builds your changes
- Size label applied: PR size labeled automatically (XS, S, M, L, XL)
- Maintainer review: Usually within 24-48 hours
- Feedback addressed: Make changes if requested
- Approval and merge: Once approved, maintainers merge, rinse and repeat!
During Review:
If changes are requested:
# Make the requested changes
vim path/to/file
# Commit the changes
git add path/to/file
git commit -m "fix: address review feedback on error handling"
# Push to update the PR
git push origin your-branch-nameAfter Merge:
# Switch back to main
git checkout main
# Pull the latest changes
git pull upstream main
# Update your fork
git push origin main
# Delete your feature branch
git branch -d your-branch-name
git push origin --delete your-branch-name:::note Advanced Git Techniques These workflows are for more experienced contributors. New contributors should focus on the basics first! :::
We strive to automate as much as we can, which means lazily spending our time watching the machine hum. Renovate runs every 30 minutes, and when a change is made in upstream Universal Blue everything rebuilds, it takes about an 30 minutes to 2 hours for a merged fix or feature to go live, depending on where in the chain the fix was needed.
Understanding Renovate:
- Renovate creates PRs for dependency updates automatically
- Updates include: base images, GitHub Actions, container digests
- Auto-merge is enabled for low-risk updates
- Accounts for 60% of all commits
Common Renovate PRs:
chore(deps): update ghcr.io/ublue-os/silverblue-main:latest docker digest to abc123
chore(deps): update softprops/action-gh-release digest to def456
When Renovate Conflicts with Your PR:
# Rebase on latest main
git checkout your-branch
git fetch upstream
git rebase upstream/main
# Resolve conflicts if any
git mergetool # or manually edit files
# Continue rebase
git rebase --continue
# Force push (your PR, your branch)
git push origin your-branch --force-with-leaseFor larger features:
# Create logical commits as you work
git add file1.sh
git commit -m "feat: add base functionality"
git add file2.sh
git commit -m "feat: add error handling"
git add file3.sh
git commit -m "docs: document new feature"
# Push all commits
git push origin your-branch# Stage additional changes
git add forgotten-file.sh
# Amend the last commit
git commit --amend
# Or amend without changing message
git commit --amend --no-edit
# Force push with safety
git push origin your-branch --force-with-lease# Cherry-pick a commit from another branch
git cherry-pick abc123def
# Cherry-pick multiple commits
git cherry-pick abc123..def456
# Resolve conflicts if needed
git cherry-pick --continue# Fetch upstream changes regularly
git fetch upstream
# Update main branch
git checkout main
git merge upstream/main
# Rebase feature branch
git checkout your-feature
git rebase main
# Or merge main into feature
git merge main:::info Find Your Fit Contributors come from diverse backgrounds. Whether you're a DevOps engineer, artist, hobbyist, homelabber, or documentation writer, there's a place for your skills in Bluefin! :::
Container Build Optimization:
- Improve Containerfile layer caching
- Optimize build scripts for speed
- Reduce image size
CI/CD Improvements:
- Optimize GitHub Actions workflows
- Add build parallelization
- Improve artifact handling
- Cloudflare experts always appreciated!
UDEV Rules:
- Submit hardware enablement rules
- Test on various hardware
- Document hardware requirements
Build Script Improvements:
- Enhance error handling
- Add progress indicators
- Improve script modularity
- Make more use of
gum,glowfor a nice CLI user experieance
Just Recipe Development:
- Maintain ujust commands
- Improve existing recipes
- Add user-friendly aliases, etc.
Documentation Standards:
- Use clear, concise language
- Avoid terms like "simply" or "easy" (justsimply.dev)
- Include practical examples
- Link to related documentation
- Work upstream!
:::tip Common Issues & Solutions Stuck? Check this section first. Most problems have been encountered before and have known solutions! :::
Problem: Build fails with package conflict
Error: package foo conflicts with bar
Solution:
- Check if package is already included elsewhere
- Add exclusion to packages.json
- Check COPR repository compatibility
Problem: Git error during build
fatal: unable to access 'https://github.com/': Could not resolve host
Solution:
- Check network connectivity in build environment
- Verify GitHub Actions has network access
- Check if rate-limited by GitHub
Problem: Podman build fails with permission error
Error: writing blob: adding layer with blob: permissions denied
Solution:
# Run with appropriate permissions
sudo podman build -t test .
# Or configure rootless podman
podman system migrateProblem: Out of disk space during build
Error: no space left on device
Solution:
# Clean up podman storage
podman system prune -a
# Check disk space
df -hProblem: CI check failing - Conventional Commit validation
❌ Commit message does not follow Conventional Commits format
Solution:
# Amend the commit message
git commit --amend
# Update the PR
git push origin your-branch --force-with-leaseProblem: Merge conflict with main
CONFLICT (content): Merge conflict in packages.json
Solution:
# Fetch latest upstream
git fetch upstream
# Rebase on main
git rebase upstream/main
# Resolve conflicts manually
vim packages.json
# Mark as resolved
git add packages.json
git rebase --continue
# Force push
git push origin your-branch --force-with-leaseGitHub Issues:
- Primary venue for bug reports and feature requests
- Use issue templates when available
- Search existing issues before creating new ones
Discord:
- Real-time chat for quick questions
- Discord: Check the documentation for the server link
- Remember: Discord is for chat, not permanent documentation
Discussion Forum:
- community.projectbluefin.io
- Long-form discussions
- Support questions
- Community feedback
DO:
- ✅ Ask questions in issues for permanent record
- ✅ Search before asking
- ✅ Provide context and details
- ✅ Be patient with maintainer response times
- ✅ Help others when you can
- ✅ Thank contributors
DON'T:
- ❌ Use Discord for bug reports (file issues instead)
- ❌ Expect immediate responses
- ❌ Ping maintainers directly unless urgent
- ❌ Ask the same question in multiple channels
- ❌ Post "me too" comments without additional info
All contributors must follow the Bluefin Code of Conduct.
Key Points:
- Be respectful and inclusive
- Welcome newcomers
- Focus on constructive feedback
- Report inappropriate behavior to
jorge.castro@gmail.com
:::note Issue Capture Philosophy Use Discord for rapid debugging, but always capture solutions in GitHub issues. This builds permanent, searchable knowledge for the community. :::
From the contributing guide philosophy:
The "Issue Capture" Pattern:
- Use Discord for rapid iteration - Debug quickly in chat
- Capture to text editor - Copy important findings as you go
- File an issue - Create permanent record of solution
- Edit and improve - Clean up the issue description later
Why This Matters:
- Solves the problem once for everyone
- Creates searchable documentation
- Prevents asking the same question twice
- Builds institutional knowledge
Example Flow:
Discord: "Hey, package X is failing to install"
↓ (quick back-and-forth debugging)
↓ (copy findings to text editor)
↓
GitHub Issue: "Package X fails on Fedora 42 due to Y dependency"
- Symptoms
- Root cause
- Solution
- Related links
Workflow Structure:
build-image-*.yml: Per-channel build triggersreusable-build.yml: Shared build logicclean.yml: Artifact cleanupgenerate-release.yml: Release notes
Making Workflow Changes:
# Edit workflow file
vim .github/workflows/build-image-stable.yml
# Validate syntax locally
# Use GitHub's workflow validator or:
yamllint .github/workflows/build-image-stable.yml
# Commit
git add .github/workflows/build-image-stable.yml
git commit -m "chore(ci): improve stable build caching"
# Test in your fork first
git push origin your-branch
# Open PR from fork to see if it worksCommon Workflow Patterns:
# Conditional execution
- name: Build only on main
if: github.ref == 'refs/heads/main'
run: ./build.sh
# Matrix builds
strategy:
matrix:
variant: [bluefin, bluefin-dx]
fedora: [42, 43]Script Organization:
00-09: Early stage (kernel, repos, packages)10-16: Mid stage (configuration, additions)17-19: Late stage (cleanup, initramfs)
Script Template:
#!/usr/bin/bash
set -eoux pipefail
echo "::group:: Your Script Name"
# Your logic here
# Use $FEDORA_MAJOR_VERSION for version-specific logic
# Use $IMAGE_NAME for image-specific logic
echo "::endgroup::"Testing Scripts:
# Direct execution (for simple scripts)
bash -x build_files/base/04-packages.sh
# Container execution (more realistic)
podman run --rm -it \
-v "$(pwd):/workspace:ro" \
-e FEDORA_MAJOR_VERSION=42 \
ghcr.io/ublue-os/silverblue-main:42 \
bash /workspace/build_files/base/04-packages.shBluefin uses continuous delivery:
- Daily builds: Automatic, no manual release
- Version format:
42.20251012.1(Fedora.YYYYMMDD.build) - Multiple builds per day: Various channels updated independently
stable (Weekly):
# Rebase to stable
sudo bootc switch ghcr.io/projectbluefin/bluefin:stablelatest (Daily):
# Rebase to latest
sudo bootc switch ghcr.io/projectbluefin/bluefin:latest:::caution Temporary Workarounds Only Package pins are temporary workarounds for upstream regressions. Always document why they exist and remove them after the fix is released! :::
Sometimes upstream Fedora has a regression requiring a temporary pin.
Add a Pin:
Edit the appropriate Containerfile section:
# Revert to older version of ostree to fix Flatpak installations
RUN rpm-ostree override replace \
https://bodhi.fedoraproject.org/updates/FEDORA-2023-cab8a89753Document the Pin:
# Add comment explaining:
# - What's pinned
# - Why it's pinned
# - Link to upstream bug
# - When to remove (after fix is released)Remove a Pin:
Wait 24-48 hours after Fedora releases a fix (for rebuild propagation), then:
# Remove the override
git diff Containerfile
# Confirm the pin is removed
git commit -m "chore: remove ostree pin after upstream fix"Bluefin does not host its own Flatpak repository. All graphical applications must first be published on Flathub. To contribute a new Flatpak:
- Ensure your application meets Flathub’s technical and legal requirements.
- Prepare a Flatpak manifest and test local builds using
flatpak-builder. - Submit your application to Flathub by forking the flathub/flathub repository, creating a new branch, adding your manifest and required files, and opening a pull request against the
new-prbranch. Follow the submission guide. - Respond to reviewer feedback and iterate as needed. Once approved, your app will be published on Flathub and available to Bluefin users.
Maintain your Flatpak by following Flathub’s maintenance guidelines. This includes updating runtimes, responding to build failures, and ensuring metadata quality. Applications that pass all quality checks are more likely to be featured both on Flathub and in downstream curated stores like Bazaar.
System-wide Flatpaks in Bluefin are managed through configuration files that list the Flatpak application IDs to be installed by default. These files are:
/etc/ublue-os/system-flatpaks.listfor standard system Flatpaks/etc/ublue-os/system-flatpaks-dx.listfor developer mode Flatpaks
To propose changes (add, update, or remove Flatpaks):
- Edit the relevant list file in the Bluefin repository (
flatpaks/system-flatpaks.listorflatpaks/system-flatpaks-dx.list) and add or remove Flatpak IDs as needed. Each line should contain a single Flatpak app ID, for example:app/org.mozilla.firefox app/org.gnome.Calculator - Submit a pull request with your changes. Maintainers will review and merge as appropriate.
During system provisioning or updates, Bluefin installs or updates all Flatpaks listed in these files using the following logic:
flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
xargs flatpak --system -y install --or-update < /etc/ublue-os/system-flatpaks.list
# Developer mode Flatpaks are installed if developer mode is enabled
xargs flatpak --system -y install --or-update < /etc/ublue-os/system-flatpaks-dx.listBazaar’s featured sections are defined in a YAML configuration file:
system_files/shared/usr/share/ublue-os/bazaar/config.yaml
Each section (e.g., "Bluefin Recommends", "Browsers", "Media") contains an appids list specifying which Flatpaks appear in that section. To feature a Flatpak:
- Ensure the Flatpak is available on Flathub and not present in the Bazaar blocklist (
system_files/shared/usr/share/ublue-os/bazaar/blocklist.txt). - Edit
config.yamland add the Flatpak’s app ID to theappidslist of the desired section. For example:sections: - title: "Bluefin Recommends" appids: - org.mozilla.firefox - org.gnome.Calculator - com.example.YourApp # <-- Add your app here
- Optionally, create a new section if your application fits a new category.
- Submit a pull request with your changes. The Bazaar maintainers will review and merge as appropriate.
- Flatpaks are updated automatically from Flathub. When a new version is published on Flathub, Bluefin systems will receive the update during the next system Flatpak update cycle.
- To update a Flatpak’s version, update it on Flathub. No changes are needed in Bluefin unless the app ID changes or the app is removed.
- To remove a Flatpak from Bluefin’s default install, delete its entry from the relevant system Flatpak list file and/or from Bazaar’s
config.yaml. - To remove a Flatpak from Flathub, follow Flathub’s end-of-life process.
- Some Flatpaks are explicitly excluded from Bazaar via the
blocklist.txtfile. Do not add blocklisted app IDs to Bazaar’s featured sections.
- Flatpak maintainers are responsible for keeping their applications up to date on Flathub.
- Bluefin maintainers review and merge changes to system Flatpak lists and Bazaar configuration.
If you find a bug that:
- Exists in vanilla Fedora Silverblue/Kinoite
- Is not caused by Bluefin modifications
- Affects the base Fedora Atomic system
-
Reproduce on vanilla Fedora (if possible):
# Boot vanilla Fedora Silverblue # Test if the issue occurs there
-
Report to Fedora:
- Upstream tracker: fedora-silverblue/issue-tracker
- Include: Fedora version, steps to reproduce, logs
-
Link in Bluefin Issue:
- Cross-reference the upstream issue
- Track upstream progress
- Help test fixes
Contributing regularly and demonstrating expertise may lead to maintainer status. Qualities valued:
- Consistent quality contributions
- Good communication
- Helpful to other contributors
- Understands project goals
- Reliable and responsive
Current Maintainer Structure:
The project welcomes all skill levels and contribution types. Start small, learn the workflows, and grow your involvement over time.
:::tip Welcome to Bluefin! Every maintainer started as a first-time contributor. Take it one step at a time, and don't be afraid to ask questions! :::
- Start small: Begin with documentation or simple fixes and additions
- Ask questions: Don't hesitate to ask for clarification
- Test thoroughly: Use local builds or PR images
- Be patient: Reviews take time; maintainers balance multiple priorities
- Learn from others: Read merged PRs to understand patterns
- Follow conventions: Stick to established patterns in the codebase
- Document your work: Help future contributors with clear explanations
Remember: Every maintainer started as a first-time contributor. Welcome to the Bluefin community!