@rizom/ops 0.2.0-alpha.22 → 0.2.0-alpha.221

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.
Files changed (45) hide show
  1. package/README.md +3 -1
  2. package/dist/brains-ops.js +229 -283
  3. package/dist/cert-bootstrap.d.ts +3 -1
  4. package/dist/content-repo-ref.d.ts +10 -0
  5. package/dist/content-repo.d.ts +1 -0
  6. package/dist/deploy.js +99 -166
  7. package/dist/entries/deploy.d.ts +3 -2
  8. package/dist/images.d.ts +76 -0
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.js +268 -281
  11. package/dist/load-registry.d.ts +25 -2
  12. package/dist/observed-status.d.ts +1 -1
  13. package/dist/origin-ca.d.ts +1 -1
  14. package/dist/parse-args.d.ts +3 -0
  15. package/dist/preview-domain.d.ts +9 -0
  16. package/dist/push-secrets.d.ts +2 -9
  17. package/dist/push-target.d.ts +1 -2
  18. package/dist/run-command.d.ts +1 -1
  19. package/dist/run-subprocess.d.ts +1 -6
  20. package/dist/schema.d.ts +64 -155
  21. package/dist/secrets-encrypt.d.ts +5 -13
  22. package/dist/ssh-key-bootstrap.d.ts +1 -26
  23. package/dist/user-add.d.ts +15 -0
  24. package/dist/verify-user.d.ts +19 -0
  25. package/package.json +45 -42
  26. package/templates/rover-pilot/.env.schema +17 -3
  27. package/templates/rover-pilot/.github/workflows/build.yml +64 -17
  28. package/templates/rover-pilot/.github/workflows/deploy.yml +128 -61
  29. package/templates/rover-pilot/.github/workflows/reconcile.yml +21 -1
  30. package/templates/rover-pilot/README.md +5 -3
  31. package/templates/rover-pilot/deploy/scripts/decrypt-user-secrets.ts +78 -24
  32. package/templates/rover-pilot/deploy/scripts/helpers.ts +3 -0
  33. package/templates/rover-pilot/deploy/scripts/resolve-deploy-handles.ts +12 -3
  34. package/templates/rover-pilot/deploy/scripts/resolve-missing-images.ts +13 -0
  35. package/templates/rover-pilot/deploy/scripts/resolve-user-config.ts +44 -9
  36. package/templates/rover-pilot/deploy/scripts/sync-content-repo.ts +51 -47
  37. package/templates/rover-pilot/deploy/scripts/update-dns.ts +14 -4
  38. package/templates/rover-pilot/deploy/scripts/validate-secrets.ts +1 -1
  39. package/templates/rover-pilot/docs/onboarding-checklist.md +33 -13
  40. package/templates/rover-pilot/docs/operator-playbook.md +183 -10
  41. package/templates/rover-pilot/docs/user-onboarding.md +67 -332
  42. package/templates/rover-pilot/pilot.yaml +1 -1
  43. package/templates/rover-pilot/.kamal/hooks/pre-deploy +0 -9
  44. package/templates/rover-pilot/deploy/Dockerfile +0 -30
  45. package/templates/rover-pilot/deploy/kamal/deploy.yml +0 -40
@@ -1,384 +1,119 @@
1
- # Rover Pilot User Onboarding
1
+ # Welcome to Rover
2
2
 
3
- Welcome to the Rover pilot.
3
+ ---
4
4
 
5
- This document is written for **first-time users**. You do **not** need prior experience with Rover, MCP, git, or the rest of the system to get started.
5
+ Most of us have more thinking happening than we can hold onto. Ideas show up in the wrong moment, notes land in five different places, and half of what you've figured out is effectively invisible by the time you need it again.
6
6
 
