Documentation

Everything you need to deploy and operate Lockwave.

Quick Start

Get running in three steps:

  1. Create your account and set up your first team
  2. Generate an SSH key or import your existing public key
  3. Enroll your first host using the install command below
curl -fsSL https://lockwave.io/install.sh | sudo bash -s -- \
  --token YOUR_ENROLLMENT_TOKEN \
  --api-url https://lockwave.io \
  --os-user deploy

The enrollment token is generated in the dashboard when you enroll a new host. It expires after 15 minutes.

Architecture

Lockwave consists of two components:

  • Control Plane - The Lockwave web application that stores teams, SSH public keys, hosts, and assignments. It computes the desired state for each host and serves it via a REST API.
  • Daemon (lockwaved) - A statically compiled Go binary that runs on each managed host. It polls the control plane over outbound HTTPS, computes the delta between current and desired state, and atomically rewrites the authorized_keys file.

The daemon never opens inbound ports. All communication flows from the daemon to the control plane, never the reverse. This means you don't need to modify firewall rules or open SSH tunnels.

Daemon Installation

The install script downloads the correct binary for your architecture, creates a systemd service, and registers the host with the control plane.

Supported Platforms

  • Linux (amd64, arm64)
  • macOS / Darwin (amd64, arm64)
  • FreeBSD (amd64)

Verifying Installation

systemctl status lockwaved
journalctl -u lockwaved -f

The host should appear in your dashboard with a "healthy" status within 60 seconds.

Key Management

Lockwave supports two key types:

  • ed25519 - Default and recommended. Smaller, faster, and more secure than RSA.
  • RSA 4096 - For legacy compatibility with older SSH clients or servers.

Keys can be generated server-side (the private key is shown once and never stored) or imported by pasting your existing public key.

Keys are scoped to teams. Visibility options:

  • Personal - Only visible to the key owner
  • Shared - Visible to team admins and owners

Assignments

Assignments map SSH keys to hosts and OS users. They define the desired state of each authorized_keys file.

Create an assignment to grant access. Delete it to revoke. Changes propagate to all affected hosts on the next daemon sync cycle.

Sync intervals depend on your plan: Free (5 min), Standard (2 min), Business (1 min), Enterprise (30 sec).

API Reference

The Lockwave REST API lets you manage all resources programmatically. All endpoints are versioned under /api/v1/.

Authentication

Create an API token from your profile settings. Include it as a Bearer token in every request:

curl -H "Authorization: Bearer YOUR_API_TOKEN" \
     -H "Accept: application/json" \
     https://lockwave.io/api/v1/ssh-keys

Team Context

All endpoints operate in the context of a team. By default, your current team is used. To target a different team, pass the X-Team-Id header:

curl -H "Authorization: Bearer YOUR_API_TOKEN" \
     -H "X-Team-Id: YOUR_TEAM_UUID" \
     -H "Accept: application/json" \
     https://lockwave.io/api/v1/hosts

Base URL

https://lockwave.io/api/v1/

Endpoints

User & Teams

MethodPathDescription
GET/api/v1/userAuthenticated user profile
GET/api/v1/teamsList your teams
GET/api/v1/teams/{team}Show team details

SSH Keys

MethodPathDescription
GET/api/v1/ssh-keysList team keys
POST/api/v1/ssh-keysImport or generate key
GET/api/v1/ssh-keys/{id}Show key details
PATCH/api/v1/ssh-keys/{id}Update key name/comment
DELETE/api/v1/ssh-keys/{id}Soft-delete key
POST/api/v1/ssh-keys/{id}/blockBlock key
POST/api/v1/ssh-keys/{id}/unblockUnblock key

Hosts

MethodPathDescription
GET/api/v1/hostsList team hosts
POST/api/v1/hostsCreate host
GET/api/v1/hosts/{id}Show host detail
PATCH/api/v1/hosts/{id}Update host
DELETE/api/v1/hosts/{id}Delete host

Host Users

MethodPathDescription
GET/api/v1/hosts/{id}/usersList OS users
POST/api/v1/hosts/{id}/usersCreate OS user
PATCH/api/v1/hosts/{id}/users/{uid}Update OS user
DELETE/api/v1/hosts/{id}/users/{uid}Delete OS user

Enrollment & Credentials

MethodPathDescription
POST/api/v1/hosts/{id}/enrollment-tokensGenerate enrollment token
POST/api/v1/hosts/{id}/credentials/rotateRotate daemon credentials

Assignments

MethodPathDescription
GET/api/v1/assignmentsList team assignments
POST/api/v1/assignmentsCreate assignment
GET/api/v1/assignments/{id}Show assignment
DELETE/api/v1/assignments/{id}Delete assignment

Break Glass

MethodPathDescription
GET/api/v1/break-glassList events
POST/api/v1/break-glass/activateActivate break glass
POST/api/v1/break-glass/{id}/deactivateDeactivate break glass

Audit Events

MethodPathDescription
GET/api/v1/audit-eventsList paginated audit log
GET/api/v1/audit-events/{id}Show single event

Reports

MethodPathDescription
GET/api/v1/reportsList reports
POST/api/v1/reportsRequest new report
GET/api/v1/reports/{id}/downloadDownload report file

Request Examples

