@nightowne/tas-cli 2.1.0 β†’ 2.3.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/README.md CHANGED
@@ -1,162 +1,377 @@
1
1
  <p align="center">
2
- <img src="assets/demo.gif" alt="TAS Demo" width="600">
2
+ <img src="assets/demo.gif" alt="TAS β€” Telegram as Storage" width="640">
3
3
  </p>
4
4
 
5
- <h1 align="center">Telegram as Storage</h1>
5
+ <h1 align="center">
6
+ πŸ“¦ TAS β€” Telegram as Storage
7
+ </h1>
8
+
9
+ <h3 align="center">
10
+ Turn Telegram into your personal encrypted cloud drive.<br>
11
+ Free forever. Zero-knowledge. No credit card. No limits.
12
+ </h3>
6
13
 
7
14
  <p align="center">
8
- <strong>Free, encrypted, unlimited cloud storage β€” inside Telegram.</strong>
15
+ <a href="https://github.com/ixchio/tas/actions/workflows/ci.yml"><img src="https://github.com/ixchio/tas/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
16
+ <a href="https://www.npmjs.com/package/@nightowne/tas-cli"><img src="https://img.shields.io/npm/v/@nightowne/tas-cli?color=cb3837&label=npm" alt="npm version"></a>
17
+ <a href="https://www.npmjs.com/package/@nightowne/tas-cli"><img src="https://img.shields.io/npm/dm/@nightowne/tas-cli?color=blue" alt="Downloads"></a>
18
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License: MIT"></a>
19
+ <a href="https://github.com/ixchio/tas/stargazers"><img src="https://img.shields.io/github/stars/ixchio/tas?style=social" alt="GitHub Stars"></a>
9
20
  </p>
10
21
 
11
22
  <p align="center">
12
- <a href="https://github.com/ixchio/tas/actions/workflows/ci.yml"><img src="https://github.com/ixchio/tas/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
13
- <a href="https://www.npmjs.com/package/@nightowne/tas-cli"><img src="https://img.shields.io/npm/v/@nightowne/tas-cli" alt="npm"></a>
14
- <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
15
- <a href="https://www.npmjs.com/package/@nightowne/tas-cli"><img src="https://img.shields.io/npm/dm/@nightowne/tas-cli" alt="Downloads"></a>
23
+ <a href="#-quick-start">Quick Start</a> β€’
24
+ <a href="#-why-tas">Why TAS</a> β€’
25
+ <a href="#-features">Features</a> β€’
26
+ <a href="#%EF%B8%8F-security">Security</a> β€’
27
+ <a href="#-cli-reference">Docs</a> β€’
28
+ <a href="#-contributing">Contributing</a>
16
29
  </p>
17
30
 
18
31
  ---
19
32
 
20
- I built this because I wanted encrypted cloud storage that's actually free. Google Drive reads your files. Dropbox costs money. Telegram gives you unlimited storage with a bot API β€” so I wrote a CLI that turns it into a proper encrypted drive.
33
+ <br>
34
+
35
+ ## The Problem
36
+
37
+ Google Drive scans your files. Dropbox costs $12/mo. iCloud locks you into Apple. Every "free" cloud storage either **reads your data**, **charges you money**, or **caps your storage**.
38
+
39
+ Meanwhile, Telegram gives every user **unlimited storage** with a bot API β€” and nobody's using it.
21
40
 
22
- **What this does:** Compresses, encrypts (AES-256-GCM), and uploads your files to your own private Telegram bot chat. Mount it as a folder, sync directories, or share files with expiring links.
41
+ ## The Solution
42
+
43
+ **TAS** compresses, encrypts, and uploads your files to your own private Telegram bot chat. Your password never leaves your machine. Telegram only sees encrypted noise. You get a real CLI-powered cloud drive β€” with mount, sync, share, and search β€” for **$0/month, forever.**
23
44
 