7
- ## What Rover is
8
-
9
- Rover is your private AI assistant for working with your own notes, links, and ideas.
10
-
11
- In this pilot, Rover is intentionally simple:
12
-
13
- - you will usually talk to it in **Discord**
14
- - **there is no website to browse**
15
- - **MCP is optional** and only needed for direct client access or specific testing workflows
16
- - your content can also live in a normal git repo of markdown/text files; **Obsidian is optional** if you want a nicer note-editing interface
17
-
18
- You can think of Rover as a private knowledge companion that helps you:
19
-
20
- - save notes
21
- - save links
22
- - reflect on your own material
23
- - find patterns in what you have collected
24
- - think through questions with AI
25
-
26
- ## What you will receive from us
27
-
28
- We will send you the details you need to get started.
29
-
30
- That usually includes:
31
-
32
- - confirmation that Discord is enabled for you, plus the invite/setup steps
33
- - if needed, your Rover MCP URL: `https://<handle>.rizom.ai/mcp`
34
- - if needed, your **Bearer token**
35
- - if needed, an invite to your **private** Rover content repo
36
- - any extra instructions if we are testing a specific workflow with your cohort
37
-
38
- If we give you a **Bearer token**, treat it like a password. Do not share it.
39
-
40
- ## One important idea: Discord is the default, MCP is optional
41
-
42
- If you are new to Rover, the shortest explanation is:
43
-
44
- - **Rover** is the assistant
45
- - **Discord** is the default way most pilot users will talk to it
46
- - **MCP** is an optional direct connection method for supported AI clients
47
-
48
- You do not need to understand the protocol details unless we specifically ask you to use MCP.
49
-
50
- For most users, the practical meaning is simple:
51
-
52
- - join Discord
53
- - message Rover there
54
- - start using it
55
-
56
- If your cohort is also testing MCP, we will send the URL, Bearer token, and setup help separately.
57
-
58
- ## What to use first
59
-
60
- For most users, the easiest first setup is:
61
-
62
- - **Discord** for talking to Rover
63
- - a normal **git repo of markdown/text files** only if you also want to work directly with your content later
64
- - **Obsidian** only if you want a friendlier interface for those same files
65
- - **Claude Desktop** or another MCP client only if we explicitly ask you to test a direct MCP workflow
66
-
67
- ## Default setup: Discord
68
-
69
- For most users, getting started means:
70
-
71
- - join the Discord server we send you
72
- - open the Rover channel or DM
73
- - send a first message
74
-
75
- Try a first message like:
76
-
77
- > What can you help me do, and what should I use you for?
78
-
79
- Or:
80
-
81
- > Help me save my first note.
82
-
83
- If Discord is not enabled for you yet, tell us and we will share the right next step.
84
-
85
- ## Optional: direct MCP access
86
-
87
- If we have asked you to use an MCP client, use one that supports:
88
-
89
- - **HTTP / Streamable HTTP MCP**
90
- - **Bearer token authentication**
91
-
92
- When your client asks for connection details, use:
93
-
94
- - **Server URL:** `https://<handle>.rizom.ai/mcp`
95
- - **Authentication type:** Bearer token
96
- - **Bearer token:** the token we sent you
97
-
98
- If the client asks for a name, use something simple like:
99
-
100
- - `Rover (<handle>)`
101
-
102
- ## Optional: Claude Desktop setup
103
-
104
- If we ask you to connect through Claude Desktop and your version supports a **remote HTTP / Streamable HTTP MCP server**, enter:
105
-
106
- - **Server URL:** `https://<handle>.rizom.ai/mcp`
107
- - **Authentication:** Bearer token
108
- - **Token:** the token we sent you
109
-
110
- Then try a first message like:
111
-
112
- > What can you help me do, and what should I use you for?
113
-
114
- Or:
115
-
116
- > Help me save my first note.
117
-
118
- If your Claude Desktop version only supports local MCP servers and not remote HTTP MCP cleanly, tell us what version you are using and we will help you.
119
-
120
- ## Your first 5 minutes
121
-
122
- Once you are connected, try this sequence:
123
-
124
- ### 1. Check that Rover responds
125
-
126
- Ask:
127
-
128
- > What can you help me do?
129
-
130
- ### 2. Save a first note
131
-
132
- Ask:
7
+ Rover is built for that problem. It's a private space where your thinking accumulates — notes, links, fragments, half-formed ideas — and an AI that can work with all of it. Find things you saved months ago. Connect dots across topics. Turn a rough note into a draft. The more you put in, the more useful it gets. And if another Rover user is in your network, your Rovers can talk to each other — share knowledge, work on something together — just by asking.
133
8
 
134
- > Save a note: I want to use Rover to collect ideas from my work, reading, and conversations.
9
+ ---
135
10
 
