OWL from the command line — for people and for AI agents
Everything OWL can do in the browser is scriptable: a single-file Python CLI with the full client-side (CSD) crypto, a browser-approved sign-in flow that never exposes your password to the terminal, and a scoped OAuth 2.0 API for integrations.
python3 owl.pyz help all, and sign in with python3 owl.pyz connect login — no password ever touches the terminal.1. Download the CLI
The owl CLI is a single file with no dependencies beyond Python 3.7+ — no pip installs, no config, and any Python works: the stock macOS /usr/bin/python3, distro Pythons, python.org and Homebrew builds, and whatever py launches on Windows. (An older interpreter prints exactly what to install instead of a traceback.) Crypto is pure stdlib, with an optional OpenSSL fast path that is byte-verified against the reference implementation before it is ever used. The CLI is byte-interoperable with the desktop and web clients: files it uploads, links it shares, and messages it sends use the same end-to-end encryption.
curl -fsSLO https://ndevr.org/cli/owl.pyz
python3 owl.pyz help all # Windows: py owl.pyz help allhelp all prints the complete command reference, generated from the live command tree, so it is never stale. The major groups: resource (files, folders, sharing, chat), pass (password vault), product (downloads), calendar, group, ai, and connect (scoped sign-in, below).
2. Sign in without typing a password
owl connect login uses the OAuth 2.0 device flow (RFC 8628). The terminal shows a short code and a link; you approve it in a browser where you're already signed in. The terminal — and any AI agent driving it — never sees your password.
python3 owl.pyz connect login
To approve this sign-in, open:
https://ndevr.org/activate?user_code=XXXX-XXXX
and confirm the code: XXXX-XXXXAfter approval the CLI holds a scoped access token (files:read, files:write) and can list, download, and upload your files with owl connect ls | pull | push. The session expires on its own within 8 hours (or after 30 idle minutes); owl connect logout ends it immediately.
For the full client experience with local client-side (CSD) crypto (chat, the password vault, sharing), sign in with python3 owl.pyz login instead — it asks for your password locally, derives keys in-process, and the password never leaves your machine.
3. Full sign-in through your browser
owl login --web gives the terminal the full client-side-crypto session — the same one owl login produces — without typing a password or a two-factor code into it. The CLI generates a one-shot P-256 key, prints (and opens) a sign-in link, and waits. You sign in on that page with the ordinary OWL sign-in card — password, authenticator code or recovery code, exactly as on the website — and press Approve. Your browser then encrypts a fresh session token plus your unwrapped OWL keypair straight to the CLI's one-shot key; NDEVR's server relays only that ciphertext and never holds your key.
python3 owl.pyz login --web
To sign in, open this link in a browser (it asks for your password and any two-factor code there):
https://ndevr.org/web/qr-login.html#request_id=…
waiting up to 5 minutes for the approval…
logged in as you (user #…), token expires …This is the right way to let an AI agent or a script sign the CLI in: it never sees your password, your code, or your key — it only runs the command and waits. Add --no-browser to print the link without launching a browser (for example on a machine reached over SSH; open the link on any signed-in device). The link expires after five minutes and can be used once. The resulting session behaves like any other CLI session (14 days; owl logout clears it locally).
connect login. The device flow above hands the server your key for a scoped, short-lived session. login --web keeps the key on your machine, in the CLI's local session cache, and unlocks everything the CLI can do — chat, the password vault, sharing, kanban.4. Retired link-based AI access
Pasted-link MCP authentication, editable-link bootstrap, link-based AI token minting, and the link-based GPT Actions are retired. Do not send private share URLs to those interfaces. Existing tokens can be reviewed or revoked with owl ai token list and owl ai token revoke.
Current file sharing uses owl resource share: it generates a private catalog link whose capability remains in the URL fragment. Public installers use owl product download, which saves the versioned installer filename and verifies the response version and SHA-256. Installers do not depend on file-share links.
5. Integrate over the OAuth 2.0 API
Third-party apps use OWL Connect: an OAuth 2.0 authorization server with consented, scoped, server-side-decrypt access — metadata at /.well-known/oauth-authorization-server.
| Endpoint | Purpose |
|---|---|
POST /api/connect/device/code | Start a device-flow authorization (public clients) |
GET /owl/connect-authorize | Redirect-based consent page (authorization code + PKCE) |
POST /api/connect/token | Exchange a code — or poll a device code — for an access token |
GET /api/connect/resources | List resources visible to the token (files:read) |
GET /api/connect/resource/{id} | Download one resource, decrypted (files:read) |
POST /api/connect/resource | Upload a new file (files:write) |
POST /api/connect/revoke | End the session now |
Client registrations are issued by NDEVR — contact us to register a redirect URI and scopes for your app. Most other /api/owl/* endpoints require an OWL session plus client-side key derivation; use the CLI for those rather than raw HTTP.
6. Clone the source repositories
NDEVR's source repos (including NDEVR_Source) are self-hosted right here, served as bare git over SSH:
git clone git@ndevr.org:NDEVR_Source.gitThere is no anonymous or HTTP clone: access requires an SSH public key registered with NDEVR plus a per-repo role. Roles and reviews are managed with the CLI (owl repo list | info | roles | grant, owl repo review-*), and code, history, and diffs are browsable signed-in at /owl/repos. Agents: if you're working on a machine that already has access, ~/.ssh/config typically carries a git@ndevr.org or ndevr-git host entry — check it before concluding you can't clone.
7. Scripting and automation notes
--jsonon most read commands emits machine-readable output; errors go to stderr and the exit code is 1 (usage errors: 2).- Text arguments accept
@fileand-(stdin) — use them for multiline content instead of shell escaping. - Non-interactive full sign-in reads
$NDEVR_OWL_PASSWORD; prompts fail fast when stdin is not a TTY, so scripts never hang. - Self-hosted OWL servers work with
--server https://your-host/; the device flow prints your host's own/activatelink, andNDEVR_OWL_CONNECT_CLIENToverrides the OAuth client id.