24
45
  ```
25
- β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
26
- β”‚ CLI │────▢│ Compress & │────▢│ Telegram β”‚
27
- β”‚ FUSE β”‚ β”‚ Encrypt β”‚ β”‚ Bot API β”‚
28
- β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
29
- β”‚ β”‚ β”‚
30
- β–Ό β–Ό β–Ό
31
- β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
32
- β”‚ SQLite Indexβ”‚ β”‚ 49MB Chunks β”‚ β”‚ Private Chat β”‚
33
- β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
46
+ Your Machine Telegram Cloud
47
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
48
+ β”‚ β”‚ Compress β”‚ β”‚
49
+ β”‚ tas push │──→ Encrypt ──→│ πŸ”’ Encrypted Blobs β”‚
50
+ β”‚ tas mount │──→ Chunk ──→│ πŸ”’ Private Bot Chat β”‚
51
+ β”‚ tas sync β”‚ β”‚ πŸ”’ Your Data, Safe β”‚
52
+ β”‚ β”‚ Decrypt β”‚ β”‚
53
+ β”‚ tas pull │←── Decomp ←──│ ← Download on demandβ”‚
54
+ β”‚ β”‚ β”‚ β”‚
55
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
56
+ SQLite Index Unlimited & Free
34
57
  ```
35
58
 
59
+ <br>
60
+
36
61
  ## ⚑ Quick Start
37
62
 
63
+ Three commands. Two minutes. Zero cost.
64
+
38
65
  ```bash
39
66
  npm install -g @nightowne/tas-cli
40
- tas init # 2-minute setup wizard
41
- tas push secret.pdf
42
- tas pull secret.pdf
67
+
68
+ tas init # Connect your Telegram bot (guided wizard)
69
+ tas push secret.pdf # Upload β€” encrypted, compressed, done
70
+ tas pull secret.pdf # Download β€” decrypted, verified, instant
43
71
  ```
44
72
 
73
+ That's it. You now have encrypted cloud storage.
74
+
75
+ <br>
76
+
77
+ ## πŸ’‘ Why TAS
78
+
79
+ <table>
80
+ <tr>
81
+ <td width="50%">
82
+
83
+ ### vs. Google Drive
84
+ - ❌ Google scans & indexes your files
85
+ - ❌ 15 GB free tier
86
+ - ❌ No encryption at rest (by you)
87
+
88
+ ### vs. Dropbox
89
+ - ❌ $12/mo for 2 TB
90
+ - ❌ Can access your data
91
+ - ❌ No CLI-first experience
92
+
93
+ ### vs. Mega / pCloud
94
+ - ❌ Freemium with tight caps
95
+ - ❌ Closed source encryption
96
+ - ❌ Can't self-host or script
97
+
98
+ </td>
99
+ <td width="50%">
100
+
101
+ ### TAS gives you
102
+ - βœ… **$0/month** β€” forever, no caps
103
+ - βœ… **Zero-knowledge** β€” only you can decrypt
104
+ - βœ… **AES-256-GCM** β€” military-grade encryption
105
+ - βœ… **Mount as folder** β€” FUSE filesystem
106
+ - βœ… **Auto-sync** β€” Dropbox-style folder sync
107
+ - βœ… **Share links** β€” expiring, download-limited
108
+ - βœ… **CLI-first** β€” cron, Docker, CI/CD ready
109
+ - βœ… **Open source** β€” audit every line
110
+
111
+ </td>
112
+ </tr>
113
+ </table>
114
+
115
+ <br>
116
+
45
117
  ## πŸ”₯ Features
46
118
 
47
- ### Mount as a folder
119
+ ### πŸ—‚οΈ Mount as a Local Folder
120
+ Drag and drop files into Telegram storage like it's a regular drive.
121
+
48
122
  ```bash
49
- tas mount ~/cloud # FUSE mount β€” drag & drop files
123
+ tas mount ~/cloud # Mount your Telegram storage
124
+ # Now use Finder, Explorer, or any app β€” files sync to Telegram
50
125
  tas unmount ~/cloud
51
126
  ```
52
- Requires `libfuse` (`apt install fuse libfuse-dev` on Debian/Ubuntu, `brew install macfuse` on macOS).
53
127
 
