Skip to content

Releases: Nightbr/factorai

factorai v0.13.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 14:50

Full Changelog: v0.12.3...v0.13.0

factorai v0.12.3

Choose a tag to compare

@github-actions github-actions released this 18 Aug 13:33

One round of UI feedback, three commits, no behaviour or contract changes. Everything here is
visible the moment you open the window.

Type is consistent, and bigger where it was small

At 100% zoom the terminal read fine and the chrome around it didn't. The app has two sizes —
12px and 14px — and it was using the smaller one for the things you navigate by.

  • Tab labels are 14px, in all three strips: the top bar's session tabs, the file panel's
    Files / Changes / Graph, and the commit pane's.
  • The sidebar's session rows are 14px, matching the project name above them.
  • 12px is now metadata and status only — a SHA, a count, missing, the indexer line, the
    uppercase PROJECTS header. That rule is written into AGENTS.md § 4, so it stays true.

Tabs show more of the title

A session tab may now reach 240px before truncating, up from 176px — about 26 characters of a
title instead of 18, which is the difference between telling two sessions apart and not. Width
still follows the title, so a short one still makes a short tab.

The top bar, the brand mark and the tabs each grew 2px to sit properly around the larger labels:
40 → 42px, 16 → 18px, 28 → 30px.

The graph is quieter

  • The commit subject rests at a softer tone and takes full foreground when you point at its
    row; a selected row keeps it permanently. A column where every subject is at full brightness has
    no focus at all.
  • The rows are indented 12px, like every row in Files and Changes. The author avatars were
    sitting flush against the panel border.
  • The author disc is a dark tinted circle with near-white initials, instead of a saturated one
    competing with the lane colours beside it.

One thing to know

The file panel's minimum width is 256px, up from 200px. The larger tab labels forced it: at
200px that header could no longer lay out three tabs plus three icon buttons without clipping the
close button. If you had dragged the panel narrower than 256px, it comes back at 256 — the width is
clamped when it's read, so there is nothing to migrate and nothing to do.


macOS — the .dmg is a universal build for Apple Silicon and Intel. A first install is
unsigned and needs the Gatekeeper dance; updates applied in place afterwards don't re-quarantine.

Linux — AppImage only, and it needs glibc 2.39+ (Ubuntu 24.04+, Debian 13+, Fedora 40+).
Tauri's updater can replace an AppImage in place but never a .deb, so shipping a .deb that
silently never self-updates isn't worth doing.

factorai v0.12.2

Choose a tag to compare

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

Full Changelog: v0.12.1...v0.12.2

factorai v0.12.1

Choose a tag to compare

@github-actions github-actions released this 18 Aug 11:55

Full Changelog: v0.12.0...v0.12.1

factorai v0.12.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 19:25
ec91d65

The Graph tab reads as people and places

The rail was lines and dots. It now says who did what, and where a branch lives.

  • The commit node is its author — a coloured disc carrying their initials, so scanning a history for "the ones I did" stops needing a click per row. Derived locally from the commit's author email; nothing is fetched from Gravatar or GitHub, because that would mean sending the author identities of every repository you browse to a third party, from an app that otherwise only reads local files. On a busy history with tightly packed lanes the disc gives way to a plain dot, since 18px of avatar would cover three lanes and the rail exists to be traceable.
  • Refs are badges, and the icon says where the ref lives — a laptop for a local branch, GitHub's or GitLab's own mark for a remote one, a tag for a tag. The forge is read from origin's configured URL; it is a config read, not a request to anyone.
  • Long branch names stop pushing the subject off the row. A chip is capped and truncates, and the full name is on the hover card.
  • The hover card opens under the row, inside the panel. It used to open leftwards, over the terminal — and being wider than the panel, it got shoved further left still.
  • Uncommitted work is a row of its own, above HEAD, dashed because nothing in it is a commit yet. It carries the file count, and clicking it opens the Changes tab. Previously this was a hollow dot: a filled and a hollow circle differ by a few pixels at that size, and neither said what to do next.

