ragevault 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/dist/assets.d.ts +14 -0
- package/dist/assets.js +47 -0
- package/dist/assets.js.map +1 -0
- package/dist/audit.d.ts +35 -0
- package/dist/audit.js +79 -0
- package/dist/audit.js.map +1 -0
- package/dist/branding.d.ts +36 -0
- package/dist/branding.js +55 -0
- package/dist/branding.js.map +1 -0
- package/dist/crypto/cipher.d.ts +74 -0
- package/dist/crypto/cipher.js +95 -0
- package/dist/crypto/cipher.js.map +1 -0
- package/dist/crypto/cipher.test.d.ts +7 -0
- package/dist/crypto/cipher.test.js +50 -0
- package/dist/crypto/cipher.test.js.map +1 -0
- package/dist/generator.d.ts +36 -0
- package/dist/generator.js +114 -0
- package/dist/generator.js.map +1 -0
- package/dist/model.d.ts +96 -0
- package/dist/model.js +43 -0
- package/dist/model.js.map +1 -0
- package/dist/porters.d.ts +35 -0
- package/dist/porters.js +175 -0
- package/dist/porters.js.map +1 -0
- package/dist/prompt.d.ts +14 -0
- package/dist/prompt.js +56 -0
- package/dist/prompt.js.map +1 -0
- package/dist/ragevault.d.ts +22 -0
- package/dist/ragevault.js +814 -0
- package/dist/ragevault.js.map +1 -0
- package/dist/server/public/app.js +420 -0
- package/dist/server/public/apple-touch-icon.png +0 -0
- package/dist/server/public/favicon.png +0 -0
- package/dist/server/public/fonts/archivo.woff2 +0 -0
- package/dist/server/public/fonts/space-grotesk.woff2 +0 -0
- package/dist/server/public/icon-192.png +0 -0
- package/dist/server/public/icon-512.png +0 -0
- package/dist/server/public/icon-maskable.png +0 -0
- package/dist/server/public/index.html +225 -0
- package/dist/server/public/manifest.webmanifest +16 -0
- package/dist/server/public/styles.css +362 -0
- package/dist/server/public/sw.js +30 -0
- package/dist/server/server.d.ts +30 -0
- package/dist/server/server.js +410 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/session.d.ts +36 -0
- package/dist/server/session.js +89 -0
- package/dist/server/session.js.map +1 -0
- package/dist/store/vaultfile.d.ts +64 -0
- package/dist/store/vaultfile.js +110 -0
- package/dist/store/vaultfile.js.map +1 -0
- package/dist/store/vaultfile.test.d.ts +5 -0
- package/dist/store/vaultfile.test.js +45 -0
- package/dist/store/vaultfile.test.js.map +1 -0
- package/dist/totp.d.ts +26 -0
- package/dist/totp.js +88 -0
- package/dist/totp.js.map +1 -0
- package/dist/totp.test.d.ts +5 -0
- package/dist/totp.test.js +41 -0
- package/dist/totp.test.js.map +1 -0
- package/dist/tui/ansi.d.ts +34 -0
- package/dist/tui/ansi.js +52 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/app.d.ts +83 -0
- package/dist/tui/app.js +607 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/update/channel.d.ts +53 -0
- package/dist/update/channel.js +135 -0
- package/dist/update/channel.js.map +1 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SoyRage Agency
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<a href="https://soyrage.es/">
|
|
4
|
+
<img src="./assets/soyrage-banner.svg" alt="SoyRage Agency — Full-Stack Developer × Infrastructure Engineer · soyrage.es" width="100%">
|
|
5
|
+
</a>
|
|
6
|
+
|
|
7
|
+
<br/>
|
|
8
|
+
|
|
9
|
+
# 🔐 RageVault
|
|
10
|
+
|
|
11
|
+
**Your passwords, self-hosted and end-to-end encrypted.**
|
|
12
|
+
A password manager you *fully own* — CLI, a full-screen TUI, a self-hosted web UI
|
|
13
|
+
and a browser extension. **Import your whole vault from Bitwarden / 1Password /
|
|
14
|
+
Proton Pass in one drop**, then get categories & folders, user roles, a serious
|
|
15
|
+
password generator, live 2FA codes, a WireGuard one-command setup — and only
|
|
16
|
+
standard, auditable crypto (`scrypt` + `AES-256-GCM`).
|
|
17
|
+
|
|
18
|
+
<br/>
|
|
19
|
+
|
|
20
|
+
[](https://github.com/soyrageagency/ragevault/actions/workflows/release.yml)
|
|
21
|
+
[](./docs/ANALYSIS.md)
|
|
22
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest)
|
|
23
|
+
[](https://nodejs.org)
|
|
24
|
+
[](./LICENSE)
|
|
25
|
+
|
|
26
|
+
### Designed, built & maintained by **[SoyRage Agency](https://soyrage.es/)** · **https://soyrage.es/**
|
|
27
|
+
|
|
28
|
+
**⚡ New here? [Install in 60 seconds](#-install-in-60-seconds--plug--play-no-node-no-npm).**
|
|
29
|
+
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
> ## ⚠️ Use a VPN. Seriously.
|
|
35
|
+
> RageVault is **self-hosted** and meant to live on a **private network** — never
|
|
36
|
+
> exposed to the open Internet. Run the built-in setup to put it behind a
|
|
37
|
+
> WireGuard tunnel in one command:
|
|
38
|
+
> ```bash
|
|
39
|
+
> ragevault wg # installs & configures WireGuard, prints a client QR
|
|
40
|
+
> ```
|
|
41
|
+
> It's **optional** — for purely local / personal use you don't need it — but if
|
|
42
|
+
> the vault is reachable from another machine, put a tunnel in front of it.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 📸 A look
|
|
47
|
+
|
|
48
|
+
<div align="center">
|
|
49
|
+
|
|
50
|
+
### Terminal dashboard — a searchable folder tree with a live detail panel (no shortcuts to learn)
|
|
51
|
+
As you move, the right panel shows the item's URL, strength and a **live breach check** ([Have I Been Pwned](https://haveibeenpwned.com/Passwords), k-anonymity) — weak or leaked passwords are flagged in red with a one-click "regenerate".
|
|
52
|
+
<img src="./assets/screenshots/tui-tree.png" alt="RageVault terminal UI — searchable folder tree with a live detail panel, strength and breach check, by SoyRage Agency" width="90%">
|
|
53
|
+
|
|
54
|
+
**Type to search, ↑/↓ to move, Enter opens a menu** of actions — reveal, copy, copy 2FA, rename, regenerate, move, delete:
|
|
55
|
+
<img src="./assets/screenshots/tui-vault.png" alt="RageVault terminal UI — per-item action menu, by SoyRage Agency" width="70%">
|
|
56
|
+
|
|
57
|
+
### Self-hosted web UI — the SoyRage cream/ink/blue line
|
|
58
|
+
A full-screen animated unlock, then your vault. Credential cards with the real **site favicon**, reveal / copy / live 2FA:
|
|
59
|
+
<img src="./assets/screenshots/web-vault.png" alt="RageVault self-hosted web UI — credential cards with reveal / copy / 2FA, by SoyRage Agency" width="90%">
|
|
60
|
+
|
|
61
|
+
### 🔁 Coming from another manager? One drop and you're in.
|
|
62
|
+
**Export → drop the file → done.** RageVault auto-detects **Bitwarden, 1Password, Proton Pass, LastPass** and any CSV — no manual field mapping, and the file is parsed **locally** (nothing is uploaded):
|
|
63
|
+
<img src="./assets/screenshots/web-import.png" alt="RageVault one-click import from Bitwarden, 1Password, Proton Pass, LastPass or CSV" width="90%">
|
|
64
|
+
|
|
65
|
+
### Make it yours — themes, a guided tour & in-app settings
|
|
66
|
+
Pick a theme (Cream, **Dark**, Midnight, Forest), change your master password, and a first-run **interactive tour** points out every feature:
|
|
67
|
+
|
|
68
|
+
<table>
|
|
69
|
+
<tr>
|
|
70
|
+
<td width="50%" valign="top"><b>⚙️ Settings & themes</b><br/><img src="./assets/screenshots/web-settings.png" alt="RageVault settings — themes and change master password" width="100%"></td>
|
|
71
|
+
<td width="50%" valign="top"><b>🧭 First-run guided tour</b><br/><img src="./assets/screenshots/web-tour.png" alt="RageVault interactive spotlight onboarding tour" width="100%"></td>
|
|
72
|
+
</tr>
|
|
73
|
+
<tr>
|
|
74
|
+
<td width="50%" valign="top"><b>🌙 Dark theme</b><br/><img src="./assets/screenshots/web-dark.png" alt="RageVault dark theme vault" width="100%"></td>
|
|
75
|
+
<td width="50%" valign="top"><b>📱 Mobile (responsive PWA)</b><br/><img src="./assets/screenshots/mobile.png" alt="RageVault on mobile — responsive web UI" width="60%"></td>
|
|
76
|
+
</tr>
|
|
77
|
+
</table>
|
|
78
|
+
|
|
79
|
+
### Browser extension — auto-detects your server on the network
|
|
80
|
+
A cinematic connect screen finds your self-hosted server, then one click copies, autofills or reads a 2FA code:
|
|
81
|
+
|
|
82
|
+
<table>
|
|
83
|
+
<tr>
|
|
84
|
+
<td width="50%" valign="top"><b>🛰️ Auto-detect & unlock</b><br/><img src="./assets/screenshots/extension-connect.png" alt="RageVault extension auto-detecting the self-hosted server" width="70%"></td>
|
|
85
|
+
<td width="50%" valign="top"><b>🧩 Fill for this site</b><br/><img src="./assets/screenshots/extension.png" alt="RageVault browser extension popup detecting github.com" width="70%"></td>
|
|
86
|
+
</tr>
|
|
87
|
+
</table>
|
|
88
|
+
|
|
89
|
+
<sub>Unlock screens: <a href="./assets/screenshots/tui-unlock.png">TUI</a> · <a href="./assets/screenshots/web-unlock.png">web</a></sub>
|
|
90
|
+
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## What it is
|
|
96
|
+
|
|
97
|
+
A password manager you **fully own**. The vault is a small encrypted file (or,
|
|
98
|
+
soon, a self-hosted server): a KDF salt and two AES-256-GCM ciphertexts. Without
|
|
99
|
+
your master password there is **nothing to read** — not even the titles.
|
|
100
|
+
|
|
101
|
+
- **End-to-end encrypted** — `scrypt` (memory-hard KDF) derives a key that wraps a
|
|
102
|
+
random data key; **AES-256-GCM** encrypts everything, authenticated.
|
|
103
|
+
- **Blur by default** — secrets show as `••••••`; you explicitly reveal or copy,
|
|
104
|
+
so nobody sees every password at a glance.
|
|
105
|
+
- **Categories, folders, tags, favourites, password history.**
|
|
106
|
+
- **Users & roles** — `owner / admin / member / viewer` with capability checks.
|
|
107
|
+
- **Generator** — random, passphrase, or pronounceable, with a real entropy meter.
|
|
108
|
+
- **No exotic dependencies** — the crypto is the Node standard library. Read it.
|
|
109
|
+
|
|
110
|
+
Full design, threat model and the 30+-feature roadmap: **[docs/ANALYSIS.md](./docs/ANALYSIS.md)**.
|
|
111
|
+
|
|
112
|
+
## ⬇️ Which download do I want?
|
|
113
|
+
|
|
114
|
+
RageVault ships in a few shapes — they all open the **same encrypted vault**, so pick one or mix them:
|
|
115
|
+
|
|
116
|
+
| You want… | Download | Who it's for |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| **A desktop app** — a window with an icon, no terminal | **Windows:** `RageVault.Setup.<ver>.exe` · **macOS:** `RageVault-<ver>-arm64.dmg` · **Linux:** `RageVault-<ver>.AppImage` | 👉 Most people. Windows installs to Start menu + system tray. |
|
|
119
|
+
| **A self-hosted server / CLI / TUI** on a box you reach over VPN | `ragevault-<os>-x64` (one self-contained file) — or `npx ragevault` if you have Node | Home-labbers. Run `ragevault serve` or the terminal UI. |
|
|
120
|
+
| **Autofill in your browser** | `ragevault-extension.zip` | Anyone — it auto-detects your server and fills logins. |
|
|
121
|
+
| **Your phone** | `ragevault-<ver>.apk` (Android) — or add the web UI to your home screen (PWA) | Android users. Enable "install unknown apps" to sideload. |
|
|
122
|
+
|
|
123
|
+
## 🖥️ Desktop app (Windows) — double-click and go
|
|
124
|
+
|
|
125
|
+
Prefer a real app window over the terminal? The **RageVault desktop app** is a normal
|
|
126
|
+
Windows program: install it, launch it from the Start menu, and your vault opens in
|
|
127
|
+
its **own window with the RageVault icon** — no console, no config. It runs the
|
|
128
|
+
encrypted server privately in the background (loopback only) and stores your data in
|
|
129
|
+
your user profile.
|
|
130
|
+
|
|
131
|
+
<div align="center">
|
|
132
|
+
|
|
133
|
+
[-0078D6?logo=windows&logoColor=white&style=for-the-badge)](https://github.com/soyrageagency/ragevault/releases/latest/download/RageVault.Setup.0.2.3.exe)
|
|
134
|
+
[-000000?logo=apple&logoColor=white&style=for-the-badge)](https://github.com/soyrageagency/ragevault/releases/latest/download/RageVault-0.2.3-arm64.dmg)
|
|
135
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest/download/RageVault-0.2.3.AppImage)
|
|
136
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest/download/ragevault-v0.2.3.apk)
|
|
137
|
+
|
|
138
|
+
<sub>Lives in the **system tray**, shows native notifications for updates, and first run walks you through a **“create your vault”** screen + a guided tour. **macOS** (`.dmg`, Apple Silicon) and **Linux** (`.AppImage`) builds are on the [latest release](https://github.com/soyrageagency/ragevault/releases/latest) too (unsigned — right-click → Open on macOS).</sub>
|
|
139
|
+
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
## ⚡ Or the CLI / server — one self-contained file, no Node, no npm
|
|
143
|
+
|
|
144
|
+
The command-line + self-hosted-server build is **one file** per device (Windows, macOS, Linux). Ideal for a home-lab box you reach over your VPN, or the terminal/TUI.
|
|
145
|
+
|
|
146
|
+
### ⬇️ Download for your device
|
|
147
|
+
|
|
148
|
+
<div align="center">
|
|
149
|
+
|
|
150
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest/download/ragevault-windows-x64.exe)
|
|
151
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest/download/ragevault-macos-arm64)
|
|
152
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest/download/ragevault-macos-x64)
|
|
153
|
+
[](https://github.com/soyrageagency/ragevault/releases/latest/download/ragevault-linux-x64)
|
|
154
|
+
|
|
155
|
+
<sub>…or see all files & the changelog on the **[latest release](https://github.com/soyrageagency/ragevault/releases/latest)**. macOS/Linux: `chmod +x <file> && ./<file>`.</sub>
|
|
156
|
+
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
### 🟢 Or one command (auto-downloads + adds to PATH)
|
|
160
|
+
|
|
161
|
+
<table>
|
|
162
|
+
<tr><td><b>🪟 Windows</b><br/><sub>PowerShell</sub></td><td>
|
|
163
|
+
|
|
164
|
+
```powershell
|
|
165
|
+
irm https://raw.githubusercontent.com/soyrageagency/ragevault/main/scripts/install.ps1 | iex
|
|
166
|
+
```
|
|
167
|
+
</td></tr>
|
|
168
|
+
<tr><td><b>🍎 macOS · 🐧 Linux</b><br/><sub>Terminal</sub></td><td>
|
|
169
|
+
|
|
170
|
+
```sh
|
|
171
|
+
curl -fsSL https://raw.githubusercontent.com/soyrageagency/ragevault/main/scripts/install.sh | sh
|
|
172
|
+
```
|
|
173
|
+
</td></tr>
|
|
174
|
+
</table>
|
|
175
|
+
|
|
176
|
+
### 🟣 Or, if you already have Node
|
|
177
|
+
|
|
178
|
+
```sh
|
|
179
|
+
npx ragevault # run it once, no install
|
|
180
|
+
npm i -g ragevault # or install the command globally
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 🔵 Or download the binary by hand
|
|
184
|
+
|
|
185
|
+
Grab the file for your device from the [**latest release**](https://github.com/soyrageagency/ragevault/releases/latest), make it runnable, and go:
|
|
186
|
+
|
|
187
|
+
| Device | File | Run it |
|
|
188
|
+
|---|---|---|
|
|
189
|
+
| Windows 64-bit | `ragevault-windows-x64.exe` | double-click, or `.\ragevault-windows-x64.exe` |
|
|
190
|
+
| macOS (Apple Silicon) | `ragevault-macos-arm64` | `chmod +x ragevault-macos-arm64 && ./ragevault-macos-arm64` |
|
|
191
|
+
| macOS (Intel) | `ragevault-macos-x64` | `chmod +x … && ./ragevault-macos-x64` |
|
|
192
|
+
| Linux 64-bit | `ragevault-linux-x64` | `chmod +x ragevault-linux-x64 && ./ragevault-linux-x64` |
|
|
193
|
+
|
|
194
|
+
> Re-run the installer any time to update — and RageVault tells you in-app when a new version ships.
|
|
195
|
+
|
|
196
|
+
## 🚀 First run — a guided 3-step wizard
|
|
197
|
+
|
|
198
|
+
Just type `ragevault` (or the binary name). It walks you through everything — **no config files, ever**:
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
1) ragevault init → names your vault, asks you to set a master password
|
|
202
|
+
(twice), and creates the encrypted file. That's it.
|
|
203
|
+
|
|
204
|
+
2) ragevault add → a friendly prompt: title, username, URL — then offers
|
|
205
|
+
to *generate* a strong password for you. Repeat freely.
|
|
206
|
+
|
|
207
|
+
3) ragevault tui → the full-screen dashboard. Arrow keys to move, r to
|
|
208
|
+
reveal, c to copy, t for a 2FA code, l to lock, q to quit.
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Prefer a browser? `ragevault serve` opens the web UI at `http://127.0.0.1:8722`, and the [browser extension](./extension) autofills logins. Want it reachable from your phone/laptop safely? `ragevault wg` sets up WireGuard and prints a QR to scan — **optional, and skippable for personal use.**
|
|
212
|
+
|
|
213
|
+
Your vault lives at `~/.ragevault/vault.ragevault` (override with `RAGEVAULT_HOME`), written owner-readable only. Back it up any time with `ragevault backup`.
|
|
214
|
+
|
|
215
|
+
## 📱 On your phone (Android & iOS) — install the app
|
|
216
|
+
|
|
217
|
+
RageVault's web UI is an **installable app (PWA)** — no store, no APK sideloading:
|
|
218
|
+
|
|
219
|
+
1. On the machine that holds your vault, run `ragevault serve` (ideally behind your VPN — `ragevault wg`).
|
|
220
|
+
2. On your phone's browser, open the server's address (e.g. `http://10.72.0.1:8722` over WireGuard).
|
|
221
|
+
3. **Chrome/Android:** menu → **"Install app"** / "Add to Home screen". **Safari/iOS:** Share → **"Add to Home Screen"**.
|
|
222
|
+
|
|
223
|
+
It launches full-screen like a native app, with the RageVault icon. Your data stays on **your** server.
|
|
224
|
+
|
|
225
|
+
> **Prefer a real `.apk`?** Download **`ragevault-<ver>.apk`** from the [latest release](https://github.com/soyrageagency/ragevault/releases/latest) (built on CI) and sideload it — enable "Install unknown apps" for your browser/files app. It's a thin, secure shell that opens your self-hosted vault. Source + signed-build steps: [`mobile/`](./mobile) and **[docs/ANDROID.md](./docs/ANDROID.md)**.
|
|
226
|
+
|
|
227
|
+
## 🔁 Switch in seconds — import from anywhere
|
|
228
|
+
|
|
229
|
+
Leaving another manager shouldn't be a chore. RageVault reads the export files the big managers already give you and **detects the format for you** — no column-mapping, no cleanup.
|
|
230
|
+
|
|
231
|
+
| Coming from | Export you give RageVault |
|
|
232
|
+
|---|---|
|
|
233
|
+
| 🟦 **Bitwarden** | *Tools → Export vault* → **`.json`** |
|
|
234
|
+
| ⬛ **1Password** | export a vault as **`.csv`** |
|
|
235
|
+
| 🟪 **Proton Pass** | *Settings → Export* → **`.json`** |
|
|
236
|
+
| 🟥 **LastPass** | *Advanced → Export* → **`.csv`** |
|
|
237
|
+
| ⬜ **Anything else** | any **`.csv`** with url/username/password columns |
|
|
238
|
+
|
|
239
|
+
**In the web UI:** unlock → **↓ Import** → drop the file. **On the CLI:**
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
ragevault import bitwarden-export.json # auto-detects Bitwarden/1Password/Proton/LastPass/CSV
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Everything is parsed **on your machine** — the file never leaves it.
|
|
246
|
+
|
|
247
|
+
## 🧩 Browser extension — install in 3 steps
|
|
248
|
+
|
|
249
|
+
Detect the current site, copy or **autofill** credentials, grab a **2FA** code, and generate passwords — right from the toolbar.
|
|
250
|
+
|
|
251
|
+
<div align="center">
|
|
252
|
+
|
|
253
|
+
[-3b9ee8?style=for-the-badge)](https://github.com/soyrageagency/ragevault/releases/latest/download/ragevault-extension.zip)
|
|
254
|
+
|
|
255
|
+
<img src="./assets/screenshots/extension.png" alt="RageVault browser extension popup" width="330">
|
|
256
|
+
|
|
257
|
+
</div>
|
|
258
|
+
|
|
259
|
+
1. **Download** `ragevault-extension.zip` (button above) and **unzip** it.
|
|
260
|
+
2. **Chrome / Edge / Brave:** open `chrome://extensions`, turn on **Developer mode**, click **Load unpacked**, pick the unzipped folder. *(Firefox: `about:debugging` → Load Temporary Add-on → pick `manifest.json`.)*
|
|
261
|
+
3. Click the RageVault icon, enter your server address + master password — done.
|
|
262
|
+
|
|
263
|
+
> Extensions can only be truly one-click from the Chrome Web Store / Firefox AMO (store publishing is on the roadmap). Until then, the unpacked install above takes about 20 seconds.
|
|
264
|
+
|
|
265
|
+
<details><summary><b>Run from source instead (developers)</b></summary>
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
npm install && npm run build
|
|
269
|
+
node dist/ragevault.js init # or: npm run dev
|
|
270
|
+
npm test # 14 crypto/vault/TOTP tests
|
|
271
|
+
npm run build:release # cross-build binaries for all 4 devices → build/release/
|
|
272
|
+
```
|
|
273
|
+
</details>
|
|
274
|
+
|
|
275
|
+
## Security at a glance
|
|
276
|
+
|
|
277
|
+
| Property | How |
|
|
278
|
+
|---|---|
|
|
279
|
+
| Key derivation | `scrypt`, N=2¹⁶, per-vault random salt (params stored & upgradable) |
|
|
280
|
+
| Encryption | `AES-256-GCM`, random 96-bit IV per record, AAD-bound |
|
|
281
|
+
| Key hierarchy | master → KEK → wraps a random DEK (password change ≠ re-encrypt everything) |
|
|
282
|
+
| Integrity | GCM auth tag — wrong password / tampering **fails loudly** |
|
|
283
|
+
| At rest | only salt + ciphertext on disk; **no plaintext leak** (tested) |
|
|
284
|
+
| Verified | `npm test` — 14 crypto / vault / TOTP tests (round-trip, wrong-pw, tamper, re-wrap, RFC 6238 vectors) |
|
|
285
|
+
|
|
286
|
+
> RageVault is young (v0.2). The cryptographic core is standard and tested, but
|
|
287
|
+
> please review the code and threat model before trusting it with production
|
|
288
|
+
> secrets — and keep it behind that VPN.
|
|
289
|
+
|
|
290
|
+
## What's inside (already shipped)
|
|
291
|
+
|
|
292
|
+
End-to-end encrypted vault · categories · nested folders · tags & favourites ·
|
|
293
|
+
password history · **users & roles** (owner/admin/member/viewer) · blur → reveal →
|
|
294
|
+
copy everywhere · random / passphrase / pronounceable **generator** with an entropy
|
|
295
|
+
meter · **live TOTP 2FA codes** (RFC 6238) · **weak/reused/old health audit** + opt-in
|
|
296
|
+
HIBP breach check · **one-drop import** (auto-detects Bitwarden/1Password/Proton Pass/LastPass/CSV)
|
|
297
|
+
+ JSON/CSV export · **encrypted backups** (backup/restore) · atomic crash-safe writes ·
|
|
298
|
+
auto-lock + clipboard auto-clear · **privacy-preserving site favicons** (server-fetched
|
|
299
|
+
& cached) · **custom emoji icons** · **4 themes** (Cream/Dark/Midnight/Forest) ·
|
|
300
|
+
**change master password in-app** · **interactive first-run tour** · **Windows desktop
|
|
301
|
+
app** (Electron) with **system tray + native update / broadcast notifications** ·
|
|
302
|
+
**CLI · TUI · web UI · browser extension** (auto-detects your server) · WireGuard
|
|
303
|
+
bootstrap · one-file standalone install + in-app update & global-announcement channel.
|
|
304
|
+
|
|
305
|
+
**Roadmap:** per-user cryptographic sharing (X25519) · multi-device sync · expiring
|
|
306
|
+
share links · custom item types & attachments · Android client · audit log. Full
|
|
307
|
+
threat model, crypto design and the 35-item feature map: **[docs/ANALYSIS.md](./docs/ANALYSIS.md)**.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 🤝 Free & open source
|
|
312
|
+
|
|
313
|
+
RageVault is **100% free** and **MIT licensed** — no paywall, no "pro" tier, no telemetry. Read every line, self‑host it forever, and **contributions are very welcome**: open an issue, suggest a feature, or send a pull request.
|
|
314
|
+
|
|
315
|
+
**Want to contribute?**
|
|
316
|
+
```bash
|
|
317
|
+
git clone https://github.com/soyrageagency/ragevault && cd ragevault
|
|
318
|
+
npm install && npm run build && npm test # 14 tests should pass
|
|
319
|
+
npm run dev # hack away
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## 💙 Support the project
|
|
323
|
+
|
|
324
|
+
RageVault is free and MIT licensed. If it protects your logins, you can [support development on PayPal](https://www.paypal.com/paypalme/soyrageagency) — a ⭐ on the repo helps just as much.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 🖋️ Credits & License
|
|
329
|
+
|
|
330
|
+
<div align="center">
|
|
331
|
+
|
|
332
|
+
**Designed, built and maintained by [SoyRage Agency](https://soyrage.es/) — https://soyrage.es/**
|
|
333
|
+
|
|
334
|
+
</div>
|
|
335
|
+
|
|
336
|
+
Released under the **[MIT License](./LICENSE)** — use it, modify it, self-host it, ship it commercially.
|
|
337
|
+
|
|
338
|
+
If you build something on top of it, a link back to [soyrage.es](https://soyrage.es/) is appreciated but never required.
|
|
339
|
+
|
|
340
|
+
> 🛠️ Maintainer? See **[docs/MAINTAINERS.md](./docs/MAINTAINERS.md)** for how to broadcast announcements and ship updates through `updates.json`.
|
|
341
|
+
|
|
342
|
+
> ⚠️ RageVault is a password manager and still young (v0.2). The cryptographic core is standard and tested, but review the code and the [threat model](./docs/ANALYSIS.md) before trusting it with production secrets — and keep it **behind your VPN**.
|
|
343
|
+
|
|
344
|
+
<div align="center">
|
|
345
|
+
|
|
346
|
+
**© 2026 SoyRage Agency — https://soyrage.es/**
|
|
347
|
+
|
|
348
|
+
Made with ❤ in Valencia, Spain.
|
|
349
|
+
|
|
350
|
+
</div>
|
package/dist/assets.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled-asset access — works the same from `dist/` (with Node) or as a
|
|
3
|
+
* single-file standalone binary (Node SEA, no Node installed).
|
|
4
|
+
*
|
|
5
|
+
* When packaged, the web UI assets and the update channel are read from the SEA
|
|
6
|
+
* blob; otherwise from disk.
|
|
7
|
+
*
|
|
8
|
+
* Part of RageVault.
|
|
9
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
10
|
+
* MIT licensed (see LICENSE).
|
|
11
|
+
*/
|
|
12
|
+
export declare function isPackaged(): boolean;
|
|
13
|
+
export declare function readAssetBuffer(key: string, diskPath: string): Buffer;
|
|
14
|
+
export declare function readAssetText(key: string, diskPath: string): string | null;
|
package/dist/assets.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled-asset access — works the same from `dist/` (with Node) or as a
|
|
3
|
+
* single-file standalone binary (Node SEA, no Node installed).
|
|
4
|
+
*
|
|
5
|
+
* When packaged, the web UI assets and the update channel are read from the SEA
|
|
6
|
+
* blob; otherwise from disk.
|
|
7
|
+
*
|
|
8
|
+
* Part of RageVault.
|
|
9
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
10
|
+
* MIT licensed (see LICENSE).
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { createRequire } from "node:module";
|
|
14
|
+
let seaMod = null;
|
|
15
|
+
try {
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
seaMod = require("node:sea");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
seaMod = null;
|
|
21
|
+
}
|
|
22
|
+
export function isPackaged() {
|
|
23
|
+
try {
|
|
24
|
+
return Boolean(seaMod?.isSea());
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function readAssetBuffer(key, diskPath) {
|
|
31
|
+
if (seaMod && isPackaged()) {
|
|
32
|
+
try {
|
|
33
|
+
return Buffer.from(seaMod.getRawAsset(key));
|
|
34
|
+
}
|
|
35
|
+
catch { /* fall through */ }
|
|
36
|
+
}
|
|
37
|
+
return readFileSync(diskPath);
|
|
38
|
+
}
|
|
39
|
+
export function readAssetText(key, diskPath) {
|
|
40
|
+
try {
|
|
41
|
+
return readAssetBuffer(key, diskPath).toString("utf8");
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,IAAI,MAAM,GAAkB,IAAI,CAAC;AACjC,IAAI,CAAC;IACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,OAAO,CAAC,UAAU,CAAW,CAAC;AACzC,CAAC;AAAC,MAAM,CAAC;IACP,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QAAC,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,QAAgB;IAC3D,IAAI,MAAM,IAAI,UAAU,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,QAAgB;IACzD,IAAI,CAAC;QAAC,OAAO,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACxF,CAAC"}
|
package/dist/audit.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Password health audit — the "how bad is my hygiene?" report everyone wants.
|
|
3
|
+
*
|
|
4
|
+
* • Weak — low estimated entropy.
|
|
5
|
+
* • Reused — the same password across two or more items.
|
|
6
|
+
* • Old — not changed in over a year.
|
|
7
|
+
* • Breached — optional, opt-in: checked against Have I Been Pwned using
|
|
8
|
+
* k-anonymity (only the first 5 chars of the SHA-1 hash ever leave
|
|
9
|
+
* the machine; the full password never does).
|
|
10
|
+
*
|
|
11
|
+
* Part of RageVault.
|
|
12
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
13
|
+
* MIT licensed (see LICENSE).
|
|
14
|
+
*/
|
|
15
|
+
import type { VaultData } from "./model.js";
|
|
16
|
+
export interface Finding {
|
|
17
|
+
itemId: string;
|
|
18
|
+
title: string;
|
|
19
|
+
issues: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface AuditReport {
|
|
22
|
+
total: number;
|
|
23
|
+
weak: number;
|
|
24
|
+
reused: number;
|
|
25
|
+
old: number;
|
|
26
|
+
findings: Finding[];
|
|
27
|
+
}
|
|
28
|
+
/** The offline audit — weak, reused and old passwords. */
|
|
29
|
+
export declare function auditVault(data: VaultData, nowMs?: number): AuditReport;
|
|
30
|
+
/**
|
|
31
|
+
* Opt-in breach check via HIBP's range API (k-anonymity). Returns how many times
|
|
32
|
+
* the password appears in known breaches (0 = not found). Never sends the
|
|
33
|
+
* password — only the 5-char SHA-1 prefix.
|
|
34
|
+
*/
|
|
35
|
+
export declare function breachCount(password: string, timeoutMs?: number): Promise<number>;
|
package/dist/audit.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Password health audit — the "how bad is my hygiene?" report everyone wants.
|
|
3
|
+
*
|
|
4
|
+
* • Weak — low estimated entropy.
|
|
5
|
+
* • Reused — the same password across two or more items.
|
|
6
|
+
* • Old — not changed in over a year.
|
|
7
|
+
* • Breached — optional, opt-in: checked against Have I Been Pwned using
|
|
8
|
+
* k-anonymity (only the first 5 chars of the SHA-1 hash ever leave
|
|
9
|
+
* the machine; the full password never does).
|
|
10
|
+
*
|
|
11
|
+
* Part of RageVault.
|
|
12
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
13
|
+
* MIT licensed (see LICENSE).
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { estimateStrength } from "./generator.js";
|
|
17
|
+
const YEAR_MS = 365 * 24 * 60 * 60 * 1000;
|
|
18
|
+
/** The offline audit — weak, reused and old passwords. */
|
|
19
|
+
export function auditVault(data, nowMs = Date.now()) {
|
|
20
|
+
const counts = new Map();
|
|
21
|
+
for (const i of data.items)
|
|
22
|
+
if (i.password)
|
|
23
|
+
counts.set(i.password, (counts.get(i.password) ?? 0) + 1);
|
|
24
|
+
const findings = [];
|
|
25
|
+
let weak = 0, reused = 0, old = 0;
|
|
26
|
+
for (const i of data.items) {
|
|
27
|
+
if (!i.password)
|
|
28
|
+
continue;
|
|
29
|
+
const issues = [];
|
|
30
|
+
if (estimateStrength(i.password).bits < 50) {
|
|
31
|
+
issues.push("weak");
|
|
32
|
+
weak++;
|
|
33
|
+
}
|
|
34
|
+
if ((counts.get(i.password) ?? 0) > 1) {
|
|
35
|
+
issues.push("reused");
|
|
36
|
+
reused++;
|
|
37
|
+
}
|
|
38
|
+
if (nowMs - Date.parse(i.updatedAt || i.createdAt) > YEAR_MS) {
|
|
39
|
+
issues.push("old");
|
|
40
|
+
old++;
|
|
41
|
+
}
|
|
42
|
+
if (issues.length)
|
|
43
|
+
findings.push({ itemId: i.id, title: i.title, issues });
|
|
44
|
+
}
|
|
45
|
+
return { total: data.items.length, weak, reused, old, findings };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Opt-in breach check via HIBP's range API (k-anonymity). Returns how many times
|
|
49
|
+
* the password appears in known breaches (0 = not found). Never sends the
|
|
50
|
+
* password — only the 5-char SHA-1 prefix.
|
|
51
|
+
*/
|
|
52
|
+
export async function breachCount(password, timeoutMs = 4000) {
|
|
53
|
+
const sha1 = createHash("sha1").update(password, "utf8").digest("hex").toUpperCase();
|
|
54
|
+
const prefix = sha1.slice(0, 5), suffix = sha1.slice(5);
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
57
|
+
try {
|
|
58
|
+
const res = await fetch(`https://api.pwnedpasswords.com/range/${prefix}`, {
|
|
59
|
+
signal: controller.signal,
|
|
60
|
+
headers: { "Add-Padding": "true", "user-agent": "RageVault" },
|
|
61
|
+
});
|
|
62
|
+
if (!res.ok)
|
|
63
|
+
return -1;
|
|
64
|
+
const text = await res.text();
|
|
65
|
+
for (const line of text.split("\n")) {
|
|
66
|
+
const [suf, count] = line.trim().split(":");
|
|
67
|
+
if (suf === suffix)
|
|
68
|
+
return Number(count) || 0;
|
|
69
|
+
}
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return -1; // unknown (offline / blocked)
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branding & identity.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for the project identity carried by RageVault: the
|
|
5
|
+
* startup banner and the version string.
|
|
6
|
+
*
|
|
7
|
+
* Part of RageVault.
|
|
8
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
9
|
+
* MIT licensed (see LICENSE).
|
|
10
|
+
*/
|
|
11
|
+
/** Identity of the project's author. */
|
|
12
|
+
export declare const BRAND: Readonly<{
|
|
13
|
+
product: "RageVault";
|
|
14
|
+
author: "SoyRage Agency";
|
|
15
|
+
url: "https://soyrage.es/";
|
|
16
|
+
donate: "https://www.paypal.com/paypalme/soyrageagency";
|
|
17
|
+
tagline: "Your passwords, self-hosted and end-to-end encrypted.";
|
|
18
|
+
version: "0.2.3";
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* The SoyRage minimalist palette, mirrored from the web/panel line:
|
|
22
|
+
* cream background, ink text, a single blue accent. Used by the web UI's CSS
|
|
23
|
+
* variables and, in spirit, by the TUI's 256-colour accent.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PALETTE: Readonly<{
|
|
26
|
+
cream: "#f3f1ea";
|
|
27
|
+
ink: "#111111";
|
|
28
|
+
accent: "#3b9ee8";
|
|
29
|
+
green: "#3a8f5c";
|
|
30
|
+
amber: "#b8892a";
|
|
31
|
+
red: "#c8524a";
|
|
32
|
+
}>;
|
|
33
|
+
/** ASCII welcome banner (ANSI Shadow style). */
|
|
34
|
+
export declare const ASCII_BANNER: string;
|
|
35
|
+
/** The full welcome block, banner + credits. */
|
|
36
|
+
export declare function welcomeBlock(): string;
|
package/dist/branding.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branding & identity.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for the project identity carried by RageVault: the
|
|
5
|
+
* startup banner and the version string.
|
|
6
|
+
*
|
|
7
|
+
* Part of RageVault.
|
|
8
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
9
|
+
* MIT licensed (see LICENSE).
|
|
10
|
+
*/
|
|
11
|
+
/** Identity of the project's author. */
|
|
12
|
+
export const BRAND = Object.freeze({
|
|
13
|
+
product: "RageVault",
|
|
14
|
+
author: "SoyRage Agency",
|
|
15
|
+
url: "https://soyrage.es/",
|
|
16
|
+
donate: "https://www.paypal.com/paypalme/soyrageagency",
|
|
17
|
+
tagline: "Your passwords, self-hosted and end-to-end encrypted.",
|
|
18
|
+
version: "0.2.3",
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* The SoyRage minimalist palette, mirrored from the web/panel line:
|
|
22
|
+
* cream background, ink text, a single blue accent. Used by the web UI's CSS
|
|
23
|
+
* variables and, in spirit, by the TUI's 256-colour accent.
|
|
24
|
+
*/
|
|
25
|
+
export const PALETTE = Object.freeze({
|
|
26
|
+
cream: "#f3f1ea",
|
|
27
|
+
ink: "#111111",
|
|
28
|
+
accent: "#3b9ee8",
|
|
29
|
+
green: "#3a8f5c",
|
|
30
|
+
amber: "#b8892a",
|
|
31
|
+
red: "#c8524a",
|
|
32
|
+
});
|
|
33
|
+
/** ASCII welcome banner (ANSI Shadow style). */
|
|
34
|
+
export const ASCII_BANNER = String.raw `
|
|
35
|
+
██████╗ █████╗ ██████╗ ███████╗██╗ ██╗ █████╗ ██╗ ██╗██╗ ████████╗
|
|
36
|
+
██╔══██╗██╔══██╗██╔════╝ ██╔════╝██║ ██║██╔══██╗██║ ██║██║ ╚══██╔══╝
|
|
37
|
+
██████╔╝███████║██║ ███╗█████╗ ██║ ██║███████║██║ ██║██║ ██║
|
|
38
|
+
██╔══██╗██╔══██║██║ ██║██╔══╝ ╚██╗ ██╔╝██╔══██║██║ ██║██║ ██║
|
|
39
|
+
██║ ██║██║ ██║╚██████╔╝███████╗ ╚████╔╝ ██║ ██║╚██████╔╝███████╗██║
|
|
40
|
+
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝
|
|
41
|
+
R A G E V A U L T · self-hosted secrets
|
|
42
|
+
~ End-to-end encrypted. Behind your VPN. Owned by you. ~
|
|
43
|
+
`;
|
|
44
|
+
/** The full welcome block, banner + credits. */
|
|
45
|
+
export function welcomeBlock() {
|
|
46
|
+
return [
|
|
47
|
+
ASCII_BANNER,
|
|
48
|
+
` ${BRAND.product} v${BRAND.version}`,
|
|
49
|
+
` Crafted with care by ${BRAND.author} — ${BRAND.url}`,
|
|
50
|
+
" Free and open source under the MIT License.",
|
|
51
|
+
` Support the project: ${BRAND.donate}`,
|
|
52
|
+
"",
|
|
53
|
+
].join("\n");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=branding.js.map
|