v2.31.0-dev16 8d0a092

remote-cli.md RawHistoryFolder

Remote CLI Management

Manage Gordon instances remotely using the CLI with the --remote flag or saved remotes.

By default (without --remote), management commands execute locally through in-process services.

What You'll Learn

  • Using global --remote and --token flags
  • Saving and managing remote connections
  • Environment variable configuration
  • Token security best practices
  • Remote command workflows

Prerequisites

  • Gordon CLI installed
  • A remote Gordon instance running with admin API enabled
  • Authentication token for the remote instance

Understanding the Remote URL

Default: use the Gordon domain configured on the remote instance.

# On the remote Gordon server
[server]
gordon_domain = "gordon.example.com"  # Use this as --remote URL

The CLI connects to https://gordon.example.com/admin/* endpoints.

Private tailnet setup (recommended for hardened VPS): keep using the HTTPS domain, point that DNS record to the VPS tailnet IP, and set insecure TLS for self-signed certs.

[!CAUTION] --insecure and insecure_tls = true disable TLS certificate verification. This removes server identity validation and increases man-in-the-middle risk. Use this only for private tailnet/VPN deployments with strict network access controls (restricted CIDRs, firewall allowlists, and no public ingress to admin endpoints). Safer alternatives:

  • Use a publicly trusted certificate (for example, Let's Encrypt).
  • Use an internal CA and trust that CA on operator machines.
  • Use Tailscale certificate generation (tailscale cert) and serve Gordon with that cert.
# Save remote once
gordon remotes add tailnet-reg https://gordon.example.com --token-env GORDON_TOKEN --insecure
gordon remotes use tailnet-reg

# Use it for auth/admin commands
gordon auth login
gordon routes list

Equivalent remotes.toml entry:

active = "tailnet-reg"

[remotes.tailnet-reg]
url = "https://gordon.example.com"
token_env = "GORDON_TOKEN"
insecure_tls = true

Use this mode when registry/auth/admin access is intentionally restricted to tailnet CIDRs.

Quick Start

One-off Remote Command

gordon routes list --remote https://gordon.mydomain.com --token $TOKEN

Using Environment Variables

export GORDON_REMOTE=https://gordon.mydomain.com
export GORDON_TOKEN=$TOKEN
gordon routes list

Using Saved Remotes

# Add a remote
gordon remotes add prod https://gordon.mydomain.com --token-env PROD_TOKEN

# Set as active
gordon remotes use prod

# Now use without flags
gordon routes list

Global Flags

These flags are available on all commands:

Flag Description
--remote <URL> Remote Gordon URL
--token <TOKEN> Authentication token
--insecure Skip TLS verification (self-signed/private certs)
# List routes on remote
gordon routes list --remote https://gordon.mydomain.com --token $TOKEN

# Manage secrets on remote
gordon secrets list myapp.example.com --remote https://gordon.mydomain.com --token $TOKEN

Environment Variables

Variable Description
GORDON_REMOTE Remote Gordon URL
GORDON_TOKEN Authentication token

Environment variables are useful for CI/CD pipelines and shell sessions:

# Set for current session
export GORDON_REMOTE=https://gordon.mydomain.com
export GORDON_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

# Commands automatically use these
gordon routes list
gordon secrets list myapp.example.com

Saved Remotes

Save frequently used remotes to avoid repeating URLs and tokens.

Configuration File

Remotes are stored in ~/.config/gordon/remotes.toml:

active = "prod"

[remotes.prod]
url = "https://gordon.mydomain.com"
token_env = "PROD_TOKEN"

[remotes.staging]
url = "https://staging.mydomain.com"
token = "eyJ..."

Managing Remotes

List Remotes

gordon remotes list

Output:

Saved Remotes

Name            URL                                    Token           Status
──────────────────────────────────────────────────────────────────────────────
prod            https://gordon.mydomain.com            $PROD_TOKEN     active
staging         https://staging.mydomain.com           set
dev             https://dev.mydomain.com               none

Add a Remote

# Basic (no token)
gordon remotes add prod https://gordon.mydomain.com

# With direct token
gordon remotes add prod https://gordon.mydomain.com --token eyJ...

# With environment variable reference (recommended)
gordon remotes add prod https://gordon.mydomain.com --token-env PROD_TOKEN
Flag Description
--token <TOKEN> Store token directly in config
--token-env <VAR> Store env variable name (token resolved at runtime)

Authenticate with Password Auth

For servers using password authentication, you can log in interactively:

# Login to active remote
gordon auth login

# Login to specific remote
gordon auth login --remote prod

# Pre-fill username
gordon auth login --username admin

This prompts for your username and password, authenticates with the remote server, and stores the returned token automatically.

Note: Only works with servers that have password authentication enabled (username + password_hash configured). For token-only servers, use gordon remotes set-token instead.

Set Token Manually

For servers using token-based auth, or to update a token manually:

# Set token directly
gordon remotes set-token prod eyJhbGciOiJIUzI1NiIs...

# Set token from file
gordon remotes set-token staging $(cat token.txt)

Remove a Remote

# With confirmation prompt
gordon remotes remove staging

# Skip confirmation
gordon remotes remove staging --force

Set Active Remote

gordon remotes use prod

When a remote is active, it's used automatically for all remote-capable commands:

gordon remotes use prod
gordon routes list              # Uses prod remote
gordon secrets list app.com     # Uses prod remote

Resolution Precedence

When multiple sources specify remote or token, the CLI uses this priority order:

Remote URL:

  1. --remote flag
  2. GORDON_REMOTE environment variable
  3. Active remote from remotes.toml

Token:

  1. --token flag
  2. GORDON_TOKEN environment variable
  3. Token from active remote in remotes.toml

This allows overriding specific values while keeping defaults:

# Active remote is prod, but use different token
gordon routes list --token $TEMPORARY_TOKEN

Commands Supporting Remote

These commands work with remote targeting:

Command Description
gordon routes list List all routes
gordon routes add <domain> <image> Add a route
gordon routes remove <domain> Remove a route
gordon routes deploy <domain> Deploy/redeploy a route
gordon attachments list [target] List all or targeted attachments
gordon attachments add <target> <image> Add an attachment
gordon attachments remove <target> <image> Remove an attachment
gordon secrets list <domain> List secrets for a domain
gordon secrets set <domain> KEY=value Set secrets
gordon secrets remove <domain> <key> Remove a secret
gordon status Show server status
gordon reload Reload config and start new routes
gordon logs View Gordon process logs
gordon logs <domain> View container logs

Remote Logs Requirement

The gordon logs command requires file logging to be enabled on the remote server. Without it, you'll get a "failed to get logs" error.

On the remote Gordon server, add to config.toml:

[logging.file]
enabled = true
# path is optional - defaults to {data_dir}/logs/gordon.log
# path = "/var/log/gordon/gordon.log"

Then restart Gordon. The log directory will be created automatically in your data directory (e.g., ~/.gordon/logs/).

If you specify a custom path, ensure the directory exists and is writable:

sudo mkdir -p /var/log/gordon
sudo chown gordon:gordon /var/log/gordon  # adjust user as needed

Note: When running as a systemd service, Gordon logs to journalctl by default. However, the remote admin API cannot read from journalctl—it reads from the configured log file. Both can be used simultaneously.

Token Security

Store the environment variable name, not the actual token:

gordon remotes add prod https://gordon.mydomain.com --token-env PROD_TOKEN

The remotes.toml stores only:

[remotes.prod]
url = "https://gordon.mydomain.com"
token_env = "PROD_TOKEN"

At runtime, Gordon reads $PROD_TOKEN from the environment.

Benefits:

  • Token not stored in plaintext config
  • Works with secret managers that inject env vars
  • Easy rotation without editing config

Option 2: Direct Token Storage

gordon remotes add prod https://gordon.mydomain.com --token eyJ...

The token is stored directly in remotes.toml:

[remotes.prod]
url = "https://gordon.mydomain.com"
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

Security note: Ensure remotes.toml has restricted permissions:

chmod 600 ~/.config/gordon/remotes.toml

Option 3: Environment Variables Only

For maximum security, don't save tokens at all:

# Add remote without token
gordon remotes add prod https://gordon.mydomain.com

# Set token via environment
export GORDON_TOKEN=$TOKEN

# Use normally
gordon remotes use prod
gordon routes list

Workflow Examples

Development Workflow

# Add dev and staging remotes
gordon remotes add dev https://gordon.dev.local --token-env DEV_TOKEN
gordon remotes add staging https://gordon.staging.example.com --token-env STAGING_TOKEN

# Work with dev
gordon remotes use dev
gordon routes list
gordon routes add myapp.dev.local myapp:latest

# Switch to staging
gordon remotes use staging
gordon routes list

CI/CD Pipeline

# GitHub Actions example
env:
  GORDON_REMOTE: ${{ secrets.GORDON_URL }}
  GORDON_TOKEN: ${{ secrets.GORDON_TOKEN }}

steps:
  - name: Deploy to Gordon
    run: |
      gordon routes deploy myapp.example.com
# GitLab CI example
deploy:
  script:
    - export GORDON_REMOTE=$GORDON_URL
    - export GORDON_TOKEN=$GORDON_TOKEN
    - gordon routes deploy myapp.example.com

Multi-Environment Management

# Add all environments
gordon remotes add prod https://gordon.example.com --token-env PROD_TOKEN
gordon remotes add staging https://gordon.staging.example.com --token-env STAGING_TOKEN
gordon remotes add dev https://gordon.dev.example.com --token-env DEV_TOKEN

# Compare routes across environments
gordon routes list --remote https://gordon.example.com --token $PROD_TOKEN
gordon routes list --remote https://gordon.staging.example.com --token $STAGING_TOKEN

# Or switch active
gordon remotes use prod && gordon routes list
gordon remotes use staging && gordon routes list

Troubleshooting

"unauthorized" Error

Token is missing, expired, or invalid.

# Check if token is set
echo $GORDON_TOKEN

# Verify token works
gordon routes list --remote https://gordon.mydomain.com --token $TOKEN

"connection refused" Error

Remote Gordon isn't running or URL is wrong.

# Verify URL is correct
curl https://gordon.mydomain.com/health

# Check if admin API is enabled on remote
# The remote gordon.toml needs:
# [admin]
# enabled = true

Remote Not Found

The specified remote doesn't exist in remotes.toml.

# List available remotes
gordon remotes list

# Add the remote
gordon remotes add myremote https://gordon.mydomain.com

Active Remote Cleared

After removing the active remote, you need to set a new active:

gordon remotes use prod

Or use explicit flags:

gordon routes list --remote https://gordon.mydomain.com --token $TOKEN

"failed to get logs" Error

The remote Gordon server doesn't have file logging enabled.

# Error: failed to get process logs: 500 Internal Server Error: failed to get logs

On the remote server, enable file logging in config.toml:

[logging.file]
enabled = true
path = "/var/log/gordon/gordon.log"

See Remote Logs Requirement for details.

source
1# Remote CLI Management
2
3Manage Gordon instances remotely using the CLI with the `--remote` flag or saved remotes.
4
5By default (without `--remote`), management commands execute locally through in-process services.
6
7## What You'll Learn
8
9- Using global `--remote` and `--token` flags
10- Saving and managing remote connections
11- Environment variable configuration
12- Token security best practices
13- Remote command workflows
14
15## Prerequisites
16
17- Gordon CLI installed
18- A remote Gordon instance running with admin API enabled
19- Authentication token for the remote instance
20
21## Understanding the Remote URL
22
23Default: use the Gordon domain configured on the remote instance.
24
25```toml
26# On the remote Gordon server
27[server]
28gordon_domain = "gordon.example.com"  # Use this as --remote URL
29```
30
31The CLI connects to `https://gordon.example.com/admin/*` endpoints.
32
33Private tailnet setup (recommended for hardened VPS): keep using the HTTPS domain, point that DNS record to the VPS tailnet IP, and set insecure TLS for self-signed certs.
34
35> [!CAUTION]
36> `--insecure` and `insecure_tls = true` disable TLS certificate verification.
37> This removes server identity validation and increases man-in-the-middle risk.
38> Use this only for private tailnet/VPN deployments with strict network access controls (restricted CIDRs, firewall allowlists, and no public ingress to admin endpoints).
39> Safer alternatives:
40> - Use a publicly trusted certificate (for example, Let's Encrypt).
41> - Use an internal CA and trust that CA on operator machines.
42> - Use Tailscale certificate generation (`tailscale cert`) and serve Gordon with that cert.
43
44```bash
45# Save remote once
46gordon remotes add tailnet-reg https://gordon.example.com --token-env GORDON_TOKEN --insecure
47gordon remotes use tailnet-reg
48
49# Use it for auth/admin commands
50gordon auth login
51gordon routes list
52```
53
54Equivalent `remotes.toml` entry:
55
56```toml
57active = "tailnet-reg"
58
59[remotes.tailnet-reg]
60url = "https://gordon.example.com"
61token_env = "GORDON_TOKEN"
62insecure_tls = true
63```
64
65Use this mode when registry/auth/admin access is intentionally restricted to tailnet CIDRs.
66
67## Quick Start
68
69### One-off Remote Command
70
71```bash
72gordon routes list --remote https://gordon.mydomain.com --token $TOKEN
73```
74
75### Using Environment Variables
76
77```bash
78export GORDON_REMOTE=https://gordon.mydomain.com
79export GORDON_TOKEN=$TOKEN
80gordon routes list
81```
82
83### Using Saved Remotes
84
85```bash
86# Add a remote
87gordon remotes add prod https://gordon.mydomain.com --token-env PROD_TOKEN
88
89# Set as active
90gordon remotes use prod
91
92# Now use without flags
93gordon routes list
94```
95
96## Global Flags
97
98These flags are available on all commands:
99
100| Flag | Description |
101|------|-------------|
102| `--remote <URL>` | Remote Gordon URL |
103| `--token <TOKEN>` | Authentication token |
104| `--insecure` | Skip TLS verification (self-signed/private certs) |
105
106```bash
107# List routes on remote
108gordon routes list --remote https://gordon.mydomain.com --token $TOKEN
109
110# Manage secrets on remote
111gordon secrets list myapp.example.com --remote https://gordon.mydomain.com --token $TOKEN
112```
113
114## Environment Variables
115
116| Variable | Description |
117|----------|-------------|
118| `GORDON_REMOTE` | Remote Gordon URL |
119| `GORDON_TOKEN` | Authentication token |
120
121Environment variables are useful for CI/CD pipelines and shell sessions:
122
123```bash
124# Set for current session
125export GORDON_REMOTE=https://gordon.mydomain.com
126export GORDON_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
127
128# Commands automatically use these
129gordon routes list
130gordon secrets list myapp.example.com
131```
132
133## Saved Remotes
134
135Save frequently used remotes to avoid repeating URLs and tokens.
136
137### Configuration File
138
139Remotes are stored in `~/.config/gordon/remotes.toml`:
140
141```toml
142active = "prod"
143
144[remotes.prod]
145url = "https://gordon.mydomain.com"
146token_env = "PROD_TOKEN"
147
148[remotes.staging]
149url = "https://staging.mydomain.com"
150token = "eyJ..."
151```
152
153### Managing Remotes
154
155#### List Remotes
156
157```bash
158gordon remotes list
159```
160
161Output:
162
163```
164Saved Remotes
165
166Name            URL                                    Token           Status
167──────────────────────────────────────────────────────────────────────────────
168prod            https://gordon.mydomain.com            $PROD_TOKEN     active
169staging         https://staging.mydomain.com           set
170dev             https://dev.mydomain.com               none
171```
172
173#### Add a Remote
174
175```bash
176# Basic (no token)
177gordon remotes add prod https://gordon.mydomain.com
178
179# With direct token
180gordon remotes add prod https://gordon.mydomain.com --token eyJ...
181
182# With environment variable reference (recommended)
183gordon remotes add prod https://gordon.mydomain.com --token-env PROD_TOKEN
184```
185
186| Flag | Description |
187|------|-------------|
188| `--token <TOKEN>` | Store token directly in config |
189| `--token-env <VAR>` | Store env variable name (token resolved at runtime) |
190
191#### Authenticate with Password Auth
192
193For servers using password authentication, you can log in interactively:
194
195```bash
196# Login to active remote
197gordon auth login
198
199# Login to specific remote
200gordon auth login --remote prod
201
202# Pre-fill username
203gordon auth login --username admin
204```
205
206This prompts for your username and password, authenticates with the remote server, and stores the returned token automatically.
207
208> **Note:** Only works with servers that have password authentication enabled (`username` + `password_hash` configured). For token-only servers, use `gordon remotes set-token` instead.
209
210#### Set Token Manually
211
212For servers using token-based auth, or to update a token manually:
213
214```bash
215# Set token directly
216gordon remotes set-token prod eyJhbGciOiJIUzI1NiIs...
217
218# Set token from file
219gordon remotes set-token staging $(cat token.txt)
220```
221
222#### Remove a Remote
223
224```bash
225# With confirmation prompt
226gordon remotes remove staging
227
228# Skip confirmation
229gordon remotes remove staging --force
230```
231
232#### Set Active Remote
233
234```bash
235gordon remotes use prod
236```
237
238When a remote is active, it's used automatically for all remote-capable commands:
239
240```bash
241gordon remotes use prod
242gordon routes list              # Uses prod remote
243gordon secrets list app.com     # Uses prod remote
244```
245
246## Resolution Precedence
247
248When multiple sources specify remote or token, the CLI uses this priority order:
249
250**Remote URL:**
2511. `--remote` flag
2522. `GORDON_REMOTE` environment variable
2533. Active remote from `remotes.toml`
254
255**Token:**
2561. `--token` flag
2572. `GORDON_TOKEN` environment variable
2583. Token from active remote in `remotes.toml`
259
260This allows overriding specific values while keeping defaults:
261
262```bash
263# Active remote is prod, but use different token
264gordon routes list --token $TEMPORARY_TOKEN
265```
266
267## Commands Supporting Remote
268
269These commands work with remote targeting:
270
271| Command | Description |
272|---------|-------------|
273| `gordon routes list` | List all routes |
274| `gordon routes add <domain> <image>` | Add a route |
275| `gordon routes remove <domain>` | Remove a route |
276| `gordon routes deploy <domain>` | Deploy/redeploy a route |
277| `gordon attachments list [target]` | List all or targeted attachments |
278| `gordon attachments add <target> <image>` | Add an attachment |
279| `gordon attachments remove <target> <image>` | Remove an attachment |
280| `gordon secrets list <domain>` | List secrets for a domain |
281| `gordon secrets set <domain> KEY=value` | Set secrets |
282| `gordon secrets remove <domain> <key>` | Remove a secret |
283| `gordon status` | Show server status |
284| `gordon reload` | Reload config and start new routes |
285| `gordon logs` | View Gordon process logs |
286| `gordon logs <domain>` | View container logs |
287
288### Remote Logs Requirement
289
290The `gordon logs` command requires **file logging to be enabled** on the remote server. Without it, you'll get a "failed to get logs" error.
291
292On the remote Gordon server, add to `config.toml`:
293
294```toml
295[logging.file]
296enabled = true
297# path is optional - defaults to {data_dir}/logs/gordon.log
298# path = "/var/log/gordon/gordon.log"
299```
300
301Then restart Gordon. The log directory will be created automatically in your data directory (e.g., `~/.gordon/logs/`).
302
303If you specify a custom path, ensure the directory exists and is writable:
304
305```bash
306sudo mkdir -p /var/log/gordon
307sudo chown gordon:gordon /var/log/gordon  # adjust user as needed
308```
309
310> **Note:** When running as a systemd service, Gordon logs to journalctl by default. However, the remote admin API cannot read from journalctl—it reads from the configured log file. Both can be used simultaneously.
311
312## Token Security
313
314### Option 1: Environment Variable Reference (Recommended)
315
316Store the environment variable name, not the actual token:
317
318```bash
319gordon remotes add prod https://gordon.mydomain.com --token-env PROD_TOKEN
320```
321
322The `remotes.toml` stores only:
323
324```toml
325[remotes.prod]
326url = "https://gordon.mydomain.com"
327token_env = "PROD_TOKEN"
328```
329
330At runtime, Gordon reads `$PROD_TOKEN` from the environment.
331
332**Benefits:**
333- Token not stored in plaintext config
334- Works with secret managers that inject env vars
335- Easy rotation without editing config
336
337### Option 2: Direct Token Storage
338
339```bash
340gordon remotes add prod https://gordon.mydomain.com --token eyJ...
341```
342
343The token is stored directly in `remotes.toml`:
344
345```toml
346[remotes.prod]
347url = "https://gordon.mydomain.com"
348token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
349```
350
351**Security note:** Ensure `remotes.toml` has restricted permissions:
352
353```bash
354chmod 600 ~/.config/gordon/remotes.toml
355```
356
357### Option 3: Environment Variables Only
358
359For maximum security, don't save tokens at all:
360
361```bash
362# Add remote without token
363gordon remotes add prod https://gordon.mydomain.com
364
365# Set token via environment
366export GORDON_TOKEN=$TOKEN
367
368# Use normally
369gordon remotes use prod
370gordon routes list
371```
372
373## Workflow Examples
374
375### Development Workflow
376
377```bash
378# Add dev and staging remotes
379gordon remotes add dev https://gordon.dev.local --token-env DEV_TOKEN
380gordon remotes add staging https://gordon.staging.example.com --token-env STAGING_TOKEN
381
382# Work with dev
383gordon remotes use dev
384gordon routes list
385gordon routes add myapp.dev.local myapp:latest
386
387# Switch to staging
388gordon remotes use staging
389gordon routes list
390```
391
392### CI/CD Pipeline
393
394```yaml
395# GitHub Actions example
396env:
397  GORDON_REMOTE: ${{ secrets.GORDON_URL }}
398  GORDON_TOKEN: ${{ secrets.GORDON_TOKEN }}
399
400steps:
401  - name: Deploy to Gordon
402    run: |
403      gordon routes deploy myapp.example.com
404```
405
406```bash
407# GitLab CI example
408deploy:
409  script:
410    - export GORDON_REMOTE=$GORDON_URL
411    - export GORDON_TOKEN=$GORDON_TOKEN
412    - gordon routes deploy myapp.example.com
413```
414
415### Multi-Environment Management
416
417```bash
418# Add all environments
419gordon remotes add prod https://gordon.example.com --token-env PROD_TOKEN
420gordon remotes add staging https://gordon.staging.example.com --token-env STAGING_TOKEN
421gordon remotes add dev https://gordon.dev.example.com --token-env DEV_TOKEN
422
423# Compare routes across environments
424gordon routes list --remote https://gordon.example.com --token $PROD_TOKEN
425gordon routes list --remote https://gordon.staging.example.com --token $STAGING_TOKEN
426
427# Or switch active
428gordon remotes use prod && gordon routes list
429gordon remotes use staging && gordon routes list
430```
431
432## Troubleshooting
433
434### "unauthorized" Error
435
436Token is missing, expired, or invalid.
437
438```bash
439# Check if token is set
440echo $GORDON_TOKEN
441
442# Verify token works
443gordon routes list --remote https://gordon.mydomain.com --token $TOKEN
444```
445
446### "connection refused" Error
447
448Remote Gordon isn't running or URL is wrong.
449
450```bash
451# Verify URL is correct
452curl https://gordon.mydomain.com/health
453
454# Check if admin API is enabled on remote
455# The remote gordon.toml needs:
456# [admin]
457# enabled = true
458```
459
460### Remote Not Found
461
462The specified remote doesn't exist in `remotes.toml`.
463
464```bash
465# List available remotes
466gordon remotes list
467
468# Add the remote
469gordon remotes add myremote https://gordon.mydomain.com
470```
471
472### Active Remote Cleared
473
474After removing the active remote, you need to set a new active:
475
476```bash
477gordon remotes use prod
478```
479
480Or use explicit flags:
481
482```bash
483gordon routes list --remote https://gordon.mydomain.com --token $TOKEN
484```
485
486### "failed to get logs" Error
487
488The remote Gordon server doesn't have file logging enabled.
489
490```bash
491# Error: failed to get process logs: 500 Internal Server Error: failed to get logs
492```
493
494On the remote server, enable file logging in `config.toml`:
495
496```toml
497[logging.file]
498enabled = true
499path = "/var/log/gordon/gordon.log"
500```
501
502See [Remote Logs Requirement](#remote-logs-requirement) for details.
503
504## Related
505
506- [CLI Commands](/docs/cli/index.md)
507- [Authentication](/docs/config/auth.md)
508- [Attachments](/docs/config/attachments.md)

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close