Fixes

A session's PATH is the login shell's, not the GUI process's. Launched from Finder or an application menu, factorai inherits an environment that never sourced your shell config — so Homebrew and every version-manager shim were missing. Three unrelated-looking symptoms had this one cause: SessionStart hook errors reporting bash: command not found, /mcp failing to reconnect stdio servers, and a statusline rendering nothing. The PATH is now asked of your login shell once at startup and cached.

A dependency pin no longer disagrees with the lockfile. pnpm install --frozen-lockfile is what CI runs first and what nothing local reproduced; it now leads the contributor gate.

Installing

macOS — the .dmg is unsigned, so Gatekeeper blocks it on first open. Clear the quarantine flag after copying the app across:

xattr -dr com.apple.quarantine /Applications/factorai.app

Linux — the .AppImage needs glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+, Fedora 40+). chmod +x it and run it.

Already running factorai? It will offer this version itself — the update badge appears in the header.

Full Changelog: v0.11.0...v0.12.0

factorai v0.11.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 17:04
4fb32fc

factorai stops wearing Tauri's placeholder icon.

The mark

A notched dark housing with an amber F cut into it. The housing reads two ways on purpose: a machine seen from above, and a chip package — the two halves of the name, neither of them spelled out, because three letters never fit a 16px square and an icon you have to read has already lost.

The notches are the idea rather than decoration. Three on the left edge and three on the right, none top or bottom: something goes in, something comes back, which is what a session is. They also do the practical work — a dock icon is judged as a silhouette before it is judged as a drawing, and the notches are what make the outline unmistakable when it is 16 pixels tall. They cut through to nothing, so your desktop shows in the gaps.

The F is drawn rather than set in a typeface. Every face on hand was tried inside the housing, matched on cap height, and they all lost the same way: a text face is drawn to sit in a line with neighbours on either side, so alone in a square it leaves air and reads as a letter in a font instead of a mark.

In the app

The header carries the mark and the name, and the name is now set one way everywhere — factor in the text colour, ai in the accent — instead of being typed out differently in each place it appeared.

Known gap

An existing Linux install will keep showing the old icon. The desktop panel takes its icon from the installed .desktop entry rather than from the app itself, so the new one arrives with a fresh install and not with an update. That plumbing is still to come.

Installing

macOS — the .dmg is unsigned, so Gatekeeper blocks it on first open. Clear the quarantine flag after copying the app across:

xattr -dr com.apple.quarantine /Applications/factorai.app

Linux — the .AppImage needs glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+, Fedora 40+). chmod +x it and run it.

Already running factorai? It will offer this version itself — the update badge appears in the header.

Full Changelog: v0.10.1...v0.11.0

factorai v0.10.1

Choose a tag to compare

@github-actions github-actions released this 17 Aug 14:16
59bf510

A bug-fix release. Both of these blanked the entire window — losing every session on screen — and both turn out to have had the same shape: something benign, treated as fatal by a handler that had been there since the first commit.

Crashes

An unhandled promise rejection no longer destroys the app. main.tsx carried a scaffold from the very first commit that replaced the page with a red error block on any unhandled rejection. Replacing the page unmounts everything, so a single stray rejection took every running session with it.

What surfaced it was the new Graph tab. Monaco computes a diff in a background worker, and disposing the editor while that is in flight cancels the request — which it reports as a rejected promise. Clicking from one commit to the next did exactly that, every time. Monaco itself treats these as non-events and ignores them; factorai was treating one as grounds to tear the app down.

Failures are now sorted before anything reacts to them. A cancelled request is ignored. A real error, with the app running, gets a small dismissible card in the corner and leaves the app alone. Only a failure with nothing rendered at all — a genuine failure to start, where there is nothing to preserve and no other way to say so — still takes the window.

