Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
b7bbce6
chore(release): prepare v0.14.1 Windows launcher hotfix
turinglambdaai Oct 27, 2026
37fbe9a
feat(windows): native settings navigation, commands parity and titleb…
turinglambdaai Oct 27, 2026
20f3812
test(windows): stable settings sidebar and pane automation IDs
turinglambdaai Oct 27, 2026
2b4af04
test(windows): exercise packaged settings navigation and titlebar icon
turinglambdaai Oct 27, 2026
cb37985
docs(release): document v0.14.1 native Windows settings parity in CHA…
turinglambdaai Oct 27, 2026
b6a16f7
docs(release): document v0.14.1 native Windows settings parity in doc…
turinglambdaai Oct 27, 2026
dcbd6e9
docs(release): document v0.14.1 native Windows settings parity in doc…
turinglambdaai Oct 27, 2026
d38ca0a
docs(release): document v0.14.1 native Windows settings parity in doc…
turinglambdaai Oct 27, 2026
1515862
fix(windows): make tray update flow visible and refresh signed downlo…
turinglambdaai Oct 27, 2026
9e5b1e2
fix(windows): declare visible native update workflow
turinglambdaai Oct 27, 2026
da0612e
test(windows): expose native settings/update acceptance in windows/Wi…
turinglambdaai Oct 27, 2026
5370740
test(windows): expose native settings/update acceptance in windows/Ma…
turinglambdaai Oct 27, 2026
e666c32
test(windows): expose native settings/update acceptance in windows/Se…
turinglambdaai Oct 27, 2026
9b50bb9
test(windows): assert settings Commands visibility and hidden-tray up…
turinglambdaai Oct 27, 2026
adf66a3
test(windows): hidden update entry acceptance plumbing in windows/Win…
turinglambdaai Oct 27, 2026
3147e5f
test(windows): hidden update entry acceptance plumbing in windows/Mai…
turinglambdaai Oct 27, 2026
3d4390f
docs: explain visible Windows update and MSI handoff (CHANGELOG.md)
turinglambdaai Oct 27, 2026
22df75d
docs: explain visible Windows update and MSI handoff (docs/user-guide…
turinglambdaai Oct 27, 2026
a359837
docs: explain visible Windows update and MSI handoff (docs/user-guide…
turinglambdaai Oct 27, 2026
fbc92a6
fix(windows): refuse MSI auto-handoff from portable ZIP executable
turinglambdaai Oct 27, 2026
d9d9ec9
test(windows): verify recent v0.13.3 to v0.14.0 MSI update (scripts/a…
turinglambdaai Oct 27, 2026
91b6b4e
test(windows): verify recent v0.13.3 to v0.14.0 MSI update (scripts/a…
turinglambdaai Oct 27, 2026
9f82454
test(windows): verify recent v0.13.3 to v0.14.0 MSI update (.github/w…
turinglambdaai Oct 27, 2026
c4895a2
fix(linux): center native search glyph and hide routine ready status
turinglambdaai Oct 27, 2026
4e1cc40
test(linux): assert search icon alignment and nonpersistent ready text
turinglambdaai Oct 27, 2026
52d6e19
test(linux): use backend result readiness and reject redundant reside…
turinglambdaai Oct 27, 2026
f47f2b8
docs(release): Linux launcher alignment/status behavior in CHANGELOG.md
turinglambdaai Oct 27, 2026
6ed246b
docs(release): Linux launcher alignment/status behavior in docs/cross…
turinglambdaai Oct 27, 2026
4ac226a
docs(release): Linux launcher alignment/status behavior in docs/user-…
turinglambdaai Oct 27, 2026
c799cad
docs(release): Linux launcher alignment/status behavior in docs/user-…
turinglambdaai Oct 27, 2026
f31bc7c
test(linux): include cmath explicitly for geometric alignment assertion
turinglambdaai Oct 27, 2026
fb92e3c
fix(search): include cached local files alongside apps without launch…
turinglambdaai Oct 27, 2026
bd2e6c7
fix(search): start local filename index during boot for unified search
turinglambdaai Oct 27, 2026
64a4839
test(search): Windows path fixture appears for ordinary filename and …
turinglambdaai Oct 27, 2026
afa0f04
test(windows): packaged WinUI discovers real Documents file without f…
turinglambdaai Oct 27, 2026
d1358dd
test(search): indexed catalog entries flow into normal mixed launcher…
turinglambdaai Oct 27, 2026
c231ef0
docs(search): describe unified filename queries and explicit find in …
turinglambdaai Oct 27, 2026
ec5c832
docs(search): describe unified filename queries and explicit find in …
turinglambdaai Oct 27, 2026
f8ec892
docs(search): describe unified filename queries and explicit find in …
turinglambdaai Oct 27, 2026
5cab4ba
docs(search): describe unified filename queries and explicit find in …
turinglambdaai Oct 27, 2026
347e503
test(search): keep file catalog assertion valid in cond branch
turinglambdaai Oct 27, 2026
03a3f41
ui(search): advertise files in localized search placeholder (shared/i…
turinglambdaai Oct 27, 2026
9b178e7
ui(search): advertise files in localized search placeholder (shared/i…
turinglambdaai Oct 27, 2026
eba4c80
ui(search): advertise files in localized search placeholder (windows/…
turinglambdaai Oct 27, 2026
88f1c18
ui(search): advertise files in localized search placeholder (macos-ho…
turinglambdaai Oct 27, 2026
4043c01
ui(search): advertise files in localized search placeholder (linux/sr…
turinglambdaai Oct 27, 2026
80e8976
ui(search): advertise files in localized search placeholder (windows/…
turinglambdaai Oct 27, 2026
d8affa7
ui(search): advertise files in localized search placeholder (linux/Ge…
turinglambdaai Oct 27, 2026
c0246fd
revert(search): restore opt-in find UX without unsolicited mixed resu…
turinglambdaai Oct 27, 2026
583bb4b
revert(search): restore opt-in find UX without unsolicited mixed resu…
turinglambdaai Oct 27, 2026
acaf46a
revert(search): restore opt-in find UX without unsolicited mixed resu…
turinglambdaai Oct 27, 2026
33ef98c
revert(search): restore opt-in find UX without unsolicited mixed resu…
turinglambdaai Oct 27, 2026
533f882
revert(search): restore opt-in find UX without unsolicited mixed resu…
turinglambdaai Oct 27, 2026
4c79700
revert(search): restore opt-in find UX without unsolicited mixed resu…
turinglambdaai Oct 27, 2026
57e823f
revert(search): retain explicit find semantics (docs/file-search-arch…
turinglambdaai Oct 27, 2026
088892c
revert(search): retain explicit find semantics (docs/user-guide.md)
turinglambdaai Oct 27, 2026
6b615dd
revert(search): retain explicit find semantics (docs/user-guide.zh-CN…
turinglambdaai Oct 27, 2026
dab74df
revert(search): retain explicit find semantics (shared/i18n/en.json)
turinglambdaai Oct 27, 2026
58d7dcc
revert(search): retain explicit find semantics (shared/i18n/zh.json)
turinglambdaai Oct 27, 2026
48e383f
revert(search): retain explicit find semantics (windows/MainWindow.xaml)
turinglambdaai Oct 27, 2026
0830b37
revert(search): retain explicit find semantics (macos-host/Sources/Ri…
turinglambdaai Oct 27, 2026
f6ec512
revert(search): retain explicit find semantics (linux/src/main.cpp)
turinglambdaai Oct 27, 2026
72ce770
revert(search): retain explicit find semantics (windows/GeneratedI18n…
turinglambdaai Oct 27, 2026
704d36b
revert(search): retain explicit find semantics (linux/GeneratedI18n.hpp)
turinglambdaai Oct 27, 2026
911f924
fix(windows): make explicit find search known folders before slow Win…
turinglambdaai Oct 27, 2026
ba0d899
fix(windows): emit UTF-8 filename paths from PowerShell search
turinglambdaai Oct 27, 2026
e0ca83c
fix(windows): use valid PowerShell UTF-8 output encoding constructor
turinglambdaai Oct 27, 2026
f0c5746
test(windows): packaged WinUI find command locates real Documents fix…
turinglambdaai Oct 27, 2026
ecf7250
test(windows): smoke actual find file and verify known-folder-first s…
turinglambdaai Oct 27, 2026
bf1f50e
test(windows): simplify real find smoke and avoid expression-level de…
turinglambdaai Oct 27, 2026
eef017f
docs(release): document Windows explicit find fix and actual file acc…
turinglambdaai Oct 27, 2026
c25acc6
fix(linux): never map an uninitialized launcher before first backend …
turinglambdaai Oct 27, 2026
932b6bf
feat(linux): align Settings with five native GTK sidebar categories
turinglambdaai Oct 27, 2026
e0970c2
feat(linux): implement functional Commands editor through shared bind…
turinglambdaai Oct 27, 2026
5046cee
feat(linux): implement native per-user start-at-login control via XDG…
turinglambdaai Oct 27, 2026
4cba3ee
fix(linux): restore coherent GTK host before isolated autostart changes
turinglambdaai Oct 27, 2026
c709b63
feat(linux): native XDG per-user autostart registration
turinglambdaai Oct 27, 2026
3a8f9f9
feat(linux): expose XDG Start at login switch in General Settings
turinglambdaai Oct 27, 2026
1989465
feat(linux): background login launches remain hidden and do not toggl…
turinglambdaai Oct 27, 2026
4e33044
feat(windows): add HKCU Run login-item adapter with background launch
turinglambdaai Oct 27, 2026
f1b3b70
feat(windows): opt-in quiet start at login integration (windows/App.x…
turinglambdaai Oct 27, 2026
c30d8ff
feat(windows): opt-in quiet start at login integration (windows/MainW…
turinglambdaai Oct 27, 2026
25ac3c5
feat(windows): opt-in quiet start at login integration (windows/Setti…
turinglambdaai Oct 27, 2026
8b61a67
feat(windows): opt-in quiet start at login integration (windows/Setti…
turinglambdaai Oct 27, 2026
25298ce
feat(macos): native per-device SMAppService start-at-login toggle and…
turinglambdaai Oct 27, 2026
b539d01
test(linux): no blank startup frame, five settings tabs and XDG login…
turinglambdaai Oct 27, 2026
0f8f17c
docs(release): Linux first frame, Settings parity and opt-in login it…
turinglambdaai Oct 27, 2026
14ecadd
docs(release): Linux first frame, Settings parity and opt-in login it…
turinglambdaai Oct 27, 2026
7899a9e
docs(release): Linux first frame, Settings parity and opt-in login it…
turinglambdaai Oct 27, 2026
811b4b2
docs(release): Linux first frame, Settings parity and opt-in login it…
turinglambdaai Oct 27, 2026
7875fc6
build(windows): link Shell32 for native login-item command-line parsing
turinglambdaai Oct 27, 2026
5fb0a48
test(windows): packaged WinUI start-at-login toggle updates HKCU Run …
turinglambdaai Oct 27, 2026
b3850a5
feat(linux): record shortcut keys directly in GTK Settings like macOS…
turinglambdaai Oct 27, 2026
c98ce33
docs(linux): record keyboard shortcuts in GTK settings (docs/cross-pl…
turinglambdaai Oct 27, 2026
8800569
docs(linux): record keyboard shortcuts in GTK settings (docs/user-gui…
turinglambdaai Oct 27, 2026
dc7fc39
docs(linux): record keyboard shortcuts in GTK settings (docs/user-gui…
turinglambdaai Oct 27, 2026
331cefa
test(macos): expose login startup control to packaged accessibility a…
turinglambdaai Oct 27, 2026
49500f1
test(macos): expose login startup control to packaged accessibility a…
turinglambdaai Oct 27, 2026
01af6ef
fix(linux): do not expose nonfunctional global command hotkey controls
turinglambdaai Oct 27, 2026
a397602
docs(linux): distinguish functional aliases from unsupported per-comm…
turinglambdaai Oct 27, 2026
a39e491
docs(linux): distinguish functional aliases from unsupported per-comm…
turinglambdaai Oct 27, 2026
d3f950b
docs(linux): distinguish functional aliases from unsupported per-comm…
turinglambdaai Oct 27, 2026
ade1608
docs(linux): distinguish functional aliases from unsupported per-comm…
turinglambdaai Oct 27, 2026
6485892
fix(linux): reveal first-search errors rather than leaving hidden emp…
turinglambdaai Oct 27, 2026
57447af
test(linux): initial search failures reveal diagnostic instead of tra…
turinglambdaai Oct 27, 2026
815e178
test(windows): packaged background login duplicate never summons hidd…
turinglambdaai Oct 27, 2026
95a0fff
fix(linux): Wayland shortcut denial must not pop background login sta…
turinglambdaai Oct 27, 2026
f023f81
test(linux): startup login remains hidden despite backend readiness
turinglambdaai Oct 27, 2026
6153534
test(linux): autostart Exec safely quotes AppImage filenames and perc…
turinglambdaai Oct 27, 2026
6ed2d0d
Merge main into v0.14.1 release candidate; harden Windows settings UI…
turinglambdaai Oct 27, 2026
255817e
ci(linux): use full Racket for host-side Rivet build and deps
turinglambdaai Oct 28, 2026
366ac41
fix(linux): keep actionable Wayland hotkey portal failures visible (#…
turinglambdaai Oct 28, 2026
59048db
Merge main into v0.14.1 release preparation (preserve latest Linux an…
turinglambdaai Oct 28, 2026
9184c8e
fix(linux): register native desktop identity before Wayland portal sh…
turinglambdaai Oct 28, 2026
a31dd15
fix(linux): align GNOME portal identity with native desktop package a…
turinglambdaai Oct 28, 2026
7d7f798
chore: pin merged Rivet desktop identity support
turinglambdaai Oct 28, 2026
01a4f1e
docs: align three-platform Settings guide and keep GNOME 50 portal cl…
turinglambdaai Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/acceptance.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ permissions:
env:
# Unified immutable upstream revision containing AppImage handoff,
# branded-DMG signature preservation, and macOS update rollback safety.
RIVET_PIN: a92877c02b6453b1826bfd061d7bbe70647ce5fa
RIVET_PIN: e18c28e6b6b18ab0f59559e82e30c51c4229d91f

jobs:
windows:
Expand Down Expand Up @@ -106,7 +106,7 @@ jobs:
- name: Remember full Racket command path
run: echo "FULL_RACKET_BIN=$(dirname "$(command -v raco)")" >> "$GITHUB_ENV"
- name: Set up embeddable Racket CS
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@a92877c02b6453b1826bfd061d7bbe70647ce5fa
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@e18c28e6b6b18ab0f59559e82e30c51c4229d91f
- name: Run executable product acceptance
run: PATH="$FULL_RACKET_BIN:$PATH" dbus-run-session -- raco rivet acceptance --json
- name: Require generated Linux client to be current
Expand Down
28 changes: 20 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ concurrency:
env:
# Unified immutable upstream revision containing AppImage handoff,
# branded-DMG signature preservation, and macOS update rollback safety.
RIVET_PIN: a92877c02b6453b1826bfd061d7bbe70647ce5fa
RIVET_PIN: e18c28e6b6b18ab0f59559e82e30c51c4229d91f
jobs:
backend:
name: Backend tests (${{ matrix.os }})
Expand Down Expand Up @@ -108,14 +108,26 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up embeddable Racket CS
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@a92877c02b6453b1826bfd061d7bbe70647ce5fa
# Installed after the embeddable runtime so Rivet's catalog closure and
# Fulcrum's SQLite dependency (db-lib) resolve against the minimal build.
- name: Install Rivet (catalog)
# Match packaged Linux acceptance: install dependencies in full Racket,
# then configure the embeddable runtime used in staged applications.
# Minimal embedded Racket's db-lib catalog fetch has timed out in CI.
- name: Install full Racket CS 9.3
uses: Bogdanp/setup-racket@v1.15
with:
version: '9.3'
architecture: x64
distribution: full
variant: CS
- name: Install Rivet and SQLite dependencies in full Racket
shell: bash
run: |
racket -e '(dynamic-require (quote db) #f)' || raco pkg install --auto --no-docs db-lib
raco pkg install --auto --no-docs 'https://github.com/turinglambdaai/rivet.git#${{ env.RIVET_PIN }}'
- name: Remember full Racket command path
shell: bash
run: echo "FULL_RACKET_BIN=$(dirname "$(command -v raco)")" >> "$GITHUB_ENV"
- name: Set up embeddable Racket CS
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@e18c28e6b6b18ab0f59559e82e30c51c4229d91f
- name: Install Linux toolchain
run: |
sudo apt-get update
Expand All @@ -126,10 +138,10 @@ jobs:
run: python3 tests/run-linux-hotkey-tests.py
- name: raco rivet doctor
shell: bash
run: raco rivet doctor
run: PATH="$FULL_RACKET_BIN:$PATH" raco rivet doctor
- name: raco rivet build
shell: bash
run: raco rivet build
run: PATH="$FULL_RACKET_BIN:$PATH" raco rivet build
- name: Generated Linux client is current
shell: bash
run: git diff --exit-code -- linux/GeneratedBackend.hpp
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/linux-appimage-upgrade-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ permissions:
contents: read

env:
RIVET_PIN: a92877c02b6453b1826bfd061d7bbe70647ce5fa
RIVET_PIN: e18c28e6b6b18ab0f59559e82e30c51c4229d91f

jobs:
installed-upgrade:
Expand All @@ -31,7 +31,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up embeddable Racket CS
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@a92877c02b6453b1826bfd061d7bbe70647ce5fa
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@e18c28e6b6b18ab0f59559e82e30c51c4229d91f
- name: Install Rivet (pinned source)
run: |
racket -e '(dynamic-require (quote db) #f)' || raco pkg install --auto --no-docs db-lib
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/macos-native-update-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ permissions:
contents: read

env:
RIVET_PIN: a92877c02b6453b1826bfd061d7bbe70647ce5fa
RIVET_PIN: e18c28e6b6b18ab0f59559e82e30c51c4229d91f
FULCRUM_UPDATE_E2E_TESTING: "1"

jobs:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ env:
# lockstep by hand.
# Unified immutable upstream revision containing AppImage handoff,
# branded-DMG signature preservation, and macOS update rollback safety.
RIVET_PIN: a92877c02b6453b1826bfd061d7bbe70647ce5fa
RIVET_PIN: e18c28e6b6b18ab0f59559e82e30c51c4229d91f
permissions:
contents: write
actions: read
Expand Down Expand Up @@ -148,7 +148,7 @@ jobs:
rpm desktop-file-utils
- name: Set up embeddable Racket CS (Linux)
if: matrix.platform == 'linux'
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@a92877c02b6453b1826bfd061d7bbe70647ce5fa
uses: turinglambdaai/rivet/.github/actions/setup-embed-racket@e18c28e6b6b18ab0f59559e82e30c51c4229d91f
# Installed after the embeddable runtime so Rivet's catalog closure and
# Fulcrum's SQLite dependency (db-lib) resolve against the minimal build.
- name: Install Rivet (catalog)
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/windows-msi-upgrade-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ permissions:

jobs:
installed-upgrade:
name: Installed MSI 0.13.1 to 0.13.2
name: Installed MSI 0.13.3 to 0.14.0
runs-on: windows-latest
timeout-minutes: 30
steps:
Expand All @@ -28,7 +28,7 @@ jobs:
shell: bash
run: |
racket -e '(dynamic-require (quote db) #f)' || raco pkg install --auto --no-docs db-lib
raco pkg install --auto --no-docs 'https://github.com/turinglambdaai/rivet.git#a92877c02b6453b1826bfd061d7bbe70647ce5fa'
raco pkg install --auto --no-docs 'https://github.com/turinglambdaai/rivet.git#e18c28e6b6b18ab0f59559e82e30c51c4229d91f'
- name: Verify official signed update discovery and MSI payload
shell: bash
run: racket scripts/acceptance/windows-signed-feed-smoke.rkt
Expand Down
81 changes: 81 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,87 @@ independently per platform packaging run.

## [Unreleased]

## [0.14.1] - 2026-10-27

### Fixed

- **Windows launcher no longer flashes an empty search panel.** It waits for
the embedded backend's first search result and builds the native rows before
showing the window. Startup failures surface a visible diagnostic instead.
- **Windows second-launch behavior is recoverable.** Launching Fulcrum again
summons the resident panel and exits the secondary process cleanly, rather
than accumulating headless copies; activation respects the exact lease ID.
- **Windows Quit releases the background process.** The tray Quit and verified
MSI installation paths unregister native hooks, shut down the embedded
Racket/RVT1 backend, and terminate WinUI. Esc and Alt+F4 still hide the
launcher without quitting the resident service.

- **Windows Settings now matches the macOS navigation model.** A native WinUI
NavigationView exposes General, Features, AI, Commands, and Sync & Updates
as individual pages; users can edit command aliases and shortcuts, and
record the global summon shortcut without typing the backend key grammar.
- **Windows updater remains visible from the tray.** Check for Updates now opens
the launcher directly in its update workflow, refreshes authenticated
download actions after checks, keeps native download progress visible,
and presents the verified MSI Install action immediately after download.
The existing signed Ed25519 manifest, bounded download/SHA-256 checks, and
external MSI quit/install/relaunch handoff remain the trust boundary.
- **Windows Settings shows Fulcrum's brand icon in the title bar.** The window
now installs the embedded resource ID 1 through `SetIcon(IconId)` instead of
passing `RivetHost.exe` to the `.ico`-path overload.
- **Windows explicit `find <filename>` search works even if Windows Search is
unavailable.** The PowerShell command now searches the user's actual
Documents, Desktop, Downloads and redirected OneDrive locations before
trying the Windows Search index or a bounded profile fallback; it handles
UTF-8 paths. File results remain behind the explicit `find` command —
plain searches and the search placeholder are deliberately unchanged.

- **Linux GTK search icon aligns with the search placeholder.** The themed
magnifying-glass glyph and editable query now occupy one vertically centered
horizontal row instead of relying on GtkSearchEntry's internally padded icon.
- **Linux hides the redundant resident-ready banner.** The normal `Ready —
hotkey or fulcrum --toggle` status no longer sits permanently above search
results when the launcher is visible. Actual startup failures, hotkey
conflicts, download errors, and progress notices remain discoverable.

- **Linux no longer flashes an empty startup search window.** Initial
launcher presentation waits for native search results from the embedded
backend. Failed boot still shows a visible diagnostic instead of hiding it.
- **Linux Settings uses native five-section navigation.** General, Features,
AI, Commands and Sync & Updates now share one GTK sidebar/stack, matching
the information architecture of macOS and Windows; Commands uses the same
bindings-commands/list/set/clear backend API for aliases; desktop-wide
command hotkey execution is explicitly disabled on Linux until a native
binding runner is implemented.
- **Start at login is available as an opt-in per-device control on all hosts.**
Linux uses XDG Autostart, Windows uses the current-user Run key, and macOS
uses SMAppService's main-app Login Item with system approval. No automatic
sync or default enablement; Windows/Linux login launches stay resident
without popping open the launcher.

### Regression coverage

- Ubuntu 26.04 GNOME 50 Wayland portal identity: native installs now
register their reverse-DNS `site.jrtx.fulcrum.desktop` app id on
a retained shared GDBus connection
before requesting shortcuts; the fallback remains visible if registration
or permission fails. Full stock-desktop verification remains open in #111.
- Linux widget tests cover the deferred first frame, five Settings sections,
and enable/disable round-trip of a temporary XDG login entry. Windows and
macOS host checks and packaged acceptance remain release gates.
- Windows backend tests and packaged WinUI acceptance seed a real user file
and require `find <name>` to return its actual path, not simply invoke a
search subprocess. This check is a release gate on the final commit.
- Linux GTK widget regression checks image/input vertical alignment and
routine-ready visibility while preserving actionable status messages; its
packaged Wayland/AT-SPI acceptance uses backend result readiness rather than
depending on a permanent idle status row.
- Windows packaged native-UI acceptance exercises ready-on-first-frame,
duplicate-launch handoff, normal process exit, and clean restart. Stable
release remains subject to the exact-commit CI, installer, signing, and
publishing gates documented in the release runbook.


## [0.14.0] - 2026-10-27

### Added
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

One keystroke. Everything within reach. A keyboard-first launcher for macOS, Windows, and Linux — one Racket brain, three first-party native UIs, no WebView anywhere.

[![CI](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml/badge.svg)](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml) ![Windows](https://img.shields.io/badge/Windows-WinUI_3-0078D4?logo=windows11&logoColor=white) ![macOS](https://img.shields.io/badge/macOS-SwiftUI-000000?logo=apple&logoColor=white) ![Linux](https://img.shields.io/badge/Linux-GTK4-F9A03C?logo=linux&logoColor=white) [![License](https://img.shields.io/badge/license-BUSL--1.1-blue)](LICENSE) ![Version](https://img.shields.io/badge/version-0.14.0-C15F3C)
[![CI](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml/badge.svg)](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml) ![Windows](https://img.shields.io/badge/Windows-WinUI_3-0078D4?logo=windows11&logoColor=white) ![macOS](https://img.shields.io/badge/macOS-SwiftUI-000000?logo=apple&logoColor=white) ![Linux](https://img.shields.io/badge/Linux-GTK4-F9A03C?logo=linux&logoColor=white) [![License](https://img.shields.io/badge/license-BUSL--1.1-blue)](LICENSE) ![Version](https://img.shields.io/badge/version-0.14.1-C15F3C)

**English** · [中文](README.zh-CN.md)

Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

一次按键,直达一切。macOS、Windows、Linux 三平台的键盘优先启动器——一个 Racket 大脑,三套第一方原生 UI,全程无 WebView。

[![CI](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml/badge.svg)](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml) ![Windows](https://img.shields.io/badge/Windows-WinUI_3-0078D4?logo=windows11&logoColor=white) ![macOS](https://img.shields.io/badge/macOS-SwiftUI-000000?logo=apple&logoColor=white) ![Linux](https://img.shields.io/badge/Linux-GTK4-F9A03C?logo=linux&logoColor=white) [![License](https://img.shields.io/badge/license-BUSL--1.1-blue)](LICENSE) ![Version](https://img.shields.io/badge/version-0.14.0-C15F3C)
[![CI](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml/badge.svg)](https://github.com/turinglambdaai/fulcrum/actions/workflows/ci.yml) ![Windows](https://img.shields.io/badge/Windows-WinUI_3-0078D4?logo=windows11&logoColor=white) ![macOS](https://img.shields.io/badge/macOS-SwiftUI-000000?logo=apple&logoColor=white) ![Linux](https://img.shields.io/badge/Linux-GTK4-F9A03C?logo=linux&logoColor=white) [![License](https://img.shields.io/badge/license-BUSL--1.1-blue)](LICENSE) ![Version](https://img.shields.io/badge/version-0.14.1-C15F3C)

[English](README.md) · **中文**

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.14.0
0.14.1
2 changes: 1 addition & 1 deletion app/backend.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
;; update check: drift here means every install believes it is outdated
;; (0.2.0 shipped believing it was 0.1.0).
(define app-version
(with-handlers ([exn:fail? (lambda (_) "0.14.0")])
(with-handlers ([exn:fail? (lambda (_) "0.14.1")])
(string-append (rivet-info:app-version))))

;; The updater learns the running version from here (the packaged app reads
Expand Down
45 changes: 32 additions & 13 deletions app/core/files.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
;; File search — per-platform, always available on desktop:
;; macOS: Spotlight (`mdfind -name`) — millisecond responses, deep index
;; Linux: `locate -i` (the mlocate/plocate index) or `find` as fallback
;; Windows: the Windows Search index (SYSTEMINDEX) when the service is
;; up, falling back in-process to a bounded `Get-ChildItem -Recurse`
;; scan when it is not
;; Windows: scan the user's actual known folders first (including redirected
;; OneDrive locations), then query Windows Search (SYSTEMINDEX) for broader
;; indexed results; a bounded profile walk is the last resort.
;; Claims `find <query>` queries so it never clutters unrelated searches.
;; Opening a result uses the platform opener, the same side-effect path
;; application launches use.
Expand Down Expand Up @@ -232,7 +232,7 @@
void
(lambda ()
(runner program args
#:timeout-ms 3000
#:timeout-ms (if (eq? os 'windows) 9000 3000)
#:cancel-evt (semaphore-peek-evt cancel)))
(lambda () (release-file-search! cancel))))
(cond
Expand Down Expand Up @@ -268,12 +268,16 @@

;; ---- windows: index-first search script -----------------------------------

;; One PowerShell invocation, two tiers inside the same 3-second budget:
;; 1. the Windows Search index (SYSTEMINDEX) — filename prefix match,
;; then FREETEXT for the mid-word case; millisecond-fast when the
;; service is healthy
;; 2. a bounded Get-ChildItem scan of the user profile — the honest
;; fallback when the index is off, empty or errors
;; One PowerShell invocation, three tiers inside a bounded explicit-find
;; request (9 seconds on Windows, not on ordinary launcher typing):
;; 1. Windows known folders — Desktop, Documents and Downloads (including
;; shell-redirected and OneDrive directories), before probing OLE DB.
;; A broken Windows Search service must not prevent common-file results.
;; 2. Windows Search (SYSTEMINDEX) for other indexed scopes.
;; 3. A bounded user-profile walk only if the first two tiers found nothing.
;; The former index-first chain frequently spent its entire three-second
;; deadline in OLE DB or an enormous USERPROFILE recursion, yielding zero
;; results for files that were plainly present under Documents.
;; The script is defensive on purpose: any index failure lands in the
;; catch and the scan still answers. Two query spellings travel in the
;; script: $q is the raw text (the scan's -Filter wants it literal) and
Expand All @@ -287,10 +291,23 @@
(define sql-q (string-replace raw-q "'" "''"))
(string-append
"$ErrorActionPreference='SilentlyContinue';"
"[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new($false);"
"$out=@();"
"$q='" (ps-literal raw-q) "';"
"$qs='" (ps-literal sql-q) "';"
"try{"
"$roots=@([Environment]::GetFolderPath('DesktopDirectory'),"
"[Environment]::GetFolderPath('MyDocuments'),"
"(Join-Path $env:USERPROFILE 'Downloads'));"
"foreach($cloud in @($env:OneDriveConsumer,$env:OneDrive)){"
"if($cloud){$roots+=@((Join-Path $cloud 'Desktop'),"
"(Join-Path $cloud 'Documents'))}};"
"foreach($root in ($roots|Where-Object{$_ -and (Test-Path -LiteralPath $_ -PathType Container)}|Select-Object -Unique)){"
"try{$out+=@(Get-ChildItem -LiteralPath $root -Recurse -Depth 4 -File "
"-Filter ('*'+$q+'*') -ErrorAction SilentlyContinue|"
"Select-Object -First 128 -ExpandProperty FullName)}catch{};"
"if($out.Count -ge 128){break}"
"};"
"if($out.Count -eq 0){try{"
"$c=New-Object System.Data.OleDb.OleDbConnection(\"Provider=Search.CollatorDSO;Extended Properties='Application=Windows'\");"
"$c.Open();$cmd=$c.CreateCommand();"
"$cmd.CommandText=\"SELECT TOP 128 System.ItemUrl FROM SYSTEMINDEX WHERE CONTAINS(System.FileName,'`\"$qs*`\"') AND SCOPE='file:'\";"
Expand All @@ -300,9 +317,11 @@
"$r=$cmd.ExecuteReader();while($r.Read()){$out+=$r.GetString(0)};$r.Close()"
"}"
"$c.Close()"
"}catch{};"
"}catch{}};"
"if($out.Count -gt 0){"
"$out|Select-Object -First 128|ForEach-Object{[System.Uri]::UnescapeDataString($_ -replace '^file:/+','')}"
"$out|Select-Object -Unique -First 128|ForEach-Object{"
"if($_ -like 'file:*'){[System.Uri]::UnescapeDataString($_ -replace '^file:/+','')}"
"else{$_}}"
"}else{"
"Get-ChildItem -Path $env:USERPROFILE -Recurse -Depth 3 -Filter ('*'+$q+'*') -File -ErrorAction SilentlyContinue|Select-Object -First 128 -ExpandProperty FullName"
"}"))
Expand Down
Loading
Loading