snip-manager 0.1.0
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/ANALYSIS.md +113 -0
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/NPM_PUBLISH_GUIDE.md +75 -0
- package/README.md +76 -0
- package/STRATEGY.md +370 -0
- package/bin/snip +2 -0
- package/color_scheme.md +24 -0
- package/example_snippet.md +26 -0
- package/jest.config.js +5 -0
- package/jest.setup.js +17 -0
- package/landing.html +833 -0
- package/lib/cli.js +114 -0
- package/lib/clipboard.js +37 -0
- package/lib/commands/add.js +36 -0
- package/lib/commands/config.js +19 -0
- package/lib/commands/edit.js +26 -0
- package/lib/commands/export.js +23 -0
- package/lib/commands/import.js +18 -0
- package/lib/commands/list.js +81 -0
- package/lib/commands/rm.js +10 -0
- package/lib/commands/run.js +34 -0
- package/lib/commands/search.js +13 -0
- package/lib/commands/show.js +29 -0
- package/lib/commands/sync.js +27 -0
- package/lib/commands/ui.js +1137 -0
- package/lib/config.js +56 -0
- package/lib/exec.js +73 -0
- package/lib/migrate_to_sqlite.js +42 -0
- package/lib/safety.js +26 -0
- package/lib/search.js +21 -0
- package/lib/storage.js +372 -0
- package/lib/sync/gist.js +67 -0
- package/mvp.md +69 -0
- package/npm_publish_workflow.md +19 -0
- package/package.json +50 -0
- package/plan.md +99 -0
- package/prd.md +70 -0
- package/scripts/seed-examples.js +113 -0
- package/scripts/sqljs-smoke.js +48 -0
- package/tech_architecture.md +47 -0
- package/temp-sqljs.db +0 -0
- package/ui_ux.md +46 -0
- package/user_journey.md +29 -0
- package/value_prop.md +21 -0
package/ANALYSIS.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# snip — Project Analysis
|
|
2
|
+
|
|
3
|
+
**Scope:** CLI Snippet Manager (MVP + post-MVP).
|
|
4
|
+
**Reviewed:** Features done vs remaining, performance, security, UI/UX.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. What’s Done
|
|
9
|
+
|
|
10
|
+
### Core MVP (from mvp.md)
|
|
11
|
+
|
|
12
|
+
| Feature | Status | Notes |
|
|
13
|
+
|--------|--------|------|
|
|
14
|
+
| `snip add <name>` (stdin + editor) | ✅ | Works; editor flow and `--lang` / `--tags` supported |
|
|
15
|
+
| `snip list` (with -t, --lang) | ✅ | Filter by tag/lang; no `--sort` in CLI |
|
|
16
|
+
| `snip search <query>` | ✅ | Fuse.js fuzzy search over name, tags, content (first 1000 chars) |
|
|
17
|
+
| `snip show <id\|name>` | ✅ | Prints content; `--edit` opens editor (broken with SQLite, see below) |
|
|
18
|
+
| `snip run <id\|name>` | ✅ | Preview, confirm, dry-run, danger detection; `--confirm` exposed for override |
|
|
19
|
+
| `snip config get/set` | ✅ | XDG config; editor, confirmRun, defaultShell, dbPath, gist_token, etc. |
|
|
20
|
+
|
|
21
|
+
### Post-MVP (from mvp.md “quick wins”)
|
|
22
|
+
|
|
23
|
+
| Feature | Status | Notes |
|
|
24
|
+
|--------|--------|------|
|
|
25
|
+
| Export/import JSON | ✅ | `snip export [path]`, `snip import <file>` |
|
|
26
|
+
| Edit/remove | ✅ | `snip edit`, `snip rm` (both broken with SQLite backend) |
|
|
27
|
+
| Gist push/pull | ✅ | `snip sync push <id>`, `snip sync pull <gistId>` (push/pull broken with SQLite) |
|
|
28
|
+
|
|
29
|
+
### Storage & infra
|
|
30
|
+
|
|
31
|
+
- **Dual storage:** JSON file DB + optional SQLite (better-sqlite3 or sql.js).
|
|
32
|
+
- **Config:** XDG-based (`~/.config/snip/config.json`, `~/.local/share/snip`).
|
|
33
|
+
- **Safety:** `lib/safety.js` blocks a set of dangerous patterns; run shows preview and respects `confirmRun`.
|
|
34
|
+
- **CI:** GitHub Actions matrix (native + sql.js), smoke test, publish workflow.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2. What’s Remaining (vs plan/mvp)
|
|
39
|
+
|
|
40
|
+
- **List:** MVP mentions `--sort`; not implemented (e.g. by date, name, usage).
|
|
41
|
+
- **Run:** Language-aware execution: everything is run as `snippet.sh` with `sh`; no `python`/`node` etc. by extension.
|
|
42
|
+
- **Roadmap:** TUI (`snip ui`), encrypted sync, team/marketplace (out of current scope).
|
|
43
|
+
- **Tests:** Test isolation is in place (temp XDG dirs); no dedicated tests for sync, config, or SQLite path; safety tests are minimal.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 3. Performance
|
|
48
|
+
|
|
49
|
+
- **Search:** `lib/search.js` builds a new Fuse index on every `search` call (`buildIndex()` → `listSnippets()` + `readSnippetContent()` for each). Fine for dozens of snippets; with hundreds, consider caching the index or invalidating on add/edit/rm.
|
|
50
|
+
- **List:** Loads all snippets each time; acceptable for local JSON/SQLite at typical scale.
|
|
51
|
+
- **SQLite sql.js:** Full DB is read and written to disk on each persist; large DBs could feel slow. better-sqlite3 is preferred when native deps are acceptable.
|
|
52
|
+
|
|
53
|
+
**Suggestions:** Cache Fuse index with file mtime or “dirty” flag; optional `--limit` on `snip list` and `snip search`.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 4. Security
|
|
58
|
+
|
|
59
|
+
- **Gist token:** **Implemented:** `SNIP_GIST_TOKEN` env var is supported and overrides config; README documents preferring the env var so the token need not be stored on disk. Config-file fallback remains for convenience.
|
|
60
|
+
- **Run safety:** Dangerous-pattern check and `confirmRun` are good. **Implemented:** `--confirm` is in the CLI so the override warning is valid.
|
|
61
|
+
- **Execution:** Snippets run in a temp dir as `snippet.sh` with user’s `SHELL`. No sandbox; user is responsible for content. Appropriate for a dev tool; optional: add “only run snippets you trust” to README.
|
|
62
|
+
- **Import:** No validation of imported JSON (e.g. path traversal in names, huge payloads). Low risk for local use; optional schema/size limits would harden it.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 5. UI & UX (CLI)
|
|
67
|
+
|
|
68
|
+
- **First run:** Helpful welcome and quick start when no DB exists. Note: first-run check uses `cfg.dbPath`; if SQLite is enabled and only `sqlitePath` is set, welcome might show even when SQLite DB exists (minor).
|
|
69
|
+
- **Consistency:** Some commands use `console.error` for errors, others may mix; standardizing on stderr for errors and exit codes improves scriptability.
|
|
70
|
+
- **Edit with SQLite:** **Fixed:** edit and show --edit use a temp file and `updateSnippetContent` when `s.path` is null.
|
|
71
|
+
- **Run flow:** Preview → confirm → run is clear. Danger warning is good; `--confirm` override is implemented.
|
|
72
|
+
- **Output:** No chalk/colors in the files inspected; README mentions “colorized by default” for list — if not implemented, either add or update README.
|
|
73
|
+
- **Help:** `--help` and onboarding text are clear; adding one-line examples per command would help.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 6. Critical Bugs (SQLite backend) — FIXED
|
|
78
|
+
|
|
79
|
+
When **SQLite is enabled**, the following were broken and have been fixed in this pass:
|
|
80
|
+
|
|
81
|
+
1. **Sync (gist.js):** Now uses `storage.setSnippetOrigin(id, origin)` so push/pull work with both JSON and SQLite.
|
|
82
|
+
2. **Edit (edit.js):** When `s.path` is null (SQLite), writes content to a temp file, opens editor, then calls `storage.updateSnippetContent(s.id, newContent)`.
|
|
83
|
+
3. **Rm (rm.js):** Now uses `storage.deleteSnippetById(s.id)` so removal works for both backends.
|
|
84
|
+
4. **Show --edit (show.js):** Same temp-file + `updateSnippetContent` flow when `s.path` is null; when path exists, calls `updateSnippetUpdatedAt(s.id)` after edit.
|
|
85
|
+
|
|
86
|
+
New storage helpers: `updateSnippetContent`, `updateSnippetUpdatedAt`, `deleteSnippetById`, `setSnippetOrigin`. sql.js path: `persist()` is called after inserts/updates so in-memory changes are written to disk.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 7. Other Issues
|
|
91
|
+
|
|
92
|
+
- **import.js:** Fixed: was `s.content || s.content || ''`, now `s.content || ''`.
|
|
93
|
+
- **package.json:** `"main": "lib/cli.js"`; entrypoint is `bin/snip` → `../lib/cli`. Fine for CLI; main is only for programmatic use if any.
|
|
94
|
+
- **exec.js:** Always writes `snippet.sh` and runs with `sh`; snippet `language` is ignored at run time.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 8. Summary
|
|
99
|
+
|
|
100
|
+
| Area | Verdict |
|
|
101
|
+
|------|--------|
|
|
102
|
+
| **Features** | MVP + post-MVP done; remaining: `--sort`, language-aware run. |
|
|
103
|
+
| **Performance** | OK for small/medium snippet sets; search re-indexes every time. Optional: cache index, `--limit`. |
|
|
104
|
+
| **Security** | `SNIP_GIST_TOKEN` and `--confirm` implemented; token storage documented in README. |
|
|
105
|
+
| **UI/UX** | Good first-run and run flow; SQLite edit/rm/show/sync fixed. Optional: first-run DB check, stderr/colors. |
|
|
106
|
+
| **Correctness** | SQLite path and import typo fixed; tests isolated via temp XDG dirs. |
|
|
107
|
+
|
|
108
|
+
**Recommended next steps (implementation status):**
|
|
109
|
+
1. ~~Expose `--confirm` on `snip run`.~~ **Done.**
|
|
110
|
+
2. ~~Fix SQLite compatibility for sync, edit, rm, show --edit.~~ **Done.**
|
|
111
|
+
3. ~~Support `SNIP_GIST_TOKEN` env var and document token storage.~~ **Done.**
|
|
112
|
+
4. ~~Add test isolation (temp config/DB dir).~~ **Done.** (Dedicated tests for sync and SQLite path not added yet.)
|
|
113
|
+
5. Optionally: cache search index; add `--sort` to list; add tests for sync and SQLite.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- **snip seed:** Clears all snippet data (local JSON DB and SQLite if present) and populates with 10 example snippets (git, docker, npm, http, util, demo). Use after install or to reset. Run `node scripts/seed-examples.js` or `snip seed`.
|
|
6
|
+
- **snip ui (TUI):** Interactive terminal UI with fuzzy search, list navigation (j/k or arrows), Enter to show snippet, r to run (preview + y/N confirm), t to toggle tag filter, / to search, q to quit. Requires a TTY. Uses same storage, run flow, and safety as the CLI. Documented in README.
|
|
7
|
+
- **snip ui polish:** Updated color hierarchy and spacing, added fast keyboard jumps (`Ctrl+d`/`Ctrl+u`), added `c` to copy selected snippet content, and added copy support directly inside the Enter-details modal (`c`/`y`).
|
|
8
|
+
- **TUI edge-case hardening:** Modal sizing now adapts to small terminals, run preview focus/scroll behavior was fixed, help overlay now closes on any key, and details view adds pager open (`p`) for native text selection/copy.
|
|
9
|
+
- **List sorting:** Added `snip list --sort <name|usage|recent>`.
|
|
10
|
+
- **Language-aware run:** Snippets now execute with interpreter selection by language (`js`, `ts`, `py`, `rb`, `php`, `pl`, `ps1` and shell languages), with clearer missing-interpreter errors.
|
|
11
|
+
- **Test isolation:** Jest setup now sets `XDG_CONFIG_HOME` and `XDG_DATA_HOME` to temp dirs per worker so tests no longer use your real config or snippet DB. Added `jest.setup.js` and `jest.config.js` (with `watchman: false` for environments where watchman is unavailable).
|
|
12
|
+
- **SNIP_GIST_TOKEN:** Gist token can be set via the `SNIP_GIST_TOKEN` environment variable; it overrides `gist_token` from config so the token need not be stored on disk. Documented in README; sync command error message updated to mention the env var.
|
|
13
|
+
- Added sql.js fallback for portable SQLite support (enables use without native builds)
|
|
14
|
+
- Added `.github/workflows/ci-matrix.yml` to validate native and sql.js paths across OS matrix
|
|
15
|
+
- Added `scripts/sqljs-smoke.js` and `npm run smoke-sqljs` for local smoke testing of sql.js persistence
|
|
16
|
+
- Added `.gitignore` and small packaging/publish guidance in README
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bharath
|
|
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.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# NPM Publication Guide for `snip-cli-manager`
|
|
2
|
+
|
|
3
|
+
This guide outlines the final steps to publish your CLI tool to the npm registry.
|
|
4
|
+
|
|
5
|
+
## 1. Final Package Check
|
|
6
|
+
|
|
7
|
+
I have already performed the following:
|
|
8
|
+
- [x] **Name Check**: Changed `package.json` name to `snip-cli-manager` (as `snip` and `snip-cli` are taken).
|
|
9
|
+
- [x] **License**: Added a standard MIT [LICENSE](./LICENSE) file.
|
|
10
|
+
- [x] **Shebang**: Verified `bin/snip` starts with `#!/usr/bin/env node`.
|
|
11
|
+
- [x] **Metadata**: Populated `keywords`, `repository`, `author`, and `description` in `package.json`.
|
|
12
|
+
- [x] **README**: Polished [README.md](./README.md) with clear installation and usage instructions.
|
|
13
|
+
- [x] **Ignore List**: Verified `.npmignore` excludes tests and development config.
|
|
14
|
+
|
|
15
|
+
## 2. Manual Verification (Dry Run)
|
|
16
|
+
|
|
17
|
+
Before publishing for real, verify what files will be included:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm publish --dry-run
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Check the output to ensure `lib/`, `bin/`, `package.json`, `README.md`, and `LICENSE` are included, while `__tests__/` and `.github/` are ignored.
|
|
24
|
+
|
|
25
|
+
## 3. Account Setup
|
|
26
|
+
|
|
27
|
+
If you haven't already:
|
|
28
|
+
1. Create an account on [npmjs.com](https://www.npmjs.com/).
|
|
29
|
+
2. Log in from your terminal:
|
|
30
|
+
```bash
|
|
31
|
+
npm login
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 4. Method A: Manual Publication (Simple)
|
|
35
|
+
|
|
36
|
+
Run these commands from the root directory:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 1. Bump version and create a git tag (e.g., v0.1.0)
|
|
40
|
+
npm version patch -m "Release v%s"
|
|
41
|
+
|
|
42
|
+
# 2. Push to GitHub (including tags)
|
|
43
|
+
git push && git push --tags
|
|
44
|
+
|
|
45
|
+
# 3. Publish to npm
|
|
46
|
+
npm publish --access public
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 5. Method B: GitHub Actions (Recommended)
|
|
50
|
+
|
|
51
|
+
I have already configured a GitHub Action at [.github/workflows/publish.yml](.github/workflows/publish.yml). To use it:
|
|
52
|
+
|
|
53
|
+
1. **Get an NPM Token**:
|
|
54
|
+
- Go to [npmjs.com/settings/tokens](https://www.npmjs.com/settings/tokens).
|
|
55
|
+
- Generate a new "Classic Token" with **Automation** access.
|
|
56
|
+
2. **Add to GitHub Secrets**:
|
|
57
|
+
- Go to your GitHub repository settings.
|
|
58
|
+
- Navigate to **Secrets and variables > Actions**.
|
|
59
|
+
- Add a new secret named `NPM_TOKEN` with your token as the value.
|
|
60
|
+
3. **Trigger the Release**:
|
|
61
|
+
- Simply push a new tag starting with `v` (e.g., `git tag v0.1.0 && git push --tags`).
|
|
62
|
+
- GitHub Actions will automatically run tests and publish if they pass.
|
|
63
|
+
|
|
64
|
+
## 6. Testing the Published Package
|
|
65
|
+
|
|
66
|
+
Once published, you can test it by installing it globally:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm install -g snip-cli-manager
|
|
70
|
+
snip --version
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
**Pro Tip**: If you decide to change the name again, remember to update both `package.json` and `README.md` before publishing!
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# snip — CLI Snippet Manager
|
|
2
|
+
|
|
3
|
+
A lightweight, cross-platform CLI for saving, searching, sharing, and running reusable code and shell snippets.
|
|
4
|
+
|
|
5
|
+
Built as an opinionated MVP with a TUI for efficient snippet management, optional SQLite persistence, and GitHub Gist sync.
|
|
6
|
+
|
|
7
|
+
Highlights
|
|
8
|
+
- **Fast Workflow**: add/list/search/run directly from your shell
|
|
9
|
+
- **Interactive TUI**: Fuzzy search and keyboard-first navigation (`snip ui`)
|
|
10
|
+
- **Persistence Options**: Choose between JSON or SQLite (with WASM fallback)
|
|
11
|
+
- **Gist Sync**: Share and backup your snippets via GitHub Gists
|
|
12
|
+
- **Safety**: Automated detection of dangerous commands (e.g., `rm -rf`)
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
Install globally via npm:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g snip-cli-manager
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
*Note: The package is currently named `snip-cli-manager` on npm.*
|
|
23
|
+
|
|
24
|
+
## Quick start
|
|
25
|
+
|
|
26
|
+
1. **Configure your editor** (optional, defaults to `$EDITOR` or `vi`):
|
|
27
|
+
```bash
|
|
28
|
+
snip config set editor "vim"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
2. **Add a snippet** from stdin:
|
|
32
|
+
```bash
|
|
33
|
+
echo 'docker run --rm -it -v "$PWD":/work -w /work ubuntu:24.04 bash' | snip add docker-run --lang sh --tags docker,run
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. **List snippets**:
|
|
37
|
+
```bash
|
|
38
|
+
snip list
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
4. **Interactive TUI**:
|
|
42
|
+
```bash
|
|
43
|
+
snip ui
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Commands
|
|
47
|
+
| Command | Description |
|
|
48
|
+
|---------|-------------|
|
|
49
|
+
| `snip add <name>` | Save a new snippet |
|
|
50
|
+
| `snip ui` | Enter the interactive TUI |
|
|
51
|
+
| `snip list` | List all saved snippets |
|
|
52
|
+
| `snip search <q>` | Fuzzy search snippets |
|
|
53
|
+
| `snip run <id\|name>` | Execute a snippet |
|
|
54
|
+
| `snip edit <id\|name>` | Edit snippet content inline |
|
|
55
|
+
| `snip sync push <q>` | Upload to GitHub Gist |
|
|
56
|
+
| `snip sync pull <id>` | Download from GitHub Gist |
|
|
57
|
+
| `snip config` | View or change configuration |
|
|
58
|
+
|
|
59
|
+
## Features
|
|
60
|
+
|
|
61
|
+
### TUI Experience
|
|
62
|
+
The `snip ui` command provides a rich, split-pane interface inspired by modern terminal aesthetics. Use `j`/`k` to navigate, `e` to edit content, `a` to add new snippets, and `r` to run.
|
|
63
|
+
|
|
64
|
+
### SQLite Backend
|
|
65
|
+
For larger snippet libraries, enable SQLite:
|
|
66
|
+
```bash
|
|
67
|
+
snip config set useSqlite true
|
|
68
|
+
```
|
|
69
|
+
Requires `better-sqlite3` for native performance, or falls back to `sql.js` (WebAssembly).
|
|
70
|
+
|
|
71
|
+
## Contributing
|
|
72
|
+
Contributions are welcome! Please open an issue or submit a pull request.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
MIT © 2026 Bharath. See the [LICENSE](./LICENSE) file for details.
|
|
76
|
+
|
package/STRATEGY.md
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
# snip — Business Strategy & Go-to-Market
|
|
2
|
+
|
|
3
|
+
## 1. The Honest Assessment: Why Does This Exist in 2026?
|
|
4
|
+
|
|
5
|
+
### The AI Elephant in the Room
|
|
6
|
+
|
|
7
|
+
Yes, developers can ask ChatGPT "how do I grep recursively" and get an answer in 2 seconds. Let's not pretend that isn't true. But here's what AI **cannot** do:
|
|
8
|
+
|
|
9
|
+
| AI Can | AI Cannot |
|
|
10
|
+
|--------|-----------|
|
|
11
|
+
| Generate a generic command | Remember YOUR specific deployment script for YOUR infra |
|
|
12
|
+
| Suggest `docker run` flags | Know that your team's Postgres container needs `--shm-size=1g` because of that one bug last March |
|
|
13
|
+
| Write a one-liner | Store the battle-tested, production-safe version you've refined over 6 months |
|
|
14
|
+
| Answer "how to" | Answer "what was that exact command I used last Thursday" |
|
|
15
|
+
|
|
16
|
+
**The insight:** AI is a search engine for *generic* knowledge. snip is a **personal command vault** for *tribal* knowledge — the exact, tested, environment-specific commands that keep a developer's (or team's) workflow running.
|
|
17
|
+
|
|
18
|
+
### Market Potential
|
|
19
|
+
|
|
20
|
+
- **33M+ developers worldwide** (GitHub, 2025)
|
|
21
|
+
- **Avg. developer runs 50-100 terminal commands/day** — many are repeated
|
|
22
|
+
- **Developer tools market: $25B+** and growing 15% YoY
|
|
23
|
+
- **CLI tools renaissance** — terminal-first workflows are surging (Warp, Fig, Zellij, all raised $50M+)
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. Competitive Landscape
|
|
28
|
+
|
|
29
|
+
### Direct Competitors
|
|
30
|
+
|
|
31
|
+
| Tool | Model | Strength | Weakness |
|
|
32
|
+
|------|-------|----------|----------|
|
|
33
|
+
| **Navi** | Free/OSS | Community cheatsheets | No personal snippets, no TUI, no team sync |
|
|
34
|
+
| **pet** | Free/OSS | Gist sync, simple | No tags, no TUI, dead project (last commit 2022) |
|
|
35
|
+
| **tldr** | Free/OSS | Beautiful community pages | Read-only, no personal commands |
|
|
36
|
+
| **cmdstash** | Free/OSS | Parameter templates | No search, no TUI |
|
|
37
|
+
| **Raycast snippets** | Freemium | Beautiful GUI | macOS only, not terminal-native, $8/mo |
|
|
38
|
+
| **Fig (now AWS)** | Acquired | Autocomplete | Acquired by Amazon, pivoted away from snippets |
|
|
39
|
+
| **Shell history** (Ctrl+R) | Built-in | Zero setup | No organization, no tags, no sharing, decays |
|
|
40
|
+
| **Notion/Obsidian** | Freemium | Rich editing | Context-switch tax, not terminal-native |
|
|
41
|
+
|
|
42
|
+
### Indirect Competitors (AI-powered)
|
|
43
|
+
|
|
44
|
+
| Tool | Why It's Different |
|
|
45
|
+
|------|-------------------|
|
|
46
|
+
| **GitHub Copilot CLI** | Generates commands, doesn't store your proven ones |
|
|
47
|
+
| **Warp AI** | Terminal-integrated AI, but locked to Warp terminal |
|
|
48
|
+
| **aichat / llm CLI** | Generic AI access, not snippet management |
|
|
49
|
+
|
|
50
|
+
### Where snip Wins
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Ctrl+R (shell history)
|
|
54
|
+
→ Unorganized, no tags, no cross-machine, decays over time
|
|
55
|
+
|
|
56
|
+
AI assistant
|
|
57
|
+
→ Generic answers, hallucination risk for complex flags, no memory
|
|
58
|
+
|
|
59
|
+
Notion/docs
|
|
60
|
+
→ Context-switch tax: leave terminal → open browser → search → copy → return
|
|
61
|
+
|
|
62
|
+
snip
|
|
63
|
+
→ Instant recall, tagged, searchable, terminal-native, YOUR commands
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 3. Differentiation — Why a Developer Picks snip
|
|
69
|
+
|
|
70
|
+
### The "10x" Value Props
|
|
71
|
+
|
|
72
|
+
1. **Terminal-native** — Never leave the terminal. Zero context-switch.
|
|
73
|
+
2. **Yours, not generic** — YOUR battle-tested commands, not a hallucinated suggestion.
|
|
74
|
+
3. **Organization that scales** — Tags, search, language detection. Not a flat history file.
|
|
75
|
+
4. **Instant TUI** — Visual browsing with preview. Not memorizing snippet names.
|
|
76
|
+
5. **Safe execution** — Dangerous command detection (`rm -rf`). AI doesn't warn you.
|
|
77
|
+
6. **Offline-first** — Works on airplanes, in data centers, behind firewalls. No API key needed.
|
|
78
|
+
7. **Portable** — JSON or SQLite backend. Export/import. Works everywhere Node runs.
|
|
79
|
+
|
|
80
|
+
### The Positioning Statement
|
|
81
|
+
|
|
82
|
+
> **snip** is the terminal-native command vault for developers who are tired of re-Googling the same commands. Unlike AI assistants that generate generic suggestions, snip stores YOUR proven, production-tested commands — organized, searchable, and one keystroke away.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 4. User Personas & ICP
|
|
87
|
+
|
|
88
|
+
### Primary Persona: "The DevOps Practitioner"
|
|
89
|
+
|
|
90
|
+
| Attribute | Detail |
|
|
91
|
+
|-----------|--------|
|
|
92
|
+
| **Role** | DevOps Engineer, SRE, Platform Engineer |
|
|
93
|
+
| **Experience** | 3-10 years |
|
|
94
|
+
| **Daily life** | Lives in terminal. Manages infra across multiple environments. |
|
|
95
|
+
| **Pain** | Maintains 50+ complex commands (kubectl, terraform, docker) with environment-specific flags. Constantly re-searching the same long commands. |
|
|
96
|
+
| **Current solution** | Mix of shell aliases, Notion docs, and `Ctrl+R` |
|
|
97
|
+
| **Why snip** | Organized command vault, tagged by project/env, instant recall |
|
|
98
|
+
| **Willingness to pay** | Medium for personal, high for team features |
|
|
99
|
+
|
|
100
|
+
### Secondary Persona: "The Polyglot Backend Dev"
|
|
101
|
+
|
|
102
|
+
| Attribute | Detail |
|
|
103
|
+
|-----------|--------|
|
|
104
|
+
| **Role** | Backend/Full-stack Developer |
|
|
105
|
+
| **Experience** | 2-7 years |
|
|
106
|
+
| **Daily life** | Switches between Python, Node, Go, Docker. Multiple projects. |
|
|
107
|
+
| **Pain** | "How did I set up that virtualenv again?" — repeats setup commands across projects. |
|
|
108
|
+
| **Current solution** | README files, browser bookmarks, asking Copilot |
|
|
109
|
+
| **Why snip** | Language-tagged snippets, project-specific commands, fast fuzzy search |
|
|
110
|
+
| **Willingness to pay** | Low for personal, medium for team |
|
|
111
|
+
|
|
112
|
+
### Tertiary Persona: "The Team Lead / Staff Engineer"
|
|
113
|
+
|
|
114
|
+
| Attribute | Detail |
|
|
115
|
+
|-----------|--------|
|
|
116
|
+
| **Role** | Tech Lead, Staff Engineer, Engineering Manager |
|
|
117
|
+
| **Experience** | 8+ years |
|
|
118
|
+
| **Daily life** | Onboards new devs, standardizes team workflows, maintains runbooks |
|
|
119
|
+
| **Pain** | Tribal knowledge is scattered. New hires spend weeks learning "how we do things here." |
|
|
120
|
+
| **Current solution** | Confluence, internal wikis (nobody reads them) |
|
|
121
|
+
| **Why snip** | Shared team snippet libraries, standardized commands, self-documenting |
|
|
122
|
+
| **Willingness to pay** | High — this is an onboarding/velocity problem with dollar value |
|
|
123
|
+
|
|
124
|
+
### Ideal Customer Profile (ICP) — Enterprise
|
|
125
|
+
|
|
126
|
+
| Attribute | Detail |
|
|
127
|
+
|-----------|--------|
|
|
128
|
+
| **Company size** | 50-500 engineers |
|
|
129
|
+
| **Industry** | SaaS, Fintech, Cloud Infrastructure |
|
|
130
|
+
| **Tech stack** | Cloud-native, Kubernetes/Docker-heavy, multiple environments |
|
|
131
|
+
| **Signal** | Large Confluence/Notion with "useful commands" pages that nobody maintains |
|
|
132
|
+
| **Budget holder** | VP Engineering, Director of Platform Engineering |
|
|
133
|
+
| **Value metric** | Developer velocity, onboarding time, incident response speed |
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 5. Business Model
|
|
138
|
+
|
|
139
|
+
### The Wrong Approach
|
|
140
|
+
Charging individual developers $5/month for a CLI snippet manager. They won't pay. The OSS alternatives are "good enough" for personal use, and developers are allergic to subscriptions for dev tools.
|
|
141
|
+
|
|
142
|
+
### The Right Approach: Open Core
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
┌─────────────────────────────────────────────────┐
|
|
146
|
+
│ FREE (OSS) │ PRO (Paid) │
|
|
147
|
+
│─────────────────────────-│──────────────────────- │
|
|
148
|
+
│ ✓ Unlimited snippets │ ⬆ Team libraries │
|
|
149
|
+
│ ✓ Tags, search, TUI │ ⬆ Shared collections │
|
|
150
|
+
│ ✓ Export/Import │ ⬆ Git sync (private) │
|
|
151
|
+
│ ✓ Local storage │ ⬆ Encrypted cloud │
|
|
152
|
+
│ ✓ Language detection │ backup/sync │
|
|
153
|
+
│ ✓ Safe-run detection │ ⬆ AI: natural lang │
|
|
154
|
+
│ ✓ Clipboard copy │ → command search │
|
|
155
|
+
│ ✓ Basic Gist sync │ ⬆ CLI analytics │
|
|
156
|
+
│ │ (usage tracking) │
|
|
157
|
+
│ │ ⬆ Private Gist sync │
|
|
158
|
+
│ │ ⬆ Priority support │
|
|
159
|
+
└─────────────────────────────────────────────────┘
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Pricing Tiers
|
|
163
|
+
|
|
164
|
+
| Tier | Price | Target | Key Features |
|
|
165
|
+
|------|-------|--------|-------------|
|
|
166
|
+
| **Free** | $0 | Individual devs | Full local functionality, public Gist sync |
|
|
167
|
+
| **Pro** | $5/mo or $48/yr | Power users | AI search, encrypted cloud sync, private Gist, analytics |
|
|
168
|
+
| **Team** | $12/user/mo | Engineering teams (5-50) | Shared libraries, RBAC, audit log, SSO, onboarding snippets |
|
|
169
|
+
| **Enterprise** | Custom ($20-30/user/mo) | Orgs (50-500+) | Self-hosted, SAML SSO, compliance, SLA, custom integrations |
|
|
170
|
+
|
|
171
|
+
### Revenue Math
|
|
172
|
+
|
|
173
|
+
| Scenario | Users | Paid % | ARPU | MRR | ARR |
|
|
174
|
+
|----------|-------|--------|------|-----|-----|
|
|
175
|
+
| Year 1 | 5,000 | 2% Pro | $5 | $500 | $6K |
|
|
176
|
+
| Year 2 | 25,000 | 3% Pro + 2 Teams (20 seats) | $5-12 | $3,855 | $46K |
|
|
177
|
+
| Year 3 | 100,000 | 4% Pro + 10 Teams (avg 15 seats) | $5-12 | $38K | $456K |
|
|
178
|
+
| Year 3+ Enterprise | +3 enterprise deals | — | — | +$15K | +$180K |
|
|
179
|
+
|
|
180
|
+
### Where the Real Money Is
|
|
181
|
+
|
|
182
|
+
**Enterprise.** Not individual developers. Here's why:
|
|
183
|
+
|
|
184
|
+
1. **Individual devs have $0 budget** — They'll use the free tier forever.
|
|
185
|
+
2. **Teams have a pain that costs money** — Onboarding a new dev takes 2-4 weeks. If snip cuts that by 3 days, that's ~$3,000 in saved salary. A $12/user/mo tool pays for itself instantly.
|
|
186
|
+
3. **Enterprise has compliance needs** — They MUST know what commands are being run. They NEED audit logs. They'll pay for governance.
|
|
187
|
+
|
|
188
|
+
**Go where the money is: teams and enterprise. Let free users be your distribution channel.**
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 6. The AI Play — Turning the Threat into a Feature
|
|
193
|
+
|
|
194
|
+
Instead of competing with AI, **integrate it**:
|
|
195
|
+
|
|
196
|
+
### "AI-Assisted Recall" (Pro feature)
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
$ snip ai "that docker command for our staging database"
|
|
200
|
+
# → Found: docker exec -it staging-pg psql -U admin -d myapp_staging
|
|
201
|
+
|
|
202
|
+
$ snip ai "how to restart the payment service"
|
|
203
|
+
# → Found: kubectl rollout restart deployment/payments -n production
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
This is fundamentally different from asking ChatGPT because:
|
|
207
|
+
- It searches **YOUR** snippets, not the entire internet
|
|
208
|
+
- It returns the **exact** command you've saved, not a hallucinated guess
|
|
209
|
+
- It respects your tags, language, and usage patterns
|
|
210
|
+
- It works **offline** with a local embedding model
|
|
211
|
+
|
|
212
|
+
### "AI Suggest" (Team feature)
|
|
213
|
+
|
|
214
|
+
When a developer types a command they haven't saved, snip suggests:
|
|
215
|
+
```
|
|
216
|
+
💡 This command isn't in your vault. Save it? [y/n/tags]
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
For teams, it can suggest relevant snippets from the team library:
|
|
220
|
+
```
|
|
221
|
+
💡 Your team has a similar command: "staging-db-connect" — use that instead? [y/n]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 7. Go-to-Market Strategy
|
|
227
|
+
|
|
228
|
+
### Phase 1: Developer Credibility (Month 1-3)
|
|
229
|
+
|
|
230
|
+
**Goal:** 1,000 GitHub stars, 500 active users
|
|
231
|
+
|
|
232
|
+
| Channel | Action | Metric |
|
|
233
|
+
|---------|--------|--------|
|
|
234
|
+
| **GitHub** | Polish README, add GIF demos, "awesome-cli" lists | Stars, forks |
|
|
235
|
+
| **Hacker News** | "Show HN: I built a terminal-native snippet manager" | Upvotes, traffic |
|
|
236
|
+
| **r/commandline** | Post workflow demos, respond to "how do you organize commands" threads | Installs |
|
|
237
|
+
| **Dev.to / Hashnode** | "Why I stopped Googling the same commands" article | Reads, shares |
|
|
238
|
+
| **Twitter/X** | Daily CLI tips using snip, terminal screencasts | Followers, engagement |
|
|
239
|
+
| **YouTube** | 2-min demo video: "Never Google the same command twice" | Views |
|
|
240
|
+
|
|
241
|
+
**Content pillars:**
|
|
242
|
+
1. "Terminal productivity" tips (snip is the vehicle, not the subject)
|
|
243
|
+
2. "I saved X hours this week" workflow stories
|
|
244
|
+
3. Comparison posts: "snip vs Ctrl+R vs Notion vs AI" (honest, not salesy)
|
|
245
|
+
|
|
246
|
+
### Phase 2: Community & Plugin Ecosystem (Month 3-6)
|
|
247
|
+
|
|
248
|
+
**Goal:** 5,000 stars, 2,000 active users, first paying users
|
|
249
|
+
|
|
250
|
+
| Action | Detail |
|
|
251
|
+
|--------|--------|
|
|
252
|
+
| **Public snippet libraries** | Curated collections: "Docker essentials", "kubectl cheatsheet", "git-advanced" |
|
|
253
|
+
| **Shell integrations** | zsh/bash/fish plugins for auto-suggest from vault |
|
|
254
|
+
| **Editor plugins** | VS Code extension: browse/insert snippets from editor |
|
|
255
|
+
| **Community collections** | Let users publish and share curated snippet sets |
|
|
256
|
+
| **Launch Pro tier** | AI search, cloud sync — target power users |
|
|
257
|
+
|
|
258
|
+
### Phase 3: Team & Enterprise (Month 6-12)
|
|
259
|
+
|
|
260
|
+
**Goal:** 10 paying teams, first enterprise pilot
|
|
261
|
+
|
|
262
|
+
| Action | Detail |
|
|
263
|
+
|--------|--------|
|
|
264
|
+
| **Team features** | Shared libraries, RBAC, audit log |
|
|
265
|
+
| **Content: "Onboarding"** | "How we cut onboarding time by 40% with shared command libraries" |
|
|
266
|
+
| **Outbound** | Reach out to DevOps teams at mid-size SaaS companies |
|
|
267
|
+
| **Partnerships** | Integrate with internal dev platforms (Backstage, Port, etc.) |
|
|
268
|
+
| **Case studies** | Document 2-3 team success stories |
|
|
269
|
+
| **Enterprise pilot** | Free 3-month pilot for 1-2 companies (50+ devs) |
|
|
270
|
+
|
|
271
|
+
### Phase 4: Scale (Month 12+)
|
|
272
|
+
|
|
273
|
+
- Self-serve Team sign-up
|
|
274
|
+
- Enterprise sales motion
|
|
275
|
+
- Marketplace for snippet collections
|
|
276
|
+
- Integration partner ecosystem
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 8. Distribution Channels (Ranked by ROI)
|
|
281
|
+
|
|
282
|
+
| # | Channel | Cost | Expected Impact | Timeline |
|
|
283
|
+
|---|---------|------|-----------------|----------|
|
|
284
|
+
| 1 | **GitHub + HN + Reddit** | Free | High — first 1K users | Week 1-4 |
|
|
285
|
+
| 2 | **Dev blog/Twitter content** | Free | Medium — sustained growth | Ongoing |
|
|
286
|
+
| 3 | **Package managers** (npm, brew) | Free | Medium — discoverability | Week 1 |
|
|
287
|
+
| 4 | **Shell plugin registries** (oh-my-zsh, fisher) | Free | Medium — installs | Month 2 |
|
|
288
|
+
| 5 | **YouTube demos** | Low ($0-200) | Medium — visual proof | Month 1-2 |
|
|
289
|
+
| 6 | **Dev newsletter sponsorships** (TLDR, Bytes, Console) | $500-2K | Medium-High | Month 3+ |
|
|
290
|
+
| 7 | **Conference talks** | Low-Medium | High for enterprise | Month 6+ |
|
|
291
|
+
| 8 | **Product Hunt launch** | Free | Spike — 1-day traffic | Month 3 |
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 9. Metrics That Matter
|
|
296
|
+
|
|
297
|
+
### North Star Metric
|
|
298
|
+
**Weekly Active Snippet Executions** — not installs, not stars. How many commands are developers running through snip each week? This measures real utility.
|
|
299
|
+
|
|
300
|
+
### Supporting Metrics
|
|
301
|
+
|
|
302
|
+
| Metric | Target (Year 1) | Why It Matters |
|
|
303
|
+
|--------|-----------------|----------------|
|
|
304
|
+
| GitHub stars | 5,000 | Social proof, discoverability |
|
|
305
|
+
| npm weekly installs | 2,000 | Adoption velocity |
|
|
306
|
+
| WAU (weekly active users) | 500 | Retention signal |
|
|
307
|
+
| Snippets/user | 15+ | Depth of engagement |
|
|
308
|
+
| D7 retention | 40%+ | Product-market fit signal |
|
|
309
|
+
| D30 retention | 25%+ | Habit formation |
|
|
310
|
+
| Pro conversion | 2-3% | Revenue viability |
|
|
311
|
+
| NPS | 50+ | Word-of-mouth potential |
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 10. Risks & Mitigations
|
|
316
|
+
|
|
317
|
+
| Risk | Probability | Impact | Mitigation |
|
|
318
|
+
|------|-------------|--------|------------|
|
|
319
|
+
| AI makes snippet tools obsolete | Medium | High | Integrate AI as a feature, not compete with it. Position as "your commands" vs "generic commands" |
|
|
320
|
+
| Low willingness to pay | High | Medium | Free tier is genuinely useful. Revenue comes from teams, not individuals |
|
|
321
|
+
| GitHub Copilot adds snippet management | Medium | High | Be cross-platform, editor-agnostic, terminal-native. Copilot is VS Code-locked |
|
|
322
|
+
| OSS competitor emerges | Medium | Low | First-mover in TUI + team features. Community moat |
|
|
323
|
+
| Terminal tools are niche | Low | Medium | Growing market. Warp, Fig, Zellij prove terminal tools can raise venture money |
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## 11. The 90-Day Sprint
|
|
328
|
+
|
|
329
|
+
### Week 1-2: Foundation
|
|
330
|
+
- [ ] Polish README with GIF demos and clear value prop
|
|
331
|
+
- [ ] Publish to npm, Homebrew
|
|
332
|
+
- [ ] Set up website/landing page (one-pager)
|
|
333
|
+
- [ ] Write "Show HN" post
|
|
334
|
+
|
|
335
|
+
### Week 3-4: Content Blitz
|
|
336
|
+
- [ ] 3 blog posts (Dev.to, Hashnode, personal)
|
|
337
|
+
- [ ] 5 Twitter/X threads with terminal screencasts
|
|
338
|
+
- [ ] r/commandline, r/devops, r/sysadmin posts
|
|
339
|
+
- [ ] YouTube demo (2 min)
|
|
340
|
+
|
|
341
|
+
### Week 5-8: Community
|
|
342
|
+
- [ ] Curated snippet collections (Docker, k8s, git, npm)
|
|
343
|
+
- [ ] oh-my-zsh / fisher plugin
|
|
344
|
+
- [ ] Respond to every GitHub issue within 24h
|
|
345
|
+
- [ ] Product Hunt launch
|
|
346
|
+
|
|
347
|
+
### Week 9-12: Monetization
|
|
348
|
+
- [ ] Ship Pro tier (AI search, cloud sync)
|
|
349
|
+
- [ ] Stripe integration
|
|
350
|
+
- [ ] First 10 Pro subscribers
|
|
351
|
+
- [ ] Start enterprise outreach (3 pilots)
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## 12. The Bottom Line
|
|
356
|
+
|
|
357
|
+
**snip won't replace AI.** It doesn't need to. The developer's workflow is:
|
|
358
|
+
|
|
359
|
+
1. **Discover** a useful command (Google, AI, colleague) → *This is what AI does well*
|
|
360
|
+
2. **Save** the proven version for reuse → *This is what snip does*
|
|
361
|
+
3. **Recall** it instantly next time → *This is where snip is 10x faster than AI*
|
|
362
|
+
4. **Share** it with the team → *This is where you charge money*
|
|
363
|
+
|
|
364
|
+
**AI is the top of the funnel. snip is the vault at the bottom.**
|
|
365
|
+
|
|
366
|
+
The money is in teams and enterprise — where tribal knowledge has a measurable cost. Individual developers are the distribution channel. Let them use it free, love it, and then say "we should use this on my team."
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
*Last updated: February 14, 2026*
|
package/bin/snip
ADDED