Clicking Claude Code's login link no longer breaks the app. Links in the terminal come in two kinds: ones factorai spots in the text by pattern, and ones the program explicitly marks up as links. Only the first was wired. The second fell through to xterm's built-in handling, which asks for confirmation through a browser dialog that does not exist in a desktop app — so it failed, and the handler above turned that failure into a blank window.

Both kinds now behave the same way: Cmd+click (Ctrl+click on Linux) opens them in your browser. A plain click still does nothing, deliberately — Claude Code is a full-screen terminal app, and a stray click landing on a link you did not mean to open would be worse than needing the modifier.

Under the hood

  • A development build now says so in its crash report instead of naming a version that was never released.
  • window.confirm and window.prompt are unusable in a Tauri app of this shape, so they are now rejected by the linter rather than waiting to be rediscovered.
  • The release workflow used to let its two platform builds race to create the release. Usually one won; this time both did, producing two half-complete releases for one version. It now creates the release once, up front.

Installing

macOS — the .dmg is unsigned, so Gatekeeper blocks it on first open. Clear the quarantine flag after copying the app across:

xattr -dr com.apple.quarantine /Applications/factorai.app

Linux — the .AppImage needs glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+, Fedora 40+). chmod +x it and run it.

Already running factorai? It will offer this version itself — the update badge appears in the header.

Full Changelog: v0.10.0...v0.10.1

factorai v0.10.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 11:45
84c3aa7

The Graph tab

A commit graph beside Files and Changes: lanes, local and remote branch refs,
tags, and where HEAD is.

It is a viewer, not a git client — the half of a git GUI that is worth its
weight when the committing, rebasing and merging is already being done by agents
in the terminal below. Nothing here checks out, resets, commits or fetches.

  • Lanes are traceable. Layout is computed in Rust and each lane takes its own
    colour, so you can follow a branch across a merge in a 288px column.
  • Refs fold rather than crowd. HEAD merges into its branch, origin/HEAD
    is dropped as the duplicate it is, and a branch level with its upstream reads
    main ≡origin. Anything left over collapses to +N.
  • Hover un-truncates, click goes deeper. Hovering a row shows the full
    subject, every ref, author and date. Clicking opens a pane below with the
    message body, the parents and the changed files — and a file opens that
    commit's diff in Monaco. A merge diffs against its first parent and labels
    which one.
  • Keyboard. / walk the history, Home/End jump.
  • 300 commits a page, with Load more.
  • Uncommitted changes show on HEAD, so a dirty tree can't read as clean.

Also: the session header's branch badge now shows a short SHA on a detached
HEAD, instead of going quiet.

Spec: specs/05-features.md § F18. Decisions: Q18, Q22, Q23 and ADR-0012.


Install. macOS: the .dmg. Linux: the .AppImage — needs glibc 2.39+, so
Ubuntu 24.04+, Debian 13+ or Fedora 40+.

Full changelog: v0.9.0...v0.10.0

factorai v0.9.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 09:40
2c719d3

Files

JSON files are syntax highlighted. They rendered as grey plain text, with Plain Text in the viewer's footer — every package.json, tsconfig.json and .claude/settings.json you opened. JSON turned out to be the one common language Monaco's basic grammar set leaves out: css, html, javascript and typescript are all there, but JSON ships only as a full language service, so the viewer had never heard of the extension at all.

It is registered by hand now, with just the tokenizer attached — highlighting and nothing else. No autocomplete, and deliberately no validation: red squiggles on a file you are reading rather than editing are noise, and a config with comments in it is not broken. .jsonc and .json5 are recognised too, and their comments are highlighted as comments.

Sessions

The session header shows which git branch you're on. A quiet marker between the project name and the session title, for when the answer to "what is this agent working against" matters. It is absent rather than empty when the project isn't a repository, and a long branch name truncates instead of shoving the close button around.

It reads the repository on its own schedule rather than borrowing the Changes tab's, so the badge is there whether or not the right panel is open, and it doesn't put a working-tree walk every few seconds behind every session you have open.

