Releases: baojie/gitty
Release list
0.2.0
0.1.9
chore(release): 0.1.9 A new screenshot for the README, the shipped links and the version bumped to match, and the unreleased notes closed as 0.1.9.
0.1.8
0.1.7
Gitty 0.1.6
Added
- Ctrl+F finds text in whatever the right-hand pane is showing: a
diff, a file, rendered markdown, an HTML preview, a blame or a file's history.
Matches are highlighted with the current one picked out; Enter /
Shift+Enter and the arrows walk them, wrapping at either end;
Esc closes; the count says where you are. The search reads the
rendered text, so a phrase is found across markdown's bold and code spans.
Views that render in chunks render the rest as the strip opens, so the count
covers the whole file or diff; a collapsed file in a multi-file diff is not
searched. - Ctrl+Shift+C copies as well as Ctrl+C, everywhere in
the window. In a terminal it takes xterm's own selection instead of reaching
the shell as an interrupt; in an HTML preview, the selection inside the frame.
With nothing selected, the key is left alone. - Clicking the Gitty brand in the title bar opens an About dialog: the
version, build time, author, and the Electron, Chromium and Node versions. It
is drawn by the renderer, so the home-page link opens in the system browser. - Whole-file blame is syntax-highlighted like the code viewer, so the lines in
the blame pane carry the same token colours as the diff and the file. - Each blame row shows the date of the commit that last touched the line, read
through the same time-zone and relative-time settings as the rest of the UI. - Markdown source lines, a View setting: each block of a rendered document
is numbered in the left gutter with the line it starts on in the source.
Headings, paragraphs, list items, tables, fenced code and images all get one,
so a passage in the preview can be found in the file. Off by default.
Changed
- Font size goes from 9 to 20, where it was 11 to 16.
- Monospace font and Shell are dropdowns rather than text fields.
Fonts are the monospace families installed on this machine, measured by
probing; shells come from/etc/shellsplus the usual paths,COMSPECand
PowerShell on Windows. A stored value the machine no longer offers stays in
the list. - Settings is three tabs — Appearance, View, Session — rather than one column
that had grown long enough to scroll. The panels stay mounted behind the
tabs, so every control keeps its state and the dialog is sized by its tallest
section rather than jumping as you switch. It opens on Appearance each time:
a short-lived dialog that resumes where it was left is a small puzzle. - Browsing a whole repository — the work tree, or a commit's snapshot — starts
with every directory collapsed, while a list of changes still opens expanded.
What you expand stays open while that tree is on screen; showing another tree
starts from the default again. - The file tree lists directories before files at every level, so a folder is
never buried among the names of its siblings. - File sorting in Settings: natural (the default) or git's byte order, for
anyone who wants the tree to match whatgit ls-filesprints. - The file tree sorts names naturally. Git orders paths by byte, which puts
SKILL_W10betweenSKILL_W0andSKILL_W1and every capital before every
lowercase letter; the tree reads the digits in a name as a number and treats
case as a tiebreak. It sorts in one place for all five commands the entries
come from, by path segment — a whole-string compare could dropa.txt
between two files ina/, drawing thea/heading twice. - The markdown outline is a resizable panel: drag the line between it and the
document (it used to be a fixed 210 pixels). The size is shared by every
document in the repository and lasts as long as the window. - Open Repository moved from the right-hand end of the title bar to a +
beside the repository button, drawn in the accent colour — with one repository
open it is the control the window still needs to offer. - The work tree row's right-click menu offers Browse Working Tree: the
repository as it is on disk right now, tracked and untracked files alike,
contents read from the work tree. It used to say Browse Snapshot and open
the tree at HEAD, omitting uncommitted work. A commit's Browse Snapshot
still browses that revision. - The blame pane's rows now show just the author and a compact date — the SHA
column is gone. A date from the current year drops the year ("Jul 1"); an
older one keeps it ("Jan 15, 2025"). The author and date carry the colour the
SHA used to carry, so adjacent commits are still told apart by hue. The full
SHA is in the row's tooltip; right-clicking a row copies it.
Fixed
- Two user-visible strings bypassed the message tables — the lazy-chunk loading
fallback and the oversized-image notice. Both now read through the tables. - Rendered markdown, the code viewer and blame rebuilt their DOM on every state
change — markdown the whole document on every scroll, the others every line.
React sets innerHTML whenever thedangerouslySetInnerHTMLprop is a different
object, and a fresh{__html}per render always is; the{__html}is now
memoised, leaving the nodes alone — which large files feel and which the find
highlights need to survive.
Gitty 0.1.5
Added
-
Six new settings, and a third Session group in the dialog to hold the
ones that are not about a pane:- Context lines — 0 to 25 lines of context around each hunk (git's
-U,
whose default is 3), so a change can be read in as much or as little of its
surroundings as it needs. - Ignore whitespace — Off, Amount (
-b) or All (-w). Reindented or
rewrapped code reads as unchanged instead of as a wall of red and green.
The file list's churn counts follow the same setting, so+12 −3cannot
claim lines the diff beside it then refuses to show. - Reopen last session — the repositories open at exit come back as tabs
at the next launch. The repository Gitty was started with stays the active
one; any that have since been deleted are quietly dropped. - Monospace font — the family the panes and the terminal are drawn in.
Empty keeps the built-in stack, and a font the system lacks falls through
to it. - Time format — Absolute or Relative (
28m ago), a companion to the
time-zone setting. Hover tips stay absolute either way. - Shell and Login shell — which shell a terminal starts and whether
it sources the user's profile. Both are read when a session is created, so
they apply to the next split rather than to running shells. A shell path
that does not exist falls back to the system's rather than leaving a dead
pane.
- Context lines — 0 to 25 lines of context around each hunk (git's
-
Time zone in Settings: the zone every date and time on screen is rendered
in — the machine's own by default, UTC, or any zone the system knows. Git
stores a commit with its author's own offset, so a stamp was always a choice
of zone; now it is one that can be made. The commit log, a file's history and
the commit header all follow it, and so does the cutoff between a row showing
a time and one showing a date, which is a calendar day in the chosen zone.
A row's hover tip now spells the time out with the zone it is in, in place of
the raw ISO stamp. -
A staged file's name is green in the work tree, the colour its index column
already carried. Partly staged counts — the index has something either way —
and a staged deletion keeps the line through its name as well. -
Delete File… in the work tree's file context menu. It asks first, in a
native dialog, and moves the file to the system trash — recoverable outside
git as well as inside it. Where there is no trash to move it to (a mount
without one, a system with none at all) it asks a second time and says
plainly that the file leaves the disk. The entry belongs to the work tree
alone: a commit's file list and a snapshot describe revisions, where there is
nothing on disk to delete, and a file already deleted is not offered either. -
Per-file churn in the file tree, after the line count:
+12 −3, the lines
this change added and removed in that file. Measured against HEAD in the work
tree and against the parent for a commit or a range. A snapshot is a tree
rather than a change and shows none, as do binary files and merge commits. -
Ctrl+Shift+0 shows all four panes again, so a layout hidden down to
one pane can be restored without going through the Panes menu. The menu
entry now names the key. Zero belongs with Ctrl+1 … Ctrl+4
but takes the Shift, since Ctrl+0 is reset-zoom. -
Gource, in the commits pane, where gource is on
PATH: an animation of the repository growing, commit by commit. It runs in
its own window and outlives Gitty; a day of history per half second, idle
files kept on screen and long gaps skipped, so a real history reads as
something happening. Where gource is not installed the button is not
rendered — nothing is downloaded, suggested or installed on your behalf. -
Browsing history, with ‹ and › at the left of the title bar
(Alt+← / Alt+→) and a ▾ listing the places viewed,
most recent first, with a dot on the current one. A place is the whole of what
the top panes were showing — the view, the file selected in it and the
document open beside the diff — so going back tosrc/main/git.ts @ 7bb7787
puts that file back on screen at that revision, not merely the commit.
Hovering a button names where it leads. Each tab keeps its own fifty most
recent places; they are not remembered across restarts. -
A macOS launcher.
setup.shnow picks the shortcut by platform and writes a
minimalGitty.appto~/Applications, with a symlink on the Desktop,
wrapping the samerun.sh. Nothing is packaged — the bundle is there to give
Finder and the Dock a name and an icon, built frombuild/icon.pngviasips
andiconutil. The Dock itself is left alone, as on Linux. Because a bundle
launched from Finder inherits launchd's minimalPATH,nodeandnpmare
resolved at install time and prepended, so the build-if-stale step still
works; re-runsetup.shafter switching Node versions. Requested by
@OrangeViolin (#2).
Fixed
-
Font size and row height started at their minimums (11 and 18) on a fresh
install rather than at their defaults (12.5 and 20): the stored value was
read throughNumber(localStorage.getItem(…)), andNumber(null)is 0,
which is finite — so the fallback never ran and the clamp took over. -
A long file name pushed its line count and churn out of the file tree. The
name is a flex item beside fixed-width ones, and those were shrinking first:
the indent and the status codes collapsed while the name kept its full length,
so the row overran the pane and the numbers at its end went with it. Only the
name gives way now, ellipsised to whatever room the rest of the row leaves. -
setup.shwrote agitty.desktopentry on macOS, where nothing would ever
read it. The shortcut now followsuname. -
run.shnow says so when Electron's binary was never downloaded, instead of
launching a broken install that hangs on "Downloading Electron binary…" with
nothing to act on. The old check looked fordist/electron, the Linux
layout, and otherwise fell back to.bin/electron— a symlink to the
package'scli.js, which is executable whether or not a binary exists. The
path now comes from the package's ownpath.txt, so macOS resolves too, and
a missing binary reports how to reinstall it,ELECTRON_MIRRORincluded.
Reported and fixed by @OrangeViolin (#1, #4). -
package.jsonread0.1.3at thev0.1.4tag, so the release described
itself as the one before it. Thanks @OrangeViolin (#3).
Gitty 0.1.4
Added
-
Every file in the tree now shows its line count beside the name (e.g.
"142 lines"), counted from disk for the work tree and from the revision
wherever else. Binary files, deleted files and files larger than 8 MB are
skipped and show no count. -
Images are shown, not reported as binary. Opening a
.png,.jpg,.gif,
.webp,.bmp,.ico,.avifor.svg— from the file tree, the header
button or a snapshot — gives the picture itself, fitted to the pane over a
checkerboard so transparency reads as transparency, with its pixel dimensions
and size underneath. Click it for actual size and scroll around; click again
to fit. The bytes come from disk in the work tree and from the commit
everywhere else, so an image can be looked at as it was. -
Markdown previews show the images they reference. A relative path is resolved
against the document and read out of the repository at the document's own
revision, so an old commit renders with the screenshots it shipped with; one
that is not there at that revision leaves a placeholder carrying its alt text.
Images from the web are still not fetched — reading a stranger's README should
not announce you to whatever host it points at. Selecting an image also
renames the header's View File to View Image. -
A Language setting in the Settings dialog switches the interface without
restarting: the panes, the menus, the dialogs and the application menu's own
labels all change together. Nine languages are listed — English, 简体中文,
日本語, 한국어, Français, Deutsch, Español, Русский and Português, all of them
translated in full — the interface, the application menu and the notices git's
output is wrapped in. English remains the source the others are translated
from. -
The commit log filters. A box above it narrows the list to commits whose
message or author contains the text, with a ✕ to clear; typing is debounced
and the result pages like the unfiltered log. The filter is a union of a
message match and an author match — git would AND--grepwith--author,
so the two passes are merged by hash and shaped in one date-ordered pass. -
Selecting a commit shows its full message. The subject, author, date and the
whole body sit above the file list whenever a commit or a snapshot is
selected, so a long commit message no longer has to be guessed at from the
one-line log. When the message has a body, a ▸ toggle folds it away to the
subject and the metadata row, giving the file list the room. -
Blame and file history, from any file's context menu. Blame File opens
one row per source line — the commit, its author and the line itself, with an
em dash where a line is not committed yet; File History lists every
commit that touched the file and clicking one opens it. Both open as
documents beside the diff, blame the revision being viewed (a commit-mode
file blames that commit, a snapshot file the snapshot's tree), and the
history follows renames. -
A vitest suite for the git parsers, the only part of the app that is pure
functions over text: thestatus,log,name-status, branch and blame
formats are parsed from fixtures without a repository.npm testjoins
npm run typecheckas the automated safety net.
Changed
- A repository tab's tooltip now says when that repository has uncommitted
changes, so the yellow dot beside its name does not have to be guessed at. - The README is available in five more languages — 简体中文, 日本語, Español,
Français and Deutsch — underref/readme/, linked from the top of the English
one. Each translation is stamped with the date it was made and says plainly
that the English README is the official version and the only one kept up to
date; where a translation disagrees with it, the English is right. - README restructured around the window rather than the panes. The title bar —
every button and counter in it — now has a section of its own instead of
being split across four unrelated ones, tabs and recent repositories sit under
it, and opening a file whole is documented beside the diff rather than inside
it. Newly written up: the Settings dialog, snapshots (Browse Snapshot),
and the Word highlight option, none of which the README mentioned. - The window opens faster: the renderer bundle is split, so the app shell and
the four panes no longer wait on the libraries only some of them need. The
terminal (xterm), opened files and markdown previews (highlight.js,
markdown-it) load as their own chunks only when they first appear, instead of
gating the first paint. - The pane-title tooltips now spell out the double-click gesture: hovering any
of the four pane titles shows Double-click the title toggles full screen
under its shortcut, so the mouse gesture is discoverable without a docs hunt. - README screenshot updated for this release (
ref/gitty-0.1.4.png).
Fixed
- Yesterday evening's commits read as times still to come. The commit log shows
a bare time for today's rows and a date for everything else, but "everything
else" was measured as the last 24 hours: at 3 PM, a commit from 9:45 the
previous night was labelled "9:45 PM" with no date, sitting directly under
1:43 PM. The cutoff is now the calendar day. The file history pane shares the
same stamp and was wrong the same way. - The window could stay hidden forever on Wayland. It is created hidden and
shown at its first paint, but an unmapped window's renderer can hold that
frame back — and showing the window is what would have released it. Gitty
appeared to start and then leave nothing on screen. The load event now arms a
fallback that shows the window a second later if the first paint has not
already done it. - Around twenty strings never followed the language setting, because they were
still written into the components rather than read from a message table —
Show Whole Diff, Wrap, Outline, Preview, Open in Browser,
the document tabs, the work-tree row of the commit log and a dozen tooltips.
They now come from the tables like everything else.
Gitty 0.1.3
Added
- Push and Pull in the commits pane header, on the checked-out branch.
Push carries the count of unpushed commits (Push 3) and greys out
when there is nothing to send; on a branch that tracks nothing it publishes
tooriginand sets the upstream. Pull fast-forwards from the upstream
and greys out when there is none. Git's own output appears above the log,
clicked away when read — failures stay until dismissed. A push or pull that
needs a credential prompt fails with git's message instead of hanging (there
is no terminal behind them); the terminal pane is where it gets finished. - Every pane hides and comes back: a × at each pane header's end hides it,
Panes in the title bar lists all four with a dot on the visible ones, and
Ctrl+1…Ctrl+4 toggle them in layout order. The remaining
panes share the space; the last visible pane keeps its × hidden, so the
window is never empty. What is hidden is remembered across restarts, and
hiding the terminal pane leaves its shells running, scrollback intact. - The file heading stays in view while scrolling a whole-file diff: when it
scrolls past the top of the pane it pins itself there until the next file's
heading pushes it away. A single-file diff is unaffected. - Every pane goes full screen, not just the diff. ⤢ at the left of each pane
header fills the window; ⤡, Esc, a header double-click or
Ctrl+Shift+1…Ctrl+Shift+4 restores the layout. The
diff's Full Screen / Restore button is gone, its corner button
replacing it. - Hovering a pane title shows a styled tooltip spelling the pane's own gestures
— the keys that hide it and fill the window — with the key labels
colour-coded.
Fixed
- Reading a long file no longer jumps back to the top when the file changes on
disk. The position is kept across a reload, with the lines already loaded in
the source view; only opening a different document rewinds. - The window list and the dock show Gitty's icon instead of a generic
placeholder. The desktop entry now carriesStartupWMClass=electron: an
unpackaged Electron app reportselectronas its window class (its Wayland
app_id) whateverapp.setName,--class,CHROME_DESKTOPor a renamed
binary say. Re-run./setup.shand restart Gitty to pick it up. - The work tree pane no longer gets stuck listing changes that are already
committed. A burst of file-system events could start several refreshes at
once, and a slow earliergit statuslanding after a newer one put its stale
file list back on screen while the diff pane showed the real state. Replies a
newer refresh has overtaken are now discarded, for the diff pane as well.
Changed
- README screenshot updated for this release (
ref/gitty-0.1.3.png).
Gitty 0.1.2
Third release.
Added
- Repository tabs — a bar along the bottom holds every open repository, each with its own four panes and terminal.
+orCtrl+Oopens another into a new tab; a dot marks tabs with uncommitted changes. - Split terminals — Split → and Split ↓, nested splits with draggable separators, and a small × to close one.
- Browse another branch — the branch in the title bar is a menu of every local and remote-tracking branch; picking one points the commit log at it. Nothing is checked out.
- Commits in the browser — a server inside the app (127.0.0.1 only) renders commits for the system browser: Open in Browser / Copy Commit URL on a commit, and a commit list with per-file diffs.
- Documents beside the diff — double-click a file (or View File / Preview) and it opens in a strip next to the diff instead of over it. Each remembers the revision it was opened at, closes with its own ×, and reloads when the work tree changes.
- Foldable file headings — a triangle on each file heading collapses it, Collapse All / Expand All does the lot, and Ctrl+click a heading opens that file.
- The whole diff by default — with no file selected the work tree now shows every uncommitted change, staged and unstaged, with untracked files inlined.
- Recent repositories, an application icon, and a desktop launcher from
./setup.sh.
Changed
- The diff pane reads as a list of files: the
diff --gitline becomes the path itself as a full-width heading, blob hashes and---/+++lines are folded away, and the hunk header is dimmed. - Show Whole Diff stays in the header instead of coming and going.
Fixed
- A deleted line beginning with
--no longer vanishes from the diff. - A hidden tab no longer stretches the visible one past the window.
setup.shrefreshes the icon cache, so the launcher is not blank.
Full changelog: https://github.com/baojie/gitty/blob/v0.1.2/CHANGELOG.md
Gitty 0.1.1
Added
- Whole-file view beyond markdown: View File — a double-click in the file
tree, the context menu, or the header toggle — shows any file's full contents
with line numbers and syntax highlighting instead of its diff, from disk in
the work tree and at the selected revision elsewhere. It is a one-off action
rather than a remembered mode: selecting another file or another commit goes
straight back to the diff. Snapshots are the exception and always view files,
having no diff to show. - A settings dialog (Settings in the title bar, File ▸ Settings, or
Cmd/Ctrl+,) collects every preference in one place: a theme
toggle (dark, the default, and light), the font size and row height as
sliders, and the existing diff layout, word wrap, word highlight and markdown
outline switches, each with a Restore Defaults button. The terminal
palette follows the theme, reading the same CSS variables as the rest of the
UI. - Markdown preview for
.mdfiles, off by default: the Preview button
renders the whole file — from disk in the work tree, from the selected commit
elsewhere — with an Outline of its headings that indents by level, follows
the reading position and jumps on click. Raw HTML is left inert and links open
in the system browser. - Colour in the markdown preview: fenced code blocks are syntax-highlighted
through highlight.js when they name a language (22 common ones are
registered), YAML front matter is lifted out of the document and shown as its
own highlighted block, and heading levels, list markers, blockquotes, table
headers, links and inline code are colour-coded. Token colours are mapped onto
the app's own palette rather than imported from a highlight.js theme, so code
matches the diff and the terminal. - Word wrap now applies to the markdown preview as well, on by default and
sharing the diff's toggle: fenced code blocks, wide tables and long inline
strings wrap instead of scrolling sideways. - Full-screen mode for the diff / preview pane, from its button, a double-click
on its header, or Esc to leave. The pane is drawn over the layout,
so the terminal underneath keeps its shell and scrollback. - Word wrap in the diff pane, on by default, toggled from the header or the
context menu and remembered between runs. - Side-by-side diff view alongside the inline one: deletions are zipped with the
additions that follow them, and each pair is a grid row so wrapped halves stay
aligned. Also remembered between runs. - Context menu in the diff pane: Copy Selection, Copy Whole Diff, and the wrap
and view toggles. - Minimal application menu (hidden bar) so Chromium's edit accelerators —
Ctrl+C on selected diff text, Ctrl+A — are bound at all,
plus File ▸ Open Repository and a View menu with reload and zoom. - Browse Snapshot from a commit's context menu: the whole repository as it was
at that commit, read-only — files come from the tree (ls-tree), contents
fromgit show, and double-click opens a temp export with the system
application. Nothing in the work tree or at HEAD is touched.
Changed
gittynow detaches from the terminal instead of holding it: it prints the
pid and returns, the window survives the shell closing, and output goes to
${XDG_STATE_HOME:-~/.local/state}/gitty/gitty.log(trimmed to its last
megabyte past 4 MB).--fgkeeps the old attached behaviour, and--devis
unaffected.- The diff pane renders in chunks of 1500 rows that grow as you scroll, instead
of a fixed-height virtual window. Variable row heights are what wrapping and
the side-by-side grid need. - Selected commit rows are more prominent: the cursor row gets a brighter
background with a blue accent bar and a bold white hash, and the compared
(second) row a wider magenta accent bar. - Word-level highlighting in the diff, on by default: changed words within a
line are diffed against their paired counterpart and get a brighter block
than the row around them, in both inline and side-by-side views. Toggle it
from the diff's context menu, and very long or single-token lines fall back
to the row-level highlight. - Double-clicking a file views it in the pane beside the tree instead of handing
it to the system application, which moved to the context menu as "Open in
System App". - README screenshot updated for this release (
ref/gitty-0.1.1.png).
Fixed
- A replaced terminal session (window reload, repository switch) no longer
writes its exit notice into the terminal that succeeded it. - Hovering a diff-pane button showed the header's own tooltip ("Double-click to
toggle full screen") whenever the button had none of its own. Tooltips now sit
on the individual parts, and every button carries its own. - "Show Whole Diff" no longer appears while browsing a snapshot, where there is
no whole diff to widen back to — clicking it just emptied the pane.