docs: polish README with custom SVG icons, extreme Markdown, and no emojis

swadhinbiswas committed 2 months ago
d274138
1 parent 5e0888a
commit d274138
11 files changed
+339 -80
โ–ผREADME.md
+222-78
1
1
<div align="center">
2
2
3
-<img src="assets/logo.svg" alt="VEET โ€” Universal Linux App Uninstaller" width="620"/>
3
+<img src="assets/logo.svg" alt="VEET โ€” Universal Linux App Uninstaller" width="600"/>
4
4
5
-<br/><br/>
5
+<br/>
6
6
7
7
[![Go Version](https://img.shields.io/badge/Go-1.22+-00ADD8?style=flat-square&logo=go)](https://go.dev)
8
8
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE)
10
10
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](CONTRIBUTING.md)
11
11
12
12
<p align="center">
13
- <b>Universal Linux App Uninstaller &amp; Deep-Clean Residual Purger</b><br/>
14
- <i>Completely remove applications, orphaned configs, hidden caches, system logs, and leftover dotfiles in one confirmed action.</i>
13
+ <b>Universal Linux Application Uninstaller &amp; Deep-Clean Residual Purger</b><br/>
14
+ <i>An interactive terminal system utility that detects installed software across package managers and automates complete removal of binaries, user caches, configuration files, and residual logs in one confirmed action.</i>
15
15
</p>
16
16
17
17
</div>
18
18
19
19
---
20
20
21
-## ๐Ÿ’ก Why VEET?
21
+## Technical Overview
22
22
23
-When you remove software using traditional Linux package managers (`pacman -R`, `apt remove`, `dnf remove`, `flatpak uninstall`, etc.):
24
-- **Only the binaries are deleted** (`/usr/bin`, `/usr/share`).
25
-- **User data is left behind forever**: `~/.config/<app>`, `~/.cache/<app>` *(often multiple gigabytes from Chromium/Electron apps)*, `~/.local/share/<app>`, `/var/log/<app>`, and lingering dotfiles.
26
-- **Package managers are fragmented**: Your system software lives across system repos, AUR, Flatpak, Snap, AppImages, npm global, pipx, and Cargo.
23
+When software is uninstalled using conventional Linux package managers (`pacman -R`, `apt remove`, `dnf remove`, `flatpak uninstall`), only package-managed system files (`/usr/bin`, `/usr/share`) are modified. User-space directories remain unmanaged:
27
24
28
-**VEET bridges this gap** โ€” giving Linux users a fast, unified, macOS *AppCleaner*-like experience built entirely in the terminal.
25
+- `~/.config/<app>` *(user configuration state)*
26
+- `~/.cache/<app>` *(accumulated runtime caches, shader caches, webview stores)*
27
+- `~/.local/share/<app>` *(local application data and databases)*
28
+- `~/.local/state/<app>` *(session and state histories)*
29
+- `/var/log/<app>` and systemd journal archives
30
+
31
+Over extended usage, unmanaged leftovers consume significant disk storage. Modern Linux distributions also feature package manager fragmentation across native repositories, universal formats, and language toolchains.
32
+
33
+**VEET** bridges this gap by scanning all installed targets concurrently, staging candidate residual paths for user verification, and executing atomic uninstalls with batched privilege elevation.
29
34
30
35
---
31
36
32
-## โœจ Features
37
+## Comparison Matrix
38
+
39
+| Feature | `pacman -R` / `apt remove` | `flatpak uninstall` | `bleachbit` | `veet` |
40
+|:---|:---:|:---:|:---:|:---:|
41
+| **Binary Removal** | Yes | Yes | No | **Yes** |
42
+| **User Configuration Cleanup (`~/.config`)** | No | No | Partial | **Yes (Inspected &amp; Staged)** |
43
+| **User Cache Cleanup (`~/.cache`)** | No | No | Yes | **Yes (Inspected &amp; Staged)** |
44
+| **Universal Multi-Source Aggregator** | No | No | No | **Yes (15+ package managers)** |
45
+| **Orphaned Dependencies Detection** | Manual query | No | No | **Yes (Live detection)** |
46
+| **AppImage &amp; Portable Binary Scanner** | No | No | No | **Yes (Auto-discovered)** |
47
+| **Interactive Terminal UI (TUI)** | No | No | GTK Only | **Yes (Zero-latency Bubble Tea)** |
48
+| **Pre-execution Dry-run Inspection** | Partial | Partial | Yes | **Yes (Full path inspection)** |
49
+| **Batched Sudo Elevation** | Per command | N/A | Full root required | **Yes (Single prompt per batch)** |
50
+
51
+---
33
52
34
-- **๐ŸŒ Multi-Source Detection**: Concurrently scans system package managers (`apt`, `dnf`, `pacman`, AUR via `yay`/`paru`, `zypper`), universal formats (`Flatpak`, `Snap`), portable bundles (`AppImage`), global toolchains (`npm -g`, `pipx`, `cargo`, `gem`, `go install`), and system services.
35
-- **๐Ÿ‚ Orphan & Unneeded Dependencies**: Automatically discovers forgotten orphaned dependencies (`pacman -Qdt`, `apt autoremove`, `dnf repoquery --unneeded`) ready to be pruned.
36
-- **๐Ÿ“‹ Systemd Journal & Log Vacuum**: Safely detects bloated `/var/log/journal` systemd logs and old `.gz` log archives to reclaim storage.
37
-- **๐Ÿ” Deep Clean Removal**: Stages every candidate directory before execution (`~/.config`, `~/.cache`, `~/.local/share`, `/etc`, `/var/log`).
38
-- **๐Ÿ“Š 1-Click Interactive Stat Cards**: Jump between `All Apps`, `Flatpak`, `Snap`, `Tools`, `Cache`, and `Reclaimable` with keys <kbd>1</kbd>โ€“<kbd>6</kbd> or <kbd>[</kbd> / <kbd>]</kbd>.
39
-- **โšก Instant Bloat Sorting (<kbd>o</kbd>)**: Cycle sorting order (`Size โ†“`, `Name A-Z`, `Source`, `Date โ†“`) to find massive disk-hogging applications immediately.
40
-- **๐Ÿ’พ Real-Time Disk Gauge**: Live disk utilization monitoring displayed in the header.
41
-- **๐Ÿ”’ Sudo Batching & Safety First**: Home-directory paths are removed as the current user. System paths are batched into **one single sudo prompt** per uninstall. Core system packages (`glibc`, `linux`, `systemd`, current shell) are protected and refused by default.
42
-- **๐Ÿ“„ Audit Trail & JSON Export**: Every removal is logged to `~/.local/share/veet/history.log`. Press <kbd>e</kbd> to export an inventory report to `apps-report.json`.
53
+## Core Capabilities
54
+
55
+<table>
56
+ <tr>
57
+ <td width="50%" valign="top">
58
+ <h4><img src="assets/icons/sources.svg" width="18" height="18" align="center" /> Multi-Source Parallel Detection</h4>
59
+ <p>Concurrently queries system package managers (<code>pacman</code>/AUR, <code>apt</code>, <code>dnf</code>, <code>zypper</code>), sandboxed formats (<code>Flatpak</code>, <code>Snap</code>), portable bundles (<code>AppImage</code>), and language toolchains (<code>npm -g</code>, <code>pipx</code>, <code>cargo</code>, <code>gem</code>, <code>go install</code>) with zero-cost skipping for absent tools.</p>
60
+ </td>
61
+ <td width="50%" valign="top">
62
+ <h4><img src="assets/icons/purge.svg" width="18" height="18" align="center" /> Deep Residual Cleanup</h4>
63
+ <p>Automates residual discovery across user configurations, cached runtime stores, desktop integration entries, icons, and system paths, staging each candidate before disk execution.</p>
64
+ </td>
65
+ </tr>
66
+ <tr>
67
+ <td width="50%" valign="top">
68
+ <h4><img src="assets/icons/orphan.svg" width="18" height="18" align="center" /> Orphaned Dependency Pruning</h4>
69
+ <p>Live detection of unneeded dependency packages across native package managers (<code>pacman -Qdt</code>, <code>apt autoremove</code>, <code>dnf repoquery --unneeded</code>) ready for safe reclamation.</p>
70
+ </td>
71
+ <td width="50%" valign="top">
72
+ <h4><img src="assets/icons/journal.svg" width="18" height="18" align="center" /> System Log &amp; Journal Vacuum</h4>
73
+ <p>Identifies bloated systemd journal storage (<code>/var/log/journal</code>) and rotated compressed log archives (<code>/var/log/*.gz</code>) with integrated elevated vacuum routines.</p>
74
+ </td>
75
+ </tr>
76
+ <tr>
77
+ <td width="50%" valign="top">
78
+ <h4><img src="assets/icons/terminal.svg" width="18" height="18" align="center" /> Interactive Navigation &amp; Telemetry</h4>
79
+ <p>Instant category switching (<kbd>1</kbd>โ€“<kbd>6</kbd>), four-mode list sorting (<kbd>o</kbd>) for rapid disk bloat identification, and in-place staged path inspection (<kbd>p</kbd>).</p>
80
+ </td>
81
+ <td width="50%" valign="top">
82
+ <h4><img src="assets/icons/security.svg" width="18" height="18" align="center" /> Sudo Batching &amp; Anti-Brick Safety</h4>
83
+ <p>Core system components (<code>glibc</code>, <code>linux</code>, <code>systemd</code>, active shell) are protected from selection. System paths are batched into a single elevated transaction.</p>
84
+ </td>
85
+ </tr>
86
+</table>
43
87
44
88
---
45
89
46
-## ๐Ÿš€ Installation
90
+## Installation
47
91
48
-### Option 1: One-Line Bash Installer *(Recommended)*
49
-Automatically compiles, installs to `~/.local/bin/veet`, and sets up shell completions:
92
+### Option 1: Automated Script Installation (Recommended)
93
+
94
+Downloads, compiles with binary optimizations (`-ldflags="-s -w"`), installs to `~/.local/bin/veet`, and configures shell autocompletions:
50
95
51
96
```bash
52
97
curl -sSL https://raw.githubusercontent.com/swadhinbiswas/veet/main/install.sh | bash
59
104
60
105
---
61
106
62
-### Option 2: Go Install
107
+### Option 2: Go Package Manager
108
+
109
+Install directly via the standard Go toolchain (requires Go 1.22+):
110
+
63
111
```bash
64
112
go install github.com/swadhinbiswas/veet@latest
65
-# or from local clone:
113
+```
114
+
115
+*Or install from local source:*
116
+```bash
66
117
go install .
67
118
```
68
119
69
120
---
70
121
71
-### Option 3: Build from Source
122
+### Option 3: Manual Compilation via Makefile
123
+
72
124
```bash
73
125
git clone https://github.com/swadhinbiswas/veet.git
74
126
cd veet
75
127
make build
76
-# or install directly
77
128
make install
78
129
```
79
130
131
+> [!NOTE]
132
+> Ensure `~/.local/bin` is present in your environment `$PATH`. If not, add `export PATH="$PATH:$HOME/.local/bin"` to your `~/.bashrc` or `~/.zshrc`.
133
+
80
134
---
81
135
82
-### ๐Ÿ—‘๏ธ Uninstallation
83
-To remove VEET and its shell completions:
84
-```bash
85
-./uninstall.sh
86
-```
136
+## Usage
87
137
138
+### Interactive Terminal Dashboard
88
139
89
-## ๐ŸŽฎ Usage
140
+Launch the zero-latency terminal user interface:
90
141
91
-### Interactive TUI Mode *(Default)*
92
-Launch the interactive terminal dashboard:
93
142
```bash
94
143
veet
95
144
```
96
145
97
-### CLI & Scripting Modes
146
+---
147
+
148
+### Command Line Interface
149
+
150
+VEET exposes non-interactive headless commands for automation, scripting, and CI auditing:
151
+
98
152
```bash
99
-# Plain-text table of all installed applications across sources
153
+# Output installed application inventory table to stdout
100
154
veet scan
101
155
102
-# Machine-readable JSON output (great for scripting and audits)
156
+# Export machine-readable JSON inventory
103
157
veet scan --json
104
158
105
-# Non-interactive preview & deep-clean removal
106
-veet clean <app-name>
107
-veet clean <app-name> --source flatpak --yes
159
+# Non-interactive deep-clean removal with preview
160
+veet clean <package-name>
161
+
162
+# Non-interactive removal scoped to specific source with confirmation
163
+veet clean <package-name> --source flatpak --yes
108
164
```
109
165
110
166
---
111
167
112
-## โŒจ๏ธ TUI Keybindings Reference
113
-
114
-| Key | Action |
115
-|---|---|
116
-| <kbd>1</kbd> โ€“ <kbd>6</kbd> | Jump to stat cards (`All`, `Flatpak`, `Snap`, `Tools`, `Cache`, `Reclaim`) |
117
-| <kbd>[</kbd> / <kbd>]</kbd> or <kbd>โ†</kbd> / <kbd>โ†’</kbd> | Cycle through top stat cards |
118
-| <kbd>โ†‘</kbd> <kbd>โ†“</kbd> or <kbd>j</kbd> <kbd>k</kbd> | Navigate the application list |
119
-| <kbd>Space</kbd> | Toggle multi-select checkbox on current row |
120
-| <kbd>a</kbd> | Select / deselect all visible filtered rows |
121
-| <kbd>o</kbd> / <kbd>O</kbd> | Cycle sort order (`Size โ†“`, `Name A-Z`, `Source`, `Date โ†“`) |
122
-| <kbd>p</kbd> / <kbd>P</kbd> | Toggle staged filesystem paths inspector in details panel |
123
-| <kbd>/</kbd> | Focus fuzzy search-as-you-type filter |
124
-| <kbd>Tab</kbd> / <kbd>Shift+Tab</kbd> | Cycle specific source filter (`pacman`, `flatpak`, `aur`, etc.) |
125
-| <kbd>Enter</kbd> | Stage selected apps and open confirmation preview |
126
-| <kbd>c</kbd> | 1-key quick purge for cache & residual dotfiles |
127
-| <kbd>e</kbd> | Export inventory report to JSON (`~/.local/share/veet/apps-report.json`) |
128
-| <kbd>r</kbd> | Rescan all detectors and package managers |
129
-| <kbd>l</kbd> | View historical audit logs |
130
-| <kbd>s</kbd> | Settings & protected components |
131
-| <kbd>h</kbd> / <kbd>?</kbd> | Toggle full help modal |
132
-| <kbd>Esc</kbd> | Back out of modal / unfocus search |
133
-| <kbd>q</kbd> / <kbd>Ctrl+C</kbd> | Quit VEET |
168
+## Keybinding Reference
169
+
170
+<table width="100%">
171
+ <thead>
172
+ <tr>
173
+ <th width="25%">Keybinding</th>
174
+ <th width="75%">Action</th>
175
+ </tr>
176
+ </thead>
177
+ <tbody>
178
+ <tr>
179
+ <td><kbd>1</kbd> โ€“ <kbd>6</kbd></td>
180
+ <td>Jump to stat card category (<code>All</code>, <code>Flatpak</code>, <code>Snap</code>, <code>Tools</code>, <code>Cache</code>, <code>Reclaim</code>)</td>
181
+ </tr>
182
+ <tr>
183
+ <td><kbd>[</kbd> / <kbd>]</kbd> or <kbd>&larr;</kbd> / <kbd>&rarr;</kbd></td>
184
+ <td>Cycle horizontally through top stat categories</td>
185
+ </tr>
186
+ <tr>
187
+ <td><kbd>&uarr;</kbd> <kbd>&darr;</kbd> / <kbd>j</kbd> <kbd>k</kbd></td>
188
+ <td>Navigate table selection cursor</td>
189
+ </tr>
190
+ <tr>
191
+ <td><kbd>Space</kbd></td>
192
+ <td>Toggle multi-select checkbox on active row</td>
193
+ </tr>
194
+ <tr>
195
+ <td><kbd>a</kbd></td>
196
+ <td>Select / deselect all visible filtered rows (skips protected components)</td>
197
+ </tr>
198
+ <tr>
199
+ <td><kbd>o</kbd> / <kbd>O</kbd></td>
200
+ <td>Cycle sort order (<code>Size &darr;</code>, <code>Name A-Z</code>, <code>Source</code>, <code>Date &darr;</code>)</td>
201
+ </tr>
202
+ <tr>
203
+ <td><kbd>p</kbd> / <kbd>P</kbd></td>
204
+ <td>Toggle staged filesystem paths inspector in details panel</td>
205
+ </tr>
206
+ <tr>
207
+ <td><kbd>/</kbd></td>
208
+ <td>Focus fuzzy search-as-you-type filter input</td>
209
+ </tr>
210
+ <tr>
211
+ <td><kbd>Tab</kbd> / <kbd>Shift+Tab</kbd></td>
212
+ <td>Cycle specific source filter dropdown (<code>pacman</code>, <code>aur</code>, <code>flatpak</code>, etc.)</td>
213
+ </tr>
214
+ <tr>
215
+ <td><kbd>Enter</kbd></td>
216
+ <td>Stage selected applications and open confirmation preview modal</td>
217
+ </tr>
218
+ <tr>
219
+ <td><kbd>c</kbd></td>
220
+ <td>1-key quick purge for user cache &amp; residual files</td>
221
+ </tr>
222
+ <tr>
223
+ <td><kbd>e</kbd></td>
224
+ <td>Export audit inventory report to <code>~/.local/share/veet/apps-report.json</code></td>
225
+ </tr>
226
+ <tr>
227
+ <td><kbd>r</kbd></td>
228
+ <td>Trigger background rescan across all detectors</td>
229
+ </tr>
230
+ <tr>
231
+ <td><kbd>l</kbd></td>
232
+ <td>Open history audit log viewport</td>
233
+ </tr>
234
+ <tr>
235
+ <td><kbd>s</kbd></td>
236
+ <td>Open settings and protected components registry</td>
237
+ </tr>
238
+ <tr>
239
+ <td><kbd>h</kbd> / <kbd>?</kbd></td>
240
+ <td>Toggle keybinding reference overlay</td>
241
+ </tr>
242
+ <tr>
243
+ <td><kbd>Esc</kbd></td>
244
+ <td>Dismiss active modal / blur search input</td>
245
+ </tr>
246
+ <tr>
247
+ <td><kbd>q</kbd> / <kbd>Ctrl+C</kbd></td>
248
+ <td>Quit VEET</td>
249
+ </tr>
250
+ </tbody>
251
+</table>
134
252
135
253
---
136
254
137
-## โš™๏ธ Configuration
255
+## Configuration
256
+
257
+<details>
258
+<summary><b>Custom Configuration (<code>~/.config/veet/config.yaml</code>)</b></summary>
259
+<br/>
138
260
139
-Create an optional configuration file at `~/.config/veet/config.yaml`:
261
+VEET supports optional user configuration via YAML. Create `~/.config/veet/config.yaml` to declare custom protected packages:
140
262
141
263
```yaml
264
+# Packages that VEET will refuse to stage or select for deletion
142
265
protected_packages:
143
266
- custom-kernel-module
144
- - my-critical-database
145
- - docker-engine
267
+ - my-critical-service
268
+ - proprietary-driver
146
269
```
147
270
271
+</details>
148
272
149
-## ๐Ÿ—๏ธ Architecture
273
+<details>
274
+<summary><b>System Architecture &amp; Module Map</b></summary>
275
+<br/>
150
276
151
277
```
152
-main.go Single entrypoint & Cobra CLI commands (scan, clean, tui)
153
-internal/model/ AppInfo, RemovableFiles, Config, SourceMeta
154
-internal/detector/ Concurrent source detectors (apt, pacman, flatpak, appimage, orphans, ...)
155
-internal/uninstaller/ Staging engine, sudo batching & filesystem cleanup (Afero)
156
-internal/history/ Append-only audit logger (~/.local/share/veet/history.log)
157
-internal/ui/ Bubble Tea & Lip Gloss TUI (table, details, stat cards, progress, styles)
278
+veet/
279
+โ”œโ”€โ”€ main.go # Cobra CLI entrypoint (scan, clean, tui)
280
+โ”œโ”€โ”€ internal/
281
+โ”‚ โ”œโ”€โ”€ model/ # Data types: AppInfo, RemovableFiles, Config, SourceMeta
282
+โ”‚ โ”œโ”€โ”€ detector/ # Parallel detector engine (15+ source handlers)
283
+โ”‚ โ”œโ”€โ”€ uninstaller/ # Staging engine, sudo batching & filesystem removal (Afero)
284
+โ”‚ โ”œโ”€โ”€ history/ # Append-only audit logger (~/.local/share/veet/history.log)
285
+โ”‚ โ””โ”€โ”€ ui/ # Bubble Tea & Lip Gloss TUI components
286
+โ”œโ”€โ”€ assets/ # Brand assets & custom vector icons
287
+โ”œโ”€โ”€ Makefile # Build automation targets
288
+โ”œโ”€โ”€ install.sh # Automated Bash installer
289
+โ””โ”€โ”€ uninstall.sh # Uninstaller script
290
+```
291
+
292
+</details>
293
+
294
+---
295
+
296
+## Uninstallation
297
+
298
+To remove the compiled binary, shell autocompletions, and optionally purge audit logs:
299
+
300
+```bash
301
+./uninstall.sh
158
302
```
159
303
160
304
---
161
305
162
-## ๐Ÿค Contributing
306
+## Contributing
163
307
164
-Contributions are welcome! Please check out [CONTRIBUTING.md](CONTRIBUTING.md) for instructions on setting up your development environment and adding support for new package managers or features.
308
+Contributions are welcome. Please refer to [CONTRIBUTING.md](CONTRIBUTING.md) for local development setup, detector implementation guides, and testing protocols.
165
309
166
310
---
167
311
168
-## ๐Ÿ“œ License
312
+## License
169
313
170
-This project is open source and available under the [MIT License](LICENSE).
314
+VEET is open-source software licensed under the [MIT License](LICENSE).
171
315
โ–ผassets/icons/audit.svg
+11-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="auditGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#00E5FF" />
5
+ <stop offset="100%" stop-color="#10B981" />
6
+ </linearGradient>
7
+ </defs>
8
+ <path d="M14 2H6C4.9 2 4 2.9 4 4V20C4 21.1 4.9 22 6 22H18C19.1 22 20 21.1 20 20V8L14 2Z" stroke="url(#auditGrad)" stroke-width="2" stroke-linejoin="round"/>
9
+ <path d="M14 2V8H20" stroke="url(#auditGrad)" stroke-width="2" stroke-linejoin="round"/>
10
+ <path d="M9 15L11 17L15 13" stroke="url(#auditGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
11
+</svg>
0
12
โ–ผassets/icons/disk.svg
+12-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="diskGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#10B981" />
5
+ <stop offset="100%" stop-color="#00E5FF" />
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="2" y="4" width="20" height="16" rx="3" stroke="url(#diskGrad)" stroke-width="2"/>
9
+ <line x1="2" y1="14" x2="22" y2="14" stroke="url(#diskGrad)" stroke-width="1.5"/>
10
+ <circle cx="6" cy="17.5" r="1" fill="#10B981"/>
11
+ <circle cx="10" cy="17.5" r="1" fill="#00E5FF"/>
12
+</svg>
0
13
โ–ผassets/icons/install.svg
+11-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="instGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#10B981" />
5
+ <stop offset="100%" stop-color="#3B82F6" />
6
+ </linearGradient>
7
+ </defs>
8
+ <path d="M21 15V19C21 20.1 20.1 21 19 21H5C3.9 21 3 20.1 3 19V15" stroke="url(#instGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M7 10L12 15L17 10" stroke="url(#instGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <line x1="12" y1="15" x2="12" y2="3" stroke="url(#instGrad)" stroke-width="2" stroke-linecap="round"/>
11
+</svg>
0
12
โ–ผassets/icons/journal.svg
+12-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="journalGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#A855F7" />
5
+ <stop offset="100%" stop-color="#6366F1" />
6
+ </linearGradient>
7
+ </defs>
8
+ <path d="M4 19.5V4.5C4 3.67 4.67 3 5.5 3H18.5C19.33 3 20 3.67 20 4.5V19.5C20 20.33 19.33 21 18.5 21H5.5C4.67 21 4 20.33 4 19.5Z" stroke="url(#journalGrad)" stroke-width="2"/>
9
+ <path d="M8 7H16" stroke="url(#journalGrad)" stroke-width="1.5" stroke-linecap="round"/>
10
+ <path d="M8 11H16" stroke="url(#journalGrad)" stroke-width="1.5" stroke-linecap="round"/>
11
+ <path d="M8 15H12" stroke="url(#journalGrad)" stroke-width="1.5" stroke-linecap="round"/>
12
+</svg>
0
13
โ–ผassets/icons/keyboard.svg
+16-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="kbGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#A855F7" />
5
+ <stop offset="100%" stop-color="#EC4899" />
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="2" y="4" width="20" height="16" rx="3" stroke="url(#kbGrad)" stroke-width="2"/>
9
+ <line x1="6" y1="8" x2="6.01" y2="8" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
10
+ <line x1="10" y1="8" x2="10.01" y2="8" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
11
+ <line x1="14" y1="8" x2="14.01" y2="8" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
12
+ <line x1="18" y1="8" x2="18.01" y2="8" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
13
+ <line x1="6" y1="12" x2="6.01" y2="12" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
14
+ <line x1="18" y1="12" x2="18.01" y2="12" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
15
+ <line x1="9" y1="16" x2="15" y2="16" stroke="url(#kbGrad)" stroke-width="2" stroke-linecap="round"/>
16
+</svg>
0
17
โ–ผassets/icons/orphan.svg
+12-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="orphanGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#F59E0B" />
5
+ <stop offset="100%" stop-color="#EF4444" />
6
+ </linearGradient>
7
+ </defs>
8
+ <circle cx="18" cy="6" r="3" stroke="url(#orphanGrad)" stroke-width="2"/>
9
+ <circle cx="6" cy="18" r="3" stroke="url(#orphanGrad)" stroke-width="2"/>
10
+ <path d="M8.5 15.5L12 12" stroke="url(#orphanGrad)" stroke-width="2" stroke-linecap="round"/>
11
+ <path d="M15.5 8.5L14 10" stroke="url(#orphanGrad)" stroke-width="2" stroke-linecap="round" stroke-dasharray="2 2"/>
12
+</svg>
0
13
โ–ผassets/icons/purge.svg
+11-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="purgeGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#38BDF8" />
5
+ <stop offset="100%" stop-color="#8B5CF6" />
6
+ </linearGradient>
7
+ </defs>
8
+ <path d="M19 4L10 13L6 9L2 13" stroke="url(#purgeGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M13 4H19V10" stroke="url(#purgeGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <path d="M4 17L8 21H20" stroke="url(#purgeGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
11
+</svg>
0
12
โ–ผassets/icons/security.svg
+10-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="secGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#00E5FF" />
5
+ <stop offset="100%" stop-color="#3B82F6" />
6
+ </linearGradient>
7
+ </defs>
8
+ <path d="M12 22S20 18 20 12V5L12 2L4 5V12C4 18 12 22 12 22Z" stroke="url(#secGrad)" stroke-width="2" stroke-linejoin="round"/>
9
+ <path d="M9 12L11 14L15 10" stroke="url(#secGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
+</svg>
0
11
โ–ผassets/icons/sources.svg
+11-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="srcGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#00E5FF" />
5
+ <stop offset="100%" stop-color="#3B82F6" />
6
+ </linearGradient>
7
+ </defs>
8
+ <path d="M12 2L2 7L12 12L22 7L12 2Z" stroke="url(#srcGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M2 17L12 22L22 17" stroke="url(#srcGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <path d="M2 12L12 17L22 12" stroke="url(#srcGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
11
+</svg>
0
12
โ–ผassets/icons/terminal.svg
+11-0
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none">
2
+ <defs>
3
+ <linearGradient id="termGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#38BDF8" />
5
+ <stop offset="100%" stop-color="#00E5FF" />
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="2" y="3" width="20" height="18" rx="3" stroke="url(#termGrad)" stroke-width="2"/>
9
+ <path d="M7 8L11 12L7 16" stroke="url(#termGrad)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
10
+ <line x1="13" y1="16" x2="17" y2="16" stroke="url(#termGrad)" stroke-width="2" stroke-linecap="round"/>
11
+</svg>
0
12