tangled
alpha
login
or
join now
nekomimi.pet
/
wisp.place-monorepo
88
fork
atom
Monorepo for wisp.place. A static site hosting service built on top of the AT Protocol.
wisp.place
88
fork
atom
overview
issues
10
pulls
pipelines
typescript cli fully in prod now
nekomimi.pet
1 week ago
6df7d4ff
c039cebd
1/2
deploy-wisp.yml
success
44s
test.yml
failed
30s
+257
-347
4 changed files
expand all
collapse all
unified
split
apps
main-app
public
editor
tabs
CLITab.tsx
cli
package.json
docs
src
content
docs
cli.md
packages
create-wisp
package.json
+210
-316
apps/main-app/public/editor/tabs/CLITab.tsx
···
6
6
CardTitle,
7
7
} from "@public/components/ui/card";
8
8
import { Badge } from "@public/components/ui/badge";
9
9
-
import { ExternalLink } from "lucide-react";
9
9
+
import { Download, ExternalLink } from "lucide-react";
10
10
import { CodeBlock } from "@public/components/ui/code-block";
11
11
12
12
+
const BASE_URL =
13
13
+
"https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries";
14
14
+
15
15
+
const BINARIES = [
16
16
+
{
17
17
+
platform: "macOS (Apple Silicon)",
18
18
+
filename: "wisp-cli-aarch64-darwin",
19
19
+
sha256:
20
20
+
"560eface5029dbecdb4adb6cca169651cc301dd6d48263a1cddf1906a2295b0b",
21
21
+
},
22
22
+
{
23
23
+
platform: "macOS (Intel)",
24
24
+
filename: "wisp-cli-x86_64-darwin",
25
25
+
sha256:
26
26
+
"fc759aa8d412948f735420536ee3f7944bda6119ad2c9169583a9b188ae889e5",
27
27
+
},
28
28
+
{
29
29
+
platform: "Linux (ARM64)",
30
30
+
filename: "wisp-cli-aarch64-linux",
31
31
+
sha256:
32
32
+
"2ff51a5411a20c45fd05d29f90acd24410bdce31f6fc8a91a125691b275e1216",
33
33
+
},
34
34
+
{
35
35
+
platform: "Linux (x86_64)",
36
36
+
filename: "wisp-cli-x86_64-linux",
37
37
+
sha256:
38
38
+
"8cf27698daf2d1371f1a4eb1ec1e24c4da9185639dc09edc3f8bc3d358f08738",
39
39
+
},
40
40
+
] as const;
41
41
+
42
42
+
const FEATURES = [
43
43
+
{ label: "Deploy", desc: "Push static sites directly from your terminal" },
44
44
+
{
45
45
+
label: "Pull",
46
46
+
desc: "Download sites from the PDS for development or backup",
47
47
+
},
48
48
+
{
49
49
+
label: "Serve",
50
50
+
desc: "Run a local server with real-time firehose updates",
51
51
+
},
52
52
+
{
53
53
+
label: "Domains",
54
54
+
desc: "Claim, manage, and assign custom domains on wisp.place",
55
55
+
},
56
56
+
] as const;
57
57
+
58
58
+
const LINKS = [
59
59
+
{ label: "CLI Documentation", href: "https://docs.wisp.place/cli" },
60
60
+
{
61
61
+
label: "Source Code",
62
62
+
href: "https://tangled.org/@nekomimi.pet/wisp.place-monorepo/tree/main/cli",
63
63
+
},
64
64
+
{ label: "Tangled Spindle CI/CD", href: "https://blog.tangled.org/ci" },
65
65
+
] as const;
66
66
+
12
67
export function CLITab() {
13
68
return (
14
69
<div className="space-y-4 min-h-[400px]">
70
70
+
{/* Header + Features */}
15
71
<Card>
16
72
<CardHeader>
17
17
-
<div className="flex items-center gap-2 mb-2">
18
18
-
<CardTitle>Wisp CLI Tool</CardTitle>
73
73
+
<div className="flex items-center gap-2">
74
74
+
<CardTitle>Wisp CLI</CardTitle>
19
75
<Badge variant="secondary" className="text-xs">
20
20
-
v0.5.0
21
21
-
</Badge>
22
22
-
<Badge variant="outline" className="text-xs">
23
23
-
Alpha
76
76
+
v1.0.0
24
77
</Badge>
25
78
</div>
26
79
<CardDescription>
27
80
Deploy static sites directly from your terminal
28
81
</CardDescription>
29
82
</CardHeader>
30
30
-
<CardContent className="space-y-6">
31
31
-
<div className="prose prose-sm max-w-none dark:prose-invert">
32
32
-
<p className="text-sm text-muted-foreground">
33
33
-
The Wisp CLI is a command-line tool for deploying static websites
34
34
-
directly to your AT Protocol account. Authenticate with app
35
35
-
password or OAuth and deploy from CI/CD pipelines.
36
36
-
</p>
37
37
-
</div>
38
38
-
39
39
-
<div className="space-y-3">
40
40
-
<h3 className="text-sm font-semibold">Features</h3>
41
41
-
<ul className="text-sm text-muted-foreground space-y-2 list-disc list-inside">
42
42
-
<li>
43
43
-
<strong>Deploy:</strong> Push static sites directly from your
44
44
-
terminal
45
45
-
</li>
46
46
-
<li>
47
47
-
<strong>Pull:</strong> Download sites from the PDS for
48
48
-
development or backup
49
49
-
</li>
50
50
-
<li>
51
51
-
<strong>Serve:</strong> Run a local server with real-time
52
52
-
firehose updates
83
83
+
<CardContent>
84
84
+
<ul className="space-y-2">
85
85
+
{FEATURES.map(({ label, desc }) => (
86
86
+
<li key={label} className="flex items-start gap-3 text-sm">
87
87
+
<span className="text-muted-foreground mt-0.5 shrink-0 select-none">
88
88
+
>
89
89
+
</span>
90
90
+
<span className="text-muted-foreground">
91
91
+
<strong className="text-foreground">{label}</strong> — {desc}
92
92
+
</span>
53
93
</li>
54
54
-
</ul>
55
55
-
</div>
94
94
+
))}
95
95
+
</ul>
96
96
+
</CardContent>
97
97
+
</Card>
56
98
57
57
-
<div className="space-y-3">
58
58
-
<h3 className="text-sm font-semibold">Download v0.5.0</h3>
59
59
-
<div className="grid gap-2">
60
60
-
<div className="p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border">
61
61
-
<a
62
62
-
href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-darwin-universal"
63
63
-
target="_blank"
64
64
-
rel="noopener noreferrer"
65
65
-
className="flex items-center justify-between mb-2"
66
66
-
>
67
67
-
<span className="font-mono text-sm">
68
68
-
macOS (Universal)
69
69
-
</span>
70
70
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
71
71
-
</a>
72
72
-
<div className="text-xs text-muted-foreground">
73
73
-
<span className="font-mono">
74
74
-
SHA-1: 7d0cc968d2a130158c3b204d9a15bcc29b8af252
75
75
-
</span>
76
76
-
</div>
99
99
+
{/* Downloads */}
100
100
+
<Card>
101
101
+
<CardHeader>
102
102
+
<CardTitle className="text-base">Download v1.0.0</CardTitle>
103
103
+
</CardHeader>
104
104
+
<CardContent className="space-y-1.5">
105
105
+
{BINARIES.map(({ platform, filename, sha256 }) => (
106
106
+
<a
107
107
+
key={filename}
108
108
+
href={`${BASE_URL}/${filename}`}
109
109
+
download
110
110
+
className="flex flex-col gap-1 p-3 rounded-lg border border-border bg-muted/30 hover:bg-muted hover:border-muted-foreground/30 transition-colors group"
111
111
+
>
112
112
+
<div className="flex items-center justify-between">
113
113
+
<span className="text-sm font-medium">{platform}</span>
114
114
+
<Download className="w-4 h-4 text-muted-foreground group-hover:text-foreground transition-colors" />
77
115
</div>
78
78
-
<div className="p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border">
79
79
-
<a
80
80
-
href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-aarch64-darwin"
81
81
-
target="_blank"
82
82
-
rel="noopener noreferrer"
83
83
-
className="flex items-center justify-between mb-2"
84
84
-
>
85
85
-
<span className="font-mono text-sm">
86
86
-
macOS (Apple Silicon)
87
87
-
</span>
88
88
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
89
89
-
</a>
90
90
-
<div className="text-xs text-muted-foreground">
91
91
-
<span className="font-mono">
92
92
-
SHA-1: 912f8f99c2b55ca6ad75e0a89903688bd2c1cb4b
93
93
-
</span>
94
94
-
</div>
95
95
-
</div>
96
96
-
<div className="p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border">
97
97
-
<a
98
98
-
href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-darwin-x86_64"
99
99
-
target="_blank"
100
100
-
rel="noopener noreferrer"
101
101
-
className="flex items-center justify-between mb-2"
102
102
-
>
103
103
-
<span className="font-mono text-sm">
104
104
-
macOS (Intel)
105
105
-
</span>
106
106
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
107
107
-
</a>
108
108
-
<div className="text-xs text-muted-foreground">
109
109
-
<span className="font-mono">
110
110
-
SHA-1: 40d26d4a9c058e42e7911a195c3e078e8a4b5e82
111
111
-
</span>
112
112
-
</div>
113
113
-
</div>
114
114
-
<div className="p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border">
115
115
-
<a
116
116
-
href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-aarch64-linux"
117
117
-
target="_blank"
118
118
-
rel="noopener noreferrer"
119
119
-
className="flex items-center justify-between mb-2"
120
120
-
>
121
121
-
<span className="font-mono text-sm">Linux (ARM64)</span>
122
122
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
123
123
-
</a>
124
124
-
<div className="text-xs text-muted-foreground">
125
125
-
<span className="font-mono">
126
126
-
SHA-1: ef1992d8850f8fef1d719e4e8fab5431475c352e
127
127
-
</span>
128
128
-
</div>
129
129
-
</div>
130
130
-
<div className="p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border">
131
131
-
<a
132
132
-
href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-linux"
133
133
-
target="_blank"
134
134
-
rel="noopener noreferrer"
135
135
-
className="flex items-center justify-between mb-2"
136
136
-
>
137
137
-
<span className="font-mono text-sm">Linux (x86_64)</span>
138
138
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
139
139
-
</a>
140
140
-
<div className="text-xs text-muted-foreground">
141
141
-
<span className="font-mono">
142
142
-
SHA-1: 3018dde8fec495abcae044079564ced93cdeb4f8
143
143
-
</span>
144
144
-
</div>
145
145
-
</div>
146
146
-
<div className="p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border">
147
147
-
<a
148
148
-
href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-windows.exe"
149
149
-
target="_blank"
150
150
-
rel="noopener noreferrer"
151
151
-
className="flex items-center justify-between mb-2"
152
152
-
>
153
153
-
<span className="font-mono text-sm">Windows (x86_64)</span>
154
154
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
155
155
-
</a>
156
156
-
<div className="text-xs text-muted-foreground">
157
157
-
<span className="font-mono">
158
158
-
SHA-1: d6bc789d7fd7c787e5520eb476cee70c97ccb3ce
159
159
-
</span>
160
160
-
</div>
161
161
-
</div>
162
162
-
</div>
163
163
-
</div>
116
116
+
<span className="font-mono text-[11px] text-muted-foreground break-all leading-relaxed">
117
117
+
SHA-256: {sha256}
118
118
+
</span>
119
119
+
</a>
120
120
+
))}
121
121
+
</CardContent>
122
122
+
</Card>
164
123
165
165
-
<div className="space-y-3">
166
166
-
<h3 className="text-sm font-semibold">Deploy a Site</h3>
124
124
+
{/* Basic Usage */}
125
125
+
<Card>
126
126
+
<CardHeader>
127
127
+
<CardTitle className="text-base">Basic Usage</CardTitle>
128
128
+
</CardHeader>
129
129
+
<CardContent className="space-y-5">
130
130
+
<div className="space-y-2">
131
131
+
<p className="text-sm font-medium">Deploy a Site</p>
167
132
<CodeBlock
168
168
-
code={`# Download and make executable
169
169
-
curl -O https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-aarch64-darwin
170
170
-
chmod +x wisp-cli-aarch64-darwin
171
171
-
172
172
-
# Deploy your site
173
173
-
./wisp-cli-aarch64-darwin deploy your-handle.bsky.social \\
133
133
+
code={`./wisp-cli deploy your-handle.bsky.social \\
174
134
--path ./dist \\
175
175
-
--site my-site \\
176
176
-
--password your-app-password
135
135
+
--site my-site
177
136
178
178
-
# Your site will be available at:
137
137
+
# Available at:
179
138
# https://sites.wisp.place/your-handle/my-site`}
180
139
language="bash"
181
140
/>
182
141
</div>
183
142
184
184
-
<div className="space-y-3">
185
185
-
<h3 className="text-sm font-semibold">Pull a Site from PDS</h3>
186
186
-
<p className="text-xs text-muted-foreground">
187
187
-
Download a site from the PDS to your local machine (uses OAuth
188
188
-
authentication):
189
189
-
</p>
143
143
+
<div className="space-y-2">
144
144
+
<p className="text-sm font-medium">Pull a Site</p>
190
145
<CodeBlock
191
191
-
code={`# Pull a site to a specific directory
192
192
-
wisp-cli pull your-handle.bsky.social \\
146
146
+
code={`./wisp-cli pull your-handle.bsky.social \\
193
147
--site my-site \\
194
194
-
--output ./my-site
195
195
-
196
196
-
# Pull to current directory
197
197
-
wisp-cli pull your-handle.bsky.social \\
198
198
-
--site my-site
199
199
-
200
200
-
# Opens browser for OAuth authentication on first run`}
148
148
+
--output ./my-site`}
201
149
language="bash"
202
150
/>
203
151
</div>
204
152
205
205
-
<div className="space-y-3">
206
206
-
<h3 className="text-sm font-semibold">
207
207
-
Serve a Site Locally with Real-Time Updates
208
208
-
</h3>
209
209
-
<p className="text-xs text-muted-foreground">
210
210
-
Run a local server that monitors the firehose for real-time
211
211
-
updates (uses OAuth authentication):
212
212
-
</p>
153
153
+
<div className="space-y-2">
154
154
+
<p className="text-sm font-medium">Serve with Live Updates</p>
213
155
<CodeBlock
214
156
code={`# Serve on http://localhost:8080 (default)
215
215
-
wisp-cli serve your-handle.bsky.social \\
216
216
-
--site my-site
217
217
-
218
218
-
# Serve on a custom port
219
219
-
wisp-cli serve your-handle.bsky.social \\
220
220
-
--site my-site \\
221
221
-
--port 3000
222
222
-
223
223
-
# Enable SPA mode (serve index.html for all routes)
224
224
-
wisp-cli serve your-handle.bsky.social \\
225
225
-
--site my-site \\
226
226
-
--spa
157
157
+
./wisp-cli serve your-handle.bsky.social --site my-site
227
158
228
228
-
# Enable directory listing for paths without index files
229
229
-
wisp-cli serve your-handle.bsky.social \\
230
230
-
--site my-site \\
231
231
-
--directory
232
232
-
233
233
-
# Downloads site, serves it, and watches firehose for live updates!`}
159
159
+
# Custom port, SPA mode, or directory listing
160
160
+
./wisp-cli serve your-handle.bsky.social --site my-site --port 3000
161
161
+
./wisp-cli serve your-handle.bsky.social --site my-site --spa
162
162
+
./wisp-cli serve your-handle.bsky.social --site my-site --directory`}
234
163
language="bash"
235
164
/>
236
165
</div>
237
166
238
238
-
<div className="space-y-3">
239
239
-
<h3 className="text-sm font-semibold">
240
240
-
CI/CD with Tangled Spindle
241
241
-
</h3>
242
242
-
<p className="text-xs text-muted-foreground">
243
243
-
Deploy automatically on every push using{" "}
244
244
-
<a
245
245
-
href="https://blog.tangled.org/ci"
246
246
-
target="_blank"
247
247
-
rel="noopener noreferrer"
248
248
-
className="text-accent hover:underline"
249
249
-
>
250
250
-
Tangled Spindle
251
251
-
</a>
252
252
-
</p>
253
253
-
254
254
-
<div className="space-y-4">
255
255
-
<div>
256
256
-
<h4 className="text-xs font-semibold mb-2 flex items-center gap-2">
257
257
-
<span>Example 1: Simple Asset Publishing</span>
258
258
-
<Badge variant="secondary" className="text-xs">
259
259
-
Copy Files
260
260
-
</Badge>
261
261
-
</h4>
262
262
-
<CodeBlock
263
263
-
code={`when:
264
264
-
- event: ['push']
265
265
-
branch: ['main']
266
266
-
- event: ['manual']
167
167
+
<div className="space-y-2">
168
168
+
<p className="text-sm font-medium">Domain Management</p>
169
169
+
<CodeBlock
170
170
+
code={`./wisp-cli domain claim your-handle.bsky.social --domain example.com
171
171
+
./wisp-cli domain claim-subdomain your-handle.bsky.social --subdomain alice
172
172
+
./wisp-cli domain status your-handle.bsky.social --domain example.com
173
173
+
./wisp-cli domain add-site your-handle.bsky.social --domain example.com --site mysite
174
174
+
./wisp-cli domain delete your-handle.bsky.social --domain example.com
175
175
+
./wisp-cli site delete your-handle.bsky.social --site mysite`}
176
176
+
language="bash"
177
177
+
/>
178
178
+
</div>
267
179
268
268
-
engine: 'nixery'
269
269
-
270
270
-
clone:
271
271
-
skip: false
272
272
-
depth: 1
180
180
+
<div className="space-y-2">
181
181
+
<p className="text-sm font-medium">List Domains & Sites</p>
182
182
+
<CodeBlock
183
183
+
code={`./wisp-cli list domains your-handle.bsky.social
184
184
+
./wisp-cli list sites your-handle.bsky.social`}
185
185
+
language="bash"
186
186
+
/>
187
187
+
</div>
188
188
+
</CardContent>
189
189
+
</Card>
273
190
274
274
-
dependencies:
275
275
-
nixpkgs:
276
276
-
- coreutils
277
277
-
- curl
278
278
-
279
279
-
environment:
280
280
-
SITE_PATH: '.' # Copy entire repo
281
281
-
SITE_NAME: 'myWebbedSite'
282
282
-
WISP_HANDLE: 'your-handle.bsky.social'
283
283
-
284
284
-
steps:
285
285
-
- name: deploy assets to wisp
191
191
+
{/* CI/CD */}
192
192
+
<Card>
193
193
+
<CardHeader>
194
194
+
<CardTitle className="text-base">CI/CD with Tangled Spindle</CardTitle>
195
195
+
<CardDescription>
196
196
+
Deploy automatically on every push using{" "}
197
197
+
<a
198
198
+
href="https://blog.tangled.org/ci"
199
199
+
target="_blank"
200
200
+
rel="noopener noreferrer"
201
201
+
className="underline underline-offset-2"
202
202
+
>
203
203
+
Tangled Spindle
204
204
+
</a>
205
205
+
</CardDescription>
206
206
+
</CardHeader>
207
207
+
<CardContent className="space-y-4">
208
208
+
<div className="space-y-2">
209
209
+
<div className="flex items-center gap-2">
210
210
+
<p className="text-sm font-medium">Simple Deploy</p>
211
211
+
<Badge variant="secondary" className="text-xs">
212
212
+
Copy Files
213
213
+
</Badge>
214
214
+
</div>
215
215
+
<CodeBlock
216
216
+
code={`steps:
217
217
+
- name: deploy to wisp
286
218
command: |
287
287
-
# Download Wisp CLI
288
219
curl https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-linux -o wisp-cli
289
220
chmod +x wisp-cli
290
290
-
291
291
-
# Deploy to Wisp
292
292
-
./wisp-cli deploy \\
293
293
-
"$WISP_HANDLE" \\
221
221
+
./wisp-cli deploy "$WISP_HANDLE" \\
294
222
--path "$SITE_PATH" \\
295
223
--site "$SITE_NAME" \\
296
296
-
--password "$WISP_APP_PASSWORD"
297
297
-
298
298
-
# Output
299
299
-
#Deployed site 'myWebbedSite': at://did:plc:ttdrpj45ibqunmfhdsb4zdwq/place.wisp.fs/myWebbedSite
300
300
-
#Available at: https://sites.wisp.place/did:plc:ttdrpj45ibqunmfhdsb4zdwq/myWebbedSite
301
301
-
`}
302
302
-
language="yaml"
303
303
-
/>
304
304
-
</div>
224
224
+
--password "$WISP_APP_PASSWORD"`}
225
225
+
language="yaml"
226
226
+
/>
227
227
+
</div>
305
228
306
306
-
<div>
307
307
-
<h4 className="text-xs font-semibold mb-2 flex items-center gap-2">
308
308
-
<span>Example 2: React/Vite Build & Deploy</span>
309
309
-
<Badge variant="secondary" className="text-xs">
310
310
-
Full Build
311
311
-
</Badge>
312
312
-
</h4>
313
313
-
<CodeBlock
314
314
-
code={`when:
229
229
+
<div className="space-y-2">
230
230
+
<div className="flex items-center gap-2">
231
231
+
<p className="text-sm font-medium">React / Vite Build & Deploy</p>
232
232
+
<Badge variant="secondary" className="text-xs">
233
233
+
Full Build
234
234
+
</Badge>
235
235
+
</div>
236
236
+
<CodeBlock
237
237
+
code={`when:
315
238
- event: ['push']
316
239
branch: ['main']
317
240
- event: ['manual']
···
321
244
clone:
322
245
skip: false
323
246
depth: 1
324
324
-
submodules: false
325
247
326
248
dependencies:
327
249
nixpkgs:
···
333
255
334
256
environment:
335
257
SITE_PATH: 'dist'
336
336
-
SITE_NAME: 'my-react-site'
258
258
+
SITE_NAME: 'my-site'
337
259
WISP_HANDLE: 'your-handle.bsky.social'
338
260
339
261
steps:
340
262
- name: build site
341
263
command: |
342
342
-
# necessary to ensure bun is in PATH
343
264
export PATH="$HOME/.nix-profile/bin:$PATH"
344
344
-
345
265
bun install --frozen-lockfile
346
346
-
347
347
-
# build with vite, run directly to get around env issues
348
266
bun node_modules/.bin/vite build
349
267
350
268
- name: deploy to wisp
351
269
command: |
352
352
-
# Download Wisp CLI
353
270
curl https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-linux -o wisp-cli
354
271
chmod +x wisp-cli
355
355
-
356
356
-
# Deploy to Wisp
357
357
-
./wisp-cli deploy \\
358
358
-
"$WISP_HANDLE" \\
272
272
+
./wisp-cli deploy "$WISP_HANDLE" \\
359
273
--path "$SITE_PATH" \\
360
274
--site "$SITE_NAME" \\
361
275
--password "$WISP_APP_PASSWORD"`}
362
362
-
language="yaml"
363
363
-
/>
364
364
-
</div>
365
365
-
</div>
276
276
+
language="yaml"
277
277
+
/>
278
278
+
</div>
366
279
367
367
-
<div className="p-3 bg-muted/30 rounded-lg border-l-4 border-accent">
368
368
-
<p className="text-xs text-muted-foreground">
369
369
-
<strong className="text-foreground">Note:</strong> Set{" "}
370
370
-
<code className="px-1.5 py-0.5 bg-background rounded text-xs">
371
371
-
WISP_APP_PASSWORD
372
372
-
</code>{" "}
373
373
-
as a secret in your Tangled Spindle repository settings.
374
374
-
Generate an app password from your AT Protocol account settings.
375
375
-
</p>
376
376
-
</div>
280
280
+
<div className="p-3 bg-muted/30 rounded-lg border-l-4 border-accent text-xs text-muted-foreground">
281
281
+
<strong className="text-foreground">Note:</strong> Set{" "}
282
282
+
<code className="px-1 py-0.5 bg-background rounded">
283
283
+
WISP_APP_PASSWORD
284
284
+
</code>{" "}
285
285
+
as a secret in your Tangled Spindle repository settings.
377
286
</div>
287
287
+
</CardContent>
288
288
+
</Card>
378
289
379
379
-
<div className="space-y-3">
380
380
-
<h3 className="text-sm font-semibold">Learn More</h3>
381
381
-
<div className="grid gap-2">
382
382
-
<a
383
383
-
href="https://docs.wisp.place/cli"
384
384
-
target="_blank"
385
385
-
rel="noopener noreferrer"
386
386
-
className="flex items-center justify-between p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border"
387
387
-
>
388
388
-
<span className="text-sm">CLI Documentation</span>
389
389
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
390
390
-
</a>
391
391
-
<a
392
392
-
href="https://tangled.org/@nekomimi.pet/wisp.place-monorepo/tree/main/cli"
393
393
-
target="_blank"
394
394
-
rel="noopener noreferrer"
395
395
-
className="flex items-center justify-between p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border"
396
396
-
>
397
397
-
<span className="text-sm">Source Code</span>
398
398
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
399
399
-
</a>
400
400
-
<a
401
401
-
href="https://blog.tangled.org/ci"
402
402
-
target="_blank"
403
403
-
rel="noopener noreferrer"
404
404
-
className="flex items-center justify-between p-3 bg-muted/50 hover:bg-muted rounded-lg transition-colors border border-border"
405
405
-
>
406
406
-
<span className="text-sm">Tangled Spindle CI/CD</span>
407
407
-
<ExternalLink className="w-4 h-4 text-muted-foreground" />
408
408
-
</a>
409
409
-
</div>
410
410
-
</div>
290
290
+
{/* Learn More */}
291
291
+
<Card>
292
292
+
<CardContent className="pt-6 space-y-1.5">
293
293
+
{LINKS.map(({ label, href }) => (
294
294
+
<a
295
295
+
key={href}
296
296
+
href={href}
297
297
+
target="_blank"
298
298
+
rel="noopener noreferrer"
299
299
+
className="flex items-center justify-between p-3 rounded-lg border border-border bg-muted/30 hover:bg-muted transition-colors"
300
300
+
>
301
301
+
<span className="text-sm">{label}</span>
302
302
+
<ExternalLink className="w-4 h-4 text-muted-foreground" />
303
303
+
</a>
304
304
+
))}
411
305
</CardContent>
412
306
</Card>
413
307
</div>
+1
-1
cli/package.json
···
1
1
{
2
2
"name": "wispctl",
3
3
-
"version": "1.0.8",
3
3
+
"version": "1.0.9",
4
4
"description": "CLI for wisp.place - deploy static sites to the AT Protocol",
5
5
"type": "module",
6
6
"main": "./dist/index.js",
+44
-28
docs/src/content/docs/cli.md
···
1
1
---
2
2
-
title: Wisp CLI 0.5.0 (alpha)
2
2
+
title: Wisp CLI v1.0.0
3
3
description: Command-line tool for deploying static sites to the AT Protocol
4
4
---
5
5
···
19
19
20
20
<div class="downloads">
21
21
22
22
-
<h2>Download v0.5.0</h2>
23
23
-
24
24
-
<a href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-darwin-universal" class="download-link" download="">
25
25
-
26
26
-
<span class="platform">macOS (Universal):</span> wisp-cli-darwin-universal
27
27
-
28
28
-
</a>
22
22
+
<h2>Download v1.0.0</h2>
29
23
30
24
<a href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-aarch64-darwin" class="download-link" download="">
31
25
···
33
27
34
28
</a>
35
29
36
36
-
<a href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-darwin-x86_64" class="download-link" download="">
30
30
+
<a href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-darwin" class="download-link" download="">
37
31
38
38
-
<span class="platform">macOS (Intel):</span> wisp-cli-darwin-x86_64
32
32
+
<span class="platform">macOS (Intel):</span> wisp-cli-x86_64-darwin
39
33
40
34
</a>
41
35
···
51
45
52
46
</a>
53
47
54
54
-
<a href="https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-windows.exe" class="download-link" download="">
55
55
-
56
56
-
<span class="platform">Windows (x86_64):</span> wisp-cli-x86_64-windows.exe
57
57
-
58
58
-
</a>
59
59
-
60
60
-
<h3 style="margin-top: 1.5rem; margin-bottom: 0.5rem;">SHA-1 Checksums</h3>
48
48
+
<h3 style="margin-top: 1.5rem; margin-bottom: 0.5rem;">SHA-256 Checksums</h3>
61
49
62
50
<pre style="font-size: 0.75rem; padding: 1rem;" class="language-bash" tabindex="0"><code class="language-bash">
63
63
-
7d0cc968d2a130158c3b204d9a15bcc29b8af252 wisp-cli-darwin-universal
64
64
-
65
65
-
912f8f99c2b55ca6ad75e0a89903688bd2c1cb4b wisp-cli-aarch64-darwin
66
66
-
67
67
-
40d26d4a9c058e42e7911a195c3e078e8a4b5e82 wisp-cli-darwin-x86_64
68
68
-
69
69
-
ef1992d8850f8fef1d719e4e8fab5431475c352e wisp-cli-aarch64-linux
70
70
-
71
71
-
3018dde8fec495abcae044079564ced93cdeb4f8 wisp-cli-x86_64-linux
72
72
-
73
73
-
d6bc789d7fd7c787e5520eb476cee70c97ccb3ce wisp-cli-x86_64-windows.exe
51
51
+
560eface5029dbecdb4adb6cca169651cc301dd6d48263a1cddf1906a2295b0b wisp-cli-aarch64-darwin
52
52
+
fc759aa8d412948f735420536ee3f7944bda6119ad2c9169583a9b188ae889e5 wisp-cli-x86_64-darwin
53
53
+
2ff51a5411a20c45fd05d29f90acd24410bdce31f6fc8a91a125691b275e1216 wisp-cli-aarch64-linux
54
54
+
8cf27698daf2d1371f1a4eb1ec1e24c4da9185639dc09edc3f8bc3d358f08738 wisp-cli-x86_64-linux
74
55
</code></pre>
75
56
76
57
</div>
···
143
124
```
144
125
145
126
Your site will be available at: `https://sites.wisp.place/your-handle/my-site`
127
127
+
128
128
+
### Domain Management
129
129
+
130
130
+
```bash
131
131
+
# Claim a custom domain
132
132
+
./wisp-cli domain claim your-handle.bsky.social --domain example.com
133
133
+
134
134
+
# Claim a subdomain
135
135
+
./wisp-cli domain claim-subdomain your-handle.bsky.social --subdomain alice
136
136
+
137
137
+
# Check domain status
138
138
+
./wisp-cli domain status your-handle.bsky.social --domain example.com
139
139
+
140
140
+
# Attach a site to a domain
141
141
+
./wisp-cli domain add-site your-handle.bsky.social --domain example.com --site mysite
142
142
+
143
143
+
# Delete a domain or site
144
144
+
./wisp-cli domain delete your-handle.bsky.social --domain example.com
145
145
+
./wisp-cli site delete your-handle.bsky.social --site mysite
146
146
+
```
147
147
+
148
148
+
### List Domains & Sites
149
149
+
150
150
+
```bash
151
151
+
./wisp-cli list domains your-handle.bsky.social
152
152
+
./wisp-cli list sites your-handle.bsky.social
153
153
+
```
154
154
+
155
155
+
### Options
156
156
+
157
157
+
Use an alternate proxy service DID:
158
158
+
159
159
+
```bash
160
160
+
./wisp-cli list domains your-handle.bsky.social --service did:web:example.com
161
161
+
```
146
162
147
163
### Pull a Site from PDS
148
164
+2
-2
packages/create-wisp/package.json
···
1
1
{
2
2
"name": "create-wisp",
3
3
-
"version": "1.0.8",
3
3
+
"version": "1.0.9",
4
4
"description": "CLI for wisp.place - deploy static sites to the AT Protocol",
5
5
"type": "module",
6
6
"bin": {
···
10
10
"bin.js"
11
11
],
12
12
"dependencies": {
13
13
-
"wispctl": "^1.0.8"
13
13
+
"wispctl": "^1.0.9"
14
14
}
15
15
}