Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
87d3738
chore(spike): main screen in egui, with startup bench and captures
klNuno Oct 10, 2026
74f207f
perf(egui-spike): render on the CPU and cut startup to 57 ms
klNuno Oct 11, 2026
92dd54f
fix(egui-spike): present the whole window when it shows
klNuno Oct 11, 2026
9ae44a0
docs(egui-spike): record the visible-window check
klNuno Oct 11, 2026
46a5c90
chore: exclude the egui port crates from the root workspace
klNuno Oct 11, 2026
77e0eac
feat(theme): port the theme engine to Rust
klNuno Oct 11, 2026
b3b9b5c
test(parity): reference frames from the Tauri app
klNuno Oct 11, 2026
82e037e
feat(app): add the backend trait, mock backend and job runner
klNuno Oct 11, 2026
338fefa
feat(app): port the client stores, settings and i18n
klNuno Oct 12, 2026
0b896a2
docs(app): note the fixture format step of the stores dump
klNuno Oct 12, 2026
570957a
feat(app): port the real backend for boot, storage, themes, PIN and d…
klNuno Oct 12, 2026
01e4d4d
docs(app): fix source line references in the real backend
klNuno Oct 12, 2026
c8da1dc
feat(egui): scene runner, CSS box painter and animation timing
klNuno Oct 12, 2026
b9c00f0
feat(app): port the real backend for platforms, Steam, Riot, Roblox a…
klNuno Oct 12, 2026
ba51f43
feat(app): port the platform model to accshift-app
klNuno Oct 12, 2026
3357326
fix(app): register the platform model modules
klNuno Oct 12, 2026
3b710d8
fix(app): format dates in the system time zone with DST
klNuno Oct 12, 2026
fe9b045
test(app): read legacy localStorage written by real WebView2
klNuno Oct 12, 2026
4d040cb
feat(app): port the account pipeline to accshift-app
klNuno Oct 12, 2026
24690e7
feat(egui): lay text out like WebView2 in ui::text
klNuno Oct 12, 2026
7aaaccd
feat(egui): app shell and title bar
klNuno Oct 12, 2026
0538b1a
fix(egui): parse multi-line text tags in parity fragments
klNuno Oct 12, 2026
245012c
fix(egui): capture parity references at the real device scale factor
klNuno Oct 12, 2026
bed884f
feat(app): port the secure screen, streamer mode, bulk edit and add f…
klNuno Oct 12, 2026
c935170
feat(app): port app actions, dialogs and keyboard to accshift-app
klNuno Oct 12, 2026
339ef73
fix(egui): compute text line boxes in device px like zoom-for-DSF
klNuno Oct 12, 2026
28aa6bc
feat(egui): snap boxes, borders and title bar to Chromium's device grid
klNuno Oct 12, 2026
f328109
docs(egui): state how closely the snap rules match the probe
klNuno Oct 12, 2026
fe79fc8
feat(app): port the app lifecycle, updater, single instance and deep …
klNuno Oct 12, 2026
cd8649f
feat(app): port the boot payload cache and the remaining telemetry calls
klNuno Oct 12, 2026
d8591b1
feat(egui): rasterize glyphs with DirectWrite like Skia
klNuno Oct 12, 2026
e33a186
feat(egui): port the workspace grid, folders, avatar pipeline and set…
klNuno Oct 12, 2026
ab1931a
feat(egui): port the settings panel with its General and Privacy tabs
klNuno Oct 12, 2026
3efee35
feat(egui): port the account card face and the native search clear bu…
klNuno Oct 12, 2026
e793005
feat(egui): port the toast stack and close the PIN field hint gap
klNuno Oct 12, 2026
334da99
fix(egui): key settings items by card so the streamer row keeps its h…
klNuno Oct 12, 2026
7404876
feat(egui): port the context menu
klNuno Oct 12, 2026
42161e5
feat(egui): port the input and confirm dialogs with the backdrop blur
klNuno Oct 12, 2026
131b2fe
feat(egui): run menu tasks, account renames and removals
klNuno Oct 12, 2026
ffada7c
feat(egui): port the list view with its preview panel
klNuno Oct 12, 2026
3fa9e9a
feat(egui): port the secure screen with the PIN lock and AFK cover
klNuno Oct 12, 2026
9f0d356
feat(egui): port the streamer mode overlay
klNuno Oct 12, 2026
c75d986
chore(deps): bump quinn-proto to 0.11.19
klNuno Oct 12, 2026
e36f37b
feat(egui): port the card extension panel
klNuno Oct 12, 2026
5f545e6
feat(egui): show the CS2 bridge badge and card sections
klNuno Oct 14, 2026
43800a0
feat(egui): blur an armed card's initials and wrap its confirm hint
klNuno Oct 14, 2026
cfc0de9
feat(egui): tabular figures and Blink's centring of wrapped lines
klNuno Oct 14, 2026
b2794af
feat(egui): decode JPEG avatars and shrink the list preview like Blink
klNuno Oct 14, 2026
1be86fa
chore(deps): bump rustls to 0.23.46
klNuno Oct 14, 2026
484d6ac
feat(egui): keyboard bindings and command palette
klNuno Oct 15, 2026
dec1d02
feat(egui): arrow-key card focus
klNuno Oct 15, 2026
6fbb08b
fix(egui): card focus columns per grid, reveal scroll on device pixels
klNuno Oct 15, 2026
60fe50f
feat(egui): reveal the focused card when the cards change
klNuno Oct 15, 2026
924680a
fix(egui): wrap, align and size text on Blink's LayoutUnit grid
klNuno Oct 15, 2026
fc08280
feat(egui): settings Platforms tab, Ctrl+F search and descriptor preview
klNuno Oct 15, 2026
1fb6258
feat(egui): Blink text field width, caret rounding and search slot
klNuno Oct 15, 2026
e09cadd
feat(egui): port the platform tabs and the first-run onboarding
klNuno Oct 16, 2026
55846c8
feat(egui): port personas and the theme editor
klNuno Oct 16, 2026
5476942
fix(egui): pick Skia's glyph gamma class from the canonical colour
klNuno Oct 16, 2026
c8b8bb0
feat(egui): port the Steam bulk edit bar and settings dialog
klNuno Oct 16, 2026
a377510
fix(egui): centre the welcome chip rows in layout units
klNuno Oct 16, 2026
feca20d
feat(egui): port the clipboard theme import and match the native slider
klNuno Oct 16, 2026
19e3ac9
feat(egui): port the UI zoom with Chromium's stage raster
klNuno Oct 16, 2026
83ba63f
feat(egui): port the context menu key
klNuno Oct 16, 2026
414a62c
feat(egui): port card drag and drop
klNuno Oct 16, 2026
3c4e698
feat(egui): port section drag and draw scaled text and icons at devic…
klNuno Oct 16, 2026
544c335
feat(egui): port the window shell
klNuno Oct 16, 2026
cb92f8a
fix(deps): drop the updater zip feature
klNuno Oct 17, 2026
c6074b3
test(parity): answer is_focused as focused in the reference
klNuno Oct 17, 2026
f5b02a3
feat(egui): port the account switch and the add account flow
klNuno Oct 17, 2026
f0782cf
feat(egui): port deep links, the updater, snap layouts and Liquid Glass
klNuno Oct 17, 2026
05675c4
feat(egui): migrate the localStorage of v0.x installs at boot
klNuno Oct 17, 2026
ba19014
fix(installer): run the user PATH scripts from files
klNuno Oct 17, 2026
244b713
feat(egui): ship the exe through the Tauri NSIS installer
klNuno Oct 17, 2026
1017d62
fix(test): pass the localStorage proof values as CDP arguments
klNuno Oct 17, 2026
eaeda8a
ci: check and test the egui crates on three OSes
klNuno Oct 17, 2026
376ad3c
ci: build the Windows release from the egui app
klNuno Oct 17, 2026
c58408c
fix(egui): depend on dunce on every OS
klNuno Oct 17, 2026
9312ce6
fix(deps): keep the @tauri-apps npm packages on the Rust crates' minors
klNuno Oct 17, 2026
0b89276
fix(egui): gate the platform-only test imports
klNuno Oct 17, 2026
c5b1991
fix(egui): build the window backends on Linux and macOS
klNuno Oct 17, 2026
91d4f06
test(egui): expect each OS's launch link and fonts
klNuno Oct 17, 2026
401df72
fix(app): bind the macOS single-instance socket before acquire returns
klNuno Oct 17, 2026
ff060c3
feat(egui): edit text fields and the CSS textarea like Chromium
klNuno Oct 17, 2026
d5448c9
fix(egui): lift the avatar picture fractionally and page the CSS text…
klNuno Oct 17, 2026
e463f78
feat(egui): open the native colour dialog and draw the select list as…
klNuno Oct 17, 2026
946bbd0
feat(egui): cut, copy, paste and select all on a text field's right c…
klNuno Oct 17, 2026
0801943
fix(egui): run bench builds on a copy of the app folders, with a read…
klNuno Oct 17, 2026
4ef63ed
refactor: drop Tauri and the Svelte front-end for the egui app
klNuno Oct 17, 2026
09c4fbf
fix(core): gate the registry test import on Windows
klNuno Oct 17, 2026
611620f
fix(updater): drop the unused zip path and its vulnerable crate
klNuno Oct 17, 2026
59a4042
chore(deps): update crates, npm packages and action pins past the Tau…
klNuno Oct 17, 2026
2ba44c3
fix(deps): keep zbus 5 for the Linux single instance
klNuno Oct 17, 2026
880e163
feat(egui): port to egui 0.37 with the vendored epaint patches
klNuno Oct 17, 2026
1c9c864
fix(egui): read the default font blob off Windows
klNuno Oct 17, 2026
85a3f68
perf(egui): cache avatars on disk, map font files and prune WebView2 …
klNuno Oct 17, 2026
f5feae2
perf(egui): blur the entrance in one filter and store the glyph atlas…
klNuno Oct 17, 2026
bee5048
perf(vendor): draw direct meshes in parallel bands, blur only the til…
klNuno Oct 18, 2026
feb2eaf
perf(egui): pace frames on the vblank, smooth the wheel and read the …
klNuno Oct 18, 2026
3682650
feat(egui): launch at startup into the tray and close to tray
klNuno Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
66 changes: 26 additions & 40 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,63 +5,48 @@ checks CI enforces, and what is expected of a pull request.