136
- ### 3. Save a useful link
137
-
138
- Ask:
139
-
140
- > Save this link and note why it matters to me: <paste URL>
141
-
142
- ### 4. Ask Rover to reflect back what it knows
143
-
144
- Ask:
145
-
146
- > Based on what I’ve stored so far, what themes are starting to emerge?
147
-
148
- ### 5. Use it as a thinking partner
149
-
150
- Ask:
151
-
152
- > I am thinking through a problem in my work. Help me structure the question and identify what context is missing.
153
-
154
- ## Wishlist: when Rover cannot do something yet
155
-
156
- Rover has a built-in **wishlist**.
157
-
158
- This is important for first-time users because Rover will not be able to do everything yet.
159
-
160
- If you ask for something Rover cannot do, it should add that request to the wishlist instead of just failing silently.
161
-
162
- You can think of the wishlist as:
163
-
164
- - a backlog of missing capabilities
165
- - a record of things users want Rover to do
166
- - a way for the pilot team to see which missing features matter most
167
-
168
- ### When the wishlist is useful
169
-
170
- The wishlist is especially useful when you ask Rover to do something like:
171
-
172
- - connect to a tool it does not support yet
173
- - perform an action it cannot perform yet
174
- - add a workflow or feature that does not exist yet
175
-
176
- Examples:
177
-
178
- > I want Rover to draft and send emails for me.
179
-
180
- > I want Rover to connect to my calendar.
181
-
182
- > I want Rover to summarize voice notes automatically.
183
-
184
- If Rover cannot actually do those things yet, it should tell you that and add the request to the wishlist.
185
-
186
- ### What happens when something is added to the wishlist
187
-
188
- When a request is added to the wishlist:
189
-
190
- - it is saved as a **wish**
191
- - it starts in a **new** state
192
- - similar requests can be grouped together instead of creating endless duplicates
193
- - repeated demand can increase the count of how many times that wish was requested
194
-
195
- That helps us see which gaps are one-off ideas and which ones keep coming up across real usage.
196
-
197
- ### How you should use it
198
-
199
- You do **not** need special commands.
200
-
201
- Just ask naturally.
202
-
203
- If Rover cannot do what you asked, a good response from Rover is something like:
204
-
205
- - it explains the limitation clearly
206
- - it says the request was added to the wishlist
207
-
208
- If that does **not** happen, that is useful feedback for us too.
209
-
210
- ## Git, text files, and Obsidian
211
-
212
- The underlying content workflow is a normal **git repo** with normal **markdown/text files**.
213
-
214
- Obsidian is optional. It is just one possible editor for those files.
215
-
216
- That means:
217
-
218
- - use **Discord** as the main way to talk to Rover
219
- - use a normal editor plus **git** if you want to browse, draft, and edit your files directly
220
- - use **Obsidian** only if you want a more note-focused interface for the same files
221
- - Rover can pick up those file changes through the normal git-sync / directory-sync flow
222
-
223
- A simple mental model:
224
-
225
- - **Discord** = talk to Rover
226
- - **git repo + text files** = the underlying content
227
- - **Obsidian** = an optional editor for that content
228
-
229
- ### Important: your content repo is private
230
-
231
- If you use the git/text-file workflow, you will be working in your own **private** GitHub repo.
232
-
233
- That means:
234
-
235
- - you do **not** need repo access just to use Rover in Discord or through MCP
236
- - you **do** need GitHub access if you want to clone, edit, and push to your content repo
237
- - we will invite you only to **your own** content repo, not to the operator repo and not to other users' repos
238
-
239
- ### How you get access
240
-
241
- If you want the git/text-file workflow, we will:
242
-
243
- 1. create or confirm your private content repo
244
- 2. invite your GitHub account to that repo
245
- 3. ask you to accept the GitHub invite
246
- 4. send you the repo URL
247
-
248
- ### Easiest setup for most users
249
-
250
- The easiest path for most first-time users is:
11
+ ## What Rover is
251
12
 
252
- 1. install **GitHub Desktop**
253
- 2. accept the repo invite in GitHub
254
- 3. clone the private repo with GitHub Desktop
255
- 4. open the cloned folder in your normal editor and edit the markdown/text files directly
256
- 5. optionally open that same folder as an **Obsidian** vault if you prefer
257
- 6. commit and push your changes
13
+ Rover is your private knowledge companion. It holds your notes, links, and ideas — and helps you think with them, not just store them.
258
14
 
