Skip to content

Git Sync: show dirty-state badge on Push button when local changes exist #883

@andreikee

Description

@andreikee

Description

When a project is connected to a Git repository, the editor shows two buttons:

[ ↓ 1 ]    [ ↑ 36m ]
  Pull       Push

The Pull button already gives useful state: "Is the remote ahead of me?"
The Push button only shows time elapsed since last push — but this does not tell
whether there are any local changes that haven't been pushed yet.

A user who pushed 36 minutes ago could have:

  • Made no changes → nothing to push
  • Made many changes → should push soon

There is currently no way to distinguish these two states without manually scanning
the file list for modifications. The 36m badge is ambiguous.

Proposed change: show a visual indicator on the Push button when the local
project has unsaved/uncommitted changes — i.e., a dirty-state badge.

The simplest implementation: change the badge color or icon based on dirty state:

State Badge appearance (suggestion)
Clean (no local changes) grey 36m — current behavior
Dirty (unpushed local edits) amber/orange 36m ● or just dot

Alternative: show the count of modified files instead of elapsed time when
dirty ([ ↑ 3 ] meaning 3 files changed since last push).

Either option is a UI-only change to the Push button — no new backend API needed
if the web app already tracks file modification state (which it must, for auto-save
and conflict detection).

Use Case

Collaborative writing with mixed local/web editing (real incident):

My co-author and I work on a shared Typst document connected to a Git repository.
I edit locally in my own editor and push via Git; my co-author edits directly in the
Typst web app. On one occasion, my co-author had made edits in the web app but had
not yet pushed them. I opened the same project in the web app myself, glanced at the
toolbar, and saw no indication that anything had changed. The Push button showed its
usual elapsed-time badge — indistinguishable from the "nothing pending" state. I
switched to my local copy, made my own edits, and pushed. This overwrote my
co-author's unpushed work. Their edits were lost.

A dirty-state badge on the Push button — even something as simple as a colour change
— would have immediately told me: "this project has local web-app changes that
haven't been pushed yet."
I would have paused, asked my co-author to push first,
and the conflict would never have happened.

Solo use (everyday friction):

I use Git Sync to back up my Typst projects to a private GitHub repository. After a
long editing session I often can't tell at a glance whether I've already pushed my
recent work. The 36m badge means "last push was 36 minutes ago", but it looks
identical whether I've changed nothing since then or have an hour's worth of edits
sitting locally.

The dirty-state indicator would let me instantly see "there are local changes I
haven't pushed"
without needing to click Push and read the diff. This is especially
useful when switching between projects — a quick look at the toolbar is enough to
know which projects need attention.

This is also a minimal stepping-stone toward the "Web App → Collaboration → Change
tracking"
roadmap item. Full change tracking (accept/reject per-user edits) is a
large feature; a dirty indicator is a small, self-contained improvement that delivers
immediate value for any Git Sync user today.

Current workaround: none — must remember when changes were last made, or click
Push and inspect the commit diff manually.

Search: no existing issue found for this feature (searched typst/typst issues,
typst/webapp-issues, and Typst Forum — June 2026).
Related docs: https://typst.app/docs/web-app/git-sync/

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions