Compare commits

...

14 commits
main ... v0.1.0

Author SHA1 Message Date
Breadway
30d94aa286 Remove accidentally-committed .claude agent state; gitignore it
All checks were successful
Mirror to GitHub / mirror (push) Successful in 9s
Build and publish package / package (push) Successful in 1m51s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 22:54:47 +08:00
Breadway
1bcd9588de Fix bos-settings compile errors and use REGISTRY_TOKEN for publishing
All checks were successful
Mirror to GitHub / mirror (push) Successful in 4s
bos-settings was scaffolded but never compiled. Fixes:
- main.rs: import gtk4::prelude (connect_activate/run)
- window.rs: disambiguate WidgetExt::display(); drop unused GBox import
- hyprland.rs: Label has no set_monospace -> use the monospace CSS class
- theme.rs: drop unused prelude import

Also switch package.yml to secrets.REGISTRY_TOKEN (scoped write:package),
since the auto Actions token is not authorized for the owner registry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 22:54:27 +08:00
Breadway
12a8fa00bb Disable LTO in PKGBUILD (vendored ring/mlua static libs vs makepkg -flto)
All checks were successful
Mirror to GitHub / mirror (push) Successful in 10s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 17:06:53 +08:00
Breadway
0ee174e16e Regenerate Cargo.lock for bos-settings
Some checks are pending
Mirror to GitHub / mirror (push) Waiting to run
The scaffolded lockfile was stale, so packaging builds with --locked failed.
Regenerated against current Cargo.toml (88 packages).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:59:30 +08:00
Breadway
eda2c44c48 Add Calamares branding images from bread logo
Some checks are pending
Mirror to GitHub / mirror (push) Waiting to run
- logo.png (productLogo/productIcon): rasterised from the bread logo, transparent
- languages.png (productWelcome): logo centred on a light Nord canvas
- logo.svg / bread_white.svg: source vector

Resolves the missing-branding-asset blocker so Calamares can render.
Colour scheme can be refined when final SVGs land.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:53:25 +08:00
Breadway
f98f21bbdd Source calamares from official extra, not [breadway]
All checks were successful
Mirror to GitHub / mirror (push) Successful in 5s
calamares and calamares-qt6 are in Arch's extra repo; no custom PKGBUILD
needed. Update packages.x86_64 and the pacman.conf comment accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:40:59 +08:00
Breadway
7ef51e8722 Clone from public URL, not GITHUB_SERVER_URL (resolves to localhost in runner)
All checks were successful
Mirror to GitHub / mirror (push) Successful in 4s
The Forgejo runner injects GITHUB_SERVER_URL as http://localhost:3002, which
is unreachable from inside the job container. Use the public URL instead.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:14:12 +08:00
Breadway
c259aa9e93 Rename mirror secret to MIRROR_TOKEN (GITHUB_ prefix is reserved)
Some checks failed
Mirror to GitHub / mirror (push) Failing after 2s
Forgejo/gitea rejects user secret names starting with GITHUB_.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:10:39 +08:00
Breadway
a2973b91eb Use Forgejo-prescribed pacman section name for the Arch registry
Some checks failed
Mirror to GitHub / mirror (push) Failing after 1s
Forgejo serves the repo db as {owner}.{group}.{domain}.db, and pacman
fetches "<section>.db" from Server — so the section name must match.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:03:55 +08:00
Breadway
769b6283e0 Fix Forgejo workflows for the actual server capabilities
Some checks failed
Mirror to GitHub / mirror (push) Failing after 2s
- package.yml: use correct Arch registry upload (octet-stream + binary body
  + PUT /api/packages/Breadway/arch/os), drop --privileged, remove
  actions/checkout (archlinux image has no Node) in favour of a manual
  shell clone, use the built-in Actions token instead of a stored secret,
  and --nocheck (tests belong in CI, not packaging)
- mirror.yml: clone --mirror + explicit refs/heads + refs/tags push with
  --prune, instead of pushing refs/remotes pollution from a checkout
- pacman.conf: correct Server URL to the Forgejo Arch registry format