259
- ### Authentication options
15
+ Ask it a question and it searches what you've saved. Give it a fragment of thinking and it can help you turn it into something.
260
16
 
261
- To work with a private repo, you need GitHub authentication.
17
+ ---
262
18
 
263
- Usually the easiest order is:
19
+ ## Getting in
264
20
 
265
- 1. **GitHub Desktop** or normal GitHub sign-in
266
- 2. **SSH key** if you already use git that way
267
- 3. a **fine-grained personal access token** only if another tool specifically requires it
21
+ We'll send you a personal URL — something like `https://<handle>.rizom.ai/`.
268
22
 
269
- You do **not** need a personal access token just to use Rover in Discord or through MCP.
23
+ When you open it for the first time, you'll be asked to set a passkey. Do that once and you're in. No passwords to remember.
270
24
 
271
- If we have already shared your content repo workflow with you, the normal setup is:
25
+ From there, your three main interfaces are:
272
26
 
273
- 1. clone your Rover content repo locally
274
- 2. edit the markdown/text files in your normal editor, or open that same folder as an Obsidian vault if you prefer
275
- 3. optionally install the **Obsidian Git** plugin if you want in-app commit/push/pull support
276
- 4. edit or organize your notes there
277
- 5. commit and push your changes through normal git, GitHub Desktop, or the Obsidian Git plugin
278
- 6. let the normal git-sync flow carry those changes into Rover
27
+ - **Chat** (`/chat`) where you talk to Rover
28
+ - **Dashboard** (`/`) an overview of your Rover
29
+ - **CMS** (`/cms`) a browser editor for your content
279
30
 
280
- If we have **not** given you a direct content repo workflow yet, that is fine. You can ignore git, text files, and Obsidian for now and use Rover in Discord. If we have also asked you to test MCP, you can use that too.
31
+ Start with Chat. Everything else follows from there.
281
32
 
282
- ## Discord (default)
33
+ ---
283
34
 
284
- Discord is the default interface for this pilot.
35
+ ## Your first five minutes
285
36
 
286
- Think of it as the main place to:
37
+ 1. Open your Chat URL. A good first message:
38
+ > Help me save my first note.
39
+ 2. Save something — a thought, a link, an idea. Doesn't need to be polished.
40
+ 3. Ask Rover about it. See what comes back.
287
41
 
288
- - save quick notes
289
- - drop in links to save
290
- - ask short or long questions
291
- - use Rover day to day without setting up a separate client
42
+ That loop — save, ask, get something useful back — is the core of how Rover works.
292
43
 
293
- Important:
44
+ ---
294
45
 
295
- - **Discord is the main pilot interface moving forward**
296
- - MCP is **optional**
297
- - if Discord is enabled, we will send the exact invite/setup steps separately
298
- - for some pilot setups, Discord-enabled users may need to supply their own bot token
46
+ ## The Chat and the CMS: when to use which
299
47
 
300
- If Discord is **not** enabled for you yet, ask us and we will tell you whether your cohort is on the Discord-first workflow.
48
+ **Chat** is for thinking out loud, asking questions, saving things quickly, and using Rover as a day-to-day thinking partner.
301
49
 
302
- ## What to expect in the pilot
50
+ **CMS** is for when you want to deliberately create or edit content — browsing your notes, making clean edits, working more like an editor than a conversationalist.
303
51
 
304
- This is a real working system, but it is still an early pilot.
52
+ Most people spend most of their time in Chat. The CMS becomes useful once you have something worth editing.
305
53
 
306
- So you should expect:
54
+ ---
307
55
 
308
- - some rough edges
309
- - a setup process that may still be a bit manual
310
- - a Rover that becomes more useful as you add more notes and links
311
- - occasional follow-up questions from us about your experience
312
- - improvements and changes during the pilot
56
+ ## Other ways to chat with Rover
313
57
 
314
- That is normal. The point of the pilot is to learn from real use.
58
+ `/chat` is the primary interface, but Rover can also be reached through messaging platforms. Discord is tested and working. Slack, WhatsApp Business, and similar should work out of the box we'll send setup steps if that's part of your configuration.
315
59
 
316
- ## Privacy and boundaries
60
+ **Talking to another Rover**
317
61
 
318
- For the pilot:
62
+ If you know another Rover user, you can add them to your contacts and call their Rover directly from your chat.
319
63
 
