tula

Install tula

One file, nothing else to install. Three ways to get it, and the same binary from each.

Install script

install
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.

update
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/tula

Remove

Delete the folder and the PATH line in your profile. Your keys are kept elsewhere.

rm -rf ~/.tula

Confirm it worked

tula --version

It prints the version. If your shell cannot find tula, your PATH does not include it:

Install script
If it printed added to or already in, open a new terminal. If it printed add it yourself, add the export line it showed.
Homebrew
A pinned tula@<version> is keg_only. Run brew link on it.
npm
npm’s global bin folder must be on your PATH. npm prefix -g shows 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 laterYesIntel and ARM, 64-bit.
LinuxYesIntel and ARM, 64-bit. Needs glibc.
Alpine, or any musl LinuxNoThe installer says so and stops.
WindowsThrough WSLInstall 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.

verify
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