@agent-link/server 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # AgentLink Server
2
+
3
+ Relay server for [AgentLink](https://github.com/anthropics/agentlink) — use Claude Code from any browser.
4
+
5
+ AgentLink lets you run Claude Code on your local machine and access it through a web interface. The server acts as a WebSocket relay between your browser and the local agent.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g @agent-link/server
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```bash
16
+ # Start server (foreground)
17
+ agentlink-server start --port 3456
18
+
19
+ # Start server (background)
20
+ agentlink-server start --daemon --port 3456
21
+
22
+ # Stop server
23
+ agentlink-server stop
24
+
25
+ # Check status
26
+ agentlink-server status
27
+
28
+ # Auto-start on boot
29
+ agentlink-server service install --port 3456
30
+ agentlink-server service uninstall
31
+ ```
32
+
33
+ ## How it works
34
+
35
+ ```
36
+ Browser ↔ AgentLink Server ↔ AgentLink Client ↔ Claude Code
37
+ (web) (relay) (your machine) (CLI)
38
+ ```
39
+
40
+ The server is a lightweight Express + WebSocket relay. It serves the web UI and forwards messages between the browser and the agent. No data is stored on the server.
41
+
42
+ ## Related
43
+
44
+ - **[@agent-link/agent](https://www.npmjs.com/package/@agent-link/agent)** — Local agent CLI (install this on your dev machine)
package/dist/cli.js CHANGED
@@ -5,6 +5,7 @@ import { openSync } from 'fs';
5
5
  import { join, dirname, resolve } from 'path';
6
6
  import { fileURLToPath } from 'url';
7
7
  import { loadServerRuntimeState, clearServerRuntimeState, getLogDir, killProcess, isProcessAlive, } from './config.js';
8
+ import { serverServiceInstall, serverServiceUninstall } from './service.js';
8
9
  const program = new Command();
9
10
  program
10
11
  .name('agentlink-server')
@@ -121,5 +122,25 @@ program
121
122
  console.log(` Started: ${state.startedAt}`);
122
123
  }
123
124
  });
125
+ // ── Service management ──
126
+ const serviceCmd = program
127
+ .command('service')
128
+ .description('Manage auto-start service');
129
+ serviceCmd
130
+ .command('install')
131
+ .description('Register server as an auto-start service and start it now')
132
+ .option('-p, --port <port>', 'Server port', '3456')
133
+ .action((options) => {
134
+ serverServiceInstall(parseInt(options.port, 10));
135
+ });
136
+ serviceCmd
137
+ .command('uninstall')
138
+ .description('Remove auto-start service and stop the server')
139
+ .action(() => {
140
+ serverServiceUninstall();
141
+ });
142
+ serviceCmd.action(() => {
143
+ serviceCmd.help();
144
+ });
124
145
  program.parse();
125
146
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,6 +13,10 @@ const app = express();
13
13
  const server = createServer(app);
14
14
  const wss = new WebSocketServer({ server });
15
15
  const webDir = join(__dirname, '../web');
16
+ // Landing page at root
17
+ app.get('/', (_req, res) => {
18
+ res.sendFile(join(webDir, 'landing.html'));
19
+ });
16
20
  // Serve static assets from web/
17
21
  app.use(express.static(webDir));
18
22
  // SPA fallback: /s/:sessionId → serve index.html (Vue router handles the rest)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function serverServiceInstall(port: number): void;