54
- ### Auto-sync folders
128
+ > Requires `libfuse` β€” `apt install fuse libfuse-dev` on Linux, `brew install macfuse` on macOS.
129
+
130
+ ### πŸ”„ Auto-Sync Folders
131
+ Dropbox-style: register a folder, and TAS watches for changes and uploads automatically.
132
+
55
133
  ```bash
56
- tas sync add ~/Documents # Register
57
- tas sync start # Watch for changes, auto-upload
134
+ tas sync add ~/Documents # Register a folder
135
+ tas sync start # Watch & auto-upload changes
58
136
  tas sync pull # Download everything back
137
+ tas sync status # See what's synced
59
138
  ```
60
139
 
61
- ### Share files with expiring links
140
+ ### πŸ”— Share with Expiring Links
141
+ Generate one-time download links with a sleek dark-themed download page. Files are decrypted on-the-fly β€” the link holder never sees your password.
142
+
62
143
  ```bash
63
- tas share create secret.pdf --expire 1h --max-downloads 3
144
+ tas share create report.pdf --expire 1h --max-downloads 3
64
145
  # β†’ http://localhost:3000/d/a1b2c3d4...
65
146
 
66
- tas share list # Active shares
67
- tas share revoke a1b2c3d4 # Revoke
147
+ tas share list # See active shares
148
+ tas share revoke a1b2c3d4 # Revoke anytime
68
149
  ```
69
- Spins up a local HTTP server. File is downloaded from Telegram, decrypted, and served. Dark-themed download page with file info.
150
+
151
+ ### 🏷️ Tags & Search
152
+ Organize and find files instantly.
153
+
154
+ ```bash
155
+ tas tag add report.pdf work Q4
156
+ tas search "report" # Search by filename
157
+ tas search -t work # Search by tag
158
+ ```
159
+
160
+ ### 🩺 Self-Diagnostics
161
+ One command to check if everything is healthy.
162
+
163
+ ```bash
164
+ tas doctor
165
+ # βœ“ Node.js 20.11.0
166
+ # βœ“ Config v2 (encrypted token)
167
+ # βœ“ Database: 42 files, 1.3 GB total
168
+ # βœ“ Disk space: 50 GB free (32% used)
169
+ # βœ“ Encryption: AES-256-GCM, PBKDF2-SHA512 600,000 iterations
170
+ # ✨ All systems go!
171
+ ```
172
+
173
+ ### πŸ€– Built for Automation
174
+ First-class JSON output, environment variable support, and zero interactivity mode.
175
+
176
+ ```bash
177
+ export TAS_PASSWORD="your-password" # Skip prompts
178
+ export TAS_DATA_DIR="/custom/path" # Custom data location
179
+
180
+ tas push backup.tar.gz # Non-interactive upload
181
+ tas list --json | jq '.[].filename' # Pipe to jq
182
+ tas status --json # Machine-readable status
183
+
184
+ # Works with: cron β€’ GitHub Actions β€’ Docker β€’ systemd β€’ any CI/CD
185
+ ```
186
+
187
+ <br>
70
188
 
71
189
  ## πŸ›‘οΈ Security
72
190
 
73
- | Component | Implementation |
74
- |-----------|----------------|
75
- | Cipher | AES-256-GCM |
76
- | Key derivation | PBKDF2-SHA512, 100k iterations |
77
- | Salt | 32 bytes, random per file |
78
- | IV | 12 bytes, random per file |
79
- | Auth tag | 16 bytes (integrity verification) |
191
+ TAS implements **zero-knowledge encryption** β€” we can't read your data, Telegram can't read your data, nobody can read your data without your password.
80
192
 
