Skip to content

Commit 3059442

Browse files
author
Shadowfetch
committed
Build Shadowfetch 4.0 Mission Control and featured Grok Bot setup
1 parent 270f6a2 commit 3059442

89 files changed

Lines changed: 8774 additions & 610 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-iso.yml

Lines changed: 53 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,63 @@
1-
name: Build & publish Shadowfetch Linux ISO
1+
name: Source and package checks
22

33
on:
44
push:
5-
tags: ['v*'] # Tag push (v1.0.0, v1.0.1, ...) triggers full release pipeline
6-
workflow_dispatch: # Manual trigger for dry-run / test builds
7-
inputs:
8-
publish:
9-
description: 'Publish to R2 + deploy Worker?'
10-
required: true
11-
default: 'false'
12-
type: choice
13-
options: ['true', 'false']
5+
branches: [main, 'release/**']
6+
pull_request:
7+
workflow_dispatch:
148

15-
jobs:
16-
build:
17-
runs-on: ubuntu-latest
18-
timeout-minutes: 180 # ISO build alone is ~30-60 min; with publish more
19-
permissions:
20-
contents: write # for creating GitHub releases
21-
steps:
22-
- name: Checkout
23-
uses: actions/checkout@v4
9+
permissions:
10+
contents: read
2411

25-
- name: Free up disk space
26-
# Default ubuntu-latest gives ~14GB free; squashfs + chroot need more.
27-
run: |
28-
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
29-
sudo docker image prune --all --force || true
30-
df -h
12+
concurrency:
13+
group: source-${{ github.workflow }}-${{ github.ref }}
14+
cancel-in-progress: true
3115

