Releases: LunarWerxs/RepoYeti
Release list
v0.21.5
What's new
Added
- "Restart to finish" is a button now (#23).
Fixed
- The "Update installed" toast no longer says the app is restarting when it isn't.
Full notes
Added
- "Restart to finish" is a button now (#23).
Installing an update by hand from the dashboard leaves the daemon serving the OLD build until
something restarts it — only the opt-in unattended update restarts on its own — so the version row
correctly changed to Restart to finish and then stopped there. That is a statement of what has
to happen next, shown on the one screen that could not make it happen: an installed PWA on a phone
has no system tray and no terminal beside it, which is the setup this row exists for in the first
place. In practice the freshly-downloaded build just sat on disk, sometimes for hours, waiting for
the owner to reach a real computer.
Tapping the badge now relaunches the daemon through the auto-updater's existing handoff rather
than a second restart mechanism: a detached successor is spawned carrying the port this daemon is
bound to, this one shuts down gracefully to release it, and the successor binds the same port — so
the page you tapped from reconnects to the new version instead of hunting for a port that moved.
That handoff already had to get three win32 traps right (WMI drops the environment block, so both
the relaunch signal and the port ride as command-line flags; a non-detached child dies with the
tray'staskkill /T), and a parallel implementation would have been a second place to get all
three right. It is deliberately notPOST /api/shutdown, which means stop the whole application
and drops the sentinel telling the tray host to dispose its icon and exit.
The restart is refused, with a reason, while work is in flight: an agent waiting on an MCP
approval, a git operation running, or an update still installing (that one restarts itself when it
lands). Those are the same guards the unattended updater uses, minus its starvation cap — that cap
exists because a loop nobody watches must not be starved into never updating at all, whereas here
the owner is the retry, so refusing every time is safe as long as the refusal says why. Every
connected dashboard, not just the one that asked, is told over SSE, so the disconnect that follows
reads as the restart it is rather than a fault.
New route:POST /api/updates/restart, owner-only (a share-link guest can never restart someone
else's machine),409 BUSYwhile work is in flight.
Fixed
- The "Update installed" toast no longer says the app is restarting when it isn't. A manual
update reported Restarting to finish. while nothing was restarting — the daemon kept serving the
old build. It now says Restart to finish, which is both true and the name of the badge that does
it.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.21.4...v0.21.5
v0.21.4
What's new
Fixed
- The overflow menus open where you can see them.
Internal
- The test suite cleans up after itself.
Full notes
Fixed
- The overflow menus open where you can see them. Four controls did nothing at all when clicked
(#15): the file viewer's View options⋮,
which is the only home word wrap has ever had, the Changed-files and History view-options
sliders, the branch switcher, and the recent commit messages history button. Every one of
them really did open.aria-expandedwenttrue, every item was in the DOM, nothing was logged,
and the menu was drawn attranslate(0, -200%), two menu-heights above the top of the window. On
a 1600x900 desktop the file viewer's menu measured its top edge at -594px. Neither the markup
nor the console said anything was wrong, which is how it survived four releases and one previous
fix attempt.
The cause is one line of nesting. reka'sMenuRoot,PopoverRootandTooltipRooteach render a
PopperRoot, whichprovides the anchor its popper positions against, and every trigger
registers itself throughPopperAnchor, whichinjects the nearest one. With the menu
wrapped around its tooltip, the menu's own trigger sat inside the tooltip and handed its
anchor to the tooltip's root, while the menu's content, which sits outside the tooltip, injected
a root that no longer had one. Floating UI never received a reference element, so it never
positioned anything. The earlier attempt added an inert<span>between the twoas-child
triggers. That is a real and separate bug, but it could not touch this one: this half is
provide/injectnesting, not DOM attribute merging. Each menu now lives inside its
tooltip's trigger, so its own root is the nearest for both halves. A newcheck:popperguardrail
fails the build on the old shape, because no component test can catch it: jsdom has no layout, so
an off-screen menu passes every assertion an on-screen one does.
Internal
- The test suite cleans up after itself. Nothing shipped to users changes, since the daemon's
own scratch directories were always removed infinallyblocks, but running the suite leaked
directories on developer machines, in two separate ways, and had done since the scratch helper
was introduced. Locally that came to 1,673,606 files across 46,854 directories in.testtmp/
between 2026-07-27 and 2026-08-15, plus 1,408 directories and 31,774 files in the real
%TEMP%from two days of runs. Only a few gigabytes; the damage is the file count, which slows
every tool that walks the working tree and takes an age to delete once grown. CI never noticed
because GitHub runners are destroyed after each job, so the entire cost landed on contributors.
First cause:tests/helpers/scratch.tsmoved scratch out of the OS temp directory (it had to,
becauseisUnderTempDirrefuses to import a repo from there) and, in doing so, silently gave up
the reaping the OS had been doing for free, without replacing it..testtmp/is gitignored, so no
git-based check could see it either. Scratch now lives under a per-run subdirectory that is torn
down when the run ends, and a run killed before its teardown is swept by the next run rather than
left forever. Second cause: the migration to that helper was never finished. Sixteen test files
still built fixtures directly under%TEMP%with no cleanup, and%TEMP%\gm-*repositories are
the exact shape of the ~115 junk rowsisUnderTempDirandpruneTempReposexist to clean up. All
sixteen now usemkScratchDir.tests/db-temp-guard.test.tsstill uses a real temp path, because
proving the guard fires there requires one, but it now records every directory it creates and
removes them. A newcheck:testscratchguardrail fails the build if a test reaches for the OS
temp directory again.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.21.3...v0.21.4
v0.21.3
What's new
Fixed
- An applied update no longer takes RepoYeti down.
- An update no longer moves the daemon to a different port and kills the tab you had open.
Full notes
Fixed
- An applied update no longer takes RepoYeti down. On a downloaded release build, installing an
update stopped the daemon and started nothing in its place: the dashboard went dead and the only
way back was launching the app again by hand. The relaunch built its successor's command from
process.argv[0..1], which is the runtime and the script in a source checkout but, inside a
compiled single-file executable, is a placeholder pair pointing at a virtual path that exists only
inside the running binary. Respawning it fails immediately, and on the machines a compiled release
exists for (no runtime installed, which is the entire pitch) the command cannot resolve at all.
Nothing caught it, because the failure is in the child: the spawn call itself succeeds, so the
guard that exists precisely to never shut down without a successor saw one and stepped aside.
Second cause, same outcome, on any launch that did not spell outstart, which is the documented
"just run the .exe" path: the relaunch signal is appended as a flag, and with no other arguments
it landed in the command slot, so the successor exited withUnknown command: --relaunch. The
update itself was always written to disk correctly, so an install on an older build recovers the
moment you start it again, and this is the last time it will need to. - An update no longer moves the daemon to a different port and kills the tab you had open. The
successor was handed the port this daemon preferred, not the port it was actually serving on.
Those are the same number only until something else holds the preferred port once; after that
every update aimed the successor at the wrong one, and it uses that value for both of its jobs. So
it waited out its full 8-second handoff timeout on a socket its predecessor never held and nobody
was going to release, then bound that port rather than the one your browser was talking to,
and the open dashboard's live connection died against a daemon that was otherwise perfectly
healthy. It is now given the bound port, so the wait applies to the socket actually being freed
and the daemon keeps one address across updates. Measured on an isolated home: a daemon that had
hopped once used to relocate its successor away from the open tab, and took 8.4s to do it; it now
hands over in 1.2s on the same port.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.21.2...v0.21.3
v0.21.2
What's new
Fixed
- Refresh now reconciles the branch list, not just the status ([#22]).
- An installed PWA recovers by itself after the tunnel address rotates ([#21]).
Full notes
Fixed
- Refresh now reconciles the branch list, not just the status ([#22]). Check out a different
branch outside RepoYeti, from a terminal or another Git client, press Refresh, and the card kept
showing the old branch while still offering branches that had been deleted. Only a full page
reload cleared it. The status read was never wrong: Refresh really did return the new branch. What
was missing is that nothing invalidated the cached branch list, and the selector renders the
cache. Reconciled at the one funnel every status update passes through, so the Refresh button,
an action's own response and the live event stream all behave identically. The trigger includes
the ref-set hash, which is what catches the half of the report that leaves the current branch
untouched: a branch deleted or updated elsewhere. Lists for cards nobody has opened are left
alone rather than re-read for a view no one is looking at. - An installed PWA recovers by itself after the tunnel address rotates ([#21]). Running mostly
from a phone, an unattended update brings the daemon back on a fresh Quick Tunnel hostname, and
opening the installed app showed a dead URL; the only way back was opening the permanent link in
a browser and reinstalling. The self-heal for this already existed, but only for a page still
running, and it assumed the service worker was serving a cached shell on the dead origin. It was
not: no shell is precached, deliberately, because a precached one used to leave a rebuilt tab
reloading into a stale build. Two correct decisions that combined into a bug, since a cold start
then failed at the network before any code ran. A failed navigation now falls back to a tiny
standalone page that asks the permanent address where the daemon went and goes there. It
references no build assets, so it cannot go stale the way the app shell could, and it only ever
appears when a navigation genuinely failed.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.21.1...v0.21.2
v0.21.1
What's new
Added
- Gitignored files and folders are dimmed in the All-files tree.
- A switch to keep "All files" on this machine only.
Changed
- The file search no longer returns every vendored copy of a filename.
Fixed
- Every changelog release links to its diff again.
Full notes
Added
- Gitignored files and folders are dimmed in the All-files tree. Browsing a working tree
without knowing which parts git is ignoring means readingnode_modules,cdk.outand
coverageas if they were yours. Editors dim those rows; so does this now, files as well as
folders. The mark comes fromgit check-ignorerather than from pattern-matching here, because
gitignore is negations, nested ignore files,core.excludesFileandinfo/excludeevaluated in
a defined order, and a hand-rolled matcher gets the interesting cases wrong. - A switch to keep "All files" on this machine only. Settings, Remote access, beside the
existing editing one: it stops the working-tree browser working over the tunnel while leaving
loopback untouched. Its own switch rather than riding on the editing one, because it is a
different risk. Editing writes; this enumerates, ignored paths included, which is where.env
files and local credentials live. Being happy to read your diffs from a phone and being happy
for the tunnel to list every file on the machine are separate decisions. Defaults to enabled.
Share-link guests were never able to browse and still cannot: both routes are owner-only.
Changed
- The file search no longer returns every vendored copy of a filename. Browsing and searching
want opposite defaults, and shipping one for both was wrong: the tree can afford to list
node_modulesbecause a folder costs nothing until you open it, but a search has no such
protection, and "tsconfig" came back as forty vendored hits burying the four that were the
answer. Ignored paths are now excluded by default, with a toggle in the search box to opt back
in. The default asks git rather than walking, which is both exact and far cheaper: 18,583 paths
in 0.55s where walking the same checkout yields 200,000+ in 4.5s.
Fixed
- Every changelog release links to its diff again. The reference at the foot of the file is
what turns a## [0.21.0]heading into a link, and nothing enforced it, so it lapsed silently
for seventeen consecutive releases. Backfilled, along with a reference pointing at a version
this file has no entry for and an[Unreleased]link still comparing from v0.15.2. A check now
fails the build rather than letting it rot again.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.21.0...v0.21.1
v0.21.0
What's new
Added
- Browse the whole repository, not just its changed files.
- Ignored paths are included, and the tree loads one folder at a time.
- Find a file anywhere in the repo.
Changed
- A click no longer waits behind the background work.
Fixed
- A greyed-out view option now says why, in the menu.
Full notes
Added
- Browse the whole repository, not just its changed files. The file panel could only ever show
files git had noticed. The viewer was always capable of opening any path, but the panel simply had
no way to list one, so everything you had not edited was unreachable from inside the app. A
toggle in each card's header now swaps the changed-file list for the entire working tree, using
the same viewer, the same icons and the same panel. A file that IS changed keeps its status
letter, so switching modes loses no signal, and the toggle sits outside the changed-files
section on purpose: a clean repo is precisely when you want to read the code. - Ignored paths are included, and the tree loads one folder at a time. Showing
dist/and
vendored bundles is the point: that is exactly whatgit ls-fileshides and what you
occasionally need to open. It is also what makes a whole-tree listing impossible rather than
merely slow: a working checkout here runs past 200,000 files oncenode_modulesis counted,
seconds of disk to enumerate and a payload the browser would then have to turn into 200,000
nodes. So a folder's contents are fetched the moment it is opened (about a millisecond, a few
dozen entries) and folders nobody opens are never walked. Folders therefore start collapsed,
the opposite of the changed-files tree. - Find a file anywhere in the repo. Searching only the folders already expanded would look
like it searched the repository and quietly not have, so the search walks the real tree,
breadth-first, so shallow matches, nearly always the wanted ones, are found before the walk
reaches a dependency tree. Bounded by both a result cap and a wall-clock budget, and it says
when the answer is a head rather than the whole set. Clicking a folder result clears the query
and opens the tree down to it.
Both new endpoints are owner-only. Reading a path you were handed is a different capability from
enumerating a repository, and the listing covers ignored files, which is exactly where .env
files and local credentials live. A view share stays "look at what I changed", not "walk my disk".
Changed
-
A click no longer waits behind the background work. Local git reads share one daemon-wide
pool, and it was two slots deep with a plain first-come queue that had no idea who was waiting.
Boot hydration fans out over every known repo with sixteen workers and the filesystem watcher
runs sixteen concurrent refreshes, so expanding one card could put itsgit statusbehind two
dozen reads draining two at a time. Seconds of "Loading changes…" caused entirely by queue
position rather than by anything about the repo. It is also why some repos felt instant and
others did not: which ones was luck.The queue now has a foreground lane, marked once at the HTTP boundary, because an inbound request is
the definition of "someone is waiting for this", and nothing else reaches it, so background work
cannot pick the marker up by accident. The pool also widens from two to half the machine's cores
(clamped to 4–8): a single card expand issues four reads, so at two it could not fill even its
own request in one pass. Background work is already coalesced and retried, so deferring it
briefly costs nothing you can see.
Fixed
- A greyed-out view option now says why, in the menu. The reason lived only in a
title
attribute, which is close to invisible, given the switch dims to 45% and a native tooltip wants a second
of hover on a control nobody suspects is disabled. Every row in the changed-files view options
needs "Diff statistics" turned on, and that ships off, so on a fresh install the whole popover
was inert while looking like an ordinary menu that simply ignored you. Nothing was broken; it
just never said so.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.20.9...v0.21.0
v0.20.9
What's new
Fixed
- A whitespace-only change is shown as a change.
- The diff pane waits for the diff instead of revealing the file un-diffed.
- "Showing 2000 of 13350 changed files" is no longer a dead end.
Internal
- The shared UI kit's MCP engine is re-synced.
Full notes
Fixed
- A whitespace-only change is shown as a change. Monaco's diff editor ignores leading and
trailing whitespace by default, which is a reasonable default for a code editor and the wrong one
for a git client: two lines differing only in trailing space were declared identical. The pane
then drew no highlights and collapsed nothing, so a file the changed-file row beside it called
+1 -1sat there side by side looking untouched. The list and the viewer disagreed about whether
the file had changed at all, and the viewer was the one lying. Trailing whitespace is a real edit
in this tool's world: it is exactly what a codemod leaves behind and what a formatter then
strips, so it gets shown. - The diff pane waits for the diff instead of revealing the file un-diffed. The viewer hides
itself until Monaco's diff worker returns its first result, because until then Monaco paints
precisely that: the whole file, nothing folded, nothing highlighted. But the safety net that
guarantees an eventual reveal was a flat 600ms, and on a large file or a loaded machine the worker
takes longer, so the net won the race and revealed the very state it existed to hide. The reveal
deadline and the diff deadline were sharing one number; they are not the same thing. The diff
event is the real signal and now gets 5s, with the timer back to being the failure path it was
meant to be. Where no listener could be attached no event is ever coming, so that case reveals
immediately rather than holding a blank pane. - "Showing 2000 of 13350 changed files" is no longer a dead end. The cap is right as a default:
it keeps the ordinary card render cheap and stops a mis-cloned repo producing a multi-megabyte
payload. It is wrong as a ceiling, because a repo-wide codemod genuinely does dirty that many
files. A "View all" now sits beside the notice and re-reads against a second, much higher bound
that still refuses a pathological tree. The choice is sticky per repo, so the automatic refresh
after a commit or a stage does not silently snap an expanded list back to the first 2000.
Internal
- The shared UI kit's MCP engine is re-synced. A mechanical sync of the optional
initialize
instructionsfield from lunarwerx-ui, which owns that code. Behaviour here is unchanged: this
server supplies no instructions, and the engine omits the field entirely rather than emitting it
empty, so the initialize result is byte-for-byte what it was.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.20.8...v0.20.9
v0.20.8
What's new
Added
- The "Update available" badge installs the update.
- A changelog link sits beside the version.
Fixed
- The Settings tabs stay put when the panel is scrolled.
Full notes
Added
- The "Update available" badge installs the update. Settings already told you a newer build
existed and then left you with nothing to press
(#20). The scheduled apply is hours away by
design, and on an installed PWA that Settings screen is often the only interface there is, with
no terminal beside it. The badge is a button now: it opens the same offer the bell entry opens, and
that dialog still owns the install, so tapping the badge changes nothing on disk. Both entry
points go through one action that re-derives "can this be installed right now?" from the live
status rather than from whatever the last announcement said, so a tree committed since that
announcement no longer opens a dialog refusing to install. The announcement also re-reads the
update status now: it was read once at startup and never again, so an update announced while the
dashboard was open reached the bell while the Version row went on saying there was nothing to
install, and the badge that opens the offer never appeared at all. - A changelog link sits beside the version. "What changed?" is the question a version number
provokes, and the answer was on a machine with a terminal. It points atCHANGELOG.mdon the
branch rather than the Releases page: a source checkout updates off the branch and routinely
sits ahead of any published release, so the file is what matches the build you are running.
Fixed
- The Settings tabs stay put when the panel is scrolled. On a phone the tab row slid up behind
the panel's title and then past it into the panel's clipped top edge, leaving "Settings" and
"General" superimposed and the tabs sheared in half. That is the artifact visible in
#20's screenshot. The panel's body is
deliberately tucked underneath its translucent title bar so rows shimmer through as they scroll,
which reads as intended for rows of settings and as a bug for a control. The tab row is pinned
under the title now, and stays usable while a long tab scrolls beneath it. It reproduces on any
window short enough to make the panel overflow, not only on a phone. At a phone's full height
the General tab can just fit, which is why it was hard to catch by hand.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.20.7...v0.20.8
v0.20.7
What's new
Fixed
- A pushed repo stops looking unpushed.
- "Visual bars" works on a phone.
- The History view-options button explains itself to a finger.
- Three more controls explain themselves on a phone.
- Updating from source rebuilds the dashboard.
- A reconnect re-hydrates collaboration presence.
- An unattended update is visible while it happens.
- The mobile bulk-action bar is labelled and reachable.
Full notes
Fixed
- A pushed repo stops looking unpushed. After a successful push the button stayed green, as
though the commits were still waiting, until someone hit Refresh
(#17). The daemon was right all along. It
re-reads status after every action and broadcasts it, but the client that pressed the button
had to wait for its own event to travel back over SSE, and Refresh was the one action that read
its status straight from its own HTTP response. Every mutating action now answers with the state
it produced, and the initiating client reconciles from that. The broadcast is still what tells
the OTHER clients. This matters most where the stream is least reliable: a phone that
backgrounds mid-action misses the frame outright, and a stream whose client falls behind is
deliberately closed rather than left silently lossy. Fetch, pull, commit, smart commit, checkout,
branch, stash, tag, remote edits, and the per-file stage/discard/delete/ignore actions all
reconcile the same way now. A share-link guest's copy is redacted exactly as the broadcast
already was, so the second delivery path cannot leak a credentialed remote URL. - "Visual bars" works on a phone. The History panel switches to a compact two-line row below
640px, and that row rendered numeric totals unconditionally, so choosing Visual bars did nothing
in the only layout a phone ever shows (#18).
It honours the setting now, on a narrower track since it shares a line with the author, age and
hash rather than owning a column. - The History view-options button explains itself to a finger. It labelled itself with a native
title, which no touch device has ever displayed, leaving an unexplained slider icon on mobile
(#16). It is a real tooltip now, reachable by
press-and-hold. The tooltip sits on an inert wrapper rather than on the popover's own button:
merging two rekaas-childtriggers onto one element is what broke the menu's click the last
time this was attempted, and a quick tap must keep opening the menu in one tap. - Three more controls explain themselves on a phone. The same native-
titleproblem, found by
sweeping for it rather than waiting for it to be reported: the branch switcher, the delete-branch
button, the file viewer's overflow menu, and the commit box's recent-messages menu all labelled
themselves with atitlea touch device never renders. All four are press-and-hold tooltips now.
The changed-files tree's row actions were left alone deliberately: that list runs to 2000 rows
with every row in the DOM, and a tooltip instance per row is the exact thing measured as making
it janky, so those need a different approach rather than this one. - Updating from source rebuilds the dashboard. A source install's auto-update ran
bun install
at the repo root, which does not reachweb/. That is a separate package with its own lockfile,
not a workspace. The dashboard was then built against the previous commit's dependencies, or not
at all, so a successful update could leave the PWA on the old build
(#16). Both installs now run as one step, so
the engine's rollback path gets the fix too. Packaged installs are untouched; they never build. - A reconnect re-hydrates collaboration presence. Peer presence is pure SSE with no polling
fallback, and was fetched only at the first connect, so a frame missed while a phone was
backgrounded stranded a departed collaborator on screen indefinitely. The reconnect resync now
covers it like everything else. - An unattended update is visible while it happens. The daemon announces both phases of a
background auto-update; the dashboard subscribed to those events and had no handler for either,
so it showed nothing at all while the daemon went away for minutes. Settings now reads "Updating"
and then "Restarting", which also explains the disconnect that follows instead of letting it read
as a fault. - The mobile bulk-action bar is labelled and reachable. Below 640px the Pin/Star/Hide/Remove
buttons drop their text labels, which left them with no accessible name at all, and their 24–28px
hit areas were under a finger's target, on a touch-only flow. They carryaria-labels now, and
a pseudo-element grows each target to 40px vertically without moving anything (sideways would
overlap the neighbour, and one of these neighbours is Remove).
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
What's Changed
- 0.20.7: push state, compact bars, touch tooltips, source-update rebuild by @LunarWerxs in #19
New Contributors
- @LunarWerxs made their first contribution in #19
Full Changelog: v0.20.6...v0.20.7
v0.20.6
What's new
Added
- Tooltips answer to a finger now.
- Settings shows the version actually running.
Full notes
Added
- Tooltips answer to a finger now. reka-ui ignores touch pointers on hover, so on a phone every
tooltip in the dashboard was unreachable. Worst of allInfoHint, whose text is the only place a
setting's description exists, which made that copy effectively invisible on mobile
(#16). Info icons now open on a single tap and
close on a tap outside, Escape, or a scroll; every other tooltip opens on a press-and-hold. A
plain tap on an action button still just runs the action: the hold is what reveals, and the click
it ends with is swallowed so nothing fires behind the tooltip. Sliding a finger abandons the hold,
so scrolling past a tooltipped control is unaffected, as is mouse hover, keyboard focus, and the
app-wide "show tooltips" switch. Info icons also gained a finger-sized tap target around their
14px glyph, at no cost to layout. - Settings shows the version actually running. With auto-update enabled, the terminal and
/api/healthwere the only ways to tell which build was live, neither of them reachable from an
installed PWA (#15). General, then Updates,
now leads with it and flags an update the daemon has already found. It reports the DAEMON's
version rather than the page's, so it stays honest after a self-update and reconnect.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.20.5...v0.20.6