81
- Your password **never** leaves your machine. Telegram only sees encrypted blobs. Even if someone accesses your bot chat, they get meaningless data without your password.
193
+ | Layer | Implementation | Why It Matters |
194
+ |-------|----------------|----------------|
195
+ | **Cipher** | AES-256-GCM | Same cipher used by governments & banks |
196
+ | **Key Derivation** | PBKDF2-SHA512, **600k iterations** | OWASP 2025 compliant β€” brute-force resistant |
197
+ | **Salt** | 32 bytes, cryptographically random | Unique per file β€” no rainbow tables |
198
+ | **IV** | 12 bytes, cryptographically random | Unique per file β€” no pattern analysis |
199
+ | **Auth Tag** | 16 bytes GCM authentication | Tamper detection β€” any bit flip = rejected |
200
+ | **Bot Token** | Encrypted at rest (AES-256-GCM) | Even your config file is protected |
201
+ | **Password Hash** | PBKDF2-based verification | Your password hash is computationally expensive to crack |
202
+ | **Integrity** | SHA-256 verified on every download | Bit-perfect downloads, guaranteed |
203
+ | **Share Server** | XSS-safe, RFC 6266 headers | Hardened against injection attacks |
82
204
 
83
- ## πŸ“‹ Full CLI Reference
205
+ For the full threat model, cipher rationale, and file format spec, see **[docs/security.md](docs/security.md)**.
206
+
207
+ ### What Telegram Sees
208
+
209
+ ```
210
+ πŸ“¦ a7f3b2c1e9d4.tas β€” 12.4 MB β€” application/octet-stream
211
+ ```
212
+
213
+ That's it. An opaque encrypted blob. No filename, no content, no metadata. Just noise.
214
+
215
+ <br>
216
+
217
+ ## πŸ”„ Reliability
218
+
219
+ Built like professional backup tools (inspired by restic, rclone, borg):
220
+
221
+ | Feature | Details |
222
+ |---------|---------|
223
+ | **Exponential Backoff** | Auto-retry with jitter on Telegram 429 errors and network timeouts |
224
+ | **Rate Limiting** | Built-in 1 msg/sec limiter β€” never hits Telegram's rate limits |
225
+ | **Integrity Verification** | SHA-256 hash check after every single download |
226
+ | **Resume Uploads** | Interrupted? Run `tas resume` to pick up where you left off |
227
+ | **Atomic Transactions** | Upload pipeline uses SQLite transactions β€” pipeline failure = clean rollback, zero orphaned DB rows |
228
+ | **Graceful Shutdown** | SIGINT/SIGTERM handled cleanly β€” zero data corruption risk |
229
+ | **Self-Diagnostics** | `tas doctor` validates your entire setup in seconds |
230
+
231
+ <br>
232
+
233
+ ## πŸ“‹ CLI Reference
234
+
235
+ <details>
236
+ <summary><strong>Core Commands</strong></summary>
84
237
 
85
238
  ```bash
86
- # Core
87
- tas init # Setup wizard
88
- tas push <file> # Upload
89
- tas pull <file|hash> # Download
90
- tas list [-l] # List files
91
- tas delete <file|hash> # Delete
92
- tas status # Stats
93
- tas search <query> # Search files
94
- tas resume # Resume interrupted uploads
95
- tas verify # Check integrity
96
-
97
- # FUSE Mount
98
- tas mount <path> # Mount as folder
239
+ tas init # πŸš€ Interactive setup wizard
240
+ tas push <file> # ⬆️ Upload (encrypt + compress + upload)
241
+ tas pull <file|hash> # ⬇️ Download (download + decrypt + verify)
242
+ tas list [-l] [--json] # πŸ“‹ List all files
243
+ tas delete <file|hash> # πŸ—‘οΈ Remove from index (--hard to delete from Telegram)
244
+ tas status [--json] # πŸ“Š Storage stats
245
+ tas search <query> # πŸ” Find files by name or tag
246
+ tas resume # πŸ”„ Resume interrupted uploads
247
+ tas verify # βœ… Verify all files exist & are intact
248
+ tas doctor # 🩺 System health check
249
+ ```
250
+
251
+ </details>
252
+
253
+ <details>
254
+ <summary><strong>Mount & Sync</strong></summary>
255
+
256
+ ```bash
257
+ # FUSE Mount (use Telegram like a local folder)
258
+ tas mount <path> # Mount
99
259
  tas unmount <path> # Unmount
100
260
 
101
- # Sync
102
- tas sync add <folder> # Register folder
103
- tas sync start # Start watching
104
- tas sync pull # Download all
105
- tas sync status # Show status
261
+ # Folder Sync (Dropbox-style auto-upload)
262
+ tas sync add <folder> # Register a folder to sync
263
+ tas sync start # Start watching for changes
264
+ tas sync pull # Download all synced files
265
+ tas sync status # Show sync status
266
+ ```
267
+
268
+ </details>
269
+
270
+ <details>
271
+ <summary><strong>Share & Tags</strong></summary>
106
272
 
