I see the problem now, the tutorial is wrong (and the returned help text).
It’s showing the usage of the <id> wrong or not listing it at all. I’m sorry, that’s crappy.
It is:
ryyn <ID> <COMMAND> <SUBCOMMAND> [ARGS]
e.g.
.\ryyn.exe alice init 4773b75ed27b51b9b56f4b6578c34e23aa2c9bb691d93d7a13c5d62f88575411 onelittlefox
Yes, after init, daemon has to be started, so that’s 1.2 in the tutorial. It should be without confusion now, all the issues you described were because of where the <id> was expected.
I’m placing the correct (should be) tutorial here and will update the repo as well.
Click to expand:
Detailed Tutorial
Detailed Tutorial
Getting familiar in a test environment
Except for the initialization, the steps are the same for test and live environment.
Try this out locally with mock network etc. to feel comfortable with the operations.
1. Test/Live instance
Before starting the daemon, and before anything at all can be done, we need to setup the key store.
For a test network, any 32-byte hex will do.
The id is anything you want, but you need to include it in all cli calls.
Secret key is a 32 byte hex. For the main network this is your EVM hex.
You need a passphrase to encrypt the secret on file. There is no validation of passphrase entropy currently, so you may use anything, but not empty.
1.1 A) Initialize test instance
Use the terminal from the path where you keep ryyn.exe.
.\ryyn.exe <id> test-init <secret_key> <passphrase> <device_nr> <test_run_dir>
Device nr is e.g. the sequence nr of simulated devices; 0, 1 .. etc.
Test run dir is the custom path where you want the simulated network and the instance app dirs to reside.
For example:
.\ryyn.exe alice test-init deadbeef... pwd123 0 /my/path
After this we start the actual backend, a daemon that will receive all the requests from the CLI.
1.1 B) Initialize live instance
The pattern is:
.\ryyn.exe <id> init <secret_key> <passphrase>
e.g.
.\ryyn.exe alice init deadbeef... pwd123
The application data will be stored in e.g. C:\Users\<YourUser>\AppData\Local\ryyn\main.
And you will see e.g.:
Key saved to C:\Users\<YourUser>\AppData\Local\ryyn\main\key.enc
(Note: Only default path option is showed here.)
1.2 Start daemon:
In this call the passphrase is included as an env var, so that the daemon can decrypt your secret key.
You do not need to include it after this, as the daemon keeps the key in memory while it is running.
The id is included as well, this is used by the daemon to lookup the other details of your instance.
set "RYYN_PWD=pwd123" && .\ryyn_daemon.exe alice
The daemon is now running and the application is ready to use.
After having started the daemon, leave the terminal window open, this keeps the daemon alive. (You can run it in background as well, but for tutorial, do it like this.) You will be able to follow the internal workings of the daemon as it outputs logs to the terminal window.
2. Using the app
2.1 Display info
.\ryyn.exe alice info
You will see a table of vaults, mounts and devices.
At this stage, only your device will show.
2.2 Create vault from a path
Note:
You may want to start clean and simple to observe the behavior without noise, and for that reason use an empty folder to create a vault of.
.\ryyn.exe alice vault create C:\path\to\vault
This will also mount the vault (the returned value is the id of the mount).
Display info again
.\ryyn.exe alice info
This will now show a vault and a mount.
You can see in the daemon terminal window that the corresponding logs show there. Somthing like:
2025-08-26T15:35:31.007684Z INFO ryyn_daemon: [DAEMON] logging initiated
2025-08-26T15:35:31.009730Z INFO ryyn_daemon: [DAEMON] server started at port 54711
2025-08-26T15:35:31.479410Z INFO ryyn_lib::engine::app: [SERVICE] started with 0 mounts
2025-08-26T15:35:33.575379Z INFO ryyn_lib::engine::user_input: [INPUT] received: GetSystemInfo
2025-08-26T15:35:33.605584Z INFO ryyn_lib::engine::user_input: [INPUT] received: CreateVault("F:\\path\\to\\mount")
2025-08-26T15:35:33.692928Z INFO ryyn_lib::engine::app: [SERVICE] created vault d0210adb and mounted b471b24f
2.3 A new file
Drag and drop a file to the mount path. You can see in the daemon terminal window what happens.
Something like the following:
2025-08-26T15:40:31.852625Z INFO ryyn_lib::engine::pipeline::delta: Chunking file of 20971520 bytes.
2025-08-26T15:40:32.288292Z INFO ryyn_lib::engine::sync::push: [PUSH] pushing 1 events..
2025-08-26T15:40:32.288627Z INFO ryyn_lib::engine::sync::push: -- event: 5cec9c15, FileCreated, ts: 1756222831794
[delta::finish] file ef1c9a22 @ 5cec9c15
[delta::finish] recorded 15 changed chunks out of 15 in total. Size of changed chunks: 20971520, out of total: 20971520 bytes
2025-08-26T15:40:34.178594Z INFO ryyn_lib::engine::pipeline::egress: [MANIFEST] 1 emitted
2025-08-26T15:40:34.294604Z INFO ryyn_lib::engine::sync::push: [PUSH] pushing 1 events..
2025-08-26T15:40:34.295038Z INFO ryyn_lib::engine::sync::push: -- event: e873f2b5, FileVersionCompleted, ts: 1756222834170
The emitted manifest, transferred between devices via the FileVersionCompleted event, is what allows us to restore the file. It is the full map to the data in the network, and how to rebuild it locally.
You can test to drag and drop files of various types and sizes.
Verify data sync
A) Test environment
Start two instances using:
<id> test-init <secret_key> <passphrase> <device_nr> <test_run_dir>
e.g.:
.\ryyn.exe alice test-init deadbeef... pwd123 0 /same/network/path
.\ryyn.exe bob test-init deadbeef... pwd123 1 /same/network/path
The secret key and the path needs to be the same for all instances of the same workspace.
The key is what lets them read the same data, and the path is the local mock network,
so they need to be on the same network.
The device nr needs to be unique for the key-path combination.
Open the drive dirs of the two instances in an Explorer window, e.g.
<test_run_dir>\devices\0\drive and <test_run_dir>\devices\1\drive
Create a vault on device 0:
e.g.
.\ryyn.exe alice vault create <test_run_dir>\devices\0\drive\<any-name>
Only the absolute path is taken for now, so use the specified path.
You will see a folder show up named <any-name>. That is the mounted vault.
Now keep an eye on the device 1 drive and drag and drop a file to the mount on drive 0.
The file should show up on device 1 under a folder with the same name.
See the two daemon terminal windows,
for device 0:
2025-08-26T15:40:32.288292Z INFO ryyn_lib::engine::sync::push: [PUSH] pushing 1 events..
2025-08-26T15:40:32.288627Z INFO ryyn_lib::engine::sync::push: -- event: 5cec9c15, FileCreated, ts: 1756222831794
[delta::finish] file ef1c9a22 @ 5cec9c15
[delta::finish] recorded 15 changed chunks out of 15 in total. Size of changed chunks: 20971520, out of total: 20971520 bytes
2025-08-26T15:40:34.178594Z INFO ryyn_lib::engine::pipeline::egress: [MANIFEST] 1 emitted
2025-08-26T15:40:34.294604Z INFO ryyn_lib::engine::sync::push: [PUSH] pushing 1 events..
2025-08-26T15:40:34.295038Z INFO ryyn_lib::engine::sync::push: -- event: e873f2b5, FileVersionCompleted, ts: 1756222834170
for device 1:
2025-08-26T15:40:32.541822Z INFO ryyn_lib::engine::sync::pull: [PULL] num events pulled: 1
2025-08-26T15:40:32.542048Z INFO ryyn_lib::engine::sync::pull: -- event: 5cec9c15, FileCreated, ts: 1756222831794
2025-08-26T15:40:34.533994Z INFO ryyn_lib::engine::sync::pull: [PULL] num events pulled: 1
2025-08-26T15:40:34.534375Z INFO ryyn_lib::engine::sync::pull: -- event: e873f2b5, FileVersionCompleted, ts: 1756222834170
2025-08-26T15:40:34.627454Z INFO ryyn_lib::engine::sync::apply: FileVersionCompleted fully applied.
The same file should now exist on both instances.
B) Live environment
Basically the same steps, just spin it up on two actual different devices.