Skip to content

Commit 2cd3fa7

Browse files
authored
Merge pull request #1 from projectbluefin/copilot/bootstrap-os-template-repo
Bootstrap testfin OS with silverblue-main base and Project Bluefin integrations
2 parents 56b309b + 0c2e9dd commit 2cd3fa7

File tree

8 files changed

+78
-25
lines changed

8 files changed

+78
-25
lines changed

.github/workflows/clean.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
# IMPORTANT: Update this to match your image name from Containerfile (line 9)
2121
# This should match the "# Name: your-repo-name" comment in your Containerfile
2222
# Example: If your Containerfile has "# Name: my-custom-os", use "my-custom-os" here
23-
packages: finpilot
23+
packages: testfin
2424
older-than: 90 days
2525
delete-orphaned-images: true
2626
keep-n-tagged: 7

AGENTS.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copilot Instructions for finpilot bootc Image Template
1+
# Copilot Instructions for testfin bootc Image Template
22

33
## CRITICAL: Pre-Commit Checklist
44

@@ -23,17 +23,17 @@
2323

2424
**When this repository is used as a template, you MUST:**
2525

26-
### 1. Rename ALL instances of `finpilot`
26+
### 1. Rename ALL instances of template name
2727

28-
**Source of truth**: `Containerfile` line 9: `# Name: finpilot`
28+
**Source of truth**: `Containerfile` line 4: `# Name: testfin`
2929

3030
**Files to update:**
31-
- `Containerfile` (line 9)
31+
- `Containerfile` (line 4)
3232
- `Justfile` (line 1)
3333
- `README.md` (line 1)
3434
- `artifacthub-repo.yml` (line 5)
3535
- `custom/ujust/README.md` (~line 175)
36-
- `.github/workflows/ghcr-pruner.yml` (line 22)
36+
- `.github/workflows/clean.yml` (line 23)
3737

3838
### 2. Create "What's Different" section in README
3939

@@ -953,5 +953,5 @@ Assisted-by: Claude 3.5 Sonnet via GitHub Copilot
953953
---
954954

955955
**Last Updated**: 2025-11-14
956-
**Template Version**: finpilot (Enhanced with comprehensive Copilot instructions)
956+
**Template Version**: testfin (Based on finpilot with silverblue-main + Project Bluefin integrations)
957957
**Maintainer**: Universal Blue Community

Containerfile

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
# Allow build scripts to be referenced without being copied into the final image
2-
FROM scratch AS ctx
3-
COPY build /build
4-
COPY custom /custom
5-
61
###############################################################################
72
# PROJECT NAME CONFIGURATION
83
###############################################################################
9-
# Name: finpilot
4+
# Name: testfin
105
#
11-
# IMPORTANT: Change "finpilot" above to your desired project name.
6+
# IMPORTANT: Change "testfin" above to your desired project name.
127
# This name should be used consistently throughout the repository in:
138
# - Justfile: export image_name := env("IMAGE_NAME", "your-name-here")
149
# - README.md: # your-name-here (title)
@@ -20,8 +15,20 @@ COPY custom /custom
2015
# to maintain consistency.
2116
###############################################################################
2217

23-
# Base Image
24-
FROM ghcr.io/ublue-os/bluefin:stable@sha256:c9411d9909708d57d8e87c160a308a4a8c795764fb4beff344340755412b9178
18+
# Common and Brew OCI layers from Project Bluefin
19+
ARG COMMON_IMAGE="ghcr.io/projectbluefin/common:latest"
20+
ARG BREW_IMAGE="ghcr.io/projectbluefin/brew:latest"
21+
22+
# Build context stage - files needed for build but not in final image
23+
FROM scratch AS ctx
24+
COPY build /build
25+
COPY custom /custom
26+
# Copy common and brew files from Project Bluefin (distroless pattern)
27+
COPY --from=ghcr.io/projectbluefin/common:latest /system_files/shared /files
28+
COPY --from=ghcr.io/projectbluefin/brew:latest /system_files /files
29+
30+
# Base Image - Using silverblue-main as the foundation
31+
FROM ghcr.io/ublue-os/silverblue-main:stable
2532

2633
## Other possible base images include:
2734
# FROM ghcr.io/ublue-os/bazzite:latest

Justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export image_name := env("IMAGE_NAME", "finpilot")
1+
export image_name := env("IMAGE_NAME", "testfin")
22
export default_tag := env("DEFAULT_TAG", "stable")
33
export bib_image := env("BIB_IMAGE", "quay.io/centos-bootc/bootc-image-builder:latest@sha256:903c01d110b8533f8891f07c69c0ba2377f8d4bc7e963311082b7028c04d529d")
44

README.md

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,39 @@
1-
# finpilot
1+
# testfin
22

