Skip to content

Releases: baojie/gitty

0.2.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 15:07
v0.2.0

Gitty 0.2.0 — the plugin system

0.1.9

Choose a tag to compare

@github-actions github-actions released this 18 Aug 15:56
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

Choose a tag to compare

@github-actions github-actions released this 16 Aug 08:39
v0.1.8

Gitty 0.1.8

0.1.7

Choose a tag to compare

@github-actions github-actions released this 15 Aug 08:13
v0.1.7

Gitty 0.1.7

Gitty 0.1.6

Choose a tag to compare

@baojie baojie released this 14 Aug 10:48

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/shells plus the usual paths, COMSPEC and
    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 what git ls-files prints.
  • The file tree sorts names naturally. Git orders paths by byte, which puts
    SKILL_W10 between SKILL_W0 and SKILL_W1 and 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 drop a.txt
    between two files in a/, drawing the a/ 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 the dangerouslySetInnerHTML prop 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

Choose a tag to compare

@baojie baojie released this 12 Aug 07:46

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 −3 cannot
      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.
  • 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+1Ctrl+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 to src/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.sh now picks the shortcut by platform and writes a
    minimal Gitty.app to ~/Applications, with a symlink on the Desktop,
    wrapping the same run.sh. Nothing is packaged — the bundle is there to give
    Finder and the Dock a name and an icon, built from build/icon.png via sips
    and iconutil. The Dock itself is left alone, as on Linux. Because a bundle
    launched from Finder inherits launchd's minimal PATH, node and npm are
    resolved at install time and prepended, so the build-if-stale step still
    works; re-run setup.sh after 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 through Number(localStorage.getItem(…)), and Number(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.sh wrote a gitty.desktop entry on macOS, where nothing would ever
    read it. The shortcut now follows uname.

  • run.sh now 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 for dist/electron, the Linux
    layout, and otherwise fell back to .bin/electron — a symlink to the
    package's cli.js, which is executable whether or not a binary exists. The
    path now comes from the package's own path.txt, so macOS resolves too, and
    a missing binary reports how to reinstall it, ELECTRON_MIRROR included.
    Reported and fixed by @OrangeViolin (#1, #4).

  • package.json read 0.1.3 at the v0.1.4 tag, so the release described
    itself as the one before it. Thanks @OrangeViolin (#3).

Gitty 0.1.4

Choose a tag to compare

@baojie baojie released this 12 Aug 07:50

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, .avif or .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 --grep with --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: the status, log, name-status, branch and blame
    formats are parsed from fixtures without a repository. npm test joins
    npm run typecheck as 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 — under ref/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

Choose a tag to compare

@baojie baojie released this 07 Aug 12:51

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
    to origin and 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+1Ctrl+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+1Ctrl+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 carries StartupWMClass=electron: an
    unpackaged Electron app reports electron as its window class (its Wayland
    app_id) whatever app.setName, --class, CHROME_DESKTOP or a renamed
    binary say. Re-run ./setup.sh and 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 earlier git status landing 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

Choose a tag to compare

@baojie baojie released this 06 Aug 02:57

Third release.

Added

  • Repository tabs — a bar along the bottom holds every open repository, each with its own four panes and terminal. + or Ctrl+O opens another into a new tab; a dot marks tabs with uncommitted changes.
  • Split terminalsSplit → 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 --git line 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.sh refreshes 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

Choose a tag to compare

@baojie baojie released this 05 Aug 13:49

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 .md files, 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
    from git show, and double-click opens a temp export with the system
    application. Nothing in the work tree or at HEAD is touched.

Changed

  • gitty now 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). --fg keeps the old attached behaviour, and --dev is
    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.