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/
Description
When a project is connected to a Git repository, the editor shows two buttons:
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:
There is currently no way to distinguish these two states without manually scanning
the file list for modifications. The
36mbadge 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:
36m— current behavior36m ●or just●dotAlternative: 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
36mbadge means "last push was 36 minutes ago", but it looksidentical 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/typstissues,typst/webapp-issues, and Typst Forum — June 2026).Related docs: https://typst.app/docs/web-app/git-sync/