Requires only the GITHUB_MIRROR_TOKEN secret (GitHub PAT, repo scope) for
the mirror job; package publishing uses the automatic per-run token.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:01:50 +08:00
Breadway
2c6feb4ea0 Add Forgejo Actions workflows and fix [breadway] repo URL
Some checks failed
Mirror to GitHub / mirror (push) Failing after 2s
- .forgejo/workflows/mirror.yml: mirrors every push/tag to GitHub
- .forgejo/workflows/package.yml: builds PKGBUILD on tag and publishes
  bos-settings to the Forgejo Arch package registry (distrib=breadway)
- iso/pacman.conf: replace placeholder repo.breadway.dev with the actual
  Forgejo package registry URL

Requires two Forgejo secrets:
  GITHUB_MIRROR_TOKEN — GitHub PAT with repo push scope
  FORGEJO_TOKEN       — Forgejo token with package:write scope

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 11:42:00 +08:00
Breadway
6f148e9a06 Add bakery.toml and packaging/arch to match bread ecosystem
Mirrors the build/distribution pattern used by the bread project:
- bakery.toml describes bos-settings as a bakery-managed package
- packaging/arch/PKGBUILD builds and installs the binary via cargo
- packaging/arch/bos-settings.desktop for app launchers
- LICENSE (MIT) required by PKGBUILD

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 11:32:40 +08:00
Breadway
8682698402 Fix prod-readiness issues flagged in audit
- Fix XDG config dir logic in config/mod.rs (was double-nesting and had /home/user hardcode)
- Replace /home/user hardcodes in breadbar.rs and hyprland.rs with config::config_dir()
- Fix /home/user hardcode in packages.rs (uses /root fallback for .local/state path)
- Remove eprintln! from GTK callback in packages.rs (no stderr at runtime)
- Fix YAML parse error in branding.desc (missing space after sidebarTextHighlight key)
- Add .gitignore (Rust target/, ISO artifacts, editor/OS junk, secrets)
- Delete state.rs (dead code — never mod'd in main.rs)
- Add brightnessctl, grim, slurp to packages.x86_64 (used by keybinds)
- Rename can-you-begin-a-composed-beacon.md → DESIGN.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 11:29:53 +08:00
Breadway
c744e45c90
Merge pull request #1 from Breadway/scaffold/bos-initial
Scaffold/bos initial
2026-06-13 11:15:38 +08:00
25 changed files with 306 additions and 35 deletions

View file

@ -0,0 +1,21 @@
name: Mirror to GitHub
on:
push:
branches: ['**']
tags: ['**']
jobs:
mirror:
runs-on: [self-hosted, hestia]
steps:
- name: Mirror to GitHub
run: |
set -euo pipefail
git clone --mirror "https://git.breadway.dev/${GITHUB_REPOSITORY}.git" repo.git
cd repo.git
# Mirror only branches and tags (not refs/pull/*, which GitHub rejects);
# --prune deletes GitHub refs that no longer exist on Forgejo.
git push --prune \
"https://x-access-token:${{ secrets.MIRROR_TOKEN }}@github.com/Breadway/bos.git" \
'+refs/heads/*:refs/heads/*' '+refs/tags/*:refs/tags/*'

View file

@ -0,0 +1,40 @@
name: Build and publish package
on:
push:
tags: ['v*']
jobs:
package:
runs-on: [self-hosted, hestia]
container:
image: archlinux:latest
steps:
# Note: no actions/checkout — the archlinux image has no Node, which JS
# actions require. Everything runs as shell steps and clones manually.
- name: Build and publish
env:
PUBLISH_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
run: |
set -euo pipefail
VERSION="${GITHUB_REF_NAME#v}"
pacman -Syu --noconfirm base-devel git rust cargo gtk4 glib2
useradd -m builder
git config --global --add safe.directory '*'
git clone --branch "${GITHUB_REF_NAME}" --depth 1 \
"https://git.breadway.dev/${GITHUB_REPOSITORY}.git" /home/builder/src
cd /home/builder/src
git archive --format=tar.gz --prefix="bos-settings-${VERSION}/" HEAD \
> packaging/arch/bos-settings-${VERSION}.tar.gz
SHA=$(sha256sum packaging/arch/bos-settings-${VERSION}.tar.gz | awk '{print $1}')
sed -i "s/^pkgver=.*/pkgver=${VERSION}/" packaging/arch/PKGBUILD
sed -i "s/^sha256sums=.*/sha256sums=('${SHA}')/" packaging/arch/PKGBUILD
chown -R builder:builder /home/builder/src
# --nocheck: packaging builds the artifact; tests belong in a CI job.
su builder -c "cd /home/builder/src/packaging/arch && makepkg -f --noconfirm --nocheck"
PKG=$(find /home/builder/src/packaging/arch -name '*.pkg.tar.zst' | head -1)
curl -fsS -X PUT \
-H "Authorization: token ${PUBLISH_TOKEN}" \
-H "Content-Type: application/octet-stream" \
--data-binary "@${PKG}" \
"https://git.breadway.dev/api/packages/Breadway/arch/os"

40
.gitignore vendored Normal file
View file

@ -0,0 +1,40 @@
# Rust build artifacts
/target/
**/*.pdb
# Editor / IDE
.vscode/
.idea/
*.swp
*.swo
*~
.direnv/
# OS artifacts
.DS_Store
Thumbs.db
desktop.ini
# Environment / secrets
.env
.env.local
*.env.*
secrets/
*.pem
*.key
*.p12
# archiso build artifacts (these are large and reproducible)
/iso-build/
/iso-out/
*.iso
*.img
# Runtime / logs
*.log
logs/
*.pid
*.sock
# Claude Code local agent state
.claude/

55
Cargo.lock generated
View file

@ -2,6 +2,18 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 4 version = 4
[[package]]
name = "async-channel"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
dependencies = [
"concurrent-queue",
"event-listener-strategy",
"futures-core",
"pin-project-lite",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.5.1" version = "1.5.1"
@ -18,6 +30,7 @@ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
name = "bos-settings" name = "bos-settings"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"async-channel",
"glib", "glib",
"gtk4", "gtk4",
"serde", "serde",
@ -58,12 +71,48 @@ dependencies = [
"target-lexicon", "target-lexicon",
] ]
[[package]]
name = "concurrent-queue"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.2" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "event-listener"
version = "5.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
dependencies = [
"concurrent-queue",
"parking",
"pin-project-lite",
]
[[package]]
name = "event-listener-strategy"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
dependencies = [
"event-listener",
"pin-project-lite",
]
[[package]] [[package]]
name = "field-offset" name = "field-offset"
version = "0.3.6" version = "0.3.6"
@ -457,6 +506,12 @@ dependencies = [
"system-deps", "system-deps",
] ]
[[package]]
name = "parking"
version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.17" version = "0.2.17"

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Breadway
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

12
bakery.toml Normal file
View file

@ -0,0 +1,12 @@
name = "bos-settings"
description = "System settings app for Bread OS"
binaries = ["bos-settings"]
system_deps = ["gtk4", "glib2"]
optional_system_deps = ["snapper"]
bread_deps = []
[config]
dir = "~/.config"
[install]
post_install = []

View file

@ -15,10 +15,13 @@ pub fn save<T: serde::Serialize>(path: &Path, val: &T) -> Result<(), Box<dyn Err
} }
pub fn config_dir() -> PathBuf { pub fn config_dir() -> PathBuf {
let home = std::env::var("HOME").unwrap_or_else(|_| { // Honour XDG_CONFIG_HOME if set; otherwise fall back to $HOME/.config.
std::env::var("XDG_CONFIG_HOME") if let Ok(xdg) = std::env::var("XDG_CONFIG_HOME") {
.map(|p| PathBuf::from(p).parent().unwrap_or(Path::new("/")).to_string_lossy().to_string()) let p = PathBuf::from(xdg);
.unwrap_or_else(|_| "/home/user".to_string()) if p.is_absolute() {
}); return p;
}
}
let home = std::env::var("HOME").unwrap_or_else(|_| "/root".to_string());
PathBuf::from(home).join(".config") PathBuf::from(home).join(".config")
} }

View file

@ -2,6 +2,8 @@ mod config;
mod theme; mod theme;
mod ui; mod ui;
use gtk4::prelude::*;
fn main() { fn main() {
let app = gtk4::Application::builder() let app = gtk4::Application::builder()
.application_id("com.breadway.bos-settings") .application_id("com.breadway.bos-settings")

View file

@ -1,11 +0,0 @@
pub struct AppState {
pub current_view: String,
}
impl AppState {
pub fn new() -> Self {
Self {
current_view: "snapshots".to_string(),
}
}
}

View file

@ -1,4 +1,3 @@
use gtk4::prelude::*;
use gtk4::CssProvider; use gtk4::CssProvider;
const CSS: &str = r#" const CSS: &str = r#"

View file

@ -3,10 +3,10 @@ use gtk4::{Box as GBox, Button, Label, Orientation, ScrolledWindow, TextView};
use std::path::PathBuf; use std::path::PathBuf;
fn css_path() -> PathBuf { fn css_path() -> PathBuf {
let home = std::env::var("HOME").unwrap_or_else(|_| "/home/user".to_string()); crate::config::config_dir().join("breadbar/style.css")
PathBuf::from(home).join(".config/breadbar/style.css")
} }
pub fn build() -> GBox { pub fn build() -> GBox {
let path = css_path(); let path = css_path();
let existing_css = std::fs::read_to_string(&path).unwrap_or_default(); let existing_css = std::fs::read_to_string(&path).unwrap_or_default();

View file

@ -23,8 +23,7 @@ fn get_monitors() -> Vec<String> {
} }
fn hypr_path(name: &str) -> std::path::PathBuf { fn hypr_path(name: &str) -> std::path::PathBuf {
let home = std::env::var("HOME").unwrap_or_else(|_| "/home/user".to_string()); crate::config::config_dir().join("hypr").join(name)
std::path::PathBuf::from(home).join(".config/hypr").join(name)
} }
pub fn build() -> GBox { pub fn build() -> GBox {
@ -51,7 +50,7 @@ pub fn build() -> GBox {
for mon in &monitors { for mon in &monitors {
let lbl = Label::new(Some(mon)); let lbl = Label::new(Some(mon));
lbl.set_xalign(0.0); lbl.set_xalign(0.0);
lbl.set_monospace(true); lbl.add_css_class("monospace");
vbox.append(&lbl); vbox.append(&lbl);
} }
} }

View file

@ -8,7 +8,7 @@ use std::io::{BufRead, BufReader};
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
fn read_installed() -> HashMap<String, String> { fn read_installed() -> HashMap<String, String> {
let home = std::env::var("HOME").unwrap_or_else(|_| "/home/user".to_string()); let home = std::env::var("HOME").unwrap_or_else(|_| "/root".to_string());
let path = std::path::Path::new(&home) let path = std::path::Path::new(&home)
.join(".local/state/bakery/installed.json"); .join(".local/state/bakery/installed.json");
@ -132,7 +132,7 @@ pub fn build() -> GBox {
Ok(mut child) => { Ok(mut child) => {
std::thread::spawn(move || { let _ = child.wait(); }); std::thread::spawn(move || { let _ = child.wait(); });
} }
Err(e) => eprintln!("bakery update failed: {e}"), Err(_) => {} // bakery not found; button is a no-op
} }
}); });

View file

@ -1,5 +1,5 @@
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::{Application, ApplicationWindow, Box as GBox, Orientation, Paned, Stack}; use gtk4::{Application, ApplicationWindow, Orientation, Paned, Stack};
use super::sidebar; use super::sidebar;
use super::views; use super::views;
@ -12,7 +12,7 @@ pub fn build_ui(app: &Application) {
.default_height(640) .default_height(640)
.build(); .build();
crate::theme::load(&window.display()); crate::theme::load(&WidgetExt::display(&window));
let hpaned = Paned::new(Orientation::Horizontal); let hpaned = Paned::new(Orientation::Horizontal);
hpaned.set_position(190); hpaned.set_position(190);

4
bread_white.svg Normal file
View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 677 369" width="677" height="369" role="img" aria-label="Bread terminal logo">
<path fill="#FFFFFF" d="M 233.00 96.00 C 228.18 100.52 224.36 105.12 222.00 111.00 C 219.37 117.57 218.50 127.32 219.00 134.00 C 219.39 139.29 220.67 143.48 223.00 148.00 C 225.68 153.19 232.13 154.83 235.00 163.00 C 242.25 183.68 230.25 267.37 235.00 286.00 C 236.52 291.95 238.13 294.33 241.00 297.00 C 243.82 299.62 245.92 300.68 252.00 302.00 C 274.95 306.97 399.57 308.16 424.00 302.00 C 431.16 300.20 434.14 297.95 437.00 295.00 C 439.23 292.71 439.95 291.45 441.00 287.00 C 444.91 270.42 433.78 182.71 441.00 163.00 C 443.68 155.70 449.32 154.77 452.00 150.00 C 454.58 145.40 456.36 140.55 457.00 135.00 C 457.76 128.44 457.34 119.48 455.00 113.00 C 452.81 106.92 448.70 101.69 444.00 97.00 C 438.89 91.90 431.52 87.55 425.00 84.00 C 418.83 80.64 414.26 78.40 406.00 76.00 C 391.93 71.90 363.58 67.13 347.00 66.00 C 335.07 65.19 326.39 66.02 316.00 67.00 C 305.39 68.00 294.29 69.44 284.00 72.00 C 273.98 74.49 263.78 77.77 255.00 82.00 C 246.91 85.90 238.71 90.65 233.00 96.00 Z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#22272B" d="M 233.00 96.00 C 228.18 100.52 224.36 105.12 222.00 111.00 C 219.37 117.57 218.50 127.32 219.00 134.00 C 219.39 139.29 220.67 143.48 223.00 148.00 C 225.68 153.19 232.13 154.83 235.00 163.00 C 242.25 183.68 230.25 267.37 235.00 286.00 C 236.52 291.95 238.13 294.33 241.00 297.00 C 243.82 299.62 245.92 300.68 252.00 302.00 C 274.95 306.97 399.57 308.16 424.00 302.00 C 431.16 300.20 434.14 297.95 437.00 295.00 C 439.23 292.71 439.95 291.45 441.00 287.00 C 444.91 270.42 433.78 182.71 441.00 163.00 C 443.68 155.70 449.32 154.77 452.00 150.00 C 454.58 145.40 456.36 140.55 457.00 135.00 C 457.76 128.44 457.34 119.48 455.00 113.00 C 452.81 106.92 448.70 101.69 444.00 97.00 C 438.89 91.90 431.52 87.55 425.00 84.00 C 418.83 80.64 414.26 78.40 406.00 76.00 C 391.93 71.90 363.58 67.13 347.00 66.00 C 335.07 65.19 326.39 66.02 316.00 67.00 C 305.39 68.00 294.29 69.44 284.00 72.00 C 273.98 74.49 263.78 77.77 255.00 82.00 C 246.91 85.90 238.71 90.65 233.00 96.00 Z M 236.00 111.00 C 240.70 104.95 252.16 97.27 260.00 93.00 C 266.44 89.50 271.52 88.07 279.00 86.00 C 289.20 83.18 303.07 80.21 316.00 79.00 C 329.97 77.69 345.66 77.61 360.00 79.00 C 373.97 80.35 388.66 82.80 401.00 87.00 C 412.06 90.77 423.64 96.26 431.00 102.00 C 436.45 106.26 440.67 110.64 443.00 116.00 C 445.31 121.32 445.92 128.39 445.00 134.00 C 444.12 139.36 440.97 145.01 438.00 149.00 C 435.46 152.40 431.30 151.88 429.00 157.00 C 421.48 173.75 434.77 272.07 429.00 286.00 C 427.65 289.26 427.35 289.61 424.00 291.00 C 407.50 297.83 268.52 298.74 252.00 291.00 C 248.48 289.35 248.34 288.69 247.00 285.00 C 241.59 270.06 254.49 173.67 247.00 157.00 C 244.70 151.89 240.54 152.40 238.00 149.00 C 235.03 145.01 232.05 138.72 231.00 134.00 C 230.15 130.15 230.27 126.67 231.00 123.00 C 231.80 119.01 232.90 114.98 236.00 111.00 Z M 250.00 114.00 C 247.10 116.53 245.19 118.87 244.00 122.00 C 242.69 125.44 242.28 130.28 243.00 134.00 C 243.69 137.59 245.68 140.95 248.00 144.00 C 250.55 147.34 255.50 147.38 258.00 153.00 C 265.57 170.01 255.06 263.56 258.00 276.00 C 258.56 278.37 258.16 278.85 260.00 280.00 C 270.82 286.73 401.52 284.73 414.00 281.00 C 415.91 280.43 416.14 280.60 417.00 279.00 C 422.10 269.55 409.97 170.96 418.00 153.00 C 420.76 146.83 426.43 146.39 429.00 143.00 C 430.99 140.37 432.40 138.08 433.00 135.00 C 433.73 131.28 433.45 125.75 432.00 122.00 C 430.64 118.49 428.73 115.87 425.00 113.00 C 418.39 107.92 402.93 102.18 392.00 99.00 C 381.94 96.07 371.95 95.00 362.00 94.00 C 352.28 93.03 343.91 92.52 333.00 93.00 C 318.78 93.62 295.80 96.46 284.00 99.00 C 277.13 100.48 273.37 101.70 268.00 104.00 C 262.05 106.55 254.16 110.38 250.00 114.00 Z M 292.00 152.00 L 294.00 152.00 L 334.00 192.00 L 334.00 194.00 L 294.00 234.00 L 291.00 234.00 L 283.00 223.00 L 312.00 194.00 L 312.00 192.00 L 283.00 163.00 Z M 337.00 222.00 L 339.00 220.00 L 393.00 220.00 L 394.00 234.00 L 339.00 235.00 L 337.00 233.00 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -26,4 +26,4 @@ style:
sidebarBackground: "#3b4252" sidebarBackground: "#3b4252"
sidebarText: "#eceff4" sidebarText: "#eceff4"
sidebarTextSelect: "#5e81ac" sidebarTextSelect: "#5e81ac"
sidebarTextHighlight:"#eceff4" sidebarTextHighlight: "#eceff4"

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 677 369" width="677" height="369" role="img" aria-label="Bread terminal logo">
<path fill="#FFFFFF" d="M 233.00 96.00 C 228.18 100.52 224.36 105.12 222.00 111.00 C 219.37 117.57 218.50 127.32 219.00 134.00 C 219.39 139.29 220.67 143.48 223.00 148.00 C 225.68 153.19 232.13 154.83 235.00 163.00 C 242.25 183.68 230.25 267.37 235.00 286.00 C 236.52 291.95 238.13 294.33 241.00 297.00 C 243.82 299.62 245.92 300.68 252.00 302.00 C 274.95 306.97 399.57 308.16 424.00 302.00 C 431.16 300.20 434.14 297.95 437.00 295.00 C 439.23 292.71 439.95 291.45 441.00 287.00 C 444.91 270.42 433.78 182.71 441.00 163.00 C 443.68 155.70 449.32 154.77 452.00 150.00 C 454.58 145.40 456.36 140.55 457.00 135.00 C 457.76 128.44 457.34 119.48 455.00 113.00 C 452.81 106.92 448.70 101.69 444.00 97.00 C 438.89 91.90 431.52 87.55 425.00 84.00 C 418.83 80.64 414.26 78.40 406.00 76.00 C 391.93 71.90 363.58 67.13 347.00 66.00 C 335.07 65.19 326.39 66.02 316.00 67.00 C 305.39 68.00 294.29 69.44 284.00 72.00 C 273.98 74.49 263.78 77.77 255.00 82.00 C 246.91 85.90 238.71 90.65 233.00 96.00 Z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#22272B" d="M 233.00 96.00 C 228.18 100.52 224.36 105.12 222.00 111.00 C 219.37 117.57 218.50 127.32 219.00 134.00 C 219.39 139.29 220.67 143.48 223.00 148.00 C 225.68 153.19 232.13 154.83 235.00 163.00 C 242.25 183.68 230.25 267.37 235.00 286.00 C 236.52 291.95 238.13 294.33 241.00 297.00 C 243.82 299.62 245.92 300.68 252.00 302.00 C 274.95 306.97 399.57 308.16 424.00 302.00 C 431.16 300.20 434.14 297.95 437.00 295.00 C 439.23 292.71 439.95 291.45 441.00 287.00 C 444.91 270.42 433.78 182.71 441.00 163.00 C 443.68 155.70 449.32 154.77 452.00 150.00 C 454.58 145.40 456.36 140.55 457.00 135.00 C 457.76 128.44 457.34 119.48 455.00 113.00 C 452.81 106.92 448.70 101.69 444.00 97.00 C 438.89 91.90 431.52 87.55 425.00 84.00 C 418.83 80.64 414.26 78.40 406.00 76.00 C 391.93 71.90 363.58 67.13 347.00 66.00 C 335.07 65.19 326.39 66.02 316.00 67.00 C 305.39 68.00 294.29 69.44 284.00 72.00 C 273.98 74.49 263.78 77.77 255.00 82.00 C 246.91 85.90 238.71 90.65 233.00 96.00 Z M 236.00 111.00 C 240.70 104.95 252.16 97.27 260.00 93.00 C 266.44 89.50 271.52 88.07 279.00 86.00 C 289.20 83.18 303.07 80.21 316.00 79.00 C 329.97 77.69 345.66 77.61 360.00 79.00 C 373.97 80.35 388.66 82.80 401.00 87.00 C 412.06 90.77 423.64 96.26 431.00 102.00 C 436.45 106.26 440.67 110.64 443.00 116.00 C 445.31 121.32 445.92 128.39 445.00 134.00 C 444.12 139.36 440.97 145.01 438.00 149.00 C 435.46 152.40 431.30 151.88 429.00 157.00 C 421.48 173.75 434.77 272.07 429.00 286.00 C 427.65 289.26 427.35 289.61 424.00 291.00 C 407.50 297.83 268.52 298.74 252.00 291.00 C 248.48 289.35 248.34 288.69 247.00 285.00 C 241.59 270.06 254.49 173.67 247.00 157.00 C 244.70 151.89 240.54 152.40 238.00 149.00 C 235.03 145.01 232.05 138.72 231.00 134.00 C 230.15 130.15 230.27 126.67 231.00 123.00 C 231.80 119.01 232.90 114.98 236.00 111.00 Z M 250.00 114.00 C 247.10 116.53 245.19 118.87 244.00 122.00 C 242.69 125.44 242.28 130.28 243.00 134.00 C 243.69 137.59 245.68 140.95 248.00 144.00 C 250.55 147.34 255.50 147.38 258.00 153.00 C 265.57 170.01 255.06 263.56 258.00 276.00 C 258.56 278.37 258.16 278.85 260.00 280.00 C 270.82 286.73 401.52 284.73 414.00 281.00 C 415.91 280.43 416.14 280.60 417.00 279.00 C 422.10 269.55 409.97 170.96 418.00 153.00 C 420.76 146.83 426.43 146.39 429.00 143.00 C 430.99 140.37 432.40 138.08 433.00 135.00 C 433.73 131.28 433.45 125.75 432.00 122.00 C 430.64 118.49 428.73 115.87 425.00 113.00 C 418.39 107.92 402.93 102.18 392.00 99.00 C 381.94 96.07 371.95 95.00 362.00 94.00 C 352.28 93.03 343.91 92.52 333.00 93.00 C 318.78 93.62 295.80 96.46 284.00 99.00 C 277.13 100.48 273.37 101.70 268.00 104.00 C 262.05 106.55 254.16 110.38 250.00 114.00 Z M 292.00 152.00 L 294.00 152.00 L 334.00 192.00 L 334.00 194.00 L 294.00 234.00 L 291.00 234.00 L 283.00 223.00 L 312.00 194.00 L 312.00 192.00 L 283.00 163.00 Z M 337.00 222.00 L 339.00 220.00 L 393.00 220.00 L 394.00 234.00 L 339.00 235.00 L 337.00 233.00 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -62,13 +62,18 @@ foot
# File manager # File manager
nautilus nautilus
# Installer — sourced from [breadway] repo (see pacman.conf) # Installer — from the official extra repo
calamares calamares
calamares-qt6 calamares-qt6
# Bread ecosystem — sourced from [breadway] repo # Bread ecosystem — sourced from [breadway] repo
bakery bakery
# Input / screen utilities
brightnessctl
grim
slurp
# Utilities # Utilities
sudo sudo
git git

View file

@ -26,13 +26,18 @@ Include = /etc/pacman.d/mirrorlist
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# Breadway custom repo — provides: bakery, calamares (pre-built), and the # Breadway custom repo — provides: bakery and the bread ecosystem packages
# bread ecosystem packages (bread, breadbar, breadbox, breadcrumbs, breadpad, # (bread, breadbar, breadbox, breadcrumbs, breadpad, bos-settings).
# bos-settings). # (calamares comes from the official extra repo, not here.)
# #
# TODO: Replace this URL with the actual hosted repo before building. # Packages are published to the Forgejo Arch registry (group "os") by the
# See: https://github.com/Breadway/repo for setup instructions. # .forgejo/workflows/package.yml workflow in each repo, on tag push.
#
# TODO: packages are currently unsigned (TrustAll). For production, sign
# them in CI with a GPG key and switch to SigLevel = Required.
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
[breadway] # The section name must match Forgejo's served db filename
# ({owner}.{group}.{domain}.db) — pacman fetches "<section>.db" from Server.
[Breadway.os.git.breadway.dev]
SigLevel = Optional TrustAll SigLevel = Optional TrustAll
Server = https://repo.breadway.dev/$arch Server = https://git.breadway.dev/api/packages/Breadway/arch/os/$arch

38
packaging/arch/PKGBUILD Normal file
View file

@ -0,0 +1,38 @@
# Maintainer: Breadway <rileyhorsham@gmail.com>
pkgname=bos-settings
pkgver=0.1.0
pkgrel=1
pkgdesc="System settings app for Bread OS"
arch=('x86_64')
url="https://github.com/Breadway/bos"
license=('MIT')
# Some Rust deps (ring/mlua) build vendored C/asm into static archives; makepkg's
# default -flto=auto emits GCC LTO bitcode the Rust (lld) link cannot read,
# causing undefined-symbol errors. Disable LTO.
options=(!lto)
depends=('gtk4' 'glib2' 'hicolor-icon-theme')
optdepends=(
'snapper: snapshot management view'
)
makedepends=('rust' 'cargo')
source=("${pkgname}-${pkgver}.tar.gz")
sha256sums=('SKIP')
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
cargo build --release --locked -p bos-settings
}
check() {
cd "${srcdir}/${pkgname}-${pkgver}"
cargo test --release --locked -p bos-settings
}
package() {
cd "${srcdir}/${pkgname}-${pkgver}"
install -Dm755 target/release/bos-settings "${pkgdir}/usr/bin/bos-settings"
install -Dm644 packaging/arch/bos-settings.desktop \
"${pkgdir}/usr/share/applications/bos-settings.desktop"
install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
}

25
packaging/arch/README.md Normal file
View file

@ -0,0 +1,25 @@
Arch packaging
==============
`PKGBUILD` builds and installs `bos-settings` from source.
## Local build
```bash
makepkg -si
```
## Before publishing to [breadway] repo
1. Tag a release on GitHub.
2. Update `pkgver` to match the tag.
3. Update `source` to the release tarball URL.
4. Run `updpkgsums` (or manually set `sha256sums`).
## Runtime dependencies
| Package | Required | Notes |
|---------|----------|-------|
| `gtk4` | yes | UI toolkit |
| `glib2` | yes | always |
| `snapper` | optional | snapshot management view |

View file

@ -0,0 +1,9 @@
[Desktop Entry]
Name=BOS Settings
Comment=System settings for Bread OS
Exec=bos-settings
Icon=preferences-system
Terminal=false
Type=Application
Categories=Settings;System;
StartupWMClass=bos-settings