32-
- name: Install build dependencies
16+
jobs:
17+
source:
18+
runs-on: ubuntu-24.04
19+
timeout-minutes: 30
20+
env:
21+
QT_QPA_PLATFORM: offscreen
22+
PYTHONDONTWRITEBYTECODE: '1'
23+
steps:
24+
- uses: actions/checkout@v4
25+
- name: Install source and package test dependencies
3326
run: |
3427
sudo apt-get update
35-
sudo apt-get install -y \
36-
live-build live-config live-boot \
37-
debhelper devscripts equivs dh-python \
38-
reprepro gnupg \
39-
xorriso isolinux syslinux-common syslinux-utils \
40-
grub-pc-bin grub-efi-amd64-bin mtools \
41-
xz-utils python3 awscli
42-
43-
- name: Verify release version and source gates
44-
run: |
45-
VERSION=$(awk '/^VERSION[[:space:]]*\?=/{print $3; exit}' Makefile)
46-
if [[ "$GITHUB_REF" == refs/tags/* && "${GITHUB_REF_NAME}" != "v${VERSION}" ]]; then
47-
echo "::error::Tag ${GITHUB_REF_NAME} does not match Makefile VERSION ${VERSION}"
48-
exit 1
49-
fi
50-
make test
51-
52-
- name: Import GPG signing key
53-
env:
54-
GPG_PRIVATE_KEY: ${{ secrets.SHADOWFETCH_GPG_PRIVATE_KEY }}
55-
run: |
56-
if [ -z "$GPG_PRIVATE_KEY" ]; then
57-
echo "::error::SHADOWFETCH_GPG_PRIVATE_KEY secret not set; can't sign release"
58-
exit 1
59-
fi
60-
echo "$GPG_PRIVATE_KEY" | gpg --batch --import
61-
gpg --list-secret-keys
62-
63-
- name: Build packages + ISO
64-
run: |
65-
make iso
66-
67-
- name: Compute checksums (also done by Makefile; double-check)
68-
run: |
69-
ls -lh *.iso *.iso.sha256 *.iso.asc
70-
cat *.iso.sha256
71-
72-
- name: Pre-release publication gate
73-
run: |
74-
make pre-release-check
75-
76-
- name: Upload ISO as workflow artifact (always)
77-
uses: actions/upload-artifact@v4
28+
sudo apt-get install -y debhelper dh-python devscripts fakeroot python3 python3-yaml python3-pyqt6 python3-dbus shellcheck desktop-file-utils bubblewrap ffmpeg
29+
- name: Test behavior
30+
run: make test
31+
- name: Validate source syntax and desktop entries
32+
run: |
33+
python3 - <<'PY'
34+
import ast, json, pathlib, subprocess
35+
files = subprocess.check_output(['git', 'ls-files', '-z']).split(b'\0')
36+
for name in filter(None, files):
37+
p = pathlib.Path(name.decode())
38+
if not p.is_file():
39+
continue
40+
try:
41+
text = p.read_text()
42+
except UnicodeError:
43+
continue
44+
first = text.splitlines()[0] if text.splitlines() else ''
45+
if p.suffix == '.py' or first.startswith('#!') and 'python' in first:
46+
ast.parse(text, filename=str(p))
47+
if p.suffix == '.json':
48+
json.loads(text)
49+
if p.suffix == '.desktop' and ('applications' in p.parts or 'autostart' in p.parts):
50+
subprocess.run(['desktop-file-validate', str(p)], check=True)
51+
PY
52+
git diff --check
53+
- name: Build unsigned candidate packages
54+
run: make packages
55+
- uses: actions/upload-artifact@v4
7856
with:
79-
name: shadowfetch-iso
80-
path: |
81-
*.iso
82-
*.iso.sha256
83-
*.iso.asc
84-
retention-days: 30
57+
name: unsigned-candidate-packages
58+
path: build/*.deb
59+
retention-days: 14
8560

86-
- name: Publish to R2 (tag or manual-with-publish=true)
87-
if: startsWith(github.ref, 'refs/tags/v') || (github.event_name == 'workflow_dispatch' && inputs.publish == 'true')
88-
env:
89-
AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
90-
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
91-
run: |
92-
make publish
93-
94-
- name: Deploy Worker (tag or manual-with-publish=true)
95-
if: startsWith(github.ref, 'refs/tags/v') || (github.event_name == 'workflow_dispatch' && inputs.publish == 'true')
96-
env:
97-
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
98-
run: |
99-
npm install -g wrangler
100-
cd web/shadowfetch-linux-worker && wrangler deploy
101-
102-
- name: Create GitHub release on tag
103-
if: startsWith(github.ref, 'refs/tags/v')
104-
uses: softprops/action-gh-release@v2
105-
env:
106-
GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }}
107-
with:
108-
name: ${{ github.ref_name }}
109-
draft: true
110-
generate_release_notes: true
111-
body: |
112-
The signed ISO is hosted on Shadowfetch's release storage because
113-
GitHub release assets have a 2 GiB per-file limit. Verify the R2
114-
download with the attached checksum and detached signature.
115-
files: |
116-
*.iso.sha256
117-
*.iso.asc
61+
# The signed release is built, tested in installed VMs, and published from the
62+
# authorized Linux publisher. A tag must not rebuild and overwrite the tested
63+
# ISO or deploy an unrelated Worker. See RELEASE-4.0.0.md.

Makefile

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
# make distclean Wipe everything regenerable
1111

1212
SHELL := /bin/bash
13-
VERSION ?= 3.5.0
13+
VERSION ?= 4.0.0
1414
CODENAME ?= umbra
1515
ISO_NAME := shadowfetch-$(VERSION)-amd64.iso
1616
VERSION_TOKEN := $(subst .,_,$(VERSION))
@@ -34,7 +34,8 @@ PACKAGES := \
3434
shadowfetch-control-center \
3535
shadowfetch-fireproof \
3636
shadowfetch-hwscan \
37-
shadowfetch-fireline
37+
shadowfetch-fireline \
38+
shadowfetch-missions
3839

3940
# GPG key the APT repo signs with. Override with `make REPO_KEY_ID=...` if
4041
# you've regenerated the key. The default matches the key on shadowfetch-linux.
@@ -79,7 +80,7 @@ R2_REGION ?= auto
7980

8081
# Used by sync-from-linux (Mac-side flow): host + path to the build box.
8182
LINUX_HOST ?= shadowfetch-linux
82-
LINUX_PATH ?= ~/projects/shadowfetch-3.5.0
83+
LINUX_PATH ?= ~/projects/shadowfetch-4.0.0
8384

8485
.PHONY: all help test source-gate package-gate iso-gate acceptance-audit deps packages repo iso sign pre-release-check publish qemu clean distclean \
8586
sync-from-linux deploy-worker ship stamp-version
@@ -102,13 +103,16 @@ help:
102103
@echo " make distclean Wipe all regenerable files"
103104

104105
test:
106+
python3 -m unittest discover -s packages/shadowfetch-missions/tests -v
107+
QT_QPA_PLATFORM=offscreen python3 -m unittest discover -s packages/shadowfetch-control-center/tests -v
105108
python3 -m unittest discover -s packages/shadowfetch-defaults/tests -v
106109
python3 -m unittest discover -s packages/shadowfetch-firewatchd/tests -v
107110
python3 -m unittest discover -s packages/shadowfetch-fireproof/tests -v
108111
python3 -m unittest discover -s packages/shadowfetch-hwscan/tests -v
109112
python3 packages/shadowfetch-fireline/tests/test_ai_ignition.py
110113
python3 packages/shadowfetch-fireline/tests/test_fireline_mcp.py
111114
python3 packages/shadowfetch-fireline/tests/test_checkpoint_roundtrip.py
115+
python3 packages/shadowfetch-fireline/tests/test_firebreak_4.py
112116
python3 -m unittest discover -s tools/tests -v
113117

114118
source-gate:
@@ -145,13 +149,7 @@ packages: $(PACKAGES_STAMP)
145149
# was itself stale. A single source of truth that a human maintains is the same
146150
# bug with one fewer copy, so the build stamps it now.
147151
stamp-version:
148-
@printf '%s\n' '$(VERSION)' > $(ROOT)/packages/shadowfetch-branding/data/usr/share/shadowfetch/version
149-
@sed -i -E 's/[0-9]+\.[0-9]+\.[0-9]+/$(VERSION)/g' \
150-
$(ROOT)/packages/shadowfetch-branding/data/usr/share/shadowfetch/os-release.shadowfetch
151-
@for f in $(ROOT)/packages/shadowfetch-themes/data/usr/share/sddm/themes/umbra/metadata.desktop $(ROOT)/packages/shadowfetch-defaults/data/usr/share/doc/shadowfetch/LICENSES.md $(ROOT)/packages/shadowfetch-defaults/data/usr/share/doc/shadowfetch/SOURCES.md $(ROOT)/packages/shadowfetch-defaults/data/usr/bin/shadowfetch-element $(ROOT)/packages/shadowfetch-fireline/data/usr/bin/shadowfetch-firebreak; do \
152-
sed -i -E 's/\b[0-9]+\.[0-9]+\.[0-9]+\b/$(VERSION)/g' "$$f"; \
153-
done
154-
@echo ">>> stamped version $(VERSION) into branding, themes, docs and CLI surfaces"
152+
python3 tools/stamp_version.py "$(VERSION)"
155153

156154
$(PACKAGES_STAMP): stamp-version
157155
@mkdir -p $(BUILD_DIR)

RELEASE-4.0.0.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Shadowfetch Linux 4.0.0 — Mission Control
2+
3+
Status: implementation and validation in progress. This file is a release contract, not a claim that 4.0 has shipped. The public 3.5 image remains the current release until publication verification passes.
4+
5+
## Release objective
6+
7+
Deliver the complete Mission Control desktop: persistent tasks, visible scopes, real code/document/media workflows, reviewed results, cancellation/retry/recovery, hardware-aware local AI and resource management. Integrate the official Grok Bot Linux desktop app as a featured installation choice alongside the existing agents. Publish the signed ISO, corresponding source, GitHub release, updated shadowfetchlinux.org, actual screenshots and a reviewer letter after stress and acceptance testing.
8+
9+
## Product requirements
10+
11+
1. Native Mission Control is a first-class desktop surface. It creates and tracks real jobs, shows allowed files/tools/network, progress, artifacts, test output, failure details and results ready for review.
12+
2. Mission state persists across service and computer restarts. Cancellation stops the task's process group. Retry checks state and does not blindly replay external effects.
13+
3. Firebreak gives agents a private home and explicitly scoped filesystem access. A required recovery checkpoint must exist before a mission mutates files. Permission and receipt state stays outside the agent-writable project.
14+
4. Fire offers explicit connected execution; Ice provides local execution with external networking disabled. Local inference crosses only a narrow local broker boundary.
15+
5. Software missions run a supported coding runtime, verify the requested tests and present the actual patch. Document missions generate a report from selected sources with citations using actual local inference. Media missions produce validated exports without overwriting originals.
16+
6. CPU, memory, process and heavy-job admission limits preserve a responsive desktop. Local model setup records the model, actual hardware and a measured successful inference result.
17+
7. The desktop launcher and file manager can send selected projects or files into Mission Control. GUI and CLI share the same engine.
18+
8. Grok Bot is the official native desktop product, separate from Grok Build CLI. Its package comes from the official vendor download source with a pinned digest and reviewed metadata. Setup shows download, disk, network and account requirements; native account sign-in remains with the provider. A cloud service is never labeled as Ice/local inference.
19+
9. Grok Bot has prominent first-boot presentation, a dedicated Control Center surface and desktop launch entry. Screenshots must include the actual vendor application and its real setup/launch state.
20+
10. BIOS and UEFI fresh installs boot from disk. A 3.5-to-4.0 upgrade preserves selected user data and has a documented recovery path. Btrfs and non-Btrfs recovery limits remain explicit.
21+
11. At least 45 minutes of concurrent CPU, memory, storage, container and mission/UI load complete with clean kernel, service, package and filesystem audits.
22+
12. Screenshots come from the built release desktop at 1366×768 and 1920×1080. Capture Fire, Ice, Welcome, Mission Control, Grok Bot, installation, results/recovery and under-load states. Do not substitute design mockups.
23+
13. The signed ISO, APT binaries and corresponding source, package manifest, SBOM, evidence bundle, Git tag/release, website and reviewer letter all describe the same verified release.
24+
25+
## Build identity
26+
27+
- Version: 4.0.0; codename/repository suite: Umbra / `umbra`.
28+
- Architecture: amd64; desktop: KDE Plasma 6; installer: Calamares.
29+
- Source: `/home/rtx5060ti/projects/shadowfetch-4.0.0`, branch `release/4.0.0`.
30+
- Development mirror: task-owned Mac workspace; builds and publishing execute on Linux.
31+
- Base snapshot is inherited from 3.5 pending package/build validation; no unsupported claim of a base-OS migration.
32+
- Exact source commit, ISO size/hash/signature and release date are recorded only after the final build.
33+
34+
## Evidence
35+
36+
`qa/4.0.0/acceptance.json` contains the complete gate inventory. Every case starts pending with no inherited 3.5 evidence. A test manifest is an index into actual logs, artifacts and runtime captures; its status alone is insufficient to prove a feature works.
37+
38+
## Publication boundaries
39+
40+
The user authorized end-to-end GitHub and website publication for 4.0. Publish only after the tested release is concrete. Native vendor apps retain their licenses and account requirements. Never embed keys, credentials, private operating data or account state in source, packages, screenshots or the ISO.
41+
42+
The public distro Worker is `shadowfetch-linux-site`, published by `rtx5060ti` from `/home/rtx5060ti/.sfbuild/release-sources/shadowfetch-linux-site`. Artifacts/APT remain on the established `.com/linux` routes. Worker `shadowfetch-astro` may ship only through the designated Linux release cycle; preserve `/news`. No broad R2 pruning or unrelated service changes are part of this release.
43+
44+
## Reviewer deliverables
45+
46+
After acceptance, generate a ready-to-send reviewer letter in editable Word, PDF and plain text, a screenshot gallery with a prominent actual Grok Bot capture, verification instructions, exact release links, test results and known limitations. The letter is prepared for the user to send; this task does not authorize unsolicited outreach.

live-build/config/includes.chroot/etc/calamares/branding/debian/show.qml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Presentation
4343
anchors.margins: 24; height: 82
4444
color: "#FFFFFF"; wrapMode: Text.WordWrap; textFormat: Text.RichText
4545
font.pixelSize: 17; horizontalAlignment: Text.AlignLeft
46-
text: qsTr("<b>Shadowfetch Linux 3.5.0</b><br/>Fire keeps connected production work close. Ice starts agent sessions offline. Both retain the same KDE desktop and recovery tools.")
46+
text: qsTr("<b>Shadowfetch Linux 4.0.0</b><br/>Mission Control brings plans, scoped work and results together. Fire keeps connected production work close. Ice starts agent sessions offline. Both retain the same KDE desktop and recovery tools.")
4747
}
4848
}
4949

@@ -79,7 +79,7 @@ Presentation
7979
anchors.margins: 24; height: 82
8080
color: "#FFFFFF"; wrapMode: Text.WordWrap; textFormat: Text.RichText
8181
font.pixelSize: 17; horizontalAlignment: Text.AlignLeft
82-
text: qsTr("<b>AI with visible boundaries</b><br/>Buzz, local models, Codex, Claude Code, Grok Build and Cursor remain optional. No model, account or credential is bundled or downloaded without consent.")
82+
text: qsTr("<b>Meet Grok Bot after installation</b><br/>Welcome features the official Grok Bot desktop alongside Buzz and coding agents. Choose its verified native installation, then sign in with an eligible account and plan. Ice keeps this cloud setup paused.")
8383
}
8484
}
8585

packages/shadowfetch-branding/data/usr/share/shadowfetch/os-release.shadowfetch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
NAME="Shadowfetch Linux"
2-
PRETTY_NAME="Shadowfetch Linux 3.1.0 Backfire (Umbra)"
2+
PRETTY_NAME="Shadowfetch Linux 4.0.0 (Umbra)"
33
ID=shadowfetch
44
ID_LIKE=debian
5-
VERSION="3.1.0 Backfire (Umbra)"
6-
VERSION_ID="3.1.0"
5+
VERSION="4.0.0 (Umbra)"
6+
VERSION_ID="4.0.0"
77
VERSION_CODENAME=umbra
88
HOME_URL="https://www.shadowfetchlinux.org/"
99
SUPPORT_URL="https://www.shadowfetchlinux.org/known-issues"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.1.0
1+
4.0.0

packages/shadowfetch-branding/debian/changelog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
shadowfetch-branding (4.0.0-1) umbra; urgency=medium
2+
3+
* Shadowfetch Linux 4.0 Mission Control release.
4+
* Integrate persistent missions, scoped execution and featured Grok Bot setup.
5+
6+
-- Shadowfetch Project <signing@shadowfetch.com> Sat, 05 Sep 2026 03:00:00 +0000
7+
18
shadowfetch-branding (3.5.0-1) umbra; urgency=medium
29

310
* Shadowfetch Linux 3.5.0 flagship Fire and Ice Workbench release.

packages/shadowfetch-control-center/data/usr/bin/shadowfetch-control

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#!/usr/bin/env python3
22
"""Shadowfetch Control Center - one window runs the machine.
33
4-
3.5.0 "Fire and Ice": eight fixed sections - Guide, Element Workbench, Ignite
5-
(Ember Mode), Watch (Firewatch), Recover (Phoenix), Local AI, Drivers, and
4+
4.0.0 Mission Control: persistent missions, featured Grok Bot, Guide,
5+
Element Workbench, Ignite, Watch, Recover, Local AI, Drivers, and
66
Software & Updates.
77
The system tools (Safe Update, System Health, AI Workspaces, Local AI Tools,
88
First-run Setup, Graphics & Recovery) all remain reachable inside their
@@ -22,10 +22,14 @@ if any(_a in ("-h", "--help") for _a in _sfsys.argv[1:]):
2222
USAGE
2323
shadowfetch-control open the control centre
2424
shadowfetch-control --page SECTION open a section directly
25+
shadowfetch-control --workspace PATH create a mission for a project folder
2526
shadowfetch-control --cli text-mode menu (no graphics needed)
2627
2728
SECTIONS (for --page; a tab may follow after a colon)
28-
guide Private, read-only System Passport (aliases: passport)
29+
missions Persistent mission queue, results, changes and review
30+
grok-bot Official Grok Bot desktop installation and launch
31+
workbench Project profiles and scoped workspaces
32+
guide Private, read-only System Passport (aliases: passport)
2933
ignite Ember Mode - one switch for speed, always returns to Balanced
3034
watch Firewatch - live sensors, the heat map, local model telemetry
3135
recover Phoenix - restore Points, repair tools, recovery report

packages/shadowfetch-control-center/data/usr/share/applications/shadowfetch-control.desktop

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[Desktop Entry]
22
Type=Application
33
Name=Shadowfetch Control Center
4-
Comment=Ignite, Watch, Recover, Local AI, Drivers and Software & Updates
4+
Comment=Mission Control, Grok Bot, local AI and system care
55
Exec=shadowfetch-control
66
Icon=shadowfetch
77
Terminal=false
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[Desktop Entry]
2+
Type=Application
3+
Name=Grok Bot · Setup & launch
4+
GenericName=Official Cloud Teammate
5+
Comment=Install the verified official Grok Bot desktop and open native account sign-in
6+
Exec=shadowfetch-control --page grok-bot
7+
Icon=shadowfetch
8+
Terminal=false
9+
Categories=Utility;
10+
Keywords=grok;bot;agents;teammate;cloud;shadowfetch;
11+
StartupNotify=true

0 commit comments

Comments
 (0)