obsideo-cli 0.4.0__tar.gz → 0.6.0__tar.gz

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.
Files changed (26) hide show
  1. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/PKG-INFO +27 -2
  2. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/README.md +109 -84
  3. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo/cli.py +1225 -1072
  4. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_cli.egg-info/PKG-INFO +27 -2
  5. obsideo_cli-0.6.0/obsideo_core/crypto.py +94 -0
  6. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_core/storage.py +98 -15
  7. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/pyproject.toml +33 -33
  8. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/tests/test_cli.py +104 -2
  9. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/tests/test_core.py +91 -0
  10. obsideo_cli-0.4.0/obsideo_core/crypto.py +0 -50
  11. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/LICENSE +0 -0
  12. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo/__init__.py +0 -0
  13. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo/__main__.py +0 -0
  14. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo/manifest.py +0 -0
  15. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo/sync.py +0 -0
  16. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_cli.egg-info/SOURCES.txt +0 -0
  17. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_cli.egg-info/dependency_links.txt +0 -0
  18. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_cli.egg-info/entry_points.txt +0 -0
  19. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_cli.egg-info/requires.txt +0 -0
  20. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_cli.egg-info/top_level.txt +0 -0
  21. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_core/__init__.py +0 -0
  22. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_core/config.py +0 -0
  23. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_core/identity.py +0 -0
  24. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_core/login.py +0 -0
  25. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/obsideo_core/names.py +0 -0
  26. {obsideo_cli-0.4.0 → obsideo_cli-0.6.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: obsideo-cli
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Obsideo Cloud CLI - client-side encrypted storage for people and AI agents: content is encrypted on your machine before upload. 12 GB free, no card. Save, browse, and sync from your terminal; agent integration contract at obsideo.io/agents.md
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://obsideo.io
@@ -17,7 +17,7 @@ Dynamic: license-file
17
17
 
18
18
  # obsideo-cli
19
19
 
20
- **Client-side encrypted storage: your content is encrypted on your machine before upload, so the platform cannot read it.** (File names are stored in the clear; keep them non-sensitive.) Save, browse, and sync whatever you want
20
+ **Client-side encrypted storage: your content is encrypted on your machine before upload, so the platform cannot read it.** File and folder names are encrypted too, by default (AES-SIV, keyed off your data key), so the platform sees opaque tokens rather than your filenames. Save, browse, and sync whatever you want
21
21
  from your terminal. Files are encrypted on your machine before they leave, so
22
22
  Obsideo's gateway, coordinator, and storage providers only ever see ciphertext.
23
23
  Your data lands on three providers (RF=3).
@@ -70,9 +70,34 @@ obsideo:/trip/ get cat.jpg ./downloaded.jpg
70
70
  | `mkdir <name>` | Create a folder |
71
71
  | `info <remote>` | Show object metadata |
72
72
  | `account` | Show storage used vs. your free quota |
73
+ | `key status\|export\|import` | Back up or restore your encryption key (see below) |
73
74
  | `sync push\|pull\|status` | Sync your local folder with Obsideo |
74
75
  | `config [set k v]` | Show or change settings |
75
76
 
77
+ ## Using it on more than one machine
78
+
79
+ Your files are encrypted with a key generated on your machine and held only
80
+ there. **A second machine that logs in without that key gets a new one**, and
81
+ your existing files stay unreadable on it (they show as `?` in `ls`). Nobody can
82
+ reissue the key for you, us included.
83
+
84
+ So before you need it:
85
+
86
+ ```
87
+ obsideo key export # prints the line to save, or: key export ~/obsideo-key.txt
88
+ ```
89
+
90
+ Then on the other machine, before uploading anything:
91
+
92
+ ```
93
+ obsideo key import OBSIDEO_DATA_KEY=...
94
+ obsideo key status # same fingerprint on both = both can read the same files
95
+ ```
96
+
97
+ `key status` prints a fingerprint, not the key, so it is safe to compare over
98
+ any channel. Importing over an existing key needs `--force`, because it makes
99
+ whatever the old key protected unreadable.
100
+
76
101
  ## How it works
77
102
 
78
103
  `obsideo` is a thin front-end over the shared **`obsideo_core`** layer (storage
@@ -1,84 +1,109 @@
1
- # obsideo-cli
2
-
3
- **Client-side encrypted storage: your content is encrypted on your machine before upload, so the platform cannot read it.** (File names are stored in the clear; keep them non-sensitive.) Save, browse, and sync whatever you want
4
- from your terminal. Files are encrypted on your machine before they leave, so
5
- Obsideo's gateway, coordinator, and storage providers only ever see ciphertext.
6
- Your data lands on three providers (RF=3).
7
-
8
- ```
9
- pip install obsideo-cli
10
- obsideo login # email -> 12 GB free
11
- obsideo # open the shell
12
- ```
13
-
14
- ## Get started
15
-
16
- ```
17
- $ obsideo login
18
- Enter your email: you@example.com
19
- Check your email for a verification code.
20
- Enter verification code: 482913
21
- You're all set. 12 GB free.
22
- ```
23
-
24
- Login is handled by Obsideo's signup service at **`signup.obsideo.io`**: it emails
25
- you a one-time code and provisions your free tier. There's no password - just your
26
- email and a local key (see *How it works*).
27
-
28
- Then either drop into the shell or run one-shot commands:
29
-
30
- ```
31
- $ obsideo
32
- obsideo:/ put ~/notes.txt
33
- obsideo:/ ls
34
- [file] notes.txt 1.2 KB
35
- obsideo:/ put ~/photos # a whole folder, uploaded recursively
36
- obsideo:/ put "C:\My Files\tax return.pdf" # paths with spaces: just quote them
37
- obsideo:/ mkdir trip
38
- obsideo:/ cd trip
39
- obsideo:/trip/ put ~/cat.jpg
40
- obsideo:/trip/ get cat.jpg ./downloaded.jpg
41
- ```
42
-
43
- ## Commands
44
-
45
- | Command | Description |
46
- |---|---|
47
- | `obsideo login` | Sign up / log in with your email (12 GB free) |
48
- | `ls [path]` | List files and folders |
49
- | `cd <path>` / `pwd` | Move around / show location |
50
- | `put <local> [name]` | Encrypt + upload a file, or a whole folder (recursive). `--no-encrypt` to store as-is |
51
- | `get <remote> [local]` | Download + decrypt a file |
52
- | `rm <remote>` | Delete a file |
53
- | `mkdir <name>` | Create a folder |
54
- | `info <remote>` | Show object metadata |
55
- | `account` | Show storage used vs. your free quota |
56
- | `sync push\|pull\|status` | Sync your local folder with Obsideo |
57
- | `config [set k v]` | Show or change settings |
58
-
59
- ## How it works
60
-
61
- `obsideo` is a thin front-end over the shared **`obsideo_core`** layer (storage
62
- seam, signing identity, account crypto, email-OTP login). The `mlvault` ML
63
- extension builds on the same core - build the core once, two front-ends.
64
-
65
- - **Encryption:** AES-256-GCM with one account data key held locally at
66
- `~/.obsideo/data.key`. Copy that key to another machine and everything is
67
- readable there; lose it and the data is unrecoverable by design. Back it up.
68
- - **Signing identity:** an Ed25519 key (`~/.obsideo/signing.key`) authorizes
69
- deletes (Principle 2 - the network can't delete your data without your
70
- signature). Generated locally; only the public half is ever sent.
71
- - **Filename encryption:** on by default (`encrypt_names`). Each path component
72
- (folder names + filename) is encrypted on your machine with AES-SIV - deterministic,
73
- so `ls`/`cd` still list under the encrypted prefix and the client decrypts the
74
- returned tokens back to real names. Turn it off with `config set encrypt_names false`
75
- (interop/debug; existing objects aren't migrated).
76
- - **What Obsideo sees:** ciphertext only - never a filename or a byte of content.
77
- Residual leaks (by design at this level): directory *structure* (depth, fan-out),
78
- object *sizes* (ciphertext ≈ plaintext), and object *counts*. Identical names
79
- encrypt to identical tokens, so Obsideo can tell two objects share a name - never
80
- what it is.
81
-
82
- ## License
83
-
84
- MIT
1
+ # obsideo-cli
2
+
3
+ **Client-side encrypted storage: your content is encrypted on your machine before upload, so the platform cannot read it.** File and folder names are encrypted too, by default (AES-SIV, keyed off your data key), so the platform sees opaque tokens rather than your filenames. Save, browse, and sync whatever you want
4
+ from your terminal. Files are encrypted on your machine before they leave, so
5
+ Obsideo's gateway, coordinator, and storage providers only ever see ciphertext.
6
+ Your data lands on three providers (RF=3).
7
+
8
+ ```
9
+ pip install obsideo-cli
10
+ obsideo login # email -> 12 GB free
11
+ obsideo # open the shell
12
+ ```
13
+
14
+ ## Get started
15
+
16
+ ```
17
+ $ obsideo login
18
+ Enter your email: you@example.com
19
+ Check your email for a verification code.
20
+ Enter verification code: 482913
21
+ You're all set. 12 GB free.
22
+ ```
23
+
24
+ Login is handled by Obsideo's signup service at **`signup.obsideo.io`**: it emails
25
+ you a one-time code and provisions your free tier. There's no password - just your
26
+ email and a local key (see *How it works*).
27
+
28
+ Then either drop into the shell or run one-shot commands:
29
+
30
+ ```
31
+ $ obsideo
32
+ obsideo:/ put ~/notes.txt
33
+ obsideo:/ ls
34
+ [file] notes.txt 1.2 KB
35
+ obsideo:/ put ~/photos # a whole folder, uploaded recursively
36
+ obsideo:/ put "C:\My Files\tax return.pdf" # paths with spaces: just quote them
37
+ obsideo:/ mkdir trip
38
+ obsideo:/ cd trip
39
+ obsideo:/trip/ put ~/cat.jpg
40
+ obsideo:/trip/ get cat.jpg ./downloaded.jpg
41
+ ```
42
+
43
+ ## Commands
44
+
45
+ | Command | Description |
46
+ |---|---|
47
+ | `obsideo login` | Sign up / log in with your email (12 GB free) |
48
+ | `ls [path]` | List files and folders |
49
+ | `cd <path>` / `pwd` | Move around / show location |
50
+ | `put <local> [name]` | Encrypt + upload a file, or a whole folder (recursive). `--no-encrypt` to store as-is |
51
+ | `get <remote> [local]` | Download + decrypt a file |
52
+ | `rm <remote>` | Delete a file |
53
+ | `mkdir <name>` | Create a folder |
54
+ | `info <remote>` | Show object metadata |
55
+ | `account` | Show storage used vs. your free quota |
56
+ | `key status\|export\|import` | Back up or restore your encryption key (see below) |
57
+ | `sync push\|pull\|status` | Sync your local folder with Obsideo |
58
+ | `config [set k v]` | Show or change settings |
59
+
60
+ ## Using it on more than one machine
61
+
62
+ Your files are encrypted with a key generated on your machine and held only
63
+ there. **A second machine that logs in without that key gets a new one**, and
64
+ your existing files stay unreadable on it (they show as `?` in `ls`). Nobody can
65
+ reissue the key for you, us included.
66
+
67
+ So before you need it:
68
+
69
+ ```
70
+ obsideo key export # prints the line to save, or: key export ~/obsideo-key.txt
71
+ ```
72
+
73
+ Then on the other machine, before uploading anything:
74
+
75
+ ```
76
+ obsideo key import OBSIDEO_DATA_KEY=...
77
+ obsideo key status # same fingerprint on both = both can read the same files
78
+ ```
79
+
80
+ `key status` prints a fingerprint, not the key, so it is safe to compare over
81
+ any channel. Importing over an existing key needs `--force`, because it makes
82
+ whatever the old key protected unreadable.
83
+
84
+ ## How it works
85
+
86
+ `obsideo` is a thin front-end over the shared **`obsideo_core`** layer (storage
87
+ seam, signing identity, account crypto, email-OTP login). The `mlvault` ML
88
+ extension builds on the same core - build the core once, two front-ends.
89
+
90
+ - **Encryption:** AES-256-GCM with one account data key held locally at
91
+ `~/.obsideo/data.key`. Copy that key to another machine and everything is
92
+ readable there; lose it and the data is unrecoverable by design. Back it up.
93
+ - **Signing identity:** an Ed25519 key (`~/.obsideo/signing.key`) authorizes
94
+ deletes (Principle 2 - the network can't delete your data without your
95
+ signature). Generated locally; only the public half is ever sent.
96
+ - **Filename encryption:** on by default (`encrypt_names`). Each path component
97
+ (folder names + filename) is encrypted on your machine with AES-SIV - deterministic,
98
+ so `ls`/`cd` still list under the encrypted prefix and the client decrypts the
99
+ returned tokens back to real names. Turn it off with `config set encrypt_names false`
100
+ (interop/debug; existing objects aren't migrated).
101
+ - **What Obsideo sees:** ciphertext only - never a filename or a byte of content.
102
+ Residual leaks (by design at this level): directory *structure* (depth, fan-out),
103
+ object *sizes* (ciphertext ≈ plaintext), and object *counts*. Identical names
104
+ encrypt to identical tokens, so Obsideo can tell two objects share a name - never
105
+ what it is.
106
+
107
+ ## License
108
+
109
+ MIT