Commit Graph
509 Commits
Author SHA1 Message Date
FredApps ea25ae5795 Merge pull request #1272 from storytold/house-rules
Copy the shared house rules into AGENTS.md
2026-11-06 14:59:36 +01:00
FredApps c599f583e7 Copy the shared house rules into AGENTS.md.
The blocks come from craft-contrib at dde09ea31e2e457f5b4653a6e76f7cdf55944bdf. CLAUDE.md imports AGENTS.md. The house-rules workflow checks the copy.
2026-11-06 11:50:02 +01:00
FredApps 0027613a90 Merge pull request #1262 from ZIDAN44/fix/1204-flatpak-autostart
fix(native): Start on login works inside the Flatpak (#1204)
2026-11-06 00:43:37 +01:00
Zinadin ZidanandClaude Opus 5.5 792ad93cee fix(native): a hidden login entry, or one that starts another app, isn't on in the Flatpak (#1204)
The Flatpak check took any entry with this app's X-Flatpak and a flatpak run
Exec as on, also one a startup manager had hidden (Hidden=true, or GNOME's
X-GNOME-Autostart-enabled=false) or whose Exec started a different app.
It now reads the [Desktop Entry] keys as desktop-entry parsers do and
counts the entry only when it isn't hidden and its Exec is exactly the line
this launcher writes for its own app id.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 04:16:55 +06:00
Zinadin ZidanandClaude Opus 5.5 3170113f47 fix(native): an old host-build login entry doesn't count in the Flatpak; grant the autostart folder (#1204)
After switching from the host build to the Flatpak, the old host entry has
the same file name, so the setting showed on while its Exec still named the
host program. In the Flatpak only the Flatpak form (X-Flatpak=<id> and an
Exec of flatpak run) counts as on, and turning it on rewrites an old entry.

Both manifests grant xdg-config/autostart:create. Flatpak resolves that
on the host and binds the folder at its own path (common/flatpak-context.c,
common/flatpak-exports.c), so the entry can be written there also when
$XDG_CONFIG_HOME is outside home, and the folder is made on a fresh account.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 04:01:11 +06:00
Zinadin ZidanandClaude Opus 5.5 70c79f38f4 fix(native): Start on login works inside the Flatpak (#1204)
Inside the Flatpak the autostart entry went into the sandbox's own config
folder (~/.var/app/<id>/config/autostart), which the host session never
reads, and its Exec line named the in-sandbox /app/bin path. When
/.flatpak-info exists the entry now goes into the host's autostart folder
($HOST_XDG_CONFIG_HOME, else ~/.config), is named after the Flatpak app id,
and starts the app with `flatpak run --command=artcraft-launcher <id>
--hidden` plus X-Flatpak, as the XDG Background portal writes it. Outside a
Flatpak the path and the entry are unchanged. Both manifests note that the
entry relies on --filesystem=home.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 00:50:41 +06:00
FredApps 39a345c7fd Merge pull request #1252 from arnav-hiwarkar/feat/open-without-updating
Open the installed copy without updating, and never offer an update that can't install
2026-11-05 18:02:26 +01:00
arnav-hiwarkarandClaude Opus 5.5 7c09fb79f4 test(ui): cover the dialog, the note's tooltip, Reinstall and stacked rows strictly
- The dialog's Install is disabled with a reason for a refused version.
- The out-of-reach tooltip in card and table; no note for a repository
  copy; the note for a release without a download here.
- Clicking Reinstall installs; clicking a greyed-out Install version X
  sends nothing.
- German rows: a single main button must sit on the menu's line, a
  stacked pair must be centred on it and stay out of the next row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 20:27:09 +05:30
arnav-hiwarkarandClaude Opus 5.5 0fba50e46b fix(ui): the version dialog follows the installability answer; centre a stacked pair
- The version dialog's Install used has_download, so for a copy the
  backend can't replace it stayed enabled and the install was refused
  (CodeRabbit). version_installs and version_refusal are now shared by
  the card's Install version X and the dialog: both are disabled and
  say why on hover.
- A stacked Open/Update sat at the top of its table row, 7 px above the
  menu; it is now laid out at its own size and centred like the rest.
- Docs of AppEntry::installable and AppStatus::Installed say what the
  answer means now: an install would go ahead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 20:27:09 +05:30
arnav-hiwarkarandClaude Opus 5.5 786a00018c fix(native): never probe the system under the reporting lock; document both Installable paths
- When a copy appears between a publisher looking and taking reporting,
  the answer uses the view its detection asked for (last_system_kinds)
  instead of probing there. A copy only enters installed through
  publish_detected, which asks first.
- Event::Installable's doc covers both emissions: in the batch with the
  Latest or Detected it depends on, and alone when only the plan changes.
- Tests: no probe under the lock (expired view kept), a plan report's
  answer follows the current settings, a concurrent poll never splits a
  pair.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 20:27:09 +05:30
arnav-hiwarkarandClaude Opus 5.5 8b1a3666d6 fix(ui): say why Install version X is disabled, and no out-of-reach note while a version is kept
- A disabled 'Install version X' for a version that can't replace this
  copy says so on hover (Jeremy8776).
- The 'latest X' note for a release that can't install here only shows
  while the app follows the latest release: right after a version is
  chosen, the old track's release is refused for that alone (Jeremy8776).
- Tests: the note in the table, the kept-version case, a repository
  Flatpak keeping Reinstall.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:46:23 +05:30
arnav-hiwarkarandClaude Opus 5.5 95b5959cce fix(native): the installability answer knows a repository Flatpak updates with flatpak update
run_install updates a repository-managed Flatpak with flatpak update (on
Linux, on the stable track) before any download is planned, but the
answer treated it as managed elsewhere and said no, so the new Reinstall
gate hid the launcher's only route to that update (Jeremy8776).
repository_update now holds that rule, and both run_install and the
answer ask it. The system_kinds doc says when it runs under a lock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:46:23 +05:30
FredApps ba05065571 Merge pull request #1250 from ZIDAN44/fix/1070-version-size-date
feat(versions): each version in the list shows its release date and download size (#1070)
2026-11-05 15:03:55 +01:00
FredApps 27d5e8f3f4 Merge branch 'main' into fix/1070-version-size-date 2026-11-05 14:52:26 +01:00
arnav-hiwarkarandClaude Opus 5.5 e47d7e8df9 test(native): an older worker waiting behind a report gets the new settings
Stages the race deterministically: a report in progress holds the
planning lock, a worker started before the settings change waits behind
it, the preferred format changes, and the worker's report is checked to
be the new one. Capturing settings at the worker's start would fail it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:17:52 +05:30
arnav-hiwarkarandClaude Opus 5.5 0651ba5702 fix(native): every kept-download report uses the current settings, one at a time
Detection, an install's end and a check's end reported kept downloads
with settings captured when their thread started, so one could land
after the report of a newer settings change and show a stale Resume or
Retry. report_partial now reads the settings itself under a planning
lock, so whichever report comes last was worked out last.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:16:29 +05:30
arnav-hiwarkarandClaude Opus 5.5 5f97629197 fix(native): a settings change works out downloads again off the UI thread
Configure recomputed every app's planned download on the UI thread, and
inside the Flatpak sandbox each asks the host (up to 3 s). That now runs
on a thread, one at a time, each with the settings as they are when it
starts, so the newest settings have the last word. Installs and planned
downloads still ask the system afresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:13:24 +05:30
arnav-hiwarkarandClaude Opus 5.5 0342a60df2 feat(ui): note a newer release that can't install here, and gate Reinstall and Install version on it
- An installed copy behind a release the launcher can't install over it
  shows 'latest X' beside its version, with a tooltip saying why, the
  way a version kept on purpose does (Jeremy8776).
- The single update button keeps its full accessible name when its label
  is shortened (Jeremy8776).
- Reinstall and 'Install version X' only show or enable where an install
  would go ahead, so they can't end in 'has no download' (Jeremy8776).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:10:19 +05:30
arnav-hiwarkarandClaude Opus 5.5 e8fc6723fd fix(native): installability uses current settings and asks the system outside the lock
- The answer reads the backend options when it is worked out, so a job
  that started before a settings change no longer answers with the old
  version track (Jeremy8776).
- What the system can install is asked before the reporting lock is
  taken and kept for a minute: in the Flatpak sandbox asking runs
  flatpak-spawn on the host (up to 3 s). Installs still ask afresh
  (Jeremy8776, CodeRabbit).
- No answer, and nothing asked, for an app that isn't installed: the UI
  only uses it for an installed copy. Startup's cached replay, before
  detection, no longer asks at all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:10:19 +05:30
arnav-hiwarkarandClaude Opus 5.5 3c60bebc7e perf(native): installability doesn't ask pacman how to word a refusal
install_plan takes how a copy managed elsewhere is explained. Installs
keep the full message (with pacman -Si naming the repository); the
installability answer, which runs on every check under the reporting
lock, only needs yes or no.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 18:55:54 +05:30
arnav-hiwarkarandClaude Opus 5.5 93d4039268 fix(native): installability asks the same plan an install does
A copy installed outside the launcher, such as a FreeBSD system binary
in /usr/local/bin, was reported installable when a newer release had a
matching tarball, because only the download choice was asked. The install
then refused it as installed outside the launcher. install_plan now holds
every check an install makes before downloading (a copy managed
elsewhere, the platform, the release and its version track, the package),
and both run_install and Event::Installable use it.

Refs review by FredApps on #1252.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 18:49:41 +05:30
arnav-hiwarkarandClaude Opus 5.5 6218b51b65 fix(native): send installability in the same batch as the release or copy it was worked out for
A poll could fall between Installable and the Latest or Detected after it,
and an answer worked out from older state could land after a newer one.
Each change to an app's latest release or installed copy is now recorded,
answered and queued under one lock, and the pair is queued together.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 17:57:43 +05:30
arnav-hiwarkarandClaude Opus 5.5 c8d9c237ba feat(ui): stack Open over Update in a table row too narrow for both side by side
Long languages (German, French, Czech, Polish, Hungarian, Spanish, Russian,
Portuguese) don't fit OPEN | UPDATE in the table's action slot. Their rows
now grow to hold Open, naming its version, above Update, instead of
dropping Open into the menu. Cards and the details page keep a fixed
height and stay side by side, or show the update alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 17:54:32 +05:30
arnav-hiwarkarandClaude Opus 5.5 4931dd717f fix: the backend says whether an update can replace the installed copy
The UI guessed from any download this platform takes, but an install keeps
the way a copy was installed (an AppImage with an AppImage, an MSI with an
MSI), so an AppImage copy with a .deb-only release still showed Update,
was announced and started automatically, and then failed. The backend now
sends Event::Installable, from the same plan an install makes, before each
Latest and Detected it depends on and whenever the plan changes. The UI
uses it for installed copies and keeps its own check where there is no
answer (the web build).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 17:50:46 +05:30
RishikeshanandRishi-gdrx 1a3ce2033b fix(native): fall back to release pages when the GitHub API fails (#908)
Co-authored-by: Rishi-gdrx <rishikeshan.ns@partners.goodrx.com>
2026-11-05 13:07:29 +01:00
arnav-hiwarkarandClaude Opus 5.5 3583972e93 test(ui): cover the split in the drawer, auto-update skips, the web and a German table
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 17:16:02 +05:30
arnav-hiwarkarandClaude Opus 5.5 968574c885 feat(ui): split the update button so the installed copy opens without updating
While an update waits (Update to X, Retry update), the main button is two
halves: an outlined Open that launches the installed copy, naming its
version where it fits, and the solid Update. Labels are measured and step
down to fit; the left keeps its version longest. Where even OPEN | UPDATE
doesn't fit, the single update button shows as before and Open stays in
the menu. Each half's accessible name is the full meaning.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 16:58:41 +05:30
arnav-hiwarkarandClaude Opus 5.5 38b0f305e7 fix(core): no update offered when the newer release has nothing for this platform
An installed app whose newer release has no installable download here
showed Update available, counted in Updates, notified and was picked by
auto-update, and installing failed with 'has no download'. It now reports
Installed, like a repository-managed copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 16:51:27 +05:30
Zinadin ZidanandClaude Opus 5.5 8649959adb feat(versions): each version in the list shows its release date and download size (#1070)
Choose version, and the launcher's own version list in Settings, showed
only the tag. Each row now adds, at its right, the day the release came
out and the size of the package this machine would download, in the
launcher's usual date and size formats. Either is left out when unknown;
the row keeps the tag as its name and carries them as its description.
On the selected row they take the row's text colour, not the muted grey.

The size follows the backend's choice of package. An app's installed
copy keeps its format (an MSI stays an MSI, the launcher's Windows copy
is its portable ZIP, an AppImage stays an AppImage), else the preferred
formats among those it installs here; FreeBSD always takes the tarball.
Where that depends on package managers the UI can't see (other Linux
installs), the row gives the date alone. The launcher's own rows size
what its self-update downloads, the format the running copy was
installed as, which the backend now reports once it knows; until then
the manual download, except on Linux.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 12:44:52 +06:00
Bryan BrunettiandClaude Opus 5.5 885538a5aa feat: per-app launch options passed when an app is opened (#830)
Each installed app's menu gains "Launch options…": flags typed there are
saved in Settings.launch_flags (app.ron, keyed by catalog id) and added to
the app's command line on Open. core::args::split turns the text into
arguments (whitespace, "…"/'…' quoting, backslashes kept for Windows
paths) and refuses an unclosed quote, both in the dialog and at launch.
Flatpak, launcher-unpacked, plain binary and macOS .app installs all pass
the flags through; strings are translated in every complete catalog.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 03:19:51 +01:00
Dylan M. Taylor da456e1dd4 Pass the Linux signing key to the release workflow (#1242) 2026-11-04 17:46:02 -05:00
Dylan M. Taylor 9a317f2a8a Merge pull request #1203 from tommy1616/i18n/remaining-noto-tc-fonts
i18n: recognize the remaining variable Noto TC fonts
2026-11-03 08:51:33 -05:00
Dylan M. Taylor 6fe4a4ac01 Merge pull request #806 from devius/ka-language
i18n: add Georgian (ka) interface language
2026-11-03 08:41:30 -05:00
Dylan M. Taylor d50b68e2af Merge remote-tracking branch 'origin/main' into ka-review 2026-11-03 08:35:51 -05:00
Dylan M. Taylor e33af96b9f Merge pull request #805 from devius/fonts-georgian
Draw Georgian with the system's Georgian font
2026-11-03 08:35:43 -05:00
Dylan M. Taylor 0f47381623 Merge remote-tracking branch 'origin/main' into fonts-review
# Conflicts:
#	crates/ui-egui/src/i18n/lang.rs
2026-11-03 08:29:40 -05:00
Dylan M. Taylor 0825b5d375 i18n(ka): fix Georgian after main's Installed and catalog changes
Add the Georgian rows for the strings main added (move, pin, reorder) and
the three Installed fields in the Georgian test, matching the Traditional
Chinese fix.
2026-11-03 08:29:26 -05:00
SHXJ e8088144e1 i18n: recognize the remaining variable Noto TC fonts
Add the variable OTC filenames NotoSansCJK-VF.otf.ttc and NotoSansCJK-VF.ttf.ttc, and the subset variable NotoSansTC-VF.otf, so an installation carrying only one of them still draws the Traditional Chinese interface.
2026-11-03 21:27:21 +08:00
Dylan M. Taylor 65f12df0a8 Merge remote-tracking branch 'origin/main' into ka-review
# Conflicts:
#	README.md
#	crates/ui-egui/src/i18n/lang.rs
#	crates/ui-egui/src/i18n/tests.rs
2026-11-03 08:26:37 -05:00
Dylan M. Taylor 10197660d9 Merge pull request #1195 from tommy1616/feat/traditional-chinese-taiwan 2026-11-03 08:24:14 -05:00
Dylan M. Taylor 4613484911 i18n: fix Traditional Chinese after main's Installed and catalog changes
Fill the new Installed fields in the TC test and add zh-TW rows for the
pinning and retry strings that main added, so the catalog completeness
test passes again.
2026-11-03 08:11:27 -05:00
Dylan M. Taylor a1ec75c653 Merge remote-tracking branch 'origin/main' into feat/traditional-chinese-taiwan 2026-11-03 08:09:30 -05:00
FredApps 1f168df0af Merge pull request #1149 from tareq-halaby/feat/pin-apps-to-top
Add pin-to-top and reorder for launcher apps
2026-11-03 09:17:12 +01:00
FredApps 8aa8df744a Fix pinned app drops outside the scroll viewport 2026-11-03 09:08:50 +01:00
FredAppsandClaude Opus 5.5 644b2adb6f style(ui): rustfmt the pinned-row test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 09:06:33 +01:00
FredAppsandClaude Opus 5.5 c20bd909d9 Merge current main into #1149
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 09:00:18 +01:00
FredAppsandClaude Opus 5.5 cbe1582624 fix(ui): keep pinned rows' buttons in their slot, one place ends the drag
- The action row's width lost a gap for every app, pinned or not (`+ gap`), so
  each row's menu ran 8 px past its column. The main button keeps its old slot;
  a pinned app's grip now leads the row and the table widens its actions column
  by one square while a pinned app is shown, so no button is squeezed (#956) and
  every row stays in line. A test checks a pinned row against an unpinned one.
- The grip only shows in the grid and the table, where dropping works; on the
  details page it was a control that did nothing.
- A released drag ends in one place, after the list draws, instead of in the
  grid, the table, the empty list and each drop target.
- Move up and Move down use the drag's `reorder_pinned_to`; `reorder_pinned`
  and its test go, and `pinned_neighbor` returns the slot.
- Drop the settings test that only re-ran its own steps (the UI test covers
  hiding a pinned app), the tool-generated design note, and use "Lösen" for
  Unpin in German.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 09:00:18 +01:00
SHXJ 23aab338f6 i18n: search openSUSE's Traditional Chinese font directory
openSUSE's google-noto-sans-tc-fonts installs NotoSansCJKtc-VF.otf directly in /usr/share/fonts/truetype; search it so the Traditional Chinese interface does not fall back to English there.
2026-11-03 13:44:47 +08:00
Dylan M. Taylor 61230e5fb8 Merge pull request #1147 from dylanmtaylor/feat/flatpark-externally-managed
feat: preserve Flatpak remotes and add opt-in OCI migration
2026-11-03 00:09:39 -05:00
Dylan M. Taylor 5ea8d5bcd9 Preserve Flatpak bundle installation scope 2026-11-03 00:03:22 -05:00