Calls storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
with secrets: inherit. Adds SonarCloud badge to README where missing and
removes the redundant sonar-project.properties (config now passed by the
reusable workflow).
#663 reworded the settings dialog's note to "On Linux, custom folders use
AppImage format." The meaning is unchanged, so each catalog's existing
translation is reused under the new key. The old wording is still used in
dialogs.rs, so its rows stay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#677 added "A new version is available. Download it to replace this
version?" without catalog rows, so complete_catalogs_cover_every_ui_literal
failed on main and those languages showed English. Adds the row to all ten
complete catalogs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds .coderabbit.yaml so CodeRabbit no longer reviews or comments on PRs opened by dependabot[bot].
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Craft App releases ship <app>-<ver>-freebsd-aarch64.tar.gz next to the
x86_64 tarball, but the platform tokens had none for FreeBSD on ARM64, so
nothing was picked there and the backend's kept-download tests failed on
the nightly FreeBSD aarch64 job. Pick freebsd-aarch64 on FreeBSD ARM64 the
way freebsd-x86_64 is picked on x86_64 (no cross-arch fallback), with a
core test on SoundCraft v0.10.0's release metadata trimmed to its FreeBSD
tarballs, and add the token to the backend tests' synthetic release.
The inherited-pipe test gave its direct child one second to start a second
test process and fill both pipes; under emulation that takes longer, so
run() killed the child first and the test never reached the case it
checks. Retry with a longer deadline (1 s, 4 s, 16 s) when the child didn't
get that far, let the descendant hold the pipes for 120 s unless stopped,
and still require run() to return within twice its deadline.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(linux): only update release Arch packages and delegate AUR/repo packages (#586)
- Only consider release Arch packages (bundle ID starting with 'ai.storyteller.') eligible for launcher updates.
- Keep AUR packages (<app>, <app>-bin, <app>-git) directed to the user's AUR helper (yay/paru).
- Direct repository packages (e.g. Omarchy) to 'sudo pacman -Syu' and add translations across all 10 locales.
- Only self-update launcher if installed as the release Arch package ('ai.storyteller.artcraft-launcher'), preventing conflicts on AUR installs.
- Check pacman DB presence before assuming ArchPkg availability.
* fix(linux): exclude ArchPkg from candidates for non-release Pacman installs
* i18n: add AUR update hint translations across all catalogs
* fix(linux): return empty kinds for AUR packages, preserve can_pacman fallback, and bound pacman queries
* fix(linux): tighten arch package self-update check, streamline hint message, and test deterministically
* fix(linux): require arch availability for new preferred installs
The "Build from source" section linked trunk to https://trunkrs.dev/, which no
longer serves the WAsm bundler: the domain was re-registered and now serves an
unrelated site. The bundler's own repo (trunk-rs/trunk) points at
https://trunk-rs.github.io/trunk/ in its README and in site/config.toml
(base_url), so the link now goes there. No other occurrence of the old URL in
the repo.
egui decodes the colour picture on a background thread the first time it is
asked for, so the first hover over a card showed no icon for a moment, and the
grey-card test (8 frames, no real time) failed on CI's slower Windows runner.
The grey path now starts that load, and the test waits for the decode.
* Add experimental flake.nix for NixOS/Linux development
This adds an experimental flake-based development environment and package entry for ArtCraft Launcher.
What this adds:
- `flake.nix` at the repository root
- Rust toolchain via `rust-overlay`
- Required native Linux libraries for the Rust workspace
- A dev shell via `nix develop`
- A package/app target via `nix run` / `nix build`
Why:
ArtCraft Launcher is a Rust workspace and currently has no Nix flake support. This makes local development and installation much easier for NixOS/Linux users.
Notes:
- This is intentionally minimal and experimental.
- It targets the development environment and local package use.
- Additional refinements may be needed for specific Wayland/X11 setups.
* Fix flake metadata to match ArtCraft Launcher and remove GTK dependency
* add flake.lock
* Update flake.nix: replace deprecated xorg packages with their new names
* added runtimeDependencies and fixed nativeBuildInputs: removed ninja and cmake to resolve conflicts with Cargo on app build, added autoPatchelfHook to auto hook runtimeDependencies into the RPATH of bin; added result in .gitignore to prevent build results from project
* Add X11 support libraries
Added X11 support libraries to the flake configuration.
* Nix: build the flake in CI and document nixGL for other distros
The new Nix workflow builds the flake and checks that every library
winit and wgpu dlopen() at runtime is on the binary's RUNPATH, so a
missing runtimeDependencies entry fails CI instead of failing on
`nix run`. It only runs when the flake, Cargo manifests or lockfile
change.
The README gains a short Nix section: the dev shell, `nix run`, and
nixGL for non-NixOS distros, where a Nix-built program can't load the
host's GPU drivers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Drop the local runtime-libs job; it moves to the shared Nix workflow
Per review: the build-and-RUNPATH check belongs in
storytold/craft-common-actions (opt-in check-runtime-libs), so
.github/workflows/nix.yml goes back to main's shared eval job.
---------
Co-authored-by: SaB131X <sea1024wm@gmail.com>
Co-authored-by: skylar taylor-barrick <hi@skylar.cc>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- Only consider release Arch packages (bundle ID starting with 'ai.storyteller.') eligible for launcher updates.
- Keep AUR packages (<app>, <app>-bin, <app>-git) directed to the user's AUR helper (yay/paru).
- Direct repository packages (e.g. Omarchy) to 'sudo pacman -Syu' and add translations across all 10 locales.
- Only self-update launcher if installed as the release Arch package ('ai.storyteller.artcraft-launcher'), preventing conflicts on AUR installs.
- Check pacman DB presence before assuming ArchPkg availability.
Main's Arch package option (#565) went into the Linux install-format list in
dialogs.rs, which this branch moved to settings_dialog.rs; it is added there.
* Drain helper output after reaching the capture limit
* fix: enforce helper deadline while draining inherited pipes
Keep both reader completions under the original shared timeout after the direct child exits. Add a finite self-spawned descendant regression that fails before the fix. Fresh isolated module: 6 tests passed, 2 ignored fixture entry points; strict Clippy and formatting passed. Independent review approved. Timeout detaches readers as before; no descendant-tree cancellation or lifetime resource-cleanup claim. AI assistance: OpenAI Codex for @MMexicann.
---------
Co-authored-by: skylar taylor-barrick <hi@skylar.cc>
jiff caches only a zone it found, so an unreadable one (a bad TZ, a bare
container) was searched for on every date of every frame. local_time keeps the
last answer either way for five minutes. Settings' two columns borrow their
shared state with try_borrow_mut, and the app page's next/previous use get().
- theme.rs gains the layout block: PAD, COLUMN_GAP, BOX_MARGIN, the toolbar,
dialog and page widths that change the layout, the three title sizes, and the
icon-link padding and gap. The app page, Settings, release notes and the small
prompts read from it instead of their own 12/14/16/24/32s.
- One brand-coloured scroll bar (sheet::accent_scroll takes the colour), used by
the app page too instead of a copy.
- An app that is not installed draws its text and accent in the theme's muted
grey; only the icon is a grey copy of itself.
- The compact toolbar puts "Sort" before its picker, like the full row; refresh
lights up on hover like the grid/table switch beside it.
- The grid keeps its sort rule in one place (views::grid_sort_now), and only the
grid groups installed apps first; the table keeps its column's order.
- icon_links owns its spacing, so neighbouring targets never touch, and Settings
sizes its icon row with icon_links_width.
- ATTRIBUTION.md lists discord.svg; a stale comment about the grid's sorts is gone.
install_dmg gained a replace parameter in #461; the macOS-only self-update call and its test
weren't updated, so the 0.5.0 release's macOS job failed to compile. Self-update writes over the
launcher's own bundle, which copy_app accepts without replace, so pass false.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cards wrote "Last updated" as a fixed 07/10/2026 while the table, app page and
release notes said "Oct 7, 2026", and every date was the UTC day, so a release
published late on the 7th UTC read as the 7th in Tokyo. local_time::civil adds
the system zone's offset at that instant (jiff on the desktop, which re-reads the
zone every few minutes; the browser's Date on the web) and falls back to UTC
when the zone can't be read. date_text is the one formatter.
Header: the Discord link and the refresh button leave the top bar; refresh sits in the toolbar and
Settings stays on the right.
Toolbar: the filter tabs go (installed apps come first, the rest under a Not installed heading); a
sort dropdown (Name A-Z / Z-A, Recently updated, Frequently used), search, Update all and the
grid/table switch drawn as two icons.
Cards and table: the version sits in the strip, apps that are not installed are drawn in grey until
hovered, the headline and last-updated date replace the status sentence; the table's two version
columns become one.
Footer: Website, GitHub and Discord join the social links as icons with more room between them.
App page: pictures, story and facts re-laid out for windows with and without screenshots.
Dialogs: Settings and release notes become large cards like the app page (a header with the brand
colour, a scrolling body, a pinned footer), Settings in boxed groups, two columns when wide.
Also adds core::release::safe_web_link, so links in release notes open only when they are plain https.
* linux: support self-update and restart for Flatpak launcher
Enable self-updating and restarting when ArtCraft Launcher runs inside a Flatpak container.
- Add `Install::Flatpak` to detect user Flatpak bundle installations via sandbox detection, app-path inspection in /.flatpak-info, and host flatpak-spawn availability.
- Cache `process::is_flatpak_available()` via `OnceLock` to prevent redundant host probes.
- Reinstall the downloaded .flatpak bundle with `--reinstall` through the Flatpak host portal.
- Schedule a detached relaunch helper on the host via flatpak-spawn that monitors the running Flatpak container instance/host PID until exit and relaunches via `flatpak run`, timing out after 60s without launching duplicate instances if exit fails.
- Add test coverage for Flatpak instance metadata and PID resolution.
* linux: detect the Flatpak bundle off the startup path
- Work out how the launcher is installed on the check thread, just before a
newer launcher is announced, instead of in NativeBackend:🆕 in the
Flatpak it asks the host's flatpak, which held up the first frame. The UI
re-reads its capabilities on LauncherUpdate.
- Self-update only a per-user copy whose origin is the bundle's own
(artcraft-launcher[N]-origin), asked through `flatpak info --show-origin`;
/.flatpak-info doesn't record it. A copy from a repository keeps Download:
an unsigned bundle can't go into a signed remote and would swap the build
under an unsigned one.
- Read app-path for ~/.local/share/flatpak only; XDG_DATA_HOME points into
~/.var/app inside the sandbox, so dirs::data_local_dir never matched.
- Don't relaunch blind when neither the host PID nor the instance id is known.
- Drop the cached flatpak probe: nothing on the startup path calls it now.
* fix(update): prevent accidental downgrades when releases or repos lag
---------
Co-authored-by: skylartaylor <hi@skylar.cc>