Skip to content

Fretwire 0.5.0

Choose a tag to compare

@olegklimakov olegklimakov released this 22 Aug 18:30

The fifth beta is about reading and about reach. The settings window stopped
being four tabs and became a list of small panes, which is what let three
preferences land in it that had nowhere to go before: how tall a history row is,
how large its text is beside everything else, and how loud the commit messages
are. Beside that, two commands grew past the one place they used to work — a
worktree can start at any commit now, and a squash can take a run from anywhere
inside the branch rather than only one ending at HEAD. And a branch pushed to
two remotes finally draws one pill instead of three that read the same.

New

  • Settings as a list of panes — six panes down the left instead of four
    tabs. A tab strip charges for each new preference twice, once in the strip and
    once in the pane it makes taller; Appearance alone had grown to carry five.
    Appearance keeps the theme and the text size, History takes the lane
    weight and the message emphasis with the sample that draws them both, and a
    new Diff pane takes the in-diff sidebar toggle together with the external
    diff and merge tools — which answer "what opens this file", not "which git
    runs", and were only ever under Git for want of a better home. The stored key
    is the old one, so an upgrade reopens on the pane it left off.
  • A history you can set the density of — ⌘, ▸ History: Row height
    (Compact / Regular / Comfortable) and a History text size. The history is
    the one list in the app with a height of its own — the refs sidebar and the
    file lists are as tall as what is in them — which is what makes "how many
    commits fit on screen" a question worth answering; Compact fits about a
    quarter more. The text size multiplies the app-wide one rather than replacing
    it, so ⌘+ and ⌘− still move both, and nobody has to choose between comfortable
    panels and a dense history. Everything inside a row follows it — message,
    author, date, SHA, ref pills, avatar — while the column header stays on the
    app-wide scale, being the table's chrome rather than its content.
  • Commit messages you can turn down — the subject is the brightest ink on
    the screen, and on a wide history that column of white pulls the eye off the
    lanes and the pills it is supposed to sit beside. Three steps, each an existing
    text rank rather than a new colour, so the message keeps its place in the
    hierarchy everything else is built from.
  • One pill per branch — a pushed branch used to decorate two pills printing
    the same word: past the column's label budget both truncate to the last
    segment, and the only difference left was an icon the eye has to hunt for. The
    refs sharing a branch name fold into one pill now — the local name, an icon per
    ref inside it — and the tooltip and the VoiceOver label spell out every full
    name, including which remotes carry it. Tags and the detached-HEAD marker keep
    their own pill: a tag named like a branch is a different thing pointing at the
    same commit.
  • A worktree that starts at a commitAdd Worktree Here… on any history
    row, beside Create Branch Here and Create Tag Here, which are the same "work
    from this point" aimed elsewhere. On a branch made for the occasion, because
    that is the only thing that can be checked out at an arbitrary commit — a
    directory sitting on a bare commit is a detached HEAD nobody asked for — with
    the folder seeded from the short hash until a branch name is typed.
  • Squash a run of commits — a selection of five could previously be folded
    only by opening the rebase editor and marking four rows by hand, and only if it
    ended at HEAD. Squash N Commits… now takes any contiguous run inside the
    branch: the base is the oldest selected commit's parent, everything above the
    run is replayed on top, and the messages are joined exactly as a squash into a
    parent already did — so the command is a confirmation, not a second editor. The
    menu entry reads the run off the selection without touching git, so it is a
    command or an explanation ("Squashing needs commits in a row", "Merge commits
    can't be squashed"), never a dead button.
  • Escape leaves the diff — reading a diff, the only way back to the history
    was the chevron in its header, a mouse trip for something every other Mac app
    answers with the key already under the reader's finger. It stands down wherever
    there is a caret: the search field and the commit message answer Escape
    themselves.

Fixed

  • Light back to System left the windows half-themed — the palette resolved
    to dark while every window went on drawing light chrome, which reads as broken
    colours and washed-out type. Light and Dark never showed it, because there the
    next forced value overwrites the last. The forcing went through SwiftUI's
    preferredColorScheme, which sets the window's appearance and does not unset
    it when the value goes back to nil. The appearance is the application's now, so
    unsetting it is an operation that exists — and nothing forced is what keeps the
    Mac's own setting readable, which is the signal the System choice follows.
  • A local branch under a prefix drew a remote's pillfeature/x is
    spelled exactly like a branch on a remote named "feature", and the graph read
    it as one, cloud icon and all. Decorations are read as full refnames now.
    Refs outside refs/heads, refs/remotes and refs/tags decorate nothing:
    a stash's internals and a fetched refs/pull/*/head used to draw a pill named
    after a path.

Requirements

  • macOS 14 or later.
  • A git — whichever comes first on your login shell's PATH, else Apple's. With
    none installed at all, the Welcome screen says so once, with the command that
    fixes it.

Not here yet

  • A command palette.
  • Dragging a commit onto a branch. The rebase editor covers reordering a range;
    history by drag-and-drop is a separate decision, and it hasn't been made.

During the beta

Free, for any use. Licensing starts at 1.0: free for personal projects, paid per
seat for commercial use — see the EULA.

The app updates itself — each update is checked against a signature before it is
applied. Settings ▸ Updates decides how much of that happens on its own. Bug
reports and requests go to the issue tracker.