Skip to content

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.


  1. 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. ↩

  2. Despite async fn signatures, sync.rs files and imports seem to be processed one at a time in plain for loops. Each @preview import seems to trigger a fresh, uncached HTTP request to the Typst Universe registry, so N imports means N sequential round-trips. ↩

  3. Only gotpm publish shells out to a system git binary via internal/gitcli, needed for sparse checkout and commit signing that the pure-Go go-git library can't do. Every other command, including gotpm install -r, uses go-git and needs no external binary. utpm's pkg install (doc-commented "requires git to be installed") and prj publish both shell out to a system git binary via utils/git.rs (std::process::Command) for clone/add/commit/push/pull. typship's download command also shells out to git clone/git checkout (src/commands/download.rs); typship publish uses the GitHub API (octocrab) directly and needs no git binary. ↩

  4. 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. ↩