List SSH Keys

curl -s -H "Authorization: Bearer $TOKEN" \
     -H "Accept: application/json" \
     https://lockwave.io/api/v1/ssh-keys

Create a Host

curl -s -X POST \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"display_name":"web-01","hostname":"web-01.example.com","os":"linux","arch":"amd64"}' \
     https://lockwave.io/api/v1/hosts

Create an Assignment

curl -s -X POST \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json" \
     -d '{"host_user_id":"HOST_USER_UUID","ssh_key_id":"SSH_KEY_UUID"}' \
     https://lockwave.io/api/v1/assignments

Cursor Pagination

All list endpoints use cursor-based pagination. Results include next_cursor and prev_cursor in the meta object. Pass ?cursor=VALUE to navigate pages. Default page size is 25 items.

Error Handling

All errors return a consistent JSON format:

{
  "message": "The given data was invalid.",
  "errors": {
    "name": ["The name field is required."]
  }
}
StatusMeaning
400Bad request / malformed JSON
401Missing or invalid token
403Insufficient permissions
404Resource not found
422Validation error
429Rate limit exceeded

Rate Limiting

The API allows 60 requests per minute per authenticated user. Rate limit status is returned in response headers:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57

When the limit is exceeded, a 429 Too Many Requests response is returned with a Retry-After header indicating seconds to wait.

MCP Server

Lockwave exposes a Model Context Protocol (MCP) server so AI assistants and agents can interact with your team's data—hosts, SSH keys, assignments, break-glass, reports, and audit—using tools, resources, and prompts.

Endpoint

POST http://lockwave.io/mcp/lockwave

All MCP JSON-RPC requests (initialize, tools/list, tools/call, resources/read, prompts/get, etc.) are sent as POST to this URL.

Authentication

Use the same API token as the REST API. Send it as a Bearer token in the Authorization header:

Authorization: Bearer YOUR_API_TOKEN

Your user must have a current team set (the same team context as the REST API). All tools and resources are scoped to that team.

Capabilities

The Lockwave MCP server provides:

  • Tools — List and get hosts, SSH keys, assignments; create or delete assignments; list/activate/deactivate break-glass events; list or request compliance reports; list audit events.
  • Resources — Static docs (overview, team summary) and URI-templated resources for host and key details (lockwave://hosts/{id}, lockwave://keys/{id}).
  • Prompts — Reusable prompts to summarize the team or guide adding a key to a host.

Supported MCP clients

Add the Lockwave MCP server in any of these clients using the endpoint and Bearer token above.

Cursor Cursor
Claude Desktop Claude Desktop
Claude Code Claude Code
Gemini Gemini
OpenAI OpenAI

Client-specific setup

Cursor
  1. Open Settings (Cmd + , or Ctrl + ,) and go to Tools & MCP.
  2. Click Add new MCP server.
  3. Set Type to streamableHttp, URL to the endpoint above, and add header Authorization: Bearer YOUR_API_TOKEN.
  4. Restart Cursor for changes to take effect.
Claude (Desktop)
  1. In Claude Desktop, go to SettingsDeveloperEdit Config.
  2. Add an MCP server entry with the Lockwave endpoint URL and configure your API token (e.g. in headers or env depending on your client version).
  3. Restart Claude Desktop after saving the config.
Claude Code

Claude Code (VS Code / IDE) can use the same config file as Claude Desktop, or you can add the Lockwave server via the CLI:

  1. Open a terminal and run (--scope user saves to your user config):
claude mcp add --transport http --header "Authorization: Bearer YOUR_API_TOKEN" --scope user lockwave http://lockwave.io/mcp/lockwave
  1. Restart Claude Code, then verify with claude mcp list.

Alternatively, edit the config file directly (~/Library/Application Support/Claude/claude_desktop_config.json on macOS) and add an MCP server entry with the Lockwave URL and Authorization: Bearer YOUR_API_TOKEN in headers.

Gemini CLI
  1. From the terminal, add the Lockwave server with HTTP transport and Bearer token:
gemini mcp add --transport http --header "Authorization: Bearer YOUR_API_TOKEN" lockwave http://lockwave.io/mcp/lockwave

Or add the server in .gemini/settings.json or ~/.gemini/settings.json under mcpServers.

OpenAI (ChatGPT)
  1. Enable Developer mode in workspace settings (available on Business and Enterprise plans).
  2. Add an MCP app with the Lockwave server URL and set authentication to use your API token as a Bearer token.
  3. Only workspace admins or owners can publish MCP apps.

Protocol reference

Configure your MCP client with the URL above and add the Authorization: Bearer YOUR_TOKEN header. For protocol details, see the Model Context Protocol specification.

Security Model

Lockwave's security model is built on four principles:

  • Outbound-only - The daemon only makes outbound HTTPS requests. No inbound ports, no SSH tunnels.
  • No private keys - We only store public keys. Private keys are generated and delivered once, then discarded.
  • Atomic writes - POSIX file locking and rename prevent corrupted authorized_keys files.
  • Immutable audit - Every action is logged in an append-only log. Break-glass, drift events, and credential rotations are all recorded.

Report security issues to security@lockwave.io.

Deploy in Under 5 Minutes

Start free. Run the install script on your first host and see keys sync.