320
- - your Rover is deployed specifically for you
321
- - if you are using MCP, access to `/mcp` is protected by your Bearer token
322
- - you should avoid putting highly sensitive material into the pilot unless we have explicitly agreed that it is in scope
64
+ - To add: _Add jane.rizom.ai to my contacts._
65
+ - To call: _Call jane.rizom.ai and ask [your question]._
66
+ You'll need their address in the format `name.rizom.ai` which they can share with you directly.
323
67
 
324
- If you are unsure whether something belongs in Rover, ask us first.
68
+ ---
325
69
 
326
- ## Troubleshooting
70
+ ## Connecting Rover to other tools
327
71
 
328
- ### I opened the domain and it does not look like a normal site
72
+ Rover can connect to external tools via MCP — a standard protocol that works in two directions: agentic AI clients (like Claude Desktop) can use it to talk to Rover, and Rover can use it to talk to productivity tools like Notion or Linear.
329
73
 
330
- That is expected. In this pilot, **there is no website to browse**. Rover runs through Discord and, optionally, a direct MCP endpoint.
74
+ Plugins exist for a number of tools already, and new ones can be built quickly in response to what you actually need. If there's a tool you'd want Rover to connect to, tell us.
331
75
 
332
- ### I got an authentication error in MCP
76
+ If MCP is part of your setup, we'll send specific instructions alongside your URL.
333
77
 
334
- Usually this means one of three things:
78
+ ---
335
79
 
336
- - the Bearer token was missing
337
- - the Bearer token was pasted incorrectly
338
- - the client is using the wrong authentication type
80
+ ## A few common questions
339
81
 
340
- Double-check that you are using:
82
+ **How do I access my data?**
83
+ Your primary interface is the CMS (`/cms`), where you can browse and edit everything you've saved. If you're set up with GitHub access, your content also lives in a private repository you can access directly.
341
84
 
342
- - URL: `https://<handle>.rizom.ai/mcp`
343
- - auth type: **Bearer token**
344
- - token: exactly the token we sent you
85
+ **Does Rover connect to the internet?**
86
+ No and that's intentional. Rover works with what you've put into it, not with whatever the internet currently says. That means its answers are grounded in your actual knowledge base, not in generic search results.
345
87
 
346
- ### My MCP client says it cannot connect
88
+ **What does this cost?**
89
+ Nothing during the pilot. We cover hosting costs while you're part of the programme.
347
90
 
348
- Some clients support local MCP servers better than remote HTTP MCP servers.
91
+ ---
349
92
 
350
- If that happens, send us:
93
+ ## This is a pilot
351
94
 
352
- - the name of the client
353
- - the version you are using
354
- - the exact error message
355
- - a screenshot if possible
95
+ Rover works. But it's not finished.
356
96
 
357
- ## What feedback helps us most
97
+ You'll hit rough edges. Some things you try won't work. Some things you expect to be there won't be yet. That's normal — and it's actually why you're here.
358
98
 
359
- We especially want to hear:
99
+ There's a ceiling on how much Rover can improve without real people using it on real problems. We've reached that ceiling on our own. Your usage is what lets the product become what it's capable of becoming. A single Rover in isolation can only do so much — the network only becomes real when there are enough active, populated Rovers in it.
360
100
 
361
- - what was confusing during setup
362
- - what felt useful immediately
363
- - what felt weak, awkward, or unclear
364
- - what you expected Rover to do but could not get it to do
365
- - whether you would keep using it after the pilot
101
+ Rover has a built-in wishlist. If you ask it to do something it can't do yet, it should tell you clearly and log the request — that goes back to us as a signal for where the product needs to go next.
366
102
 
367
- Short, honest feedback is perfect.
103
+ When something breaks or falls short, tell us: what you were trying to do, what you expected, and what happened instead.
368
104
 
369
- ## Quick handoff template
105
+ ---
370
106
 
371
- When we onboard you, the message will look roughly like this:
107
+ ## Your access details
372
108
 