107
- # Share
108
- tas share create <file> # Create download link
273
+ ```bash
274
+ # Temporary Share Links
275
+ tas share create <file> [--expire 24h] [--max-downloads 3]
109
276
  tas share list # Active shares
110
- tas share revoke <token> # Revoke
277
+ tas share revoke <token> # Revoke a share link
111
278
 
112
- # Tags
279
+ # File Tags
113
280
  tas tag add <file> <tags...>
114
281
  tas tag remove <file> <tags...>
115
- tas tag list [tag]
282
+ tas tag list [tag] # List tags or files with a specific tag
116
283
  ```
117
284
 
118
- ## πŸ€– Automation
285
+ </details>
119
286
 
120
- ```bash
121
- # Skip password prompts
122
- export TAS_PASSWORD="your-password"
123
- tas push file.pdf
287
+ <br>
288
+
289
+ ## πŸ—οΈ Architecture
124
290
 
125
- # Or inline
126
- tas push -p "password" file.pdf
127
291
  ```
292
+ src/
293
+ β”œβ”€β”€ cli.js # Commander-based CLI β€” all commands
294
+ β”œβ”€β”€ index.js # Streaming upload/download pipeline
295
+ β”œβ”€β”€ crypto/
296
+ β”‚ └── encryption.js # AES-256-GCM + PBKDF2-SHA512 key derivation
297
+ β”œβ”€β”€ db/
298
+ β”‚ └── index.js # SQLite index (files, chunks, tags, shares, sync)
299
+ β”œβ”€β”€ telegram/
300
+ β”‚ └── client.js # Bot API wrapper β€” retry, rate-limit, streaming
301
+ β”œβ”€β”€ fuse/
302
+ β”‚ └── mount.js # FUSE filesystem β€” mount Telegram as a folder
303
+ β”œβ”€β”€ share/
304
+ β”‚ └── server.js # HTTP server β€” expiring download links
305
+ β”œβ”€β”€ sync/
306
+ β”‚ └── sync.js # Folder watcher β€” Dropbox-style auto-sync
307
+ └── utils/
308
+ β”œβ”€β”€ compression.js # Smart gzip (skips already-compressed formats)
309
+ β”œβ”€β”€ chunker.js # 49MB chunking with custom WAS1 file headers
310
+ β”œβ”€β”€ progress.js # Terminal progress bar with speed + ETA
311
+ β”œβ”€β”€ throttle.js # Bandwidth limiter (stream transform)
312
+ β”œβ”€β”€ branding.js # ASCII art + version (auto-synced from package.json)
313
+ └── cli-helpers.js # Password management + config resolution
314
+ ```
315
+
316
+ **Tech stack:** Node.js Β· better-sqlite3 Β· node-telegram-bot-api Β· fuse-native Β· Commander Β· Chalk Β· Ora Β· Inquirer
128
317
 
129
- Works with cron, GitHub Actions, Docker, or any CI/CD.
318
+ <br>
130
319
 
131
- ## ⚠️ Limitations
320
+ ## ⚠️ Good to Know
132
321
 
133
- - **Not a backup** β€” Telegram can delete content without notice
134
- - **No versioning** β€” overwriting deletes the old version
135
- - **49MB chunks** β€” files split due to Bot API limits
136
- - **Single user** β€” personal use, not multi-tenant
137
- - **FUSE required** β€” mount feature needs libfuse
322
+ | | |
323
+ |---|---|
324
+ | πŸ“Œ **Not a backup solution** | Telegram can delete content. Use TAS alongside proper backups, not instead of them. |
325
+ | πŸ“Œ **49 MB chunks** | Files are automatically split due to Telegram Bot API limits. Fully transparent. |
326
+ | πŸ“Œ **Single-user** | Designed for personal use. Not multi-tenant. |
327
+ | πŸ“Œ **FUSE = Linux/macOS** | Mount feature requires `libfuse`. CLI works everywhere Node.js runs. |
328
+ | πŸ“Œ **No versioning (yet)** | Overwriting a file replaces the previous version. |
329
+
330
+ <br>
138
331
 
139
332
  ## πŸ› οΈ Development
140
333
 
141
334
  ```bash
