v2.15.1 c808592

remote-cli.md RawHistoryFolder

Remote CLI Management

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

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