Reliability

A crash shows you the crash. An error while rendering used to leave an empty window: no message, and no address bar to reload from. There is now a screen carrying the error, where it happened, and three things to do about it — reload, copy the details, or open a prefilled issue.

Two things it is explicit about. Reloading keeps your sessions running — the agent processes survive it — but the terminal scrollback is cleared, and the screen says so rather than letting you find out. And the issue button opens a GitHub page in your browser with the details filled in; nothing is sent anywhere. You read it, edit it, and decide. factorai still has no telemetry, no analytics and no crash reporting service.

Interface

Buttons, inputs and selects are sized for a desktop app. The shared components still carried the stock web sizing they were vendored with — noticeably too tall for a dense tool, which is why + New session looked oversized. Six places in the app had already been quietly overriding the height by hand; the scale now matches what they were reaching for, and most of those overrides are gone. Inputs and selects moved with the buttons so rows containing both still line up.

Under the hood

  • An untagged development build now says so in its crash report, rather than reporting a version that was never released.
  • The dev QA scripts had a coordinate bug that made every scripted click land a row low, and put the top of the window out of reach entirely. Documented, with the fix queued.

Installing

macOS — the .dmg is unsigned, so Gatekeeper blocks it on first open. Clear the quarantine flag after copying the app across:

xattr -dr com.apple.quarantine /Applications/factorai.app

Linux — the .AppImage needs glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+, Fedora 40+). chmod +x it and run it.

Already running factorai? It will offer this version itself — the update badge appears in the header.

Full Changelog: v0.8.0...v0.9.0

factorai v0.8.0

Choose a tag to compare

@github-actions github-actions released this 16 Aug 13:18
f5012d4

Sessions

Sub-agents fold under the session that spawned them. A session that ran six agents used to put seven rows on the project page, burying the sessions you actually go back into. Groups are collapsed by default now, behind a disclosure chevron, with a count badge that says how many are hidden. Expanding indents them under the parent, and the sub-agent / read-only markers are right-aligned so they share a column instead of landing wherever a truncated title happened to end.

The session header asks before it kills. Its Stop button was the one place in the app where a single click ended a running agent with no undo and no question. It is now an × opening the same confirmation a tab's × opens — one shared dialog, so the two can't drift apart. Closing from the header also drops the session's tab immediately instead of waiting for an exit event that might never arrive.

Files

Right-click menu on file tree rows. Open · Open in default app · Copy contents · Copy absolute path · Copy relative path. The contents row disables itself, with the reason in its label, for a directory, a binary, or a file too large to have been read whole — half a file on the clipboard that looks like a whole one is worse than no row at all.

The WebView's own context menu is gone from the app's chrome. Right-clicking anywhere factorai didn't draw a menu used to produce a browser's: Back, Forward, Reload, Inspect Element — and Reload in a desktop window drops every terminal you have open. The terminal keeps its native menu, because right-clicking it pastes, and that is the only mouse-driven paste a session has.

Indexing

Sessions whose transcript has been deleted are reaped from the index. The index only ever added, so a deleted .jsonl stayed in it forever — 147 rows against 80 files on one real machine. Worse than a stale count: the row kept its title, so a search hit opened it, found nothing on disk, and started an empty new session wearing a long conversation's name. A scan now drops rows whose file is gone, while leaving alone anything it could not read and any session with a live process behind it.

Under the hood

  • Formatting is clean across the whole repo and checked in CI, on both the TypeScript and Rust sides.
  • The dead get_session command was removed.

Installing

macOS — the .dmg is unsigned, so Gatekeeper blocks it on first open. Clear the quarantine flag after copying the app across:

xattr -dr com.apple.quarantine /Applications/factorai.app

Linux — the .AppImage needs glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+, Fedora 40+). chmod +x it and run it.

Already running factorai? It will offer this version itself — the update badge appears in the header.

Full Changelog: v0.7.0...v0.8.0