142
335
  git clone https://github.com/ixchio/tas
143
336
  cd tas && npm install
144
- npm test # 43 tests
337
+ npm test # 83 tests across 16 suites, all passing
145
338
  ```
146
339
 
147
- ```
148
- src/
149
- β”œβ”€β”€ cli.js # Commands
150
- β”œβ”€β”€ index.js # Upload/download pipeline
151
- β”œβ”€β”€ crypto/ # AES-256-GCM
152
- β”œβ”€β”€ db/ # SQLite index
153
- β”œβ”€β”€ fuse/ # FUSE filesystem
154
- β”œβ”€β”€ share/ # HTTP share server
155
- β”œβ”€β”€ sync/ # Folder sync engine
156
- β”œβ”€β”€ telegram/ # Bot API client
157
- └── utils/ # Compression, chunking
158
- ```
340
+ For the full developer guide (architecture, testing, conventions, gotchas), see **[docs/development.md](docs/development.md)**.
341
+
342
+ PRs welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
343
+
344
+ <br>
345
+
346
+ ## πŸ“š Documentation
347
+
348
+ | Doc | What's in it |
349
+ |-----|-------------|
350
+ | [docs/development.md](docs/development.md) | Developer onboarding β€” project structure, how to add commands, testing, conventions |
351
+ | [docs/security.md](docs/security.md) | Threat model β€” what TAS protects against, cipher details, file format specs |
352
+ | [CHANGELOG.md](CHANGELOG.md) | Version history with all changes documented |
353
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute β€” fork, branch, PR |
354
+ | [SECURITY.md](SECURITY.md) | Security vulnerability reporting |
355
+
356
+ <br>
357
+
358
+ ## 🌟 Contributing
359
+
360
+ TAS is open source and we love contributions:
361
+
362
+ - πŸ› **Found a bug?** [Open an issue](https://github.com/ixchio/tas/issues)
363
+ - πŸ’‘ **Have an idea?** [Start a discussion](https://github.com/ixchio/tas/issues)
364
+ - πŸ”§ **Want to contribute?** Fork β†’ Branch β†’ PR β†’ πŸŽ‰
365
+
366
+ <br>
159
367
 
160
368
  ## πŸ“„ License
161
369
 
162
- MIT β€” do whatever you want with it.
370
+ MIT β€” use it, fork it, ship it, sell it. Do whatever you want.
371
+
372
+ ---
373
+
374
+ <p align="center">
375
+ <sub>Built with β˜• and stubbornness by <a href="https://github.com/ixchio">@ixchio</a></sub><br>
376
+ <sub>If TAS saved you money, consider giving it a ⭐</sub>
377
+ </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nightowne/tas-cli",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Telegram as Storage - Automated encrypted cloud backup. Free, encrypted, scriptable. Mount as folder or use with cron/Docker.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -46,11 +46,13 @@
46
46
  "better-sqlite3": "^12.6.2",
47
47
  "chalk": "^5.3.0",
48
48
  "commander": "^12.1.0",
49
- "fuse-native": "^2.2.6",
50
49
  "inquirer": "^12.2.0",
51
50
  "node-telegram-bot-api": "^0.66.0",
52
51
  "ora": "^8.1.1"
53
52
  },
53
+ "optionalDependencies": {
54
+ "fuse-native": "^2.2.6"
55
+ },
54
56
  "engines": {
55
57
  "node": ">=18.0.0"
56
58
  }