33
A template for building custom bootc operating system images based on the lessons from [Universal Blue](https://universal-blue.org/) and [Bluefin](https://projectbluefin.io). It is designed to be used manually, but is optimized to be bootstraped by GitHub Copilot. After set up you'll have your own custom Linux.
44

55
> Be the one who moves, not the one who is moved.
66
7+
## What Makes testfin Different?
8+
9+
This image is based on [Fedora Silverblue](https://fedoraproject.org/silverblue/) and includes integrations from [Project Bluefin](https://projectbluefin.io):
10+
11+
### Base Image
12+
- **Base**: `ghcr.io/ublue-os/silverblue-main:stable` - Fedora Silverblue with Universal Blue enhancements
13+
- **Desktop**: GNOME desktop environment
14+
- **Package Manager**: Immutable base with layered packages via `dnf5`
15+
16+
### Added from Project Bluefin
17+
- **Common Layer**: Shared configuration, udev rules, and ujust command completions from `@projectbluefin/common`
18+
- **Homebrew Integration**: Pre-installed Homebrew package manager from `@projectbluefin/brew` for runtime package management
19+
- **Curated Brewfiles**: Ready-to-use package collections for development, CLI tools, and fonts
20+
- **Flatpak Support**: Automatic installation of GUI applications on first boot
21+
- **ujust Commands**: User-friendly shortcuts for common system tasks
22+
23+
### Runtime Package Management
24+
- **Homebrew (Brew)**: CLI tools and development environments installed via Brewfiles
25+
- **Flatpak**: GUI applications from Flathub
26+
- **Build-time**: System packages via `dnf5` in build scripts
27+
28+
### Production Features
29+
- **GitHub Actions**: Automated builds on every commit
30+
- **Renovate**: Automatic dependency updates
31+
- **Image Signing**: Optional cosign support for image verification (disabled by default)
32+
- **SBOM Generation**: Optional software bill of materials (disabled by default)
33+
- **Rechunking**: Optional layer optimization for better distribution (disabled by default)
34+
35+
*Last updated: 2025-12-14*
36+
737
## Guided Copilot Mode
838

939
Here are the steps to guide copilot to make your own repo, or just use it like a regular image template.
@@ -68,13 +98,14 @@ Click "Use this template" to create a new repository from this template.
6898

6999
### 2. Rename the Project
70100

71-
Important: Change `finpilot` to your repository name in these 5 files:
101+
Important: Change `testfin` to your repository name in these 6 files:
72102

73-
1. `Containerfile` (line 9): `# Name: your-repo-name`
103+
1. `Containerfile` (line 4): `# Name: your-repo-name`
74104
2. `Justfile` (line 1): `export image_name := "your-repo-name"`
75105
3. `README.md` (line 1): `# your-repo-name`
76106
4. `artifacthub-repo.yml` (line 5): `repositoryID: your-repo-name`
77107
5. `custom/ujust/README.md` (~line 175): `localhost/your-repo-name:stable`
108+
6. `.github/workflows/clean.yml` (line 23): `packages: your-repo-name`
78109

79110
### 3. Enable GitHub Actions
80111

@@ -87,9 +118,9 @@ Note: Image signing is disabled by default. Your images will build successfully
87118

88119
### 4. Customize Your Image
89120

90-
Choose your base image in `Containerfile` (line 23):
121+
Choose your base image in `Containerfile` (line 35):
91122
```dockerfile
92-
FROM ghcr.io/ublue-os/bluefin:stable
123+
FROM ghcr.io/ublue-os/silverblue-main:stable
93124
```
94125

95126
Add your packages in `build/10-build.sh`:

artifacthub-repo.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Sign up and add the Repository ID to the right field. Owners fields are optional.
33
# Examples: https://artifacthub.io/packages/search?ts_query_web=ublue&sort=relevance&page=1
44

5-
repositoryID: finpilot # Fill in with your own credentials
5+
repositoryID: testfin # Fill in with your own credentials
66
owners: # (optional, used to claim repository ownership)
77
- name: Jane Containerface
88
email: jane@blueuniversal.com

build/10-build.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,23 @@ set -eoux pipefail
55
###############################################################################
66
# Main Build Script
77
###############################################################################
8-
# This script follows the @ublue-os/bluefin pattern for build scripts.
8+
# This script follows the @projectbluefin/distroless pattern for build scripts.
99
# It uses set -eoux pipefail for strict error handling and debugging.
1010
###############################################################################
1111

1212
# Source helper functions
1313
# shellcheck source=/dev/null
1414
source /ctx/build/copr-helpers.sh
1515

16+
echo "::group:: Copy Project Bluefin Common and Brew Files"
17+
18+
# Copy all system files from Project Bluefin common and brew layers
19+
# This includes ujust completions, udev rules, Homebrew, and other shared configuration
20+
# Following the distroless pattern: https://github.com/projectbluefin/distroless
21+
cp -avf /ctx/files/. /
22+
23+
echo "::endgroup::"
24+
1625
echo "::group:: Copy Custom Files"
1726

1827
# Copy Brewfiles to standard location
@@ -43,6 +52,12 @@ echo "::group:: System Configuration"
4352

4453
# Enable/disable systemd services
4554
systemctl enable podman.socket
55+
56+
# Enable brew services (from Project Bluefin brew layer)
57+
systemctl enable brew-setup.service
58+
systemctl enable brew-upgrade.timer
59+
systemctl enable brew-update.timer
60+
4661
# Example: systemctl mask unwanted-service
4762

4863
echo "::endgroup::"

custom/ujust/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ Universal Blue images include helpers in `/usr/lib/ujust/ujust.sh`:
172172
Test locally before committing:
173173

174174
1. Build your image: `just build` (see [`Justfile`](../../Justfile))
175-
2. If on a bootc system: `sudo bootc switch --target localhost/finpilot:stable`
175+
2. If on a bootc system: `sudo bootc switch --target localhost/testfin:stable`
176176
3. Reboot and test: `ujust your-command`
177177

178178
Or test the just files directly:

0 commit comments

Comments
 (0)