• v0.13.0 Stable

    simonfranken released this 2026-10-25 21:44:53 +00:00 | 0 commits to main since this release

    submarine moved to GitHub: https://github.com/simonfranken/submarine

    This is the last release on this host. submarine update (or q quit and update in the footer) installs it from here; from then on, submarine looks for updates on GitHub on its own. Nothing else to do.

    New install command: curl -fsSL https://raw.githubusercontent.com/simonfranken/submarine/main/install.sh | sh

    Release notes and future releases: https://github.com/simonfranken/submarine/releases/tag/v0.13.0

    Downloads
  • v0.12.0 Stable

    simonfranken released this 2026-10-25 20:11:41 +00:00 | 2 commits to main since this release

    New

    • X restores to the committed pins: like x, but without the staged/committed question, and it drops the staged pins at every depth below the selection, the superproject's included.
    • X asks before it drops a staged pin, the selected submodule's own pin included: Restore libs/staged to the committed pins? Discards 1 staged pin.
    • Clearer key names: x restore to pin, X restore committed pins; on the header u reads pull (fast-forward), which is what it does there.
    • Problems only, filter and fetch are shown in the footer (! problems only • / filter • f fetch), not only in the full help.
    • ? explains the screen: the first page lists every key in titled columns, the second is a legend of the status words, symbols and commit roles in their colors. esc closes it.
    • Hints for newcomers: new here? ? shows every key… above the footer until the first key, and fetched never · f fetch in the detail pane when the last fetch is old.
    • The header counts staged pins as n staged, the same word as the tree.

    Install or update: curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh, or submarine update.

    Full changelog: https://git.simon-franken.de/simonfranken/submarine/compare/v0.11.0...v0.12.0

    Downloads
  • v0.11.0 Stable

    simonfranken released this 2026-10-24 20:42:12 +00:00 | 5 commits to main since this release

    New

    • u updates a pin that is behind (origin/main ↓2): it moves the pin to the tip of its branch, the same as picking that branch with b but without the popup. It takes exactly the commits shown and fetches nothing. If the branch moved in the meantime, it does nothing.
    • u on the header fast-forwards the superproject to its upstream (main ↓1), like git pull --ff-only from the last fetch, and restores the submodules.
    • Switch (b) fast-forwards a local branch that is only behind the chosen remote branch, unless another worktree has it checked out. A branch with commits of its own is still never moved.

    Fixes

    • The key list in the detail pane wraps instead of cutting off keys.

    Install or update: curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh, or submarine update.

    Full changelog: https://git.simon-franken.de/simonfranken/submarine/compare/v0.10.0...v0.11.0

    Downloads
  • v0.10.0 Stable

    simonfranken released this 2026-10-24 17:18:15 +00:00 | 6 commits to main since this release

    New

    • Restore (x) puts submodules on a branch instead of a detached HEAD, if the pin is a branch tip. In order: the local branch tracking the shown ref, the ref itself (created as a tracking branch if no local branch has its name), another local branch (alphabetically), another remote branch at the pin. It applies to submodules at every depth, already in-sync ones included, and to the submodules below a switch (b). No branch is ever moved: a local branch behind or ahead of its remote is not fast-forwarded. If nothing fits, the submodule stays detached as before.

    Install or update: curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh, or submarine update.

    Full changelog: https://git.simon-franken.de/simonfranken/submarine/compare/v0.9.0...v0.10.0

    Downloads
  • v0.9.0 4ac29c04d0

    v0.9.0 Stable

    simonfranken released this 2026-10-23 16:45:24 +00:00 | 9 commits to main since this release

    Breaking changes

    • q quits and updates when a newer release exists. Plain quit moves to Q while an update is offered; ctrl+c always quits without updating. Without an update, q quits as before.

    New

    • Update check on every start, in the background (no more once-a-day cache); silent if the registry can't be reached. Still off for dev builds, --mock and SUBMARINE_NO_UPDATE_CHECK=1.
    • q quit and update to vX in the footer: right of help and quit, on a highlighted background. q quits, then installs the release (same as submarine update).
    • The notice printed after exit is gone; the footer shows the update instead.

    Install or update: curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh, or submarine update.

    Full changelog: https://git.simon-franken.de/simonfranken/submarine/compare/v0.8.0...v0.9.0

    Downloads
  • v0.8.0 e8d366d88f

    v0.8.0 Stable

    simonfranken released this 2026-10-23 15:37:14 +00:00 | 10 commits to main since this release

    New

    • History spine in the detail pane: the pin, tip, your checkout and a staged pin are shown as one line of history, newest on top, with the number of commits between nodes. All three on one commit read "in sync".
    • Diverged commits as a fork: a tip, checkout or committed pin that has diverged from the pin gets its own lane, joined at the merge base (with SHA and subject).
    • Target branch and off target: each pin is compared with the branch it should be on (branch = in .gitmodules, else the remote's default branch). A pushed pin that is not on it is flagged off target (blue, counted in the header and below collapsed rows), and the spine shows the target's tip.
    • The header summary is right-aligned and ordered by importance; the fetch age moved to the detail pane.

    Fixes

    • The shown ref of a pin is now the target branch if the pin is on it, otherwise the closest branch containing it. A pin on a feature branch no longer looks perfect, and the ref no longer changes with the branch checked out in the submodule.

    Install or update: curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh, or submarine update.

    Full changelog: https://git.simon-franken.de/simonfranken/submarine/compare/v0.7.0...v0.8.0

    Downloads
  • v0.7.0 01a9babe64

    v0.7.0 Stable

    simonfranken released this 2026-10-22 12:40:46 +00:00 | 14 commits to main since this release

    New

    • Switch branch (b): opens a popup in the middle of the screen with a search line and the local and remote branches of the selected repository (or the superproject).
      • ↑ / ↓ select, type to filter, enter switches, esc cancels. Mouse: click a branch to switch, scroll wheel to move, click outside to close.
      • For a submodule, the branch tip becomes its staged pin and the submodule (and everything below it) is restored to it, with HEAD on the branch. A remote branch gets a local tracking branch; an existing local branch of the same name is never moved.
      • Like restore, it asks y/n only if work would be lost, and may clone or fetch what is missing below.
      • The screen behind the popup is dimmed so the dialog has the focus.

    Install or update: curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh, or submarine update.

    Full changelog: https://git.simon-franken.de/simonfranken/submarine/compare/v0.6.0...v0.7.0

    Downloads
  • v0.6.0 b9f6055759

    v0.6.0 Pre-Release

    simonfranken released this 2026-10-22 10:44:43 +00:00 | 17 commits to main since this release

    Sixth release of submarine. Still a prototype, but the first one that changes your repositories: x restores a submodule, or the whole project, to exactly what git records. It also adds a problems-only view and no longer fetches on startup.

    Highlights

    • Restore (x). Makes the selected submodule, and every submodule below it, exactly what git records: tracked files reset, untracked files and leftover repositories removed, merges and rebases ended, missing submodules cloned or initialized again (also inactive ones and ones set to update = none). With the header selected it restores the superproject itself, so one key gives you the exact project your root commit specifies.
    • Restore never moves a branch: a checkout that is off its pin is detached first, so commits stay on their branch. Ignored files (.env, node_modules, build output) are kept.
    • Restore asks only if work would be lost: changed or untracked files, a merge/rebase in progress, commits that no branch or remote reaches, or a repository that exists nowhere else. The question lists what is discarded; y restores, any other key cancels. Without a loss it just runs.
    • Staged pins are kept at every depth. A nested submodule with a staged pin and uncommitted changes keeps the pin and is reset to it. On a submodule with a staged pin, x asks whether to restore to the staged pin (s) or the committed pin (c, which unstages it).
    • Problems only (!). Shows only submodules with an issue (or an unknown state), plus their ancestors, expanded. It combines with the filter and says problems only above the footer, so a short list is not mistaken for a healthy repository.
    • The superproject is selectable. The header is its row: it is selected on startup, shows its own state (changed, unpushed, …) and has a detail pane like a submodule. A leftover clone of a submodule the branch no longer has shows up as an untracked repository.
    • No fetch on startup. With hundreds of submodules the automatic fetch was too much. The header and the detail pane show when you last fetched (also fetches made in other shells); f fetches everything.

    Changes to be aware of

    • The --no-fetch flag is removed, since nothing is fetched on startup. Scripts that pass it now fail with "flag provided but not defined". The update check is still off for dev builds, --mock and SUBMARINE_NO_UPDATE_CHECK=1.
    • Restore is the first action that uses the network besides f: it may clone a missing submodule or fetch a missing commit. It never prompts (passwords, passphrases and host-key questions fail with git's message instead).
    • The placeholder keys u (checkout pin) and b (bump pin) are removed.

    Install

    curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh
    

    Installs submarine and the alias sub (linux/macOS, amd64/arm64) to ~/.local/bin. Update from 0.5.0 with submarine update.

    Binaries and checksums.txt are published in the package registry (generic package submarine, version v0.6.0).

    Known limitations

    • Restore shows restoring … with a spinner, but no progress per repository, so a restore with many clones takes a while without feedback.
    • There is no way yet to stage a pin from submarine (planned, see docs/actions.md).
    • Restore is not available on the mock data (--mock).
    Downloads
  • v0.5.0 f9838c0c99

    v0.5.0 Pre-Release

    simonfranken released this 2026-10-22 08:25:47 +00:00 | 23 commits to main since this release

    Fifth release of submarine. Still a prototype: browsing is complete, actions are not yet implemented. This release shows staged pins in the tree and adds a proper README.

    Highlights

    • A pin change that is staged in the superproject but not yet committed is now visible in the tree. A submodule without issues shows a blue staged instead of in sync; next to an issue word it shows a blue ●. Before, you only saw it in the detail pane and as n pin staged in the top bar, with no way to find the row.
    • A collapsed parent shows ● if a staged pin is hidden below it, before its issue counts.
    • A staged pin is information, not an issue: it is not counted in +n or in the issue counts, and it does not change a row's level.
    • New README with a screenshot, installation, examples and the key bindings. sub is now the command used in the examples.

    Install

    curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh
    

    Installs submarine and the alias sub (linux/macOS, amd64/arm64) to ~/.local/bin. Update from 0.4.0 with submarine update.

    Binaries and checksums.txt are published in the package registry (generic package submarine, version v0.5.0).

    Known limitations

    • The actions u, b and ! only show a "not implemented" message.
    Downloads
  • v0.4.0 f5fabfd093

    v0.4.0 Pre-Release

    simonfranken released this 2026-10-21 19:18:26 +00:00 | 27 commits to main since this release

    Fourth release of submarine. Still a prototype: browsing is complete, actions are not yet implemented. This release adds a filter.

    Highlights

    • / filters the tree. A text input above the footer takes the term; submodules whose path (including the name) contains it are shown, ignoring case.
    • Ancestors of a match stay visible and are shown expanded, so nested matches keep their context. Your fold state is untouched.
    • If the selected submodule is filtered out, the next visible one is selected (the previous one if none follows, none if nothing matches).
    • enter hands the keys back to the tree and keeps the filter; / edits the term again. esc closes the input and removes the filter; the selection stays. ↑↓ and pgup/pgdn also work while typing.
    • Fix: an empty tree, or one where the filter hides everything, no longer panics.

    Install

    curl -fsSL https://git.simon-franken.de/simonfranken/submarine/raw/branch/main/install.sh | sh
    

    Installs submarine and the alias sub (linux/macOS, amd64/arm64) to ~/.local/bin. Update from 0.3.0 with submarine update.

    Binaries and checksums.txt are published in the package registry (generic package submarine, version v0.4.0).

    Known limitations

    • The actions u, b and ! only show a "not implemented" message.
    Downloads