@nightowne/tas-cli 2.0.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 +326 -132
- package/package.json +4 -2
- package/src/cli.js +199 -24
- package/src/crypto/encryption.js +153 -3
- package/src/db/index.js +19 -13
- package/src/fuse/mount.js +253 -155
- package/src/index.js +209 -112
- package/src/share/server.js +100 -32
- package/src/sync/sync.js +211 -56
- package/src/telegram/client.js +102 -26
- package/src/utils/branding.js +10 -3
- package/src/utils/chunker.js +15 -3
- package/src/utils/cli-helpers.js +44 -6
- package/src/utils/compression.js +30 -0
- package/src/utils/progress.js +3 -3
- package/src/utils/throttle.js +26 -0
package/README.md
CHANGED
|
@@ -1,183 +1,377 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/demo.gif" alt="TAS β Telegram as Storage" width="640">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">
|
|
6
|
+
π¦ TAS β Telegram as Storage
|
|
7
|
+
</h1>
|
|
2
8
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
<
|
|
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">
|
|
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>
|
|
29
|
+
</p>
|
|
12
30
|
|
|
13
|
-
|
|
14
|
-
βββββββββββββββ βββββββββββββββββ ββββββββββββββββ
|
|
15
|
-
β CLI ββββββΆβ Compress & ββββββΆβ Telegram β
|
|
16
|
-
β FUSE β β Encrypt β β Bot API β
|
|
17
|
-
βββββββββββββββ βββββββββββββββββ ββββββββββββββββ
|
|
18
|
-
β β β
|
|
19
|
-
βΌ βΌ βΌ
|
|
20
|
-
βββββββββββββββ βββββββββββββββββ ββββββββββββββββ
|
|
21
|
-
β SQLite Indexβ β 49MB Chunks β β Private Chat β
|
|
22
|
-
βββββββββββββββ βββββββββββββββββ ββββββββββββββββ
|
|
23
|
-
```
|
|
31
|
+
---
|
|
24
32
|
|
|
25
|
-
|
|
33
|
+
<br>
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
|---------|:---:|:-----------------------------------:|
|
|
29
|
-
| Account ban risk | None (Bot API) | High (session hijack detection) |
|
|
30
|
-
| Encryption | AES-256-GCM | Usually none |
|
|
31
|
-
| Dependencies | SQLite only | Rclone, external DB |
|
|
32
|
-
| Setup complexity | 2 minutes | Docker + multiple services |
|
|
35
|
+
## The Problem
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
- Uses Bot API, not session-based auth - Telegram can't ban your account
|
|
36
|
-
- Encryption by default - files encrypted before leaving your machine
|
|
37
|
-
- Local-first - SQLite index, no cloud dependencies
|
|
38
|
-
- FUSE mount - use Telegram like a folder
|
|
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**.
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
Meanwhile, Telegram gives every user **unlimited storage** with a bot API β and nobody's using it.
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|-----------|----------------|
|
|
44
|
-
| Cipher | AES-256-GCM |
|
|
45
|
-
| Key derivation | PBKDF2-SHA512, 100,000 iterations |
|
|
46
|
-
| Salt | 32 bytes, random per file |
|
|
47
|
-
| IV | 12 bytes, random per file |
|
|
48
|
-
| Auth tag | 16 bytes (integrity) |
|
|
41
|
+
## The Solution
|
|
49
42
|
|
|
50
|
-
Your password never leaves your machine. Telegram
|
|
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.**
|
|
51
44
|
|
|
52
|
-
|
|
45
|
+
```
|
|
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
|
|
57
|
+
```
|
|
53
58
|
|
|
54
|
-
|
|
55
|
-
- No versioning - overwriting a file deletes the old version
|
|
56
|
-
- 49MB chunks - files split due to Bot API limits
|
|
57
|
-
- FUSE required - mount feature needs libfuse on Linux/macOS
|
|
58
|
-
- Single user - designed for personal use, not multi-tenant
|
|
59
|
+
<br>
|
|
59
60
|
|
|
60
|
-
## Quick Start
|
|
61
|
+
## β‘ Quick Start
|
|
62
|
+
|
|
63
|
+
Three commands. Two minutes. Zero cost.
|
|
61
64
|
|
|
62
65
|
```bash
|
|
63
|
-
# Install
|
|
64
66
|
npm install -g @nightowne/tas-cli
|
|
65
67
|
|
|
66
|
-
#
|
|
67
|
-
tas
|
|
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
|
|
71
|
+
```
|
|
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>
|
|
68
116
|
|
|
69
|
-
|
|
70
|
-
tas push secret.pdf
|
|
117
|
+
## π₯ Features
|
|
71
118
|
|
|
72
|
-
|
|
73
|
-
|
|
119
|
+
### ποΈ Mount as a Local Folder
|
|
120
|
+
Drag and drop files into Telegram storage like it's a regular drive.
|
|
74
121
|
|
|
75
|
-
|
|
76
|
-
tas mount ~/cloud
|
|
122
|
+
```bash
|
|
123
|
+
tas mount ~/cloud # Mount your Telegram storage
|
|
124
|
+
# Now use Finder, Explorer, or any app β files sync to Telegram
|
|
125
|
+
tas unmount ~/cloud
|
|
77
126
|
```
|
|
78
127
|
|
|
79
|
-
|
|
80
|
-
- Node.js β₯18
|
|
81
|
-
- Telegram account + bot token from [@BotFather](https://t.me/BotFather)
|
|
82
|
-
- `libfuse` for mount feature:
|
|
83
|
-
```bash
|
|
84
|
-
# Debian/Ubuntu
|
|
85
|
-
sudo apt install fuse libfuse-dev
|
|
86
|
-
|
|
87
|
-
# Fedora
|
|
88
|
-
sudo dnf install fuse fuse-devel
|
|
89
|
-
|
|
90
|
-
# macOS
|
|
91
|
-
brew install macfuse
|
|
92
|
-
```
|
|
128
|
+
> Requires `libfuse` β `apt install fuse libfuse-dev` on Linux, `brew install macfuse` on macOS.
|
|
93
129
|
|
|
94
|
-
|
|
130
|
+
### π Auto-Sync Folders
|
|
131
|
+
Dropbox-style: register a folder, and TAS watches for changes and uploads automatically.
|
|
95
132
|
|
|
96
133
|
```bash
|
|
97
|
-
#
|
|
98
|
-
tas
|
|
99
|
-
tas
|
|
100
|
-
tas
|
|
101
|
-
|
|
102
|
-
tas delete <file|hash> # Remove file
|
|
103
|
-
tas status # Show stats
|
|
104
|
-
|
|
105
|
-
# Search & Resume (v1.1.0)
|
|
106
|
-
tas search <query> # Search by filename
|
|
107
|
-
tas search -t <query> # Search by tag
|
|
108
|
-
tas resume # Resume interrupted uploads
|
|
109
|
-
|
|
110
|
-
# FUSE Mount
|
|
111
|
-
tas mount <path> # Mount as folder
|
|
112
|
-
tas unmount <path> # Unmount
|
|
134
|
+
tas sync add ~/Documents # Register a folder
|
|
135
|
+
tas sync start # Watch & auto-upload changes
|
|
136
|
+
tas sync pull # Download everything back
|
|
137
|
+
tas sync status # See what's synced
|
|
138
|
+
```
|
|
113
139
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
tas tag remove <file> <tags...> # Remove tags
|
|
117
|
-
tas tag list [tag] # List tags or files by tag
|
|
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.
|
|
118
142
|
|
|
119
|
-
|
|
120
|
-
tas
|
|
121
|
-
|
|
122
|
-
tas sync pull # Download all to sync folders
|
|
123
|
-
tas sync status # Show sync status
|
|
143
|
+
```bash
|
|
144
|
+
tas share create report.pdf --expire 1h --max-downloads 3
|
|
145
|
+
# β http://localhost:3000/d/a1b2c3d4...
|
|
124
146
|
|
|
125
|
-
#
|
|
126
|
-
tas share
|
|
127
|
-
|
|
128
|
-
tas share list # Show active shares
|
|
129
|
-
tas share revoke <token> # Revoke a share
|
|
147
|
+
tas share list # See active shares
|
|
148
|
+
tas share revoke a1b2c3d4 # Revoke anytime
|
|
149
|
+
```
|
|
130
150
|
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
133
158
|
```
|
|
134
159
|
|
|
135
|
-
|
|
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
|
+
```
|
|
136
172
|
|
|
137
|
-
|
|
173
|
+
### π€ Built for Automation
|
|
174
|
+
First-class JSON output, environment variable support, and zero interactivity mode.
|
|
138
175
|
|
|
139
176
|
```bash
|
|
140
|
-
#
|
|
141
|
-
export
|
|
142
|
-
|
|
143
|
-
tas
|
|
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>
|
|
188
|
+
|
|
189
|
+
## π‘οΈ Security
|
|
190
|
+
|
|
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.
|
|
192
|
+
|
|
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 |
|
|
204
|
+
|
|
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 |
|
|
144
230
|
|
|
145
|
-
|
|
146
|
-
|
|
231
|
+
<br>
|
|
232
|
+
|
|
233
|
+
## π CLI Reference
|
|
234
|
+
|
|
235
|
+
<details>
|
|
236
|
+
<summary><strong>Core Commands</strong></summary>
|
|
237
|
+
|
|
238
|
+
```bash
|
|
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
|
|
147
249
|
```
|
|
148
250
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
- Shell scripts for batch operations
|
|
251
|
+
</details>
|
|
252
|
+
|
|
253
|
+
<details>
|
|
254
|
+
<summary><strong>Mount & Sync</strong></summary>
|
|
154
255
|
|
|
155
|
-
|
|
256
|
+
```bash
|
|
257
|
+
# FUSE Mount (use Telegram like a local folder)
|
|
258
|
+
tas mount <path> # Mount
|
|
259
|
+
tas unmount <path> # Unmount
|
|
260
|
+
|
|
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
|
+
```
|
|
156
267
|
|
|
157
|
-
|
|
268
|
+
</details>
|
|
158
269
|
|
|
159
|
-
|
|
270
|
+
<details>
|
|
271
|
+
<summary><strong>Share & Tags</strong></summary>
|
|
160
272
|
|
|
161
273
|
```bash
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
274
|
+
# Temporary Share Links
|
|
275
|
+
tas share create <file> [--expire 24h] [--max-downloads 3]
|
|
276
|
+
tas share list # Active shares
|
|
277
|
+
tas share revoke <token> # Revoke a share link
|
|
278
|
+
|
|
279
|
+
# File Tags
|
|
280
|
+
tas tag add <file> <tags...>
|
|
281
|
+
tas tag remove <file> <tags...>
|
|
282
|
+
tas tag list [tag] # List tags or files with a specific tag
|
|
166
283
|
```
|
|
167
284
|
|
|
168
|
-
|
|
285
|
+
</details>
|
|
286
|
+
|
|
287
|
+
<br>
|
|
288
|
+
|
|
289
|
+
## ποΈ Architecture
|
|
290
|
+
|
|
169
291
|
```
|
|
170
292
|
src/
|
|
171
|
-
βββ cli.js
|
|
172
|
-
βββ index.js
|
|
173
|
-
βββ crypto/
|
|
174
|
-
|
|
175
|
-
βββ
|
|
176
|
-
|
|
177
|
-
βββ telegram/
|
|
178
|
-
βββ
|
|
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
|
|
317
|
+
|
|
318
|
+
<br>
|
|
319
|
+
|
|
320
|
+
## β οΈ Good to Know
|
|
321
|
+
|
|
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>
|
|
331
|
+
|
|
332
|
+
## π οΈ Development
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
git clone https://github.com/ixchio/tas
|
|
336
|
+
cd tas && npm install
|
|
337
|
+
npm test # 83 tests across 16 suites, all passing
|
|
179
338
|
```
|
|
180
339
|
|
|
181
|
-
|
|
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
|
|
182
347
|
|
|
183
|
-
|
|
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>
|
|
367
|
+
|
|
368
|
+
## π License
|
|
369
|
+
|
|
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.
|
|
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
|
}
|