2
+ export declare function serverServiceUninstall(): void;
@@ -0,0 +1,217 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync } from 'fs';
3
+ import { join, dirname, resolve } from 'path';
4
+ import { homedir } from 'os';
5
+ import { fileURLToPath } from 'url';
6
+ import { getLogDir, loadServerRuntimeState, clearServerRuntimeState, killProcess, isProcessAlive, } from './config.js';
7
+ const SERVICE_NAME = 'agentlink-server';
8
+ const LAUNCHD_LABEL = 'com.agentlink.server';
9
+ function getCliPath() {
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ return resolve(dirname(__filename), 'cli.js');
12
+ }
13
+ function getNodePath() {
14
+ return process.execPath;
15
+ }
16
+ // ── Linux (systemd user unit) ──
17
+ function getSystemdUnitPath() {
18
+ return join(homedir(), '.config', 'systemd', 'user', `${SERVICE_NAME}.service`);
19
+ }
20
+ function generateSystemdUnit(port) {
21
+ const nodePath = getNodePath();
22
+ const cliPath = getCliPath();
23
+ const logDir = getLogDir();
24
+ const nodeBinDir = dirname(nodePath);
25
+ return `[Unit]
26
+ Description=AgentLink Relay Server
27
+ After=network-online.target
28
+ Wants=network-online.target
29
+
30
+ [Service]
31
+ Type=simple
32
+ ExecStart=${nodePath} ${cliPath} start --port ${port}
33
+ Restart=on-failure
34
+ RestartSec=10
35
+ Environment=PATH=${nodeBinDir}:${homedir()}/.local/bin:${homedir()}/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
36
+ StandardOutput=append:${logDir}/server.log
37
+ StandardError=append:${logDir}/server.err
38
+
39
+ [Install]
40
+ WantedBy=default.target
41
+ `;
42
+ }
43
+ function linuxInstall(port) {
44
+ const unitPath = getSystemdUnitPath();
45
+ mkdirSync(dirname(unitPath), { recursive: true });
46
+ mkdirSync(getLogDir(), { recursive: true });
47
+ writeFileSync(unitPath, generateSystemdUnit(port));
48
+ execSync('systemctl --user daemon-reload');
49
+ execSync(`systemctl --user enable ${SERVICE_NAME}`);
50
+ execSync(`systemctl --user start ${SERVICE_NAME}`);
51
+ console.log('Service installed and started.');
52
+ console.log(`\nUnit file: ${unitPath}`);
53
+ console.log('\nUseful commands:');
54
+ console.log(` systemctl --user status ${SERVICE_NAME}`);
55
+ console.log(` journalctl --user -u ${SERVICE_NAME} -f`);
56
+ console.log('\nTo run when not logged in:');
57
+ console.log(' sudo loginctl enable-linger $(whoami)');
58
+ }
59
+ function linuxUninstall() {
60
+ try {
61
+ execSync(`systemctl --user stop ${SERVICE_NAME} 2>/dev/null`);
62
+ }
63
+ catch { }
64
+ try {
65
+ execSync(`systemctl --user disable ${SERVICE_NAME} 2>/dev/null`);
66
+ }
67
+ catch { }
68
+ const unitPath = getSystemdUnitPath();
69
+ if (existsSync(unitPath)) {
70
+ unlinkSync(unitPath);
71
+ }
72
+ try {
73
+ execSync('systemctl --user daemon-reload');
74
+ }
75
+ catch { }
76
+ console.log('Service uninstalled.');
77
+ }
78
+ // ── macOS (launchd plist) ──
79
+ function getLaunchdPlistPath() {
80
+ return join(homedir(), 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`);
81
+ }
82
+ function generateLaunchdPlist(port) {
83
+ const nodePath = getNodePath();
84
+ const cliPath = getCliPath();
85
+ const logDir = getLogDir();
86
+ return `<?xml version="1.0" encoding="UTF-8"?>
87
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
88
+ <plist version="1.0">
89
+ <dict>
90
+ <key>Label</key>
91
+ <string>${LAUNCHD_LABEL}</string>
92
+ <key>ProgramArguments</key>
93
+ <array>
94
+ <string>${nodePath}</string>
95
+ <string>${cliPath}</string>
96
+ <string>start</string>
97
+ <string>--port</string>
98
+ <string>${port}</string>
99
+ </array>
100
+ <key>RunAtLoad</key>
101
+ <true/>
102
+ <key>KeepAlive</key>
103
+ <dict>
104
+ <key>SuccessfulExit</key>
105
+ <false/>
106
+ </dict>
107
+ <key>ThrottleInterval</key>
108
+ <integer>10</integer>
109
+ <key>StandardOutPath</key>
110
+ <string>${logDir}/server.log</string>
111
+ <key>StandardErrorPath</key>
112
+ <string>${logDir}/server.err</string>
113
+ </dict>
114
+ </plist>
115
+ `;
116
+ }
117
+ function macInstall(port) {
118
+ const plistPath = getLaunchdPlistPath();
119
+ mkdirSync(dirname(plistPath), { recursive: true });
120
+ mkdirSync(getLogDir(), { recursive: true });
121
+ if (existsSync(plistPath)) {
122
+ try {
123
+ execSync(`launchctl unload "${plistPath}" 2>/dev/null`);
124
+ }
125
+ catch { }
126
+ }
127
+ writeFileSync(plistPath, generateLaunchdPlist(port));
128
+ execSync(`launchctl load "${plistPath}"`);
129
+ console.log('Service installed and started.');
130
+ console.log(`\nPlist file: ${plistPath}`);
131
+ console.log('\nUseful commands:');
132
+ console.log(` launchctl list | grep ${LAUNCHD_LABEL}`);
133
+ }
134
+ function macUninstall() {
135
+ const plistPath = getLaunchdPlistPath();
136
+ if (existsSync(plistPath)) {
137
+ try {
138
+ execSync(`launchctl unload "${plistPath}"`);
139
+ }
140
+ catch { }
141
+ unlinkSync(plistPath);
142
+ }
143
+ console.log('Service uninstalled.');
144
+ }
145
+ // ── Windows (Startup folder .bat) ──
146
+ function getStartupBatPath() {
147
+ const startupDir = join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
148
+ return join(startupDir, `${SERVICE_NAME}.bat`);
149
+ }
150
+ function generateStartupBat(port) {
151
+ const nodePath = getNodePath();
152
+ const cliPath = getCliPath();
153
+ return `@echo off\r\n"${nodePath}" "${cliPath}" start --daemon --port ${port}\r\n`;
154
+ }
155
+ function winInstall(port) {
156
+ mkdirSync(getLogDir(), { recursive: true });
157
+ const batPath = getStartupBatPath();
158
+ writeFileSync(batPath, generateStartupBat(port));
159
+ console.log('Startup script installed.');
160
+ console.log(`\nStartup file: ${batPath}`);
161
+ // Start the server now
162
+ console.log('\nStarting server now...');
163
+ try {
164
+ execSync(`"${getNodePath()}" "${getCliPath()}" start --daemon --port ${port}`, { stdio: 'inherit' });
165
+ }
166
+ catch {
167
+ console.error('Failed to start server. Check logs in ~/.agentlink/logs/');
168
+ }
169
+ }
170
+ function winUninstall() {
171
+ const batPath = getStartupBatPath();
172
+ if (existsSync(batPath)) {
173
+ unlinkSync(batPath);
174
+ console.log(`Removed startup file: ${batPath}`);
175
+ }
176
+ // Stop running server if any
177
+ const state = loadServerRuntimeState();
178
+ if (state && isProcessAlive(state.pid)) {
179
+ console.log(`Stopping server (PID ${state.pid})...`);
180
+ killProcess(state.pid);
181
+ clearServerRuntimeState();
182
+ }
183
+ console.log('Service uninstalled.');
184
+ }
185
+ // ── Platform dispatch ──
186
+ export function serverServiceInstall(port) {
187
+ const p = process.platform;
188
+ console.log('Installing AgentLink server service...');
189
+ console.log(` Port: ${port}`);
190
+ console.log('');
191
+ if (p === 'linux')
192
+ linuxInstall(port);
193
+ else if (p === 'darwin')
194
+ macInstall(port);
195
+ else if (p === 'win32')
196
+ winInstall(port);
197
+ else {
198
+ console.error(`Unsupported platform: ${p}`);
199
+ console.error('Run the server directly: agentlink-server start --daemon');
200
+ process.exit(1);
201
+ }
202
+ }
203
+ export function serverServiceUninstall() {
204
+ const p = process.platform;
205
+ console.log('Uninstalling AgentLink server service...');
206
+ if (p === 'linux')
207
+ linuxUninstall();
208
+ else if (p === 'darwin')
209
+ macUninstall();
210
+ else if (p === 'win32')
211
+ winUninstall();
212
+ else {
213
+ console.error(`Unsupported platform: ${p}`);
214
+ process.exit(1);
215
+ }
216
+ }
217
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "@agent-link/server",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "AgentLink relay server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
- "files": ["dist", "web"],
8
+ "files": [
9
+ "dist",
10
+ "web"
11
+ ],
9
12
  "bin": {
10
13
  "agentlink-server": "dist/cli.js"
11
14
  },
@@ -0,0 +1,392 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AgentLink — Claude Code in Your Browser</title>
7
+ <style>
8
+ * { margin: 0; padding: 0; box-sizing: border-box; }
9
+
10
+ :root {
11
+ --bg: #0a0a0a;
12
+ --surface: #141414;
13
+ --border: #252525;
14
+ --text: #e8e8e8;
15
+ --text-dim: #888;
16
+ --accent: #6c63ff;
17
+ --accent-hover: #7c74ff;
18
+ --green: #22c55e;
19
+ }
20
+
21
+ body {
22
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
23
+ background: var(--bg);
24
+ color: var(--text);
25
+ line-height: 1.6;
26
+ min-height: 100vh;
27
+ }
28
+
29
+ /* ── Nav ── */
30
+ nav {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: space-between;
34
+ padding: 1rem 2rem;
35
+ max-width: 1100px;
36
+ margin: 0 auto;
37
+ }
38
+
39
+ .logo {
40
+ font-size: 1.25rem;
41
+ font-weight: 700;
42
+ letter-spacing: -0.02em;
43
+ }
44
+
45
+ .logo span { color: var(--accent); }
46
+
47
+ nav a {
48
+ color: var(--text-dim);
49
+ text-decoration: none;
50
+ font-size: 0.9rem;
51
+ transition: color 0.2s;
52
+ }
53
+
54
+ nav a:hover { color: var(--text); }
55
+
56
+ /* ── Hero ── */
57
+ .hero {
58
+ text-align: center;
59
+ padding: 6rem 2rem 4rem;
60
+ max-width: 800px;
61
+ margin: 0 auto;
62
+ }
63
+
64
+ .hero h1 {
65
+ font-size: clamp(2.2rem, 5vw, 3.5rem);
66
+ font-weight: 800;
67
+ letter-spacing: -0.03em;
68
+ line-height: 1.15;
69
+ margin-bottom: 1.5rem;
70
+ }
71
+
72
+ .hero h1 em {
73
+ font-style: normal;
74
+ background: linear-gradient(135deg, var(--accent), #a78bfa);
75
+ -webkit-background-clip: text;
76
+ -webkit-text-fill-color: transparent;
77
+ background-clip: text;
78
+ }
79
+
80
+ .hero p {
81
+ font-size: 1.15rem;
82
+ color: var(--text-dim);
83
+ max-width: 550px;
84
+ margin: 0 auto 1.5rem;
85
+ }
86
+
87
+ .hero-trust {
88
+ font-size: 0.95rem !important;
89
+ color: var(--green) !important;
90
+ font-weight: 500;
91
+ margin-bottom: 3rem !important;
92
+ letter-spacing: 0.01em;
93
+ }
94
+
95
+ /* ── Install box ── */
96
+ .install {
97
+ background: var(--surface);
98
+ border: 1px solid var(--border);
99
+ border-radius: 12px;
100
+ padding: 2rem 2.5rem;
101
+ max-width: 600px;
102
+ margin: 0 auto 4rem;
103
+ text-align: left;
104
+ }
105
+
106
+ .install-label {
107
+ font-size: 0.8rem;
108
+ color: var(--text-dim);
109
+ text-transform: uppercase;
110
+ letter-spacing: 0.08em;
111
+ margin-bottom: 1rem;
112
+ }
113
+
114
+ .install-step {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 0.75rem;
118
+ margin-bottom: 0.75rem;
119
+ }
120
+
121
+ .step-num {
122
+ width: 24px;
123
+ height: 24px;
124
+ border-radius: 50%;
125
+ background: var(--accent);
126
+ color: #fff;
127
+ font-size: 0.75rem;
128
+ font-weight: 700;
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: center;
132
+ flex-shrink: 0;
133
+ }
134
+
135
+ .install-cmd {
136
+ background: #1a1a2e;
137
+ border: 1px solid #2a2a4a;
138
+ border-radius: 8px;
139
+ padding: 0.6rem 1rem;
140
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
141
+ font-size: 0.9rem;
142
+ color: var(--green);
143
+ flex: 1;
144
+ cursor: pointer;
145
+ position: relative;
146
+ transition: border-color 0.2s;
147
+ }
148
+
149
+ .install-cmd:hover {
150
+ border-color: var(--accent);
151
+ }
152
+
153
+ .install-cmd .copy-hint {
154
+ position: absolute;
155
+ right: 0.75rem;
156
+ top: 50%;
157
+ transform: translateY(-50%);
158
+ font-size: 0.7rem;
159
+ color: var(--text-dim);
160
+ opacity: 0;
161
+ transition: opacity 0.2s;
162
+ }
163
+
164
+ .install-cmd:hover .copy-hint { opacity: 1; }
165
+
166
+ .install-note {
167
+ font-size: 0.8rem;
168
+ color: var(--text-dim);
169
+ margin-top: 1rem;
170
+ text-align: center;
171
+ }
172
+
173
+ /* ── Features ── */
174
+ .features {
175
+ display: grid;
176
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
177
+ gap: 1.5rem;
178
+ max-width: 1000px;
179
+ margin: 0 auto 5rem;
180
+ padding: 0 2rem;
181
+ }
182
+
183
+ .feature {
184
+ background: var(--surface);
185
+ border: 1px solid var(--border);
186
+ border-radius: 12px;
187
+ padding: 1.5rem;
188
+ }
189
+
190
+ .feature-icon {
191
+ font-size: 1.5rem;
192
+ margin-bottom: 0.75rem;
193
+ }
194
+
195
+ .feature h3 {
196
+ font-size: 1rem;
197
+ font-weight: 600;
198
+ margin-bottom: 0.5rem;
199
+ }
200
+
201
+ .feature p {
202
+ font-size: 0.9rem;
203
+ color: var(--text-dim);
204
+ line-height: 1.5;
205
+ }
206
+
207
+ /* ── How it works ── */
208
+ .how {
209
+ text-align: center;
210
+ max-width: 800px;
211
+ margin: 0 auto 5rem;
212
+ padding: 0 2rem;
213
+ }
214
+
215
+ .how h2 {
216
+ font-size: 1.8rem;
217
+ font-weight: 700;
218
+ margin-bottom: 2rem;
219
+ }
220
+
221
+ .diagram {
222
+ display: flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ gap: 0;
226
+ flex-wrap: wrap;
227
+ margin-bottom: 1.5rem;
228
+ }
229
+
230
+ .diagram-node {
231
+ background: var(--surface);
232
+ border: 1px solid var(--border);
233
+ border-radius: 10px;
234
+ padding: 1rem 1.5rem;
235
+ text-align: center;
236
+ min-width: 140px;
237
+ }
238
+
239
+ .diagram-node .node-label {
240
+ font-size: 0.75rem;
241
+ color: var(--text-dim);
242
+ text-transform: uppercase;
243
+ letter-spacing: 0.05em;
244
+ }
245
+
246
+ .diagram-node .node-name {
247
+ font-weight: 700;
248
+ font-size: 1rem;
249
+ margin-top: 0.25rem;
250
+ }
251
+
252
+ .diagram-arrow {
253
+ color: var(--accent);
254
+ font-size: 1.5rem;
255
+ padding: 0 0.5rem;
256
+ }
257
+
258
+ .how p {
259
+ color: var(--text-dim);
260
+ font-size: 0.95rem;
261
+ }
262
+
263
+ /* ── Footer ── */
264
+ footer {
265
+ text-align: center;
266
+ padding: 2rem;
267
+ color: var(--text-dim);
268
+ font-size: 0.85rem;
269
+ border-top: 1px solid var(--border);
270
+ }
271
+
272
+ footer a { color: var(--accent); text-decoration: none; }
273
+ footer a:hover { text-decoration: underline; }
274
+
275
+ @media (max-width: 640px) {
276
+ .hero { padding: 4rem 1.5rem 3rem; }
277
+ .install { padding: 1.5rem; margin: 0 1rem 3rem; }
278
+ .diagram { flex-direction: column; }
279
+ .diagram-arrow { transform: rotate(90deg); padding: 0.25rem 0; }
280
+ }
281
+ </style>
282
+ </head>
283
+ <body>
284
+
285
+ <nav>
286
+ <div class="logo">Agent<span>Link</span></div>
287
+ <div>
288
+ <a href="https://www.npmjs.com/package/@agent-link/agent" target="_blank">npm</a>
289
+ </div>
290
+ </nav>
291
+
292
+ <section class="hero">
293
+ <h1>Claude Code,<br><em>in your browser</em></h1>
294
+ <p>Run Claude Code on your machine, use it from any browser. Two commands to get started.</p>
295
+ <p class="hero-trust">End-to-end encrypted. The server is a relay — it never sees, stores, or logs your data.</p>
296
+ </section>
297
+
298
+ <section class="install">
299
+ <div class="install-label">Get started</div>
300
+ <div class="install-step">
301
+ <div class="step-num">1</div>
302
+ <div class="install-cmd" onclick="copyCmd(this)">
303
+ npm install -g @agent-link/agent
304
+ <span class="copy-hint">click to copy</span>
305
+ </div>
306
+ </div>
307
+ <div class="install-step">
308
+ <div class="step-num">2</div>
309
+ <div class="install-cmd" onclick="copyCmd(this)">
310
+ agentlink-client start
311
+ <span class="copy-hint">click to copy</span>
312
+ </div>
313
+ </div>
314
+ <div class="install-note">Open the URL it prints. That's it.</div>
315
+ </section>
316
+
317
+ <section class="features">
318
+ <div class="feature">
319
+ <div class="feature-icon">&#9889;</div>
320
+ <h3>Zero config</h3>
321
+ <p>Install, start, open the URL. No accounts, no setup, no configuration files needed.</p>
322
+ </div>
323
+ <div class="feature">
324
+ <div class="feature-icon">&#128274;</div>
325
+ <h3>Privacy first</h3>
326
+ <p>All messages are end-to-end encrypted. The relay server cannot read, store, or log any of your conversations or code. It's a blind forwarder.</p>
327
+ </div>
328
+ <div class="feature">
329
+ <div class="feature-icon">&#127760;</div>
330
+ <h3>Access anywhere</h3>
331
+ <p>Use Claude Code from your phone, tablet, or any device with a browser. Share the URL with teammates.</p>
332
+ </div>
333
+ <div class="feature">
334
+ <div class="feature-icon">&#128196;</div>
335
+ <h3>Full Claude Code</h3>
336
+ <p>File editing, bash commands, search, multi-turn conversations, session history — everything Claude Code can do.</p>
337
+ </div>
338
+ <div class="feature">
339
+ <div class="feature-icon">&#128260;</div>
340
+ <h3>Session history</h3>
341
+ <p>Browse and resume any past conversation from any working directory. Switch projects without losing context.</p>
342
+ </div>
343
+ <div class="feature">
344
+ <div class="feature-icon">&#128679;</div>
345
+ <h3>Self-hostable</h3>
346
+ <p>Run your own relay server with <code style="color:var(--green)">@agent-link/server</code>. Full control over your infrastructure.</p>
347
+ </div>
348
+ </section>
349
+
350
+ <section class="how">
351
+ <h2>How it works</h2>
352
+ <div class="diagram">
353
+ <div class="diagram-node">
354
+ <div class="node-label">Your browser</div>
355
+ <div class="node-name">Web UI</div>
356
+ </div>
357
+ <div class="diagram-arrow">&harr;</div>
358
+ <div class="diagram-node">
359
+ <div class="node-label">Encrypted relay</div>
360
+ <div class="node-name">Server</div>
361
+ </div>
362
+ <div class="diagram-arrow">&harr;</div>
363
+ <div class="diagram-node">
364
+ <div class="node-label">Your machine</div>
365
+ <div class="node-name">Agent</div>
366
+ </div>
367
+ <div class="diagram-arrow">&harr;</div>
368
+ <div class="diagram-node">
369
+ <div class="node-label">Local CLI</div>
370
+ <div class="node-name">Claude Code</div>
371
+ </div>
372
+ </div>
373
+ <p>The agent on your machine spawns Claude Code, streams output through the relay server to your browser, and sends your messages back. All tool execution happens locally. <strong>All traffic is end-to-end encrypted — the server is a stateless relay that never decrypts, stores, or logs your data.</strong></p>
374
+ </section>
375
+
376
+ <footer>
377
+ AgentLink &mdash; <a href="https://www.npmjs.com/package/@agent-link/agent">@agent-link/agent</a> &middot; <a href="https://www.npmjs.com/package/@agent-link/server">@agent-link/server</a>
378
+ </footer>
379
+
380
+ <script>
381
+ function copyCmd(el) {
382
+ const text = el.childNodes[0].textContent.trim();
383
+ navigator.clipboard.writeText(text);
384
+ const hint = el.querySelector('.copy-hint');
385
+ hint.textContent = 'copied!';
386
+ hint.style.opacity = '1';
387
+ setTimeout(() => { hint.textContent = 'click to copy'; hint.style.opacity = ''; }, 1500);
388
+ }
389
+ </script>
390
+
391
+ </body>
392
+ </html>