Encrypted secrets
Encrypted before they touch disk. At rest, by default, without a flag you'll forget.
at-rest
Rune is an open-source secrets manager for people who'd rather ship than babysit a vault cluster. Encrypted storage, seal/unseal, namespaces, token RBAC, audit logs, automated rotation and versioning — from the CLI, the Web UI, or straight into your Spring Boot app.
01 / live demo
A simulated Rune vault running entirely in this tab, logged in with the root token. It starts sealed — because of course it does. Click through the commands or type your own: create a read-only token, log in with it, and watch RBAC say no. Nothing leaves your browser.
02 / spec sheet
Encrypted before they touch disk. At rest, by default, without a flag you'll forget.
at-rest
Lock the vault when secrets shouldn't be reachable. Explicitly. Every time. No vibes-based security.
rune seal
Isolate secrets by environment, app or team. Production stays production.
-n production
read, write, delete, rotate — granted per namespace, per token. Least privilege, most chill.
-n production:read,write
Tokens that end. Unlike that one API key from 2019 that's still in a CI variable somewhere.
expiry
Who read what, when, with which token. Because "who did that?" deserves an answer.
audit
One command, or on a schedule. The old value stays encrypted in history, not in your clipboard.
rune rotate
Every rotation keeps an encrypted version you can inspect and fetch later.
rune history
Delete a secret and its whole history goes with it. Nothing lingers. No ghosts.
rune delete
Your services get their own identity — not a human's token copy-pasted into a deployment.
system tokens
A Spring Boot starter that resolves ${rune.db-password} before your beans wake up.
maven
Native in a terminal — with a browser UI for the days you'd rather click.
rune · rune-server
03 / versioning & rotation
$ rune rotate db-password -n production
SECRET ROTATED
──────────────────────────────────────
Namespace: production
Key: db-password
New Value: q7W!xR2m…
──────────────────────────────────────
✔ Secret rotated successfully
$ rune history db-password -n production
VERSION CREATED ROTATED
1 2026-10-02T09:12:04Z -
2 2026-10-02T09:12:04Z 2026-10-09T14:03:51Z
3 2026-10-02T09:12:04Z 2026-10-21T08:41:17Z
4 2026-10-02T09:12:04Z 2026-11-01T10:30:42Z
04 / token rbac
Token RBAC, one flag at a time: read, write, delete, rotate — per namespace, per token. Give tokens an expiry, give services their own identity, and let the audit log remember who did what. No 40-line policy file required.
$ rune token create ci-deploy -n production:read,rotate
✔ Token created successfully
Name: ci-deploy
production read, rotate
Token: 9f3c…e1a7
$ rune login 9f3c…e1a7
✔ Token saved successfully
$ rune put stripe-key sk_live_… -n production
✖ [AUTHORIZATION DENIED]: Token cannot write to this namespace
05 / web ui
rune-server serves a Web UI right next to the API — no installer, no app store, no Electron was summoned. Unseal, browse namespaces, reveal and rotate secrets, manage tokens, read the audit log. It's wired to the same demo vault as the terminal above: do something there, watch it land here.
namespaces / production
0 secrets
Vault is sealed.
Secrets are encrypted and unreachable — exactly as advertised.
$
rune local-first secrets vault
➜ api
➜ ui /ui/
⬡ vault sealed — run rune unseal
06 / java sdk
The Rune Spring Boot starter pulls a namespace's secrets at startup and hands them to Spring as plain properties — ${rune.db-password} resolves before your beans wake up. Need more control? Inject RuneClient and ask directly. Zero extra HTTP dependencies.
<dependency>
<groupId>io.rune</groupId>
<artifactId>rune-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
dependencies {
implementation 'io.rune:rune-spring-boot-starter:0.1.0'
}
rune:
url: http://localhost:2710
token: ${RUNE_TOKEN} # a scoped, read-only token. please.
namespace: production
fail-fast: true # no secrets, no boot
// property injection — resolved at startup
@Value("${rune.db-password}")
private String dbPassword;
// or ask at runtime
private final RuneClient rune;
String key = rune.getSecret("production", "stripe-key");
List<String> keys = rune.listKeys("production");
java 17+spring boot 3no jackson neededfail-fast
07 / ceremony index
We like HashiCorp Vault. It solves org-scale problems for org-sized teams. Rune is for when you have secrets, not a platform team.
put.
curl | sh → rune-server → rune login → rune put. Done.
rune unseal
-n production:read
08 / roadmap
09 / install
curl -fsSL https://raw.githubusercontent.com/runelock-io/rune/main/scripts/install.sh | sh
Detected OS: darwin Detected ARCH: arm64 Downloading Rune... Installing Rune... Rune installed successfully Run: rune --version # rune v1.0.0-RC rune-server # api + web ui on :2710
# OS: darwin | linux ARCH: amd64 | arm64
VERSION=v1.0.0-RC OS=darwin ARCH=arm64
BASE=https://github.com/runelock-io/rune/releases/download/$VERSION
curl -L $BASE/rune_${OS}_${ARCH} -o rune
curl -L $BASE/rune-server_${OS}_${ARCH} -o rune-server
chmod +x rune rune-server
sudo mv rune rune-server /usr/local/bin/
# needs Go + Node (for the web ui build)
git clone https://github.com/runelock-io/rune.git
cd rune
make install
<!-- pom.xml -->
<dependency>
<groupId>io.rune</groupId>
<artifactId>rune-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
# brew install rune
# ...not yet. it's still brewing.
# use the install script for now — it's one line.
rune-serverset a passphrase, copy the root token (shown once)rune login <root-token>saves it for the CLIrune unsealthen put, get, rotate — or open :2710/ui/open sourceself-hostedno accountno sales call
10 / philosophy
You should know where your secrets live, how they're encrypted and who can read them. No black boxes. No unnecessary infrastructure. No vendor lock-in.