Commit Graph

157 Commits

Author SHA1 Message Date
Dylan M. Taylor c27cf7b62c ci: add sonar-project.properties for CI-based analysis
Marks the project ineligible for SonarCloud Automatic Analysis, resolving the
CI-vs-automatic-analysis conflict so the SonarCloud workflow succeeds.
2026-10-21 16:00:26 -04:00
Dylan M. Taylor 45ce3c2b93 ci: add SonarCloud scan via shared reusable workflow
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).
2026-10-21 15:46:49 -04:00
Dylan M. Taylor 7dc837560e ci: add SonarCloud scan workflow and config 2026-10-21 13:54:43 -04:00
Brandon Thomas ba3b0345f0 i18n: translate the reworded AppImage note (#663)
#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>
v0.6.1
2026-10-20 15:00:06 -04:00
Brandon Thomas 5479f0a618 Release 0.6.1: saved filters no longer hide every app (#678)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 14:56:04 -04:00
Brandon Thomas 5fcbed6db8 i18n: translate the update dialog's download prompt
#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>
2026-10-20 14:56:04 -04:00
Dylan M. Taylor 8caaabed5d Merge pull request #663 from Felix-Helleckes/fix/issue-649
fix: address issue #649
2026-10-20 14:53:27 -04:00
Dylan M. Taylor 2ae652f750 Merge pull request #675 from storytold/fix/freebsd-aarch64-tests
fix(freebsd): pick the aarch64 tarball on FreeBSD aarch64; steady the pipe-deadline test
2026-10-20 14:49:47 -04:00
Dylan M. Taylor d6117aa2de Merge pull request #677 from Felix-Helleckes/fix/issue-388
fix: address issue #388
2026-10-20 14:48:49 -04:00
skylar taylor-barrick a538251f1e Fix saved filters hiding all apps on startup (#678) (#684)
* #678: clear obsolete saved filters at desktop startup

* #678: share saved filter migration across startup paths

* #678: cover legacy saved filters and locale-safe UI startup
2026-10-20 14:46:55 -04:00
irgendwasmitfelix aee3305d89 fix: address issue #388 2026-10-20 18:42:12 +02:00
Brandon Thomas 046d48fb2a Skip CodeRabbit reviews on Dependabot PRs (#676)
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>
2026-10-20 11:41:13 -04:00
Brandon Thomas 7e6460e5c8 fix(freebsd): install the aarch64 tarball on FreeBSD aarch64 and steady the pipe-deadline test
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>
2026-10-20 10:53:56 -04:00
irgendwasmitfelix 39ceecb5c2 fix: address issue #649
[Bug Report] [App Launcher] Bad grammar on Linux Appimage directory menu

---
*Auto-fixed by daemon*
2026-10-20 10:41:07 +02:00
Brandon Thomas 8b107ffff2 Release 0.6.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.6.0
2026-10-19 22:17:37 -04:00
Dylan M. Taylor 7c7271e5f6 docs: add SonarCloud and CodeRabbit badges to README (#599)
* docs: add SonarCloud and CodeRabbit badges to README

* docs: put SonarCloud and CodeRabbit badges on their own line
2026-10-18 16:14:51 -06:00
skylar taylor-barrick 345c509fe8 Merge pull request #527 from Jeremy8776/feat/launcher-redesign
feat(ui): a calmer header, toolbar, cards, app page and dialogs
2026-10-18 15:03:44 -06:00
Dylan M. Taylor f1676dfb41 fix(linux): only update release Arch packages and delegate AUR/repo packages (#586) (#588)
* 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
2026-10-18 14:33:45 -04:00
Gabriel Matozo 887d72b3ed docs: point the README's Trunk link at the bundler's site (#562)
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.
2026-10-18 14:31:43 -04:00
Dylan M. Taylor 2b9c13eff7 ci: configure Dependabot for Cargo and GitHub Actions
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2026-10-18 12:31:09 -06:00
Dylan M. Taylor e0af0f81f8 fix(linux): require arch availability for new preferred installs 2026-10-18 14:03:19 -04:00
skylar taylor-barrick 8773041c72 Load a grey card's colour icon ahead of the hover
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.
2026-10-18 12:02:31 -06:00
Dylan M. Taylor b511457458 fix(linux): tighten arch package self-update check, streamline hint message, and test deterministically 2026-10-18 12:48:10 -04:00
Dylan M. Taylor 54f18abc62 fix(linux): return empty kinds for AUR packages, preserve can_pacman fallback, and bound pacman queries 2026-10-18 09:47:40 -04:00
Dylan M. Taylor 5ab2fd1bbb i18n: add AUR update hint translations across all catalogs 2026-10-18 09:08:11 -04:00
Dylan M. Taylor 3243d96ddb fix(linux): exclude ArchPkg from candidates for non-release Pacman installs 2026-10-18 08:43:48 -04:00
Dylan M. Taylor 9cef5d2a0f chore(details): drop competitor reference from deckcraft feature copy (#579) 2026-10-18 08:41:23 -04:00
Gerknis 40f22a612a Fix flake.nix (#526)
* 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>
2026-10-18 08:41:02 -04:00
Dylan M. Taylor 4e533d6d7a 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.
2026-10-18 08:35:47 -04:00
skylar taylor-barrick b39b80580c Merge main into the redesign
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.
2026-10-17 23:55:57 -06:00
skylar taylor-barrick ccc2f4b96c Tests: check the one header label directly instead of looping over it
Rust 1.99's clippy (CI's) rejects a for loop over a one-item array; the list
lost its other entry when the "Launcher" tag left the header.
2026-10-17 22:59:34 -06:00
Dylan M. Taylor ad7f24a912 Merge pull request #565 from dylanmtaylor/feat/arch-package-option
feat(linux): handle installing and updating Arch packages (.pkg.tar.zst) via settings
2026-10-18 00:49:45 -04:00
Mex c08e5f5d4e Drain helper output after reaching the capture limit (#315)
* 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>
2026-10-17 22:02:43 -06:00
Mex 0b3097c7d2 Respect managed AppImage desktop entries and refresh icon caches (#355)
* Respect managed AppImage desktop integration and refresh icon caches

* fix: preserve customized AppImage desktop executables

Enhance entry refresh logic to preserve customized fields.

* test: cover custom and ambiguous AppImage executables
2026-10-17 21:14:41 -06:00
Mex 4d7353a429 Read complete single-instance greetings before comparing versions (#331) 2026-10-17 21:13:01 -06:00
skylar taylor-barrick 6170f81438 Look the time zone up once every few minutes, found or not; no panic paths in two spots
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().
2026-10-17 20:50:27 -06:00
Dylan M. Taylor 0c8f5a7603 feat(linux): handle installing and updating Arch packages (.pkg.tar.zst) via settings 2026-10-17 22:48:36 -04:00
skylar taylor-barrick 393c1c410d Share the layout steps between the app page, dialogs, toolbar and footer
- 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.
2026-10-17 20:43:48 -06:00
Brandon Thomas ed6b32ebf3 Release 0.5.1: fix the macOS build (self-update passes install_dmg's replace flag)
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>
v0.5.1
2026-10-17 22:43:28 -04:00
skylar taylor-barrick 95f693ecfb Show dates on this computer's calendar, one way everywhere
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.
2026-10-17 20:36:34 -06:00
Jeremy e00be806a1 feat(ui): a calmer header, toolbar, cards, app page and dialogs
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.
2026-10-17 20:33:02 -06:00
Dylan M. Taylor ac88b2b6c4 linux: support self-update and restart for Flatpak launcher (#190)
* 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>
2026-10-17 20:32:11 -06:00
Dylan M. Taylor e85a296426 Open the Discord app for Discord links when it's installed (#566)
Detect a registered discord:// handler in the background and fall back to https://discord.gg/artcraft when the deep link can't be opened.
2026-10-17 20:03:55 -06:00
Brandon Thomas 494f43d33d Release 0.5.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 21:43:30 -04:00
Mex c99e375a67 Handle Command+M in the macOS launcher window (#350)
Co-authored-by: skylar taylor-barrick <hi@skylar.cc>
2026-10-17 15:05:46 -06:00
Mex 82bbae4536 Zoom release-note text independently from the main UI (#351) 2026-10-17 14:18:27 -06:00
Mex 0f52d3f305 Resolve MSI package paths before installing or self-updating (#356) 2026-10-17 14:18:17 -06:00
Mex c001e354f6 Use exclusive temporary files for atomic launcher state writes (#314) 2026-10-17 14:18:08 -06:00
Mex c20e3e0ac2 fix(platform): select compatible macOS DMGs for Intel Macs (#414) 2026-10-17 14:17:58 -06:00
Mex e4bb3e6972 fix(download): stop retrying when an oversized partial cannot be removed (#495) 2026-10-17 14:17:48 -06:00