Skip to content

Releases: LunarWerxs/RepoYeti

v0.21.5

Choose a tag to compare

@github-actions github-actions released this 19 Aug 05:09

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's taskkill /T), and a parallel implementation would have been a second place to get all
    three right. It is deliberately not POST /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 BUSY while 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

Choose a tag to compare

@github-actions github-actions released this 18 Aug 15:53

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-expanded went true, every item was in the DOM, nothing was logged,
    and the menu was drawn at translate(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's MenuRoot, PopoverRoot and TooltipRoot each render a
    PopperRoot, which provides the anchor its popper positions against, and every trigger
    registers itself through PopperAnchor, which injects 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 two as-child
    triggers. That is a real and separate bug, but it could not touch this one: this half is
    provide/inject nesting, not DOM attribute merging. Each menu now lives inside its
    tooltip's trigger, so its own root is the nearest for both halves. A new check:popper guardrail
    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 in finally blocks, 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.ts moved scratch out of the OS temp directory (it had to,
    because isUnderTempDir refuses 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 rows isUnderTempDir and pruneTempRepos exist to clean up. All
    sixteen now use mkScratchDir. tests/db-temp-guard.test.ts still 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 new check:testscratch guardrail 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

Choose a tag to compare

@github-actions github-actions released this 16 Aug 01:11

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 out start, 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 with Unknown 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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 21:01

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:22

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 reading node_modules, cdk.out and
    coverage as if they were yours. Editors dim those rows; so does this now, files as well as
    folders. The mark comes from git check-ignore rather than from pattern-matching here, because
    gitignore is negations, nested ignore files, core.excludesFile and info/exclude evaluated 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_modules because 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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 18:24

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 what git ls-files hides 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 once node_modules is 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 its git status behind 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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 01:00

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 -1 sat 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
    instructions field 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

Choose a tag to compare

@github-actions github-actions released this 13 Aug 17:05

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 at CHANGELOG.md on 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

Choose a tag to compare

@github-actions github-actions released this 12 Aug 18:27
64258c4

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 reka as-child triggers 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-title problem, 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 a title a 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 reach web/. 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 carry aria-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

Full Changelog: v0.20.6...v0.20.7

v0.20.6

Choose a tag to compare

@github-actions github-actions released this 12 Aug 04:41

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 all InfoHint, 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/health were 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