373
- ```text
374
- Discord enabled: yes/no
375
- Discord setup: <invite link or setup steps>
376
- MCP access: optional / enabled / not enabled
109
+ When we onboard you, we'll send something like:
377
110
 
378
- If MCP is enabled:
379
- MCP URL: https://<handle>.rizom.ai/mcp
380
- Auth type: Bearer token
381
- Bearer token: <token>
111
+ ```
112
+ Chat URL: https://<handle>.rizom.ai/chat
113
+ Dashboard URL: https://<handle>.rizom.ai/
114
+ CMS URL: https://<handle>.rizom.ai/cms
115
+ Discord: yes/no — setup steps below if yes
116
+ MCP: enabled/not enabled — details below if enabled
382
117
  ```
383
118
 
384
- If anything is unclear, reply with the exact error text or a screenshot and we will help.
119
+ If anything is unclear, reply with what you're seeing and we'll help.
@@ -7,5 +7,5 @@ domainSuffix: .rizom.ai
7
7
  preset: core
8
8
  aiApiKey: AI_API_KEY
9
9
  gitSyncToken: GIT_SYNC_TOKEN
10
- mcpAuthToken: MCP_AUTH_TOKEN
10
+ contentRepoAdminToken: CONTENT_REPO_ADMIN_TOKEN
11
11
  agePublicKey: age1replace-with-your-public-key
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- BRAIN_FILE="${BRAIN_YAML_PATH:-brain.yaml}"
5
- SSH_USER="$(ruby -e 'require "yaml"; config = YAML.load_file("deploy/kamal/deploy.yml") || {}; puts(config.dig("ssh", "user") || "root")')"
6
- IFS=',' read -ra HOSTS <<< "$KAMAL_HOSTS"
7
- for host in "${HOSTS[@]}"; do
8
- scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$BRAIN_FILE" "${SSH_USER}@${host}:/opt/brain.yaml"
9
- done
@@ -1,30 +0,0 @@
1
- ARG BUN_VERSION=1.3.10
2
- FROM oven/bun:${BUN_VERSION}-slim AS runtime
3
-
4
- WORKDIR /app
5
-
6
- RUN apt-get update && apt-get install -y --no-install-recommends \
7
- curl ca-certificates git \
8
- && rm -rf /var/lib/apt/lists/*
9
-
10
- ENV XDG_DATA_HOME=/data
11
- ENV XDG_CONFIG_HOME=/config
12
- RUN mkdir -p /app/data /app/cache /app/brain-data && \
13
- chmod -R 777 /app/data /app/cache /app/brain-data
14
-
15
- EXPOSE 8080
16
-
17
- CMD ["./node_modules/.bin/brain", "start"]
18
-
19
- # --- standalone: bake full project into image (brain-cli deploy) ---
20
- FROM runtime AS standalone
21
- COPY package.json ./package.json
22
- RUN bun install --production --ignore-scripts
23
- COPY . .
24
-
25
- # --- fleet: install published brain at pinned version (ops deploy) ---
26
- FROM runtime AS fleet
27
- ARG BRAIN_VERSION
28
- RUN test -n "$BRAIN_VERSION" \
29
- && printf '{"name":"rover-pilot-runtime","private":true}\n' > package.json \
30
- && bun add @rizom/brain@$BRAIN_VERSION
@@ -1,40 +0,0 @@
1
- service: rover
2
- image: <%= ENV['IMAGE_REPOSITORY'] %>
3
-
4
- servers:
5
- web:
6
- hosts:
7
- - <%= ENV['SERVER_IP'] %>
8
-
9
- proxy:
10
- ssl:
11
- certificate_pem: CERTIFICATE_PEM
12
- private_key_pem: PRIVATE_KEY_PEM
13
- hosts:
14
- - <%= ENV['BRAIN_DOMAIN'] %>
15
- - <%= ENV['PREVIEW_DOMAIN'] %>
16
- app_port: 8080
17
- healthcheck:
18
- path: /health
19
-
20
- registry:
21
- server: ghcr.io
22
- username: <%= ENV['REGISTRY_USERNAME'] %>
23
- password:
24
- - KAMAL_REGISTRY_PASSWORD
25
-
26
- builder:
27
- arch: amd64
28
-
29
- env:
30
- clear:
31
- NODE_ENV: production
32
- secret:
33
- - AI_API_KEY
34
- - GIT_SYNC_TOKEN
35
- - MCP_AUTH_TOKEN
36
- - DISCORD_BOT_TOKEN
37
-
38
- volumes:
39
- - /opt/brain-data:/app/brain-data
40
- - /opt/brain.yaml:/app/brain.yaml