Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.
| preparing for cloud work | 1 | [package] |
| 2 | name = "g1t-desktop" | |
| Merge branch 'main' into rm-agents | 3 | version = "0.3.6" |
| preparing for cloud work | 4 | edition = "2024" |
| 5 | license = "MIT" | |
| 6 | repository = "https://g1t.sh/flagon-io/g1t" | |
| 7 | description = "The g1t desktop app: g1t in a window of its own, with native notifications, a badge, a tray, g1t:// links and updates that install themselves." | |
| 8 | ||
| 9 | # Not a member of the repository's Cargo workspace (its Cargo.toml excludes | |
| 10 | # this folder): Tauri needs a toolkit the services never do, so it builds | |
| 11 | # on its own, with its own lockfile, and `cargo test --workspace` stays | |
| 12 | # fast. Build it from apps/desktop with `npm run build`. | |
| 13 | [workspace] | |
| 14 | ||
| 15 | [build-dependencies] | |
| 16 | tauri-build = { version = "2", features = [] } | |
| 17 | ||
| 18 | [dependencies] | |
| Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9 | 19 | # `unstable`: a window holding more than one web view, so the title bar |
| 20 | # and the site sit one above the other (src/frame.rs). | |
| 21 | tauri = { version = "2", features = ["tray-icon", "image-png", "unstable"] } | |
| preparing for cloud work | 22 | # Updates: a signed manifest at g1t.sh/downloads/desktop/latest.json. |
| 23 | tauri-plugin-updater = "2" | |
| 24 | # Native notifications, from the site's live feed. | |
| 25 | tauri-plugin-notification = "2" | |
| 26 | # Links out, opened in the browser the system uses. | |
| 27 | tauri-plugin-opener = "2" | |
| 28 | # g1t:// links, which open the page they name; a second launch hands its | |
| 29 | # link to the app already running. | |
| 30 | tauri-plugin-deep-link = "2" | |
| 31 | tauri-plugin-single-instance = { version = "2", features = ["deep-link"] } | |
| 32 | # The window's size and place, kept between launches. | |
| 33 | tauri-plugin-window-state = "2" | |
| Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9 | 34 | # Opening g1t when someone signs in to their computer (settings.rs). |
| 35 | tauri-plugin-autostart = "2" | |
| preparing for cloud work | 36 | serde = { version = "1", features = ["derive"] } |
| 37 | serde_json = "1" | |
| 38 | url = "2" | |
| 39 | # Whether the server answers, before the window goes there (the same client the updater brings). | |
| 40 | reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] } | |
| 41 | tokio = { version = "1", features = ["time"] } | |
| The desktop app is 0.3.2, and its runner updates are fast, seen and only ever g1t's. The app now trusts a g1t-runner release only when its manifest's Ed25519 signature, latest.json.sig, checks out against g1t's runner release key, which is built into the app (the public half of RUNNER_RELEASE_PUBLIC_KEY, kept in runner/native.rs, where development builds have it too; G1T_RUNNER_RELEASE_KEY overrides it for a g1t with its own key), as the runner already did with its own updates. A manifest with no signature, or one that doesn't check out, is refused and nothing in it is used: the runner keeps the version it has and says "Update refused: not signed by g1t", or, with no runner installed yet, "Not running: the runner's release isn't signed by g1t", each with why and what to do. It looks every hour rather than every six, on a thread of its own so the runner is looked after meanwhile, and what it finds waits, downloaded and checked, until each kind of job is idle, then goes in kind by kind, never cutting a job short: Linux jobs take the release's image (sandbox update) as soon as they have no job, while Windows jobs, whose runner is the program itself, are stopped after their job (sandbox down --only windows --drain), the program is replaced and they start again, the other kind running on throughout; a runner in Docker or on the computer stops between jobs and starts on the new one. The program there is moved aside rather than overwritten, so a status the app is asking at that moment can't stop it. Each kind of job's card in Settings shows its runner version, when the app last looked ("Checked 12 min ago") and a newer one waiting ("0.3.2 ready, installs after this job", "Installing 0.3.2"), and "Check for runner updates" beside the computer's name looks at once and installs what it finds, even with "Download updates by themselves" off, which otherwise stops the hourly look. The desktop report carries the same (snake_case: the diagnosis's update, with checked_at, ready and note, and each kind's update), so the Runners page's Desktops cards show it, "Checked" with how long ago, and this computer's row has the button too. All the words are diagnosis.rs's. The desktop guide says how updates work, what each card shows, the new troubleshooting rows and where the release key lives. Tests cover the signature with a key pair of their own and with release 0.3.0's manifest and signature as g1t.sh published them, kept byte for byte (.gitattributes), the wording, the cards and the report. | 42 | # Checking a downloaded g1t-runner against its release's SHA-256, and the |
| 43 | # release's manifest against g1t's release key (src/runner/native.rs), as | |
| 44 | # the runner checks its own updates. | |
| Merge the desktop app's runner: it starts with the app for the signed-in person, sandboxed by default and running nothing where no sandbox is available yet, registers through the site, keeps itself up to date, and says everywhere what it is doing, why it is not, and how to fix it. | 45 | sha2 = "0.10" |
| The desktop app is 0.3.2, and its runner updates are fast, seen and only ever g1t's. The app now trusts a g1t-runner release only when its manifest's Ed25519 signature, latest.json.sig, checks out against g1t's runner release key, which is built into the app (the public half of RUNNER_RELEASE_PUBLIC_KEY, kept in runner/native.rs, where development builds have it too; G1T_RUNNER_RELEASE_KEY overrides it for a g1t with its own key), as the runner already did with its own updates. A manifest with no signature, or one that doesn't check out, is refused and nothing in it is used: the runner keeps the version it has and says "Update refused: not signed by g1t", or, with no runner installed yet, "Not running: the runner's release isn't signed by g1t", each with why and what to do. It looks every hour rather than every six, on a thread of its own so the runner is looked after meanwhile, and what it finds waits, downloaded and checked, until each kind of job is idle, then goes in kind by kind, never cutting a job short: Linux jobs take the release's image (sandbox update) as soon as they have no job, while Windows jobs, whose runner is the program itself, are stopped after their job (sandbox down --only windows --drain), the program is replaced and they start again, the other kind running on throughout; a runner in Docker or on the computer stops between jobs and starts on the new one. The program there is moved aside rather than overwritten, so a status the app is asking at that moment can't stop it. Each kind of job's card in Settings shows its runner version, when the app last looked ("Checked 12 min ago") and a newer one waiting ("0.3.2 ready, installs after this job", "Installing 0.3.2"), and "Check for runner updates" beside the computer's name looks at once and installs what it finds, even with "Download updates by themselves" off, which otherwise stops the hourly look. The desktop report carries the same (snake_case: the diagnosis's update, with checked_at, ready and note, and each kind's update), so the Runners page's Desktops cards show it, "Checked" with how long ago, and this computer's row has the button too. All the words are diagnosis.rs's. The desktop guide says how updates work, what each card shows, the new troubleshooting rows and where the release key lives. Tests cover the signature with a key pair of their own and with release 0.3.0's manifest and signature as g1t.sh published them, kept byte for byte (.gitattributes), the wording, the cards and the report. | 46 | ed25519-dalek = "3" |
| 47 | base64 = "0.22" | |
| preparing for cloud work | 48 | |
| Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9 | 49 | # Keeping the menu bar hidden under g1t's own title bar (src/frame.rs); the |
| 50 | # same GTK that Tauri brings. | |
| 51 | [target.'cfg(target_os = "linux")'.dependencies] | |
| 52 | gtk = "0.18" | |
| 53 | ||
| preparing for cloud work | 54 | [profile.release] |
| 55 | strip = "debuginfo" | |
| 56 | lto = "thin" | |
| 57 | opt-level = "s" | |
| 58 | codegen-units = 1 |
This file's history is long; its oldest lines are credited to the oldest commit read.