Comparison with other tools¶
The main alternative Typst package manager is utpm, which targets the same workflow: developing and publishing local Typst packages. typship is included for completeness — its GitHub repository has been deleted and it hasn't been updated since May 2025, but the crate is still live on crates.io. Feature comparison, accurate as of August 2026:
| Feature | gotpm | utpm v0.3.0 |
typship v0.4.2 4 |
|---|---|---|---|
| Language | Go | Rust | Rust |
| Local install | ✅ gotpm install |
✅ utpm prj link |
✅ typship install <namespace> |
| Remote install (git) | ✅ gotpm install -r |
✅ utpm pkg install |
✅ typship download <repo> |
| Editable install (symlink) | ✅ gotpm install -e |
✅ utpm prj link --no-copy |
❌ |
| Uninstall | ✅ gotpm uninstall |
✅ utpm pkg unlink |
❌ |
| List packages | ✅ gotpm list |
✅ utpm pkg list |
❌ |
| Version bump | ✅ gotpm bump |
✅ utpm prj bump |
❌ |
| Publish to Typst Universe | ✅ gotpm publish |
🚧 planned (utpm prj publish) |
✅ typship publish |
| Update deps to latest version | ✅ gotpm update 1 |
✅ utpm prj sync 2 |
❌ |
| External binaries required 3 | git — publish only |
git — remote install & publish |
git — remote install only |
gotpm uses flat top-level commands (gotpm install, gotpm uninstall) that are
easy to remember. utpm groups commands under prj/pkg subcommands (e.g.
utpm prj bump, utpm pkg unlink), which might add some mental overhead in
recalling which group a given command lives under.
scripts/bench.sh
uses hyperfine to compare gotpm and utpm on install, uninstall, list, bump,
and update/sync. Requires hyperfine, jq, git, gotpm, and utpm on
$PATH. Everything runs against sandboxed temp directories — it never touches
your real Typst package directory.
./scripts/bench.sh
| Command | gotpm | utpm | Result |
|---|---|---|---|
| Install (local) | 2 ms | 2 ms | gotpm 1.1x faster |
| Install (remote git) | 632 ms | 710 ms | gotpm 1.1x faster |
| Uninstall | 2 ms | 2 ms | gotpm 1.1x faster |
| List | 2 ms | 2 ms | utpm 1.0x faster |
| Bump (patch) | 2 ms | 7 ms | gotpm 3.7x faster |
| Update (18 imports) | 166 ms | 6.80 s | gotpm 41.0x faster |
Benchmarked 2026-08-03 on Linux 6.8.0-136-generic x86_64 with gotpm v0.3.13 and
utpm 0.3.0. Results vary by machine and network conditions - run
scripts/bench.sh yourself to reproduce. Whichever tool is faster for a given
command is reported as-is.
-
Fetches the Typst Universe version index once, then resolves all import statements in that file concurrently (goroutines) against the in-memory index — one network request regardless of import count. ↩
-
Despite
async fnsignatures,sync.rsfiles and imports seem to be processed one at a time in plainforloops. Each@previewimport seems to trigger a fresh, uncached HTTP request to the Typst Universe registry, so N imports means N sequential round-trips. ↩ -
Only
gotpm publishshells out to a systemgitbinary viainternal/gitcli, needed for sparse checkout and commit signing that the pure-Gogo-gitlibrary can't do. Every other command, includinggotpm install -r, usesgo-gitand needs no external binary. utpm'spkg install(doc-commented "requires git to be installed") andprj publishboth shell out to a systemgitbinary viautils/git.rs(std::process::Command) for clone/add/commit/push/pull. typship'sdownloadcommand also shells out togit clone/git checkout(src/commands/download.rs);typship publishuses the GitHub API (octocrab) directly and needs no git binary. ↩ -
Last published 2025-05-07 (
v0.4.2). Its GitHub repository (sjfhsjfh/typship, linked from the crates.io metadata) now 404s, so the source used here comes from the crate tarball on crates.io (typship-0.4.2.crate) rather than the repo. ↩