CLI DOCUMENTATION
dotlet is a CLI tool for syncing and versioning your dotfiles. It transforms your configuration files into modular units called islets, enabling seamless synchronization across machines with versioned history.
Installation
- Node.js 20 or later
$ pnpm install -g dotlet$ curl -sL https://dotlet.app/install.sh | sh$ dot --version
dotlet v0.1.0Overview
The dotlet CLI lets you push configuration files from any machine to the cloud, organize them by device, and pull them back on another machine. Every push creates a new version, so you can always roll back or inspect history through the web interface.
The CLI is available as two equivalent binaries: dotlet and dot. All examples in this documentation use dot for brevity, but dotlet works identically.
$ dot <command> [options]
Commands:
login Sign in to your Dotlet account
logout Log out of your Dotlet account
push <path> Push a file or directory as an islet
pull <islet> Pull an islet
list List islets for a device
device Manage devicesLogin
Authenticate the CLI with your dotlet account. This initiates an OAuth2 device authorization flow -- a URL is opened in your browser where you approve the CLI.
$ dot loginThe command displays a verification URL and a one-time code. Once you approve in the browser, the CLI stores the access token locally and you're ready to push and pull.
dotlet login
┌─────────────────────────────────────────────┐
│ URL https://dotlet.app/oauth/device │
│ Code ABCD-1234 │
│ Expires about 15m 0s │
└─────────────────────────────────────────────┘
✔ Browser opened (0.3s)
⠋ Waiting for authorization...
✔ Login successful. CLI is now authorized.Logout
Terminate the current session and clear local authentication tokens. This removes the stored credentials from your machine.
$ dot logout✔ Logged out successfully.Push
Push a file or directory as an islet to your device. Each push creates a new version. If the content hasn't changed, the file is marked as unchanged.
$ dot push <path> [options]Arguments
<path>Options
-d, --device<name>-n, --name<name>-a, --absolute-m, --message<text>-v, --visibilitypublic | privateExamples
# Push a single config file
$ dot push ~/.config/ghostty/config
# Push an entire directory
$ dot push ~/.config/nvim
# Push to a specific device with a message
$ dot push ~/.zshrc -d laptop -m "added aliases"
# Push with absolute path storage
$ dot push ./.vscode/settings.json --absolute
# Push with a custom name
$ dot push ~/.config/ghostty/config -n ./ghostty/config
# Push as private
$ dot push ~/.ssh/config -v privatePull
Pull an islet and write the files to disk. By default, files are restored to their original paths. Existing files are skipped unless --force is used.
$ dot pull <islet> [options]Arguments
<islet>Options
-f, --force-p, --path<path>-d, --device<device | username/device>-v, --version<version>Pull Targets
The <islet> argument accepts three formats:
Just the islet name. Use your default device or -d / --device with a device name (your account) or username/device to target a specific account without using the full username/device:islet form.
$ dot pull ~/.zshrc
$ dot pull ./nvim/init.lua
$ dot pull ~/.zshrc?v=rev2
$ dot pull ~/.zshrc -d laptop
$ dot pull ~/.zshrc -d alice/laptopIncludes the username and device. No --device flag needed.
$ dot pull alice/laptop:~/.zshrc
$ dot pull alice/laptop:./nvim/init.lua?v=rev1A full URL from the dotlet web interface. Cannot be combined with --device.
$ dot pull "https://dotlet.app/alice/laptop/islet?n=~/.zshrc"
$ dot pull "https://dotlet.app/alice/laptop/islet?n=./nvim/init.lua&v=rev1"Examples
# Pull and restore to original path
$ dot pull ~/.zshrc
# Pull and overwrite existing files
$ dot pull ~/.zshrc --force
# Pull to a custom directory
$ dot pull ./nvim/init.lua -p ~/backup/init.lua
# Pull a specific version
$ dot pull ~/.zshrc -v rev3
# Short form with explicit username/device (-d)
$ dot pull ~/.zshrc -d alice/laptop
# Pull from another user's public islet (full form)
$ dot pull alice/laptop:~/.zshrcList
List all islets for the selected or specified device. --device accepts a device name on your account or username/device to list another user's device. Running dot with no subcommand is equivalent to dot list.
$ dot list [options]
$ dot # same as dot listOptions
-d, --device<device | username/device>Examples
$ dot list -d personal
$ dot list -d alice/laptop✔ Found 3 islets
personal
‣ .zshrc
‣ nvim/init.lua
‣ .config/ghostty/config✔ Found 2 islets
alice/laptop
‣ .zshrc
‣ nvim/init.luaDevice
Manage devices: list, create, or choose a default. Running dot device with no subcommand is equivalent to dot device list.
$ dot device [subcommand] [options]device list
List all devices. The current default device is highlighted.
$ dot device list [options]
$ dot device # same as dot device list-u, --username<name>✔ Fetched 2 devices
◉ personal public
◯ work privatedevice create
Register a new device.
$ dot device create <device name> [options]<device name>-v, --visibilitypublic | privateExamples
# Create a public device
$ dot device create laptop
# Create a private device
$ dot device create work -v privatedevice use
Set a device as the default. Subsequent commands that accept --device will use this device when the flag is omitted.
$ dot device use <device name><device name>Example
$ dot device use laptop✔ Default device set to laptopWorkflows
Common end-to-end scenarios combining multiple commands.
# Install
$ pnpm install -g dotlet
# Authenticate
$ dot login
# Create a device for this machine
$ dot device create macbook
# Set it as default
$ dot device use macbook# Push individual files
$ dot push ~/.zshrc
$ dot push ~/.gitconfig
# Push a config directory
$ dot push ~/.config/nvim
# Push with a version message
$ dot push ~/.config/ghostty/config -m "updated font size"# Install and login on the new machine
$ pnpm install -g dotlet
$ dot login
# Set the device
$ dot device use macbook
# List what's available
$ dot list
# Pull everything back
$ dot pull ~/.zshrc
$ dot pull ~/.gitconfig
$ dot pull ~/.config/nvim --force# Pull a public islet using the full form
$ dot pull alice/laptop:~/.zshrc
# Pull and save to a specific path
$ dot pull alice/laptop:nvim/init.lua -p ~/nvim/init.lua