Install tula
One file, nothing else to install. Three ways to get it, and the same binary from each.
Install script
curl --proto '=https' --tlsv1.2 -LsSf https://usetu.la/install.sh | sh
- --proto '=https'
- Only HTTPS, on redirects too
- --tlsv1.2
- Nothing older than TLS 1.2
- -L
- Follow a redirect
- -s
- No progress bar
- -S
- But still show errors
- -f
- Stop on an HTTP error, so an error page is never piped into a shell
It runs a script in your shell, so read install.sh first. It is the same file as the one in the repo.
The tula shell checks for a new release each time it opens. It never installs one without asking: run /update install.
Where it puts things
Everything goes in ~/.tula, one folder per version. It will not use a folder other users can write to. TULA_INSTALL_DIR picks another folder.
If ~/.tula/bin is not on your PATH, it adds it to your zsh, bash or fish profile. TULA_NO_MODIFY_PATH=1 prints the line instead.
One exact version
Set TULA_VERSION to pick a version. In CI, TULA_REQUIRE_ATTESTATION=1 stops the install if who built it cannot be checked.
Update
Run /update install in tula, or the install command again — that works even if tula will not start. A version you already have is not downloaded twice; TULA_FORCE=1 downloads it anyway.
curl --proto '=https' --tlsv1.2 -LsSf https://usetu.la/install.sh | sh
Go back
Old versions stay on disk, so going back is one link:
ln -sf ~/.tula/versions/<version>/tula ~/.tula/bin/tulaRemove
Delete the folder and the PATH line in your profile. Your keys are kept elsewhere.
rm -rf ~/.tulaHomebrew
brew install hsnice16/tap/tula
Homebrew checks the download against the checksum in the formula.
tula gets stable releases; hsnice16/tap/tula-latest gets every release.
The tula shell checks for a new release each time it opens. It never installs one without asking, and on Homebrew it does not install one at all: run brew upgrade hsnice16/tap/tula.
One exact version
Every release has a pinned formula. It is keg_only, so link it to use it:
brew install hsnice16/tap/tula@<version> brew link --overwrite --force tula@<version>
Update
brew upgrade hsnice16/tap/tulaGo back
Install and link an older pinned formula, as above.
Remove
After it, brew untap hsnice16/tap drops the tap too.
brew uninstall tulanpm
npm install -g @hsnice16/tula
Checked a different way. npm repackages the binary, so the GitHub attestation does not cover it. Check npm’s own provenance with npm audit signatures.
Node is needed to install it, not to run it.
The tula shell checks for a new release each time it opens. It never installs one without asking, and on npm it does not install one at all: run the update below.
One exact version
Name the version. Without one, npm installs the newest.
npm install -g @hsnice16/tula@<version>Update
npm install -g @hsnice16/tulaGo back
Install the older version, as above.
Remove
npm uninstall -g @hsnice16/tulaConfirm it worked
tula --versionIt prints the version. If your shell cannot find tula, your PATH does not include it:
- Install script
- If it printed
added tooralready in, open a new terminal. If it printedadd it yourself, add theexportline it showed. - Homebrew
- A pinned
tula@<version>iskeg_only. Runbrew linkon it. - npm
- npm’s global bin folder must be on your PATH.
npm prefix -gshows the folder that holds it.
Once it starts, ? on an empty line shows the shell’s keys. Every keyboard shortcut is on its own page.
Every install is checked
Checksum
Always checked. The install stops if it does not match.
Build attestation
GitHub signs each release as it is built. Checking it needs the GitHub CLI.
Versioned installs
Every release stays installable, so you can always go back.
What it runs on
| macOS 13 or later | Yes | Intel and ARM, 64-bit. |
|---|---|---|
| Linux | Yes | Intel and ARM, 64-bit. Needs glibc. |
| Alpine, or any musl Linux | No | The installer says so and stops. |
| Windows | Through WSL | Install inside WSL. There is no native build. |
Proving who built it
A checksum proves the file arrived whole, not who made it. The build attestation does: GitHub signs it while building the release, and no one can sign it again later.
Checking it needs the GitHub CLI, signed in with gh auth login.
Most people do not have the GitHub CLI, and nothing here requires it. You still get an HTTPS-only download and a checksum check, just no proof of who built it. The installer tells you when that is the case.
curl --proto '=https' --tlsv1.2 -fLO https://github.com/hsnice16/tula/releases/download/v0.4.2/tula-v0.4.2-darwin-arm64.tar.gz gh attestation verify tula-v0.4.2-darwin-arm64.tar.gz --repo hsnice16/tula --signer-workflow hsnice16/tula/.github/workflows/release.yml --source-ref refs/tags/v0.4.2 --deny-self-hosted-runners
The attestation covers the archive, not the binary inside, so this downloads it again.
Your keys are kept apart
Your keys live in ~/.config/tula. Reinstalling, updating or removing tula never touches them.
Delete them only when you are done with tula:
rm -rf ~/.config/tula