{% extends "base.html" %} {% block title_suffix %} — Library{% endblock %} {% block content %} {% if flash %}
Import complete

{{ flash }}

{% endif %}
{{ eyebrow_date }} — Dashboard

Your library.

{{ subtitle }}.

{% if counts.clean %}{{ '%02d' % counts.clean }} clean{% endif %} {% if counts.dirty %}{{ '%02d' % counts.dirty }} dirty{% endif %} {% if counts.conflict %}{{ '%02d' % counts.conflict }} conflict{% endif %} {% if counts.behind %}{{ '%02d' % counts.behind }} behind{% endif %} {% if counts.ahead %}{{ '%02d' % counts.ahead }} ahead{% endif %} {% if counts.frozen %}{{ '%02d' % counts.frozen }} frozen{% endif %}
+ Add repo
{% if repos %}
{% for repo in repos %}{% include "partials/repo_row.html" %}{% endfor %}
Status Repository Workspace Branch Remote Δ Tags Last pull Actions
auto-refresh 30s · click repo name → details · pull runs in place · what does this dashboard show? {% else %}

Your library is empty.

Add your first repository to get started.

+ Add repo
{% endif %}

Reading the dashboard

Statuses

clean
Working tree matches HEAD; no uncommitted changes. In sync with your last fetch.
dirty
Uncommitted local changes. Commit or stash before pulling.
conflict
Working tree is dirty AND behind remote. Resolve locally before pulling.
behind
Remote has commits you don't. The Pull button turns orange and shows the count.
ahead
You have local commits not yet pushed. Pull does nothing here — consider git push.
frozen
Intentionally skipped by "Pull all". Lock icon marks the row. Unfreeze from the ⋯ menu.

The Pull button

Orange — repo is behind. Click to fast-forward by the shown count.
Ghost — already up to date, or working tree is dirty/ahead. The button still works; it just won't change anything useful.
Disabled — repo is frozen, in conflict, or missing on disk. Pull is blocked until you resolve.

The Remote Δ column

Ahead (↑ N), behind (↓ N), or even () relative to upstream. These counts reflect your last git fetch, not live remote state. Click Fetch all to refresh them without merging, or Pull all to fetch and merge.

Auto-refresh (every 30s)

Refresh re-reads local state only: your ~/.gitstow/repos.yaml registry plus git status on each tracked repo. It catches:

  • New repos added via the CLI (gitstow add in another terminal)
  • Local commits, branch switches, dirty files you just edited

It does NOT run git fetch — so "behind" and "ahead" counts won't update unless you use Fetch all or Pull all.

Actions

Pull
Pull from remote (fast-forward only).
↓ Pull all
Pull every non-frozen repo in parallel. Automatically fetches first, then merges.
⟳ Fetch all
Fetch all remotes in parallel — updates ahead/behind counts without merging. Includes frozen repos.
+ Add repo
Clone a new repo into a workspace.
↻ Refresh
Re-read local state now (same as the 30-second auto).
Hide frozen
Collapse rows for frozen repos.
Per-row menu: view details, open folder, copy URL/path/local path, freeze/unfreeze, edit tags, remove.
Shutdown (footer)
Stop the gitstow server and close the dashboard.
{% endblock %} {% block body_extra %} {% endblock %}