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.
| Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9 | 1 | <!doctype html> |
| 2 | <!-- | |
| 3 | The desktop app's settings, in a window of their own: opened from the | |
| 4 | menu, the tray, or the site's account menu (src/settings.rs). Each | |
| 5 | change is kept as soon as it is made; there is nothing to save. | |
| 6 | --> | |
| 7 | <html lang="en"> | |
| 8 | <head> | |
| 9 | <meta charset="utf-8" /> | |
| 10 | <meta name="viewport" content="width=device-width, initial-scale=1" /> | |
| 11 | <meta name="color-scheme" content="dark" /> | |
| 12 | <title>g1t settings</title> | |
| 13 | <link rel="stylesheet" href="settings.css" /> | |
| 14 | </head> | |
| 15 | <body> | |
| 16 | <!-- Its title bar, when g1t draws its own (src/frame.rs): drag it to move the window. --> | |
| 17 | <header class="titlebar" id="titlebar" hidden> | |
| 18 | <span>Settings</span> | |
| 19 | <button type="button" id="close-window" class="caption" aria-label="Close" title="Close" tabindex="-1"> | |
| 20 | <svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" aria-hidden="true"> | |
| 21 | <line x1="4" y1="4" x2="12" y2="12" /> | |
| 22 | <line x1="12" y1="4" x2="4" y2="12" /> | |
| 23 | </svg> | |
| 24 | </button> | |
| 25 | </header> | |
| 26 | <div class="page"> | |
| 27 | <main> | |
| 28 | <h1>Settings</h1> | |
| 29 | <p class="muted lede">For the desktop app on this computer. Your account's settings, notifications included, are on g1t itself.</p> | |
| 30 | ||
| 31 | <section aria-labelledby="general-heading"> | |
| 32 | <h2 id="general-heading">Starting and closing</h2> | |
| 33 | <label class="setting"> | |
| 34 | <span><strong>Open g1t when you sign in</strong><span class="muted" id="open-at-login-note">g1t starts with your computer.</span></span> | |
| 35 | <input type="checkbox" role="switch" id="openAtLogin" /> | |
| 36 | </label> | |
| 37 | <label class="setting"> | |
| 38 | <span><strong>Start in the tray</strong><span class="muted" id="start-hidden-note">Opened at sign-in, g1t waits in the tray without opening its window.</span></span> | |
| 39 | <input type="checkbox" role="switch" id="startHidden" /> | |
| 40 | </label> | |
| 41 | <label class="setting"> | |
| 42 | <span><strong>Keep g1t running when the window closes</strong><span class="muted">It stays in the tray for notifications. Turned off, closing the window quits.</span></span> | |
| 43 | <input type="checkbox" role="switch" id="closeToTray" /> | |
| 44 | </label> | |
| 45 | </section> | |
| 46 | ||
| 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. | 47 | <section aria-labelledby="runner-heading" id="runner-section"> |
| 48 | <h2 id="runner-heading">Runner</h2> | |
| The desktop app is 0.3.4, and the runner has a window of its own. Beside the title bar's Settings button a chip says what the runner is doing, live, with a dot in its colour (Runner running, Running a job, Running 2 jobs, Runner starting, Runner updating, Runner stopped, Runner offline, Runner needs you), as Docker Desktop shows its engine; in a narrow window only the dot shows. It opens the Runner window, as the tray's runner row now does: at its top what the whole runner is doing, with what it is running, its version and workspace, and its own Stop or Start; then each kind of job's card as before; then its setup (running jobs here at all, how jobs run, the workspace, the computer with Check for runner updates and View on g1t); and its log, open and following along as it is written. Settings keeps the runner as one line, what it is doing with Open runner, and each window saves only its own settings over what the app has now, so neither undoes the other's. The chip's words are diagnosis.rs's, the Runner window is made off the main thread as Settings now is, and it has a capability of its own with only the commands it uses; the title bar may now ask the runner's status. Two things fixed on the way: a settings row hidden until it applies, Restart to change the title bar, showed all the time, since its row's display beat the hidden attribute; and in a narrow window the title bar's buttons ran over the search, which now shrinks instead. The desktop guide describes the chip, the Runner window and where each runner setting now is. | 49 | <!-- What it is doing, in a line; the Runner window has the rest (runner.html). --> |
| 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. | 50 | <div class="setting"> |
| The desktop app is 0.3.4, and the runner has a window of its own. Beside the title bar's Settings button a chip says what the runner is doing, live, with a dot in its colour (Runner running, Running a job, Running 2 jobs, Runner starting, Runner updating, Runner stopped, Runner offline, Runner needs you), as Docker Desktop shows its engine; in a narrow window only the dot shows. It opens the Runner window, as the tray's runner row now does: at its top what the whole runner is doing, with what it is running, its version and workspace, and its own Stop or Start; then each kind of job's card as before; then its setup (running jobs here at all, how jobs run, the workspace, the computer with Check for runner updates and View on g1t); and its log, open and following along as it is written. Settings keeps the runner as one line, what it is doing with Open runner, and each window saves only its own settings over what the app has now, so neither undoes the other's. The chip's words are diagnosis.rs's, the Runner window is made off the main thread as Settings now is, and it has a capability of its own with only the commands it uses; the title bar may now ask the runner's status. Two things fixed on the way: a settings row hidden until it applies, Restart to change the title bar, showed all the time, since its row's display beat the hidden attribute; and in a narrow window the title bar's buttons ran over the search, which now shrinks instead. The desktop guide describes the chip, the Runner window and where each runner setting now is. | 51 | <span |
| 52 | ><strong class="runner-line"><span class="dot" id="runner-dot" aria-hidden="true"></span><span id="runner-title" role="status" aria-live="polite">Runner</span></strong | |
| 53 | ><span class="muted" id="runner-summary">Your workspace's <code>runs-on: self-hosted</code> jobs, on this computer while g1t is open.</span></span | |
| 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. | 54 | > |
| The desktop app is 0.3.4, and the runner has a window of its own. Beside the title bar's Settings button a chip says what the runner is doing, live, with a dot in its colour (Runner running, Running a job, Running 2 jobs, Runner starting, Runner updating, Runner stopped, Runner offline, Runner needs you), as Docker Desktop shows its engine; in a narrow window only the dot shows. It opens the Runner window, as the tray's runner row now does: at its top what the whole runner is doing, with what it is running, its version and workspace, and its own Stop or Start; then each kind of job's card as before; then its setup (running jobs here at all, how jobs run, the workspace, the computer with Check for runner updates and View on g1t); and its log, open and following along as it is written. Settings keeps the runner as one line, what it is doing with Open runner, and each window saves only its own settings over what the app has now, so neither undoes the other's. The chip's words are diagnosis.rs's, the Runner window is made off the main thread as Settings now is, and it has a capability of its own with only the commands it uses; the title bar may now ask the runner's status. Two things fixed on the way: a settings row hidden until it applies, Restart to change the title bar, showed all the time, since its row's display beat the hidden attribute; and in a narrow window the title bar's buttons ran over the search, which now shrinks instead. The desktop guide describes the chip, the Runner window and where each runner setting now is. | 55 | <span class="buttons"><button type="button" id="open-runner">Open runner</button></span> |
| 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. | 56 | </div> |
| 57 | </section> | |
| 58 | ||
| Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9 | 59 | <section aria-labelledby="notifications-heading"> |
| 60 | <h2 id="notifications-heading">Notifications</h2> | |
| 61 | <label class="setting"> | |
| 62 | <span><strong>Show notifications</strong><span class="muted">From your system, for what needs you while g1t is behind another window. Which things notify you is set on g1t.</span></span> | |
| 63 | <input type="checkbox" role="switch" id="notifications" /> | |
| 64 | </label> | |
| 65 | <label class="setting"> | |
| 66 | <span><strong id="flash-label">Flash the taskbar icon</strong><span class="muted">When a notification arrives and the window is not in front.</span></span> | |
| 67 | <input type="checkbox" role="switch" id="flash" /> | |
| 68 | </label> | |
| 69 | <label class="setting"> | |
| 70 | <span><strong>Show a badge on the icon</strong><span class="muted">How many things are waiting for you.</span></span> | |
| 71 | <input type="checkbox" role="switch" id="badge" /> | |
| 72 | </label> | |
| 73 | </section> | |
| 74 | ||
| 75 | <section aria-labelledby="window-heading"> | |
| 76 | <h2 id="window-heading">Window</h2> | |
| 77 | <label class="setting"> | |
| 78 | <span | |
| 79 | ><strong>Use the system's title bar</strong | |
| 80 | ><span class="muted" id="system-title-bar-note">In place of g1t's own, with the menu bar under it.</span></span | |
| 81 | > | |
| 82 | <input type="checkbox" role="switch" id="systemTitleBar" /> | |
| 83 | </label> | |
| 84 | <div class="setting" id="restart-row" hidden> | |
| 85 | <span><strong>Restart to change the title bar</strong><span class="muted">g1t opens again where you were.</span></span> | |
| 86 | <button type="button" id="restart-app" class="primary">Restart now</button> | |
| 87 | </div> | |
| 88 | <label class="setting"> | |
| 89 | <span><strong>Zoom</strong><span class="muted" id="zoom-note">The View menu changes it too.</span></span> | |
| 90 | <select id="zoom"> | |
| 91 | <option value="0.67">67%</option> | |
| 92 | <option value="0.75">75%</option> | |
| 93 | <option value="0.8">80%</option> | |
| 94 | <option value="0.9">90%</option> | |
| 95 | <option value="1">100%</option> | |
| 96 | <option value="1.1">110%</option> | |
| 97 | <option value="1.25">125%</option> | |
| 98 | <option value="1.5">150%</option> | |
| 99 | <option value="1.75">175%</option> | |
| 100 | <option value="2">200%</option> | |
| 101 | </select> | |
| 102 | </label> | |
| 103 | </section> | |
| 104 | ||
| 105 | <section aria-labelledby="updates-heading"> | |
| 106 | <h2 id="updates-heading">Updates</h2> | |
| 107 | <label class="setting"> | |
| 108 | <span><strong>Download updates by themselves</strong><span class="muted">Each one installs when you restart or quit g1t, never in the middle of something.</span></span> | |
| 109 | <input type="checkbox" role="switch" id="autoUpdate" /> | |
| 110 | </label> | |
| 111 | <div class="setting" id="updates-row"> | |
| 112 | <span><strong id="version">g1t</strong><span class="muted" id="update-status" aria-live="polite"> </span></span> | |
| 113 | <span class="buttons"> | |
| 114 | <button type="button" id="restart" class="primary" hidden>Restart now</button> | |
| 115 | <button type="button" id="check">Check for updates</button> | |
| 116 | </span> | |
| 117 | </div> | |
| 118 | </section> | |
| 119 | ||
| 120 | <section aria-labelledby="server-heading"> | |
| 121 | <h2 id="server-heading">Server</h2> | |
| 122 | <div class="setting"> | |
| 123 | <span><strong id="server">g1t.sh</strong><span class="muted">The g1t this app opens. Change it if you run g1t yourself.</span></span> | |
| 124 | <button type="button" id="change-server">Change…</button> | |
| 125 | </div> | |
| 126 | </section> | |
| 127 | ||
| 128 | <p class="error" id="error" role="alert" hidden></p> | |
| 129 | <p class="muted small foot"><a href="https://docs.g1t.sh/guides/desktop/">About the desktop app</a></p> | |
| 130 | </main> | |
| 131 | </div> | |
| Merge branch 'main' into rm-agents | 132 | <script src="busy.js"></script> |
| Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9 | 133 | <script src="settings.js"></script> |
| 134 | </body> | |
| 135 | </html> |
This file's history is long; its oldest lines are credited to the oldest commit read.