## Prerequisites

- Node.js 22 (the version CI uses).
- pnpm 10.32.1. It is pinned by `packageManager` in `package.json`, so
`corepack enable` gives you the right version automatically.
- A stable Rust toolchain with the `rustfmt` and `clippy` components.
- Tauri 2 system dependencies for your OS. Follow
[tauri.app/start/prerequisites](https://tauri.app/start/prerequisites/).
- Node.js 22 and pnpm 10.32.1, only to build installers (the Tauri bundler) and
to work on the telemetry worker. pnpm is pinned by `packageManager` in
`package.json`, so `corepack enable` gives you the right version.

On Ubuntu, the packages CI installs are:

```bash
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-dev libsoup-3.0-dev libssl-dev pkg-config
sudo apt-get install -y libdbus-1-dev libgtk-3-dev libxkbcommon-dev pkg-config
```

## Getting started

```bash
pnpm install
pnpm tauri dev
cargo run -p accshift-egui
```

`pnpm tauri build` produces a release bundle for your platform.
`node crates/accshift-egui/bundle/bundle.mjs --build` builds the installers for
your platform after `pnpm install`.

## Checks

CI runs the `validate` job on Windows, Ubuntu and macOS. Every step must pass on
CI runs the `rust` job on Windows, Ubuntu and macOS. Every step must pass on
all three. Run the equivalents locally before opening a pull request:

```bash
pnpm exec vp check # Vite+ check
pnpm run check:frontend # svelte-check
pnpm exec vp test # frontend tests
pnpm exec vp build # frontend build
pnpm run fmt:check # cargo fmt --all --check
pnpm run clippy # cargo clippy --workspace -- -D warnings
pnpm run check:rust # cargo check --workspace
pnpm run test:rust # cargo test --workspace
cargo fmt --all --check
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --locked
```

`pnpm run check` chains the Vite+ check, `check:frontend` and `check:rust` in one
command. `pnpm gates` runs `check`, the frontend and worker tests, the worker
typecheck, `fmt:check`, `clippy` and `test:rust`, then prints each exit code;
`pnpm gates clippy rust` runs only the named gates. It needs
`server/node_modules` installed. The frontend build is not part of it.

Two details that are easy to miss locally:

- The Rust check, test and clippy scripts run `scripts/stage-cli.mjs` first.
It stages the gitignored CLI sidecar and builds it if missing. Direct
`cargo check`, `cargo test` or `cargo clippy` commands do not run this step;
run `node scripts/stage-cli.mjs` first on a fresh checkout.
- The telemetry worker in `server/` is a separate pnpm package and is
typechecked on its own:
```bash
pnpm --dir server install --frozen-lockfile
pnpm --dir server exec tsc --noEmit
```
`node scripts/gates.mjs` runs those three and the worker typecheck and tests,
then prints each exit code; `node scripts/gates.mjs clippy rust` runs only the
named gates. It needs `server/node_modules` installed.

The telemetry worker in `server/` is a separate pnpm package:

```bash
pnpm --dir server install --frozen-lockfile
pnpm --dir server exec tsc --noEmit
pnpm --dir server exec vitest run
```

`cargo audit --file Cargo.lock` runs on Ubuntu only. If your change touches
dependencies, run it locally too.
Expand All @@ -70,9 +55,10 @@ dependencies, run it locally too.

See the "Project Structure" section of the [README](../README.md#project-structure).

The Cargo workspace has three members: `src-tauri` (the Tauri GUI wrapper),
`crates/accshift-core` (platform logic, config, storage, OS primitives) and
`crates/accshift-cli` (the CLI binary).
The Cargo workspace has five members: `crates/accshift-core` (platform logic,
config, storage, OS primitives), `crates/accshift-cli` (the CLI binary),
`crates/accshift-app` (the UI-free app logic), `crates/accshift-theme` (the
theme engine) and `crates/accshift-egui` (the GUI).

The CLI and GUI both sit on top of `crates/accshift-core`, so a platform change
usually touches both surfaces. When you add or modify a platform, check that the
Expand Down
2 changes: 1 addition & 1 deletion .github/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ In scope:
- The exclusive file lock shared by the GUI and CLI on mutating operations.
- The `accshift://` deep link handler and any input reaching it.
- The updater and its signature verification.
- The webview-reachable command surface and input validation on platform ids.
- Input validation on platform ids and deep links (`accshift://`).
- The optional CS2 stats bridge and the storage of its Bearer token.

Out of scope:
Expand Down
9 changes: 9 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,15 @@ updates:
update-types:
- minor
- patch
# A new egui minor needs crates/accshift-egui/vendor/epaint and
# egui_software_backend moved to it by hand.
ignore:
- dependency-name: "egui*"
update-types: ["version-update:semver-minor", "version-update:semver-major"]
- dependency-name: "eframe"
update-types: ["version-update:semver-minor", "version-update:semver-major"]
- dependency-name: "epaint"
update-types: ["version-update:semver-minor", "version-update:semver-major"]

- package-ecosystem: github-actions
directory: /
Expand Down
79 changes: 33 additions & 46 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ permissions:
contents: read

jobs:
validate:
rust:
strategy:
fail-fast: false
matrix:
Expand All @@ -22,70 +22,57 @@ jobs:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install Linux Tauri build deps
- name: Install Linux build deps
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libsoup-3.0-dev \
libssl-dev \
libxkbcommon-dev \
pkg-config

- name: Setup Vite+
uses: voidzero-dev/setup-vp@3754dd7dbdb32bd8f6d28b6043de13ad3a75f21f # v1.21.1
with:
node-version: 22
cache: true

- name: Setup Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, pinned 2026-06-09
with:
components: rustfmt, clippy

- name: Vite+ check
run: vp check

- name: Svelte check
run: vp run check:frontend

- name: Frontend tests
run: vp test

# setup-vp only puts `vp` on PATH; the server worker is a plain pnpm
# package. `corepack enable` writes its pnpm shim next to the real node
# binary, which is not on PATH here, so drive pnpm through corepack
# itself (version pinned by packageManager in the root package.json).
- name: Install server dependencies
run: corepack pnpm --dir server install --frozen-lockfile

- name: Server typecheck
run: corepack pnpm --dir server exec tsc --noEmit

- name: Build frontend
run: vp build

# clippy, check:rust and test:rust each run scripts/stage-cli.mjs first:
# tauri-build resolves `externalBin` at build-script time and the sidecar
# is gitignored, so a fresh checkout has to stage it before any of them.

- name: Cargo fmt
run: vp run fmt:check
run: cargo fmt --all --check

- name: Cargo clippy
run: vp run clippy

- name: Cargo check
run: vp run check:rust
run: cargo clippy --workspace --all-targets --locked -- -D warnings

- name: Rust tests
run: vp run test:rust
run: cargo test --workspace --locked

- name: Cargo audit
if: matrix.os == 'ubuntu-latest'
run: |
cargo install cargo-audit --quiet
cargo audit --file Cargo.lock

# The telemetry worker (server/) is a plain pnpm package of its own.
worker:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

# Only used for the Node runtime. `corepack enable` writes its pnpm shim
# next to the real node binary, which is not on PATH here, so drive pnpm
# through corepack itself (version pinned by packageManager in the root
# package.json).
- name: Setup Node
uses: voidzero-dev/setup-vp@3754dd7dbdb32bd8f6d28b6043de13ad3a75f21f # v1.21.1
with:
node-version: 22
run-install: false

- name: Install server dependencies
run: corepack pnpm --dir server install --frozen-lockfile

- name: Server typecheck
run: corepack pnpm --dir server exec tsc --noEmit

- name: Server tests
run: corepack pnpm --dir server exec vitest run
35 changes: 17 additions & 18 deletions .github/workflows/dev-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,63 +19,62 @@ jobs:
- os: windows-latest
artifact_name: accshift-windows
artifact_paths: |
target/release/bundle/nsis/*.exe
target/release/bundle/msi/*.msi
target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe
- os: ubuntu-latest
artifact_name: accshift-linux
artifact_paths: |
target/release/bundle/deb/*.deb
target/release/bundle/appimage/*.AppImage
target/release/bundle/rpm/*.rpm
target/x86_64-unknown-linux-gnu/release/bundle/deb/*.deb
target/x86_64-unknown-linux-gnu/release/bundle/appimage/*.AppImage
target/x86_64-unknown-linux-gnu/release/bundle/rpm/*.rpm
- os: macos-latest
artifact_name: accshift-macos
artifact_paths: |
target/release/bundle/dmg/*.dmg
target/release/bundle/macos/*.app.zip
target/aarch64-apple-darwin/release/bundle/dmg/*.dmg
target/aarch64-apple-darwin/release/bundle/macos/*.app.zip
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ inputs.ref || github.ref }}

- name: Install Linux Tauri build deps
- name: Install Linux build deps
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
libxkbcommon-dev \
librsvg2-dev \
libsoup-3.0-dev \
libssl-dev \
pkg-config

- name: Setup Vite+
- name: Setup Node
uses: voidzero-dev/setup-vp@3754dd7dbdb32bd8f6d28b6043de13ad3a75f21f # v1.21.1
with:
node-version: 22
cache: true
run-install: false

- name: Setup Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, pinned 2026-06-09

- name: Install the bundler
run: corepack pnpm install --frozen-lockfile

# No ACCSHIFT_TELEMETRY_URL: a dev build compiles in the inert fallback, so
# test installs never reach the analytics dashboard. Only release.yml sets it.
- name: Build Tauri bundles (unsigned, no updater artifacts)
run: vp exec tauri build -c '{"bundle":{"createUpdaterArtifacts":false}}'
- name: Build the installers (unsigned, no updater artifacts)
run: node crates/accshift-egui/bundle/bundle.mjs --build --no-updater

- name: Compress macOS .app bundle
if: matrix.os == 'macos-latest'
run: |
cd target/release/bundle/macos
cd target/aarch64-apple-darwin/release/bundle/macos
for app in *.app; do
zip -r "${app%.app}.app.zip" "$app"
done

- name: Upload artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: ${{ matrix.artifact_name }}
path: ${{ matrix.artifact_paths }}
Expand Down
Loading
Loading