okengine 0.10.3 → 0.11.1

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 (323) hide show
  1. package/package.json +76 -10
  2. package/site/content/docs/deployment/docker-swarm.mdx +48 -111
  3. package/site/content/docs/deployment/docker.mdx +43 -36
  4. package/site/content/docs/deployment/index.mdx +9 -9
  5. package/site/content/docs/deployment/kubernetes.mdx +4 -4
  6. package/site/content/docs/elements/ai.mdx +7 -7
  7. package/site/content/docs/elements/channel.mdx +9 -7
  8. package/site/content/docs/elements/clock.mdx +8 -8
  9. package/site/content/docs/elements/flow.mdx +46 -47
  10. package/site/content/docs/elements/gate.mdx +6 -5
  11. package/site/content/docs/elements/signal.mdx +2 -2
  12. package/site/content/docs/elements/store.mdx +71 -78
  13. package/site/content/docs/elements/vault.mdx +89 -70
  14. package/site/content/docs/get-started/basic-usage.mdx +8 -8
  15. package/site/content/docs/get-started/installation.mdx +36 -36
  16. package/site/content/docs/get-started/introduction.mdx +11 -0
  17. package/site/content/docs/get-started/why.mdx +2 -2
  18. package/site/content/docs/plugins/anonymous.mdx +1 -1
  19. package/site/content/docs/plugins/magic-link.mdx +11 -11
  20. package/site/content/docs/plugins/otp.mdx +2 -2
  21. package/site/content/docs/plugins/passkey.mdx +1 -1
  22. package/site/content/docs/plugins/two-factor.mdx +1 -1
  23. package/site/content/docs/plugins/username.mdx +1 -1
  24. package/site/content/docs/recipes/caddy.mdx +1 -1
  25. package/site/content/docs/recipes/cockroachdb.mdx +2 -2
  26. package/site/content/docs/recipes/dragonfly.mdx +1 -1
  27. package/site/content/docs/recipes/index.mdx +1 -2
  28. package/site/content/docs/recipes/llama-cpp.mdx +21 -23
  29. package/site/content/docs/recipes/mailpit.mdx +11 -11
  30. package/site/content/docs/recipes/meilisearch.mdx +10 -10
  31. package/site/content/docs/recipes/meta.json +0 -1
  32. package/site/content/docs/recipes/ollama.mdx +1 -1
  33. package/site/content/docs/recipes/pgdog.mdx +12 -9
  34. package/site/content/docs/recipes/postgres.mdx +3 -3
  35. package/site/content/docs/recipes/redis.mdx +2 -2
  36. package/site/content/docs/recipes/rustfs.mdx +10 -7
  37. package/site/content/docs/recipes/sglang.mdx +1 -1
  38. package/site/content/docs/recipes/supabase-docker.mdx +1 -1
  39. package/site/content/docs/recipes/timescale.mdx +2 -2
  40. package/site/content/docs/recipes/valkey.mdx +1 -1
  41. package/site/content/docs/recipes/vllm.mdx +1 -1
  42. package/site/content/docs/recipes/yugabytedb.mdx +2 -2
  43. package/site/content/docs/reference/cli.md +61 -38
  44. package/site/content/docs/reference/configuration.mdx +145 -70
  45. package/site/content/docs/reference/environment-variables.mdx +36 -28
  46. package/site/content/docs/reference/errors.mdx +28 -29
  47. package/site/content/docs/reference/fx.mdx +11 -4
  48. package/site/content/docs/reference/i18n.mdx +17 -6
  49. package/site/content/docs/reference/index.mdx +5 -0
  50. package/site/content/docs/reference/meta.json +1 -0
  51. package/site/content/docs/reference/migrating-environments.mdx +158 -0
  52. package/site/content/docs/reference/plugins.mdx +2 -2
  53. package/src/auth/gate-auth.test.ts +12 -10
  54. package/src/cli/ai-setup/ai-setup.test.ts +27 -15
  55. package/src/cli/ai-setup/apply.ts +111 -15
  56. package/src/cli/ai-setup/catalog.ts +3 -3
  57. package/src/cli/ai-setup/index.ts +1 -1
  58. package/src/cli/ai-setup/prompts.ts +1 -1
  59. package/src/cli/ai-setup/recommend.test.ts +1 -1
  60. package/src/cli/ask-seed.test.ts +3 -3
  61. package/src/cli/build.ts +1 -1
  62. package/src/cli/db-auto-push.test.ts +6 -3
  63. package/src/cli/db-auto-push.ts +7 -5
  64. package/src/cli/db-seed.ts +7 -8
  65. package/src/cli/db.test.ts +70 -71
  66. package/src/cli/db.ts +86 -12
  67. package/src/cli/dev-controller.test.ts +35 -0
  68. package/src/cli/dev-controller.ts +298 -0
  69. package/src/cli/dev-controls.ts +11 -65
  70. package/src/cli/dev-db-push.test.ts +47 -15
  71. package/src/cli/dev-schema-sync.test.ts +11 -11
  72. package/src/cli/dev-schema-sync.ts +10 -10
  73. package/src/cli/dev-session-lock.test.ts +106 -0
  74. package/src/cli/dev-session-lock.ts +209 -0
  75. package/src/cli/dev.test.ts +166 -121
  76. package/src/cli/dev.ts +138 -192
  77. package/src/cli/doc-staleness.test.ts +3 -6
  78. package/src/cli/docker-clean.test.ts +33 -1
  79. package/src/cli/docker-clean.ts +28 -33
  80. package/src/cli/docker-cli.test.ts +12 -11
  81. package/src/cli/docker.ts +95 -20
  82. package/src/cli/doctor.test.ts +40 -0
  83. package/src/cli/doctor.ts +55 -15
  84. package/src/cli/drizzle-env.test.ts +11 -13
  85. package/src/cli/drizzle-env.ts +18 -11
  86. package/src/cli/ensure-drizzle-config.ts +11 -14
  87. package/src/cli/hero-meta.test.ts +15 -15
  88. package/src/cli/hero-meta.ts +10 -9
  89. package/src/cli/index.ts +36 -6
  90. package/src/cli/load-config.images.test.ts +16 -12
  91. package/src/cli/load-config.source.test.ts +50 -0
  92. package/src/cli/load-config.ts +34 -28
  93. package/src/cli/meilisearch-local.ts +1 -2
  94. package/src/cli/mode.ts +7 -58
  95. package/src/cli/registry.ts +175 -19
  96. package/src/cli/resolve-dev-sql-env.test.ts +8 -16
  97. package/src/cli/resolve-dev-sql-env.ts +13 -15
  98. package/src/cli/safe-defaults.test.ts +28 -10
  99. package/src/cli/schema.ts +65 -16
  100. package/src/cli/test.ts +58 -0
  101. package/src/cli/tui/App.tsx +252 -0
  102. package/src/cli/tui/DevLive.tsx +116 -0
  103. package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
  104. package/src/cli/tui/components/HeaderBar.tsx +67 -0
  105. package/src/cli/tui/components/LogStream.tsx +47 -0
  106. package/src/cli/tui/components/PanelCard.tsx +39 -0
  107. package/src/cli/tui/components/SelectRow.tsx +37 -0
  108. package/src/cli/tui/components/SlashPalette.tsx +172 -0
  109. package/src/cli/tui/components/Spinner.tsx +32 -0
  110. package/src/cli/tui/components/StatusBar.tsx +51 -0
  111. package/src/cli/tui/components/StatusDot.tsx +37 -0
  112. package/src/cli/tui/components/TabBar.tsx +49 -0
  113. package/src/cli/tui/components/Wordmark.tsx +43 -0
  114. package/src/cli/tui/format.ts +38 -0
  115. package/src/cli/tui/keys.test.ts +18 -0
  116. package/src/cli/tui/keys.ts +26 -0
  117. package/src/cli/tui/launch.test.ts +18 -0
  118. package/src/cli/tui/launch.ts +57 -0
  119. package/src/cli/tui/panels/Dashboard.tsx +201 -0
  120. package/src/cli/tui/panels/Database.tsx +198 -0
  121. package/src/cli/tui/panels/Dev.tsx +257 -0
  122. package/src/cli/tui/panels/Docker.tsx +357 -0
  123. package/src/cli/tui/panels/Navigator.test.ts +22 -0
  124. package/src/cli/tui/panels/Navigator.tsx +213 -0
  125. package/src/cli/tui/slash-catalog.test.ts +31 -0
  126. package/src/cli/tui/slash-catalog.ts +184 -0
  127. package/src/cli/tui/slash-run.ts +54 -0
  128. package/src/cli/tui/state/ports.ts +95 -0
  129. package/src/cli/tui/theme.ts +24 -0
  130. package/src/cli/vault-cmd.test.ts +402 -0
  131. package/src/cli/vault-cmd.ts +727 -69
  132. package/src/cli/vault-secure-input.test.ts +56 -0
  133. package/src/cli/vault-secure-input.ts +124 -0
  134. package/src/compiler/effects-infer.ts +7 -0
  135. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  136. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
  137. package/src/compiler/fixtures/skyport.expected.json +1 -1
  138. package/src/compiler-entry.ts +7 -0
  139. package/src/config/define-config.test.ts +111 -47
  140. package/src/config/driver-defaults.test.ts +16 -23
  141. package/src/config/driver-defaults.ts +33 -63
  142. package/src/config/index.ts +169 -144
  143. package/src/config/resolve-driver.test.ts +14 -19
  144. package/src/console/server/app.ts +4 -2
  145. package/src/console/server/console.test.ts +58 -1
  146. package/src/console/server/flows.ts +22 -2
  147. package/src/console/server/index.ts +3 -0
  148. package/src/console/server/operator-db.test.ts +55 -13
  149. package/src/console/server/operator-db.ts +305 -263
  150. package/src/console/server/serve.ts +16 -7
  151. package/src/console/server/state.ts +31 -9
  152. package/src/console/server/vault.test.ts +120 -5
  153. package/src/console/server/vault.ts +208 -12
  154. package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
  155. package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
  156. package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
  157. package/src/console/ui/dist/index.html +2 -2
  158. package/src/console/ui/shell/client.ts +16 -0
  159. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
  160. package/src/console/ui/vault/VaultA11yView.tsx +33 -1
  161. package/src/console/ui/vault/backend.test.ts +75 -0
  162. package/src/console/ui/vault/backend.ts +117 -0
  163. package/src/console/ui/vault/fixture.ts +21 -2
  164. package/src/console/ui/vault/index.ts +11 -1
  165. package/src/console/ui/vault/types.ts +26 -0
  166. package/src/docker/compose.ts +164 -61
  167. package/src/docker/derive.ts +106 -12
  168. package/src/docker/docker.test.ts +156 -110
  169. package/src/docker/helpers.ts +98 -0
  170. package/src/docker/images-config.test.ts +3 -8
  171. package/src/docker/index.ts +30 -5
  172. package/src/docker/recipes/index.ts +0 -3
  173. package/src/docker/recipes/llama-cpp.ts +4 -4
  174. package/src/docker/recipes/pgdog.ts +9 -2
  175. package/src/docker/resources.test.ts +71 -0
  176. package/src/docker/resources.ts +176 -0
  177. package/src/docker/stack-id.test.ts +11 -4
  178. package/src/docker/stack-id.ts +42 -32
  179. package/src/docker/stack.integration.test.ts +4 -15
  180. package/src/docker/types.ts +35 -3
  181. package/src/drivers/ai-ollama.integration.test.ts +2 -2
  182. package/src/drivers/conformance.test.ts +11 -12
  183. package/src/drivers/drizzle-dialect.test.ts +0 -4
  184. package/src/drivers/drizzle-dialect.ts +7 -13
  185. package/src/drivers/index.ts +24 -7
  186. package/src/drivers/journal-postgres.test.ts +3 -1
  187. package/src/drivers/journal-postgres.ts +4 -2
  188. package/src/drivers/meilisearch.ts +1 -1
  189. package/src/drivers/pglite.ts +28 -5
  190. package/src/drivers/types.ts +9 -11
  191. package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
  192. package/src/drivers/vault-aws-secrets-manager.ts +333 -0
  193. package/src/drivers/vault-builtin.test.ts +110 -0
  194. package/src/drivers/vault-builtin.ts +184 -0
  195. package/src/drivers/vault-driver-removal.test.ts +13 -0
  196. package/src/drivers/vault-managed.test.ts +95 -0
  197. package/src/drivers/vault-managed.ts +101 -25
  198. package/src/drivers/vault-types.ts +25 -5
  199. package/src/elements/ai/runtime.ts +1 -1
  200. package/src/elements/clock/chaos.test.ts +4 -1
  201. package/src/elements/clock/durable.ts +57 -4
  202. package/src/elements/clock.test.ts +13 -14
  203. package/src/elements/gate/config.ts +13 -3
  204. package/src/elements/gate/constants.ts +18 -0
  205. package/src/elements/gate/declare.ts +1 -1
  206. package/src/elements/gate/strategies.ts +2 -12
  207. package/src/elements/gate.test.ts +1 -1
  208. package/src/elements/gate.ts +2 -2
  209. package/src/elements/store/domain-ddl.test.ts +5 -12
  210. package/src/elements/store/emit-drizzle.ts +44 -19
  211. package/src/elements/store/index-boot.test.ts +15 -116
  212. package/src/elements/store/load-plugin-tables.ts +1 -1
  213. package/src/elements/store/resource-list-docs.fixture.ts +12 -6
  214. package/src/elements/store/resource-list-docs.test.ts +64 -44
  215. package/src/elements/store/resource.test.ts +17 -10
  216. package/src/elements/store/runtime.ts +9 -12
  217. package/src/elements/store/schema-decl.test.ts +16 -32
  218. package/src/elements/store/seed.test.ts +1 -2
  219. package/src/elements/store/seed.ts +7 -8
  220. package/src/elements/store/sql-condition.test.ts +2 -2
  221. package/src/elements/store/sql-session.test.ts +8 -10
  222. package/src/elements/store/sql-session.ts +10 -2
  223. package/src/elements/store.test.ts +13 -13
  224. package/src/elements/vault/audit.ts +233 -0
  225. package/src/elements/vault/boot-chain.test.ts +78 -0
  226. package/src/elements/vault/boot-chain.ts +43 -39
  227. package/src/elements/vault/builtin-adapter.test.ts +479 -0
  228. package/src/elements/vault/builtin-adapter.ts +1184 -0
  229. package/src/elements/vault/crypto.test.ts +237 -0
  230. package/src/elements/vault/crypto.ts +431 -0
  231. package/src/elements/vault/declare.ts +164 -3
  232. package/src/elements/vault/errors.ts +56 -0
  233. package/src/elements/vault/kms-unseal.test.ts +76 -0
  234. package/src/elements/vault/kms-unseal.ts +181 -0
  235. package/src/elements/vault/path.ts +90 -0
  236. package/src/elements/vault/resilience.test.ts +102 -0
  237. package/src/elements/vault/resilience.ts +107 -0
  238. package/src/elements/vault/runtime.ts +36 -4
  239. package/src/elements/vault/security-checklist.test.ts +130 -0
  240. package/src/elements/vault/storage.ts +448 -0
  241. package/src/elements/vault/types.ts +288 -0
  242. package/src/elements/vault/unseal.ts +150 -0
  243. package/src/elements/vault.test.ts +72 -4
  244. package/src/elements/vault.ts +91 -2
  245. package/src/full.ts +248 -0
  246. package/src/http.ts +41 -0
  247. package/src/i18n/interpolate-simple.ts +37 -0
  248. package/src/i18n/messages.ts +51 -4
  249. package/src/i18n-entry.ts +7 -0
  250. package/src/index.ts +35 -145
  251. package/src/journal-entry.ts +20 -0
  252. package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
  253. package/src/kernel/app-auth.ts +98 -0
  254. package/src/kernel/app.ts +77 -110
  255. package/src/kernel/auto-registry.test.ts +2 -2
  256. package/src/kernel/boot-bind/ai.test.ts +5 -5
  257. package/src/kernel/boot-bind/ai.ts +2 -1
  258. package/src/kernel/boot-bind/channel.test.ts +6 -6
  259. package/src/kernel/boot-bind/channel.ts +3 -10
  260. package/src/kernel/boot-bind/clock.ts +2 -2
  261. package/src/kernel/boot-bind/gate.ts +5 -9
  262. package/src/kernel/boot-bind/honor-config.test.ts +42 -42
  263. package/src/kernel/boot-bind/journal.ts +2 -2
  264. package/src/kernel/boot-bind/store.test.ts +43 -44
  265. package/src/kernel/boot-bind/store.ts +16 -41
  266. package/src/kernel/boot-bind/vault.ts +16 -1
  267. package/src/kernel/boot.test.ts +13 -19
  268. package/src/kernel/boot.ts +31 -19
  269. package/src/kernel/budget-entry.ts +1 -1
  270. package/src/kernel/compensate.test.ts +288 -1
  271. package/src/kernel/compensate.ts +126 -0
  272. package/src/kernel/concurrency.test.ts +10 -9
  273. package/src/kernel/effects-stamping.test.ts +27 -2
  274. package/src/kernel/element-registries.ts +5 -3
  275. package/src/kernel/flow.ts +4 -2
  276. package/src/kernel/fx.test.ts +119 -3
  277. package/src/kernel/fx.ts +215 -40
  278. package/src/kernel/index.ts +14 -0
  279. package/src/kernel/journal.ts +130 -7
  280. package/src/kernel/pipeline.test.ts +20 -6
  281. package/src/kernel/redacted.test.ts +35 -0
  282. package/src/kernel/redacted.ts +24 -2
  283. package/src/kernel/router/create-default.ts +16 -0
  284. package/src/kernel/router/create-edge.ts +18 -0
  285. package/src/kernel/router/create.ts +23 -0
  286. package/src/kernel/router/index.ts +23 -0
  287. package/src/kernel/router/linear.ts +88 -0
  288. package/src/kernel/router/regexp.ts +188 -0
  289. package/src/kernel/router/smart.ts +120 -0
  290. package/src/kernel/router/trie.ts +108 -0
  291. package/src/kernel/router/types.ts +56 -0
  292. package/src/kernel/router.ts +18 -532
  293. package/src/kernel-entry.ts +43 -0
  294. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  295. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  296. package/src/plugins/config-source.test.ts +7 -7
  297. package/src/release/build-lib.ts +61 -0
  298. package/src/release/exports.test.ts +4 -2
  299. package/src/release/exports.ts +30 -4
  300. package/src/release/measure.ts +101 -22
  301. package/src/runs/duckdb.ts +7 -2
  302. package/src/shared/lazy-src.ts +79 -0
  303. package/src/shared/optional-peer.ts +41 -0
  304. package/src/term.test.ts +3 -44
  305. package/src/test/create-test-app.ts +12 -0
  306. package/src/test/provisions.integration.test.ts +1 -1
  307. package/src/test/reset-element-registries.ts +2 -0
  308. package/src/upgrade/codemods.test.ts +7 -20
  309. package/src/upgrade/codemods.ts +93 -60
  310. package/site/content/docs/recipes/openbao.mdx +0 -141
  311. package/src/cli/ask-dev-mode.ts +0 -40
  312. package/src/cli/dev-mode.test.ts +0 -45
  313. package/src/cli/dev-mode.ts +0 -78
  314. package/src/cli/openbao-bootstrap.test.ts +0 -150
  315. package/src/cli/openbao-bootstrap.ts +0 -321
  316. package/src/cli/openbao-restart.integration.test.ts +0 -145
  317. package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
  318. package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
  319. package/src/docker/recipes/openbao.ts +0 -47
  320. package/src/drivers/libsql.ts +0 -179
  321. package/src/drivers/sqlite.ts +0 -44
  322. package/src/drivers/vault-openbao.test.ts +0 -97
  323. package/src/drivers/vault-openbao.ts +0 -143
@@ -21,8 +21,11 @@ This page gets you from zero to a running app on Bun. The engine targets
21
21
  ### Prerequisites
22
22
 
23
23
  - [Bun](https://bun.sh) ≥ 1.3.14 (`bun --version`)
24
+ - [Docker](https://docs.docker.com/get-docker/) with a running daemon (`docker info`)
24
25
  - A terminal and a code editor
25
26
 
27
+ `oke dev` always starts Docker Compose for Postgres / Redis / S3 / SMTP (and other pinned images). Use `oke test` for PGLite tests without Compose.
28
+
26
29
  </Step>
27
30
 
28
31
  <Step>
@@ -59,23 +62,19 @@ bunx create-oke@latest my-app --sql postgres
59
62
  bunx create-oke@latest my-app --yes
60
63
  ```
61
64
 
62
- Two Notes starters: **standard** (local-first) and **advanced** (docker-ready +
63
- files/digest/AI). Both ship a minimal GitHub Actions workflow (typecheck +
64
- `bun test` on push/PR) so the first push has working CI.
65
+ Two Notes starters: **standard** and **advanced** (adds `store.index` + optional AI).
66
+ Both are Docker-first (`dev`/`prod` share production protocols; `test` uses PGLite /
67
+ memory). Both ship a minimal GitHub Actions workflow (typecheck + `bun test`).
65
68
 
66
69
  On a TTY: pick a template, then **recommended defaults**, **customize**, or
67
- **reuse** matching saved settings (saved to `~/.oke/create-defaults.json`).
68
-
69
- Customize asks local or docker first, walks facets (including `store.index` with
70
- `none`), then **AI setup** (Recommended / Customize / Off). Project name rejects
71
- a non-empty existing path.
70
+ **reuse** matching saved settings (`~/.oke/create-defaults.json`).
72
71
 
73
- Non-TTY / `--yes` stay scriptable. Defaults: local SQLite · Docker/prod Postgres.
74
- `--sql postgres` pins SQL; `--ai` runs the model wizard before install.
72
+ Customize walks Docker-first facets (including `store.index` with `none`), then
73
+ **AI setup** (Recommended / Customize / Off). Project name rejects a non-empty
74
+ existing path.
75
75
 
76
- Scaffold writes `.oke/mode` (standard `local`, advanced `docker`) so the
77
- first `oke dev` skips the mode prompt unless you delete it or pass `--local` /
78
- `--docker`.
76
+ Non-TTY / `--yes` stay scriptable. `--sql postgres` pins SQL; `--ai` runs the
77
+ model wizard before install.
79
78
 
80
79
  </Step>
81
80
 
@@ -102,9 +101,9 @@ configured.**
102
101
 
103
102
  </Steps>
104
103
 
105
- ## Local database sync
104
+ ## Database sync in `oke dev`
106
105
 
107
- Local mode watches schema paths and auto-runs `oke db push` so the database
106
+ `oke dev` watches schema paths and auto-runs `oke db push` so the database
108
107
  stays in sync. Opt out with `oke dev --no-db-push` or
109
108
  `db: { autoPush: false }` in `oke.config.ts`.
110
109
 
@@ -116,25 +115,18 @@ oke db generate # write drizzle/*.sql
116
115
  oke db migrate # apply
117
116
  ```
118
117
 
119
- ## Docker mode
118
+ ## Docker Compose under `oke dev`
120
119
 
121
- Want Postgres/Redis like production while the app stays on host Bun?
122
-
123
- <DevModes />
120
+ `oke dev` always brings up Compose under `docker/` and runs the app on host Bun
121
+ with the `dev` driver profile (filled from `prod` when omitted). Credentials and
122
+ host ports are unique per project.
124
123
 
125
124
  ```bash title="Terminal"
126
- oke dev --docker # or: oke dev -d
127
- # or set the saved default: oke mode docker
125
+ oke dev # full Compose set from images
126
+ oke dev -d store.sql,signal # optional: only these roles
127
+ oke test # PGLite tests — no Compose
128
128
  ```
129
129
 
130
- Uses the `docker` driver profile in `oke.config.ts` (filled from `prod` when
131
- omitted). Compose and credentials land under `docker/` (`.env.docker` beside
132
- compose); host ports are unique per project.
133
-
134
- Bare `oke dev` uses `.oke/mode` when present (seeded by create-oke). On a TTY
135
- with no saved mode it prompts once and writes the file; non-TTY defaults to
136
- `local`.
137
-
138
130
  | Protocol | Env shape (generated) |
139
131
  | ------------------- | --------------------------------------------------------------------------------------------------------------- |
140
132
  | Postgres | `DATABASE_URL` plus `OKE_STORE_SQL_*` |
@@ -142,9 +134,11 @@ with no saved mode it prompts once and writes the file; non-TTY defaults to
142
134
  | S3-compatible files | `S3_ENDPOINT`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, `S3_BUCKET`, `S3_URL`, `S3_REGION`, `S3_CONSOLE_URL` |
143
135
  | SMTP email | `SMTP_URL`, `SMTP_HOST`, `SMTP_PORT`, `MAILPIT_UI_URL`, optional `SMTP_USER` / `SMTP_PASSWORD` |
144
136
 
145
- Each section also includes commented controls (Redis memory policy, Postgres
146
- init options, Bun S3 session tokens, Mailpit limits). Uncommented supported
147
- controls are preserved when `oke dev --docker` regenerates the file.
137
+ Uncommented supported controls in the generated compose env are preserved when
138
+ `oke dev` regenerates the file.
139
+
140
+ Migrating from `local` / `docker` maps or `oke mode`?
141
+ See [Migrating environments](/docs/reference/migrating-environments).
148
142
 
149
143
  ## Troubleshooting
150
144
 
@@ -156,6 +150,11 @@ controls are preserved when `oke dev --docker` regenerates the file.
156
150
  package name — only `okengine`.
157
151
  </Accordion>
158
152
 
153
+ <Accordion title="Docker daemon not running">
154
+ `oke dev` requires Docker. Start Docker Desktop (or your engine), confirm with `docker info`, then
155
+ retry. For tests without Compose, use `oke test`.
156
+ </Accordion>
157
+
159
158
  <Accordion title="Console is empty / no flows listed">
160
159
  Confirm `oke dev` is running and you opened `:6533`, not `:6530`. Flows appear only after the app
161
160
  boots and the Manifest is extracted — fix TypeScript errors in the terminal first.
@@ -168,12 +167,12 @@ controls are preserved when `oke dev --docker` regenerates the file.
168
167
  </Accordion>
169
168
 
170
169
  <Accordion title="Database out of sync after editing schema">
171
- Local `oke dev` auto-pushes by default. If you passed `--no-db-push` or set `db.autoPush: false`,
172
- run `oke db push` yourself, or re-enable auto-push.
170
+ `oke dev` auto-pushes by default. If you passed `--no-db-push` or set `db.autoPush: false`, run
171
+ `oke db push` yourself, or re-enable auto-push.
173
172
  </Accordion>
174
173
 
175
174
  <Accordion title="Docker containers left after deleting a project">
176
- Each project gets its own `oke-dev-<id>` compose stack; `oke dev` stop keeps volumes. Run
175
+ Each project gets its own `oke-dev-<id>` compose project; `oke dev` stop keeps volumes. Run
177
176
  `oke docker clean` (TTY picker) or `oke docker clean --all --yes` from anywhere to remove
178
177
  leftover containers, networks, and volumes.
179
178
  </Accordion>
@@ -182,9 +181,10 @@ controls are preserved when `oke dev --docker` regenerates the file.
182
181
 
183
182
  ## Learn more
184
183
 
185
- - [CLI Reference](/docs/reference/cli) — `oke`, `create-oke`, mode, and db commands
184
+ - [CLI Reference](/docs/reference/cli) — `oke`, `create-oke`, `oke test`, and db commands
186
185
  - [Environment variables](/docs/reference/environment-variables) — protocol-shaped env
187
186
  - [Configuration](/docs/reference/configuration) — `oke.config.ts` drivers and `db.autoPush`
187
+ - [Migrating environments](/docs/reference/migrating-environments) — four-key maps → three
188
188
 
189
189
  ## Next
190
190
 
@@ -144,6 +144,17 @@ derived from these ten names:
144
144
  import { on, flow, signal, store, clock, gate, vault, channel, ai, plugin } from "okengine";
145
145
  ```
146
146
 
147
+ For HTTP-only apps, prefer the slim entry so the cold graph stays on the edge
148
+ router:
149
+
150
+ ```ts title="okengine/http"
151
+ import { on, flow, http, gate, oke, createBunRuntime } from "okengine/http";
152
+ ```
153
+
154
+ Heavy surfaces (`runs`, journal factories, compiler extract, the legacy
155
+ mega-barrel) live on `okengine/runs`, `okengine/journal`, `okengine/compiler`,
156
+ and `okengine/full`.
157
+
147
158
  <Vocabulary />
148
159
 
149
160
  ## Learn more
@@ -67,7 +67,7 @@ Local runs one vendor client, CI another, prod a third — three glue stories
67
67
  for the same database. "Works on my machine" is a driver mismatch.
68
68
 
69
69
  **OKE derives:** drivers are named after protocols (`postgres`, `redis`,
70
- `s3`), the vendor lives in `images`, and `oke dev --docker` runs the real
70
+ `s3`), the vendor lives in `images`, and `oke dev` runs the real
71
71
  stack locally.
72
72
 
73
73
  ## The tax is drift
@@ -101,7 +101,7 @@ ninth element — the set of eight is closed.
101
101
  | Secrets / config | Env sprawl; fails on first request | Vault contracts; `VaultBootError` at boot |
102
102
  | Observability | Bolted on; separate source of truth | Console from the Manifest, dev and prod (`:6533`) |
103
103
  | Permissions | Ad-hoc checks scattered in handlers | Least-privilege matrix from declared effects |
104
- | Local vs prod | Vendor clients; one-off compose | Protocol drivers; vendor in `images`; `oke dev --docker` |
104
+ | Local vs prod | Vendor clients; one-off compose | Protocol drivers; vendor in `images`; `oke dev` |
105
105
  | Client / agents | Separate codegen or hand-kept schemas | Typed client and MCP (`:6535`) from the same Manifest |
106
106
 
107
107
  ## Ambition, stated plainly
@@ -26,7 +26,7 @@ import { anonymous } from "okengine/plugins";
26
26
 
27
27
  export const app = oke({
28
28
  name: "shop",
29
- env: "local",
29
+ env: "dev",
30
30
  gate: { auth: {} },
31
31
  }).plug(anonymous());
32
32
  ```
@@ -27,7 +27,7 @@ import { magicLink } from "okengine/plugins";
27
27
 
28
28
  export const app = oke({
29
29
  name: "shop",
30
- env: "local",
30
+ env: "dev",
31
31
  gate: { auth: {} },
32
32
  }).plug(magicLink({ baseUrl: "http://127.0.0.1:6530" }));
33
33
  ```
@@ -43,8 +43,8 @@ const { data } = await api.auth.requestMagicLink({ email: "ali@example.com" });
43
43
  // data.devToken only when exposeDevToken
44
44
  ```
45
45
 
46
- `POST /auth/magic-link/request`. Locally the `console` driver captures mail; with
47
- `oke dev --docker`, Mailpit receives the real SMTP message.
46
+ `POST /auth/magic-link/request`. Under `oke test` the `console` driver captures mail; with
47
+ `oke dev`, Mailpit receives the real SMTP message.
48
48
 
49
49
  </Step>
50
50
 
@@ -88,12 +88,12 @@ catalog bodies (`{{link}}`, `{{token}}`). Override copy by merging your own cata
88
88
 
89
89
  ## Delivery drivers
90
90
 
91
- | `drivers.channel.email` | Delivery |
92
- | ----------------------- | ----------------------------------------------------------------- |
93
- | `console` | Dev inbox (local/test default) |
94
- | `smtp` | Any SMTP host — Mailpit under `oke dev --docker` (docker default) |
95
- | `resend` / `sndr` | Hosted email APIs |
96
- | `taqnyat-mail` | Taqnyat Mail API (additive option) |
91
+ | `drivers.channel.email` | Delivery |
92
+ | ----------------------- | ----------------------------------------------------- |
93
+ | `console` | Dev inbox (local/test default) |
94
+ | `smtp` | Any SMTP host — Mailpit under `oke dev` (dev default) |
95
+ | `resend` / `sndr` | Hosted email APIs |
96
+ | `taqnyat-mail` | Taqnyat Mail API (additive option) |
97
97
 
98
98
  ### Taqnyat Mail
99
99
 
@@ -101,7 +101,7 @@ catalog bodies (`{{link}}`, `{{token}}`). Override copy by merging your own cata
101
101
  export default {
102
102
  drivers: {
103
103
  channel: {
104
- email: { local: "console", docker: "smtp", test: "console", prod: "taqnyat-mail" },
104
+ email: { dev: "smtp", test: "console", prod: "taqnyat-mail" },
105
105
  },
106
106
  },
107
107
  };
@@ -139,7 +139,7 @@ Token expired (default 10m), already used, or mistyped. Request a new link.
139
139
  <Accordion title="No email arrived">
140
140
 
141
141
  In `local` / `test` the `console` driver captures mail into the inbox — nothing hits a mailbox.
142
- Run `oke dev --docker` and open Mailpit (`MAILPIT_UI_URL`) to see the rendered message. For
142
+ Run `oke dev` and open Mailpit (`MAILPIT_UI_URL`) to see the rendered message. For
143
143
  unit tests without SMTP, set `exposeDevToken: true`.
144
144
 
145
145
  </Accordion>
@@ -40,7 +40,7 @@ import { otp } from "okengine/plugins";
40
40
 
41
41
  export const app = oke({
42
42
  name: "shop",
43
- env: "local",
43
+ env: "dev",
44
44
  gate: { auth: {} },
45
45
  }).plug(
46
46
  otp({
@@ -122,7 +122,7 @@ const { data } = await api.auth.verifyOtp({
122
122
  export default {
123
123
  drivers: {
124
124
  channel: {
125
- sms: { local: "console", docker: "taqnyat", test: "console", prod: "taqnyat" },
125
+ sms: { test: "console", prod: "taqnyat" },
126
126
  },
127
127
  },
128
128
  };
@@ -28,7 +28,7 @@ import { passkey } from "okengine/plugins";
28
28
 
29
29
  export const app = oke({
30
30
  name: "shop",
31
- env: "local",
31
+ env: "dev",
32
32
  gate: { auth: {} },
33
33
  }).plug(passkey({ origins: ["http://localhost", "https://localhost"] }));
34
34
  ```
@@ -27,7 +27,7 @@ import { twoFactor } from "okengine/plugins";
27
27
 
28
28
  export const app = oke({
29
29
  name: "shop",
30
- env: "local",
30
+ env: "dev",
31
31
  gate: { auth: {} },
32
32
  }).plug(twoFactor());
33
33
  ```
@@ -26,7 +26,7 @@ import { username } from "okengine/plugins";
26
26
 
27
27
  export const app = oke({
28
28
  name: "shop",
29
- env: "local",
29
+ env: "dev",
30
30
  gate: { auth: {} },
31
31
  }).plug(username());
32
32
  ```
@@ -43,7 +43,7 @@ Unset defaults to `localhost` — Caddy issues a **local** TLS cert instead of L
43
43
  ### Include the proxy layer
44
44
 
45
45
  ```bash
46
- docker compose -f compose.yml -f compose.proxy.yml up -d
46
+ docker compose -f docker-compose.yml up -d
47
47
  ```
48
48
 
49
49
  Generated `Caddyfile`: `{$OKE_PROXY_HOST:localhost} { reverse_proxy app:6530 }`.
@@ -34,7 +34,7 @@ images: {
34
34
  ### Bring the stack up
35
35
 
36
36
  ```bash
37
- oke dev --docker
37
+ oke dev
38
38
  ```
39
39
 
40
40
  `oke docker` injects `COCKROACH_USER` / `COCKROACH_PASSWORD` / `COCKROACH_DATABASE`
@@ -94,7 +94,7 @@ not multi-region HA. For managed multi-region, use the
94
94
  <Accordions>
95
95
  <Accordion title="oke boot: postgres driver needs DATABASE_URL">
96
96
 
97
- Re-run `oke dev --docker` so the stack writes `docker/.env.docker`, or export
97
+ Re-run `oke dev` so the stack writes `docker/.env.docker`, or export
98
98
  `DATABASE_URL` yourself when pointing at a remote Cockroach host.
99
99
 
100
100
  </Accordion>
@@ -100,7 +100,7 @@ daemon / systemd limit, or run on a host that allows `memlock: -1`.
100
100
  </Accordion>
101
101
  <Accordion title="oke boot: redis driver needs REDIS_URL">
102
102
 
103
- Same driver failure as Redis — export `REDIS_URL` or let docker mode write it. Wrong
103
+ Same driver failure as Redis — export `REDIS_URL` or let `oke dev` write it. Wrong
104
104
  password yields Redis-protocol `NOAUTH` / `WRONGPASS` from the server.
105
105
 
106
106
  </Accordion>
@@ -10,7 +10,7 @@ and get env, healthcheck, and a connection URL for free.
10
10
 
11
11
  <Callout title="The one rule">
12
12
  Vendor choice lives in `images[…]` — never in `drivers.*`, which only ever say protocol ids
13
- (`postgres`, `redis`, `s3`, `smtp`, `openbao`, `meilisearch`, `openai-compatible`, `ollama`, …).
13
+ (`postgres`, `redis`, `s3`, `smtp`, `meilisearch`, `openai-compatible`, `ollama`, …).
14
14
  </Callout>
15
15
 
16
16
  ## SQL
@@ -84,7 +84,6 @@ Opt-in via `images.proxy` — leave unset until you need HTTPS or `--scale app=N
84
84
  href="/docs/recipes/rustfs"
85
85
  />
86
86
  <Card title="Mailpit" description="SMTP catcher — UI on :8025." href="/docs/recipes/mailpit" />
87
- <Card title="OpenBao" description="Raft vault — unseal key SPOF." href="/docs/recipes/openbao" />
88
87
  <Card
89
88
  title="Meilisearch"
90
89
  description="Full-text store.index on :7700."
@@ -23,7 +23,7 @@ for single-user / dev. Driver id stays `openai-compatible`.
23
23
 
24
24
  ```typescript title="oke.config.ts"
25
25
  drivers: {
26
- ai: { local: "openai-compatible", docker: "openai-compatible", test: "mock" },
26
+ ai: { dev: "openai-compatible", test: "mock", prod: "openai-compatible" },
27
27
  },
28
28
  images: {
29
29
  ai: "ghcr.io/ggml-org/llama.cpp:server-b10290", // never :latest
@@ -32,7 +32,7 @@ images: {
32
32
 
33
33
  Or `oke ai setup --provider llama-cpp` (TTY: banner → Ultra Fast / Fast /
34
34
  Balanced / Smart → up to 20 curated Docker Hub `ai/` picks per tier) / `--yes`
35
- for `smollm2`.
35
+ for `granite3.3:2b`.
36
36
 
37
37
  </Step>
38
38
 
@@ -41,19 +41,16 @@ for `smollm2`.
41
41
 
42
42
  ```bash title="docker/.env.docker"
43
43
  OKE_AI_URL=http://127.0.0.1:8080/v1
44
- OKE_AI_MODEL=smollm2
44
+ OKE_AI_MODEL=granite3.3:2b
45
45
  ```
46
46
 
47
47
  `OKE_AI_MODEL` is a Docker Hub `ai/<id>` model. The recipe writes
48
- `docker/llama-entrypoint.py`, which Hub-pulls into the cache volume (native
49
- `llama download -dr`, then a CNCF `model.weight` fallback for newer tags like
50
- gemma4), then starts `llama-server -m <gguf> --alias <id>` (single-model — not
51
- router `--models-preset` / bare `--docker-repo`, which hang on b10290+). Never
52
- set `LLAMA_ARG_MODELS_PRESET` / `LLAMA_ARG_DOCKER_REPO` in the container env.
48
+ `docker/llama-entrypoint.py`, which Hub-pulls into the cache volume, then starts
49
+ `llama-server -m <gguf> --alias <id>` (single-model).
53
50
 
54
- `oke dev -d` shows the model id in the hero / Docker summary and polls
55
- `/v1/models` in the background until status is `ready` (first boot may take
56
- minutes while the Hub image downloads).
51
+ Never set `LLAMA_ARG_MODELS_PRESET` / `LLAMA_ARG_DOCKER_REPO` those hang on
52
+ b10290+. `oke dev` shows the model id and polls `/v1/models` until `ready`
53
+ (first boot may take minutes).
57
54
 
58
55
  </Step>
59
56
 
@@ -65,7 +62,7 @@ import { ai } from "okengine";
65
62
 
66
63
  export const smart = ai.model("smart", {
67
64
  provider: "openai-compatible",
68
- model: process.env.OKE_AI_MODEL ?? "smollm2",
65
+ model: process.env.OKE_AI_MODEL ?? "granite3.3:2b",
69
66
  });
70
67
  ```
71
68
 
@@ -89,10 +86,10 @@ Postgres/Redis, stricter on the published interface because of GGUF CVE risk.
89
86
 
90
87
  ## Required env
91
88
 
92
- | Variable | Required? | Meaning |
93
- | -------------- | ----------------- | --------------------------------------- |
94
- | `OKE_AI_URL` | **Yes** in docker | Base URL including `/v1` |
95
- | `OKE_AI_MODEL` | Recommended | Docker Hub `ai/` id (default `smollm2`) |
89
+ | Variable | Required? | Meaning |
90
+ | -------------- | ----------------- | --------------------------------------------- |
91
+ | `OKE_AI_URL` | **Yes** in docker | Base URL including `/v1` |
92
+ | `OKE_AI_MODEL` | Recommended | Docker Hub `ai/` id (default `granite3.3:2b`) |
96
93
 
97
94
  ## What the recipe configures
98
95
 
@@ -127,13 +124,14 @@ interfaces). `OKE_AI_URL` must include `/v1`.
127
124
 
128
125
  First start Hub-pulls the curated `ai/` model into the named cache volume
129
126
  (see logs: `oke ai: ensuring…` / download %). Prefer `oke ai setup` tiers
130
- (Ultra Fast → `smollm2`) for smoke tests. Confirm `OKE_AI_MODEL` is active in
131
- `.env.local` / `docker/.env.docker`. Watch `oke dev` (`AI … — waiting…` →
132
- `ready`). If status stays `loading` forever on an old stack that still uses
133
- `--models-preset`, regenerate `docker/` and recreate AI. Newer Hub tags use
134
- CNCF weight layers — the entrypoint falls back when native `llama download`
135
- cannot find `vnd.docker.ai.gguf.v3`. Do not mount random GGUF files. Never put
136
- `LLAMA_ARG_MODELS_PRESET` / `LLAMA_ARG_DOCKER_REPO` in the container env.
127
+ (Ultra Fast → `granite3.3:2b`) for smoke tests.
128
+
129
+ Confirm `OKE_AI_MODEL` in `docker/.env.docker` (keep the `.env.local` hint commented so it does not shadow compose). Watch `oke
130
+ dev` until AI status is `ready`.
131
+
132
+ If status stays `loading` on Compose that still uses `--models-preset`,
133
+ regenerate `docker/` and recreate AI. Never mount random GGUF or set
134
+ `LLAMA_ARG_MODELS_PRESET` / `LLAMA_ARG_DOCKER_REPO`.
137
135
 
138
136
  </Accordion>
139
137
  </Accordions>
@@ -5,13 +5,13 @@ icon: "Mail"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
7
7
 
8
- Mailpit is the docker-mode email catcher — every message the `smtp` channel driver sends
9
- lands in a web UI instead of a real inbox. Pin it as `images["channel.email"]` when
10
- `drivers.channel.email.docker` is `smtp`.
8
+ Mailpit is the `oke dev` email catcher — every message the `smtp` channel driver sends
9
+ lands in a web UI instead of a real inbox. Pin it as `images.channel.email` when
10
+ `drivers.channel.email.dev` is `smtp`.
11
11
 
12
12
  <Callout title="The one rule">
13
- Docker ≈ prod for the **SMTP protocol** — same `SMTP_URL` shape. Mailpit is not a production MTA;
14
- swap the image / URL for a real relay when you leave local docker.
13
+ `dev``prod` for the **SMTP protocol** — same `SMTP_URL` shape. Mailpit is not a production MTA;
14
+ swap the image / URL for a real relay in production.
15
15
  </Callout>
16
16
 
17
17
  ## Quick start
@@ -24,11 +24,11 @@ lands in a web UI instead of a real inbox. Pin it as `images["channel.email"]` w
24
24
  ```typescript title="oke.config.ts"
25
25
  drivers: {
26
26
  channel: {
27
- email: { local: "console", docker: "smtp", test: "console", prod: "smtp" },
27
+ email: { dev: "smtp", test: "console", prod: "smtp" },
28
28
  },
29
29
  },
30
30
  images: {
31
- "channel.email": "axllent/mailpit:v1.22.3",
31
+ channel: { email: "axllent/mailpit:v1.22.3" },
32
32
  },
33
33
  ```
34
34
 
@@ -100,7 +100,7 @@ if SMTP still accepts mail.
100
100
  <Accordion title="oke boot: smtp driver needs SMTP_URL">
101
101
 
102
102
  The smtp binder refuses to start without `SMTP_URL` (or `OKE_CHANNEL_EMAIL_URL`). In
103
- docker mode the error asks whether `oke dev -d` wrote `docker/.env.docker`. Also rejects
103
+ under `oke dev` the error asks whether Compose wrote `docker/.env.docker`. Also rejects
104
104
  non-`smtp://` schemes: `oke boot: SMTP_URL must use smtp://`.
105
105
 
106
106
  </Accordion>
@@ -128,9 +128,9 @@ shift the host port).
128
128
  href="/docs/recipes/rustfs"
129
129
  />
130
130
  <Card
131
- title="OpenBao"
132
- description="Vault recipe for docker/prod secrets."
133
- href="/docs/recipes/openbao"
131
+ title="Vault"
132
+ description="Secrets and built-in encrypted store."
133
+ href="/docs/elements/vault"
134
134
  />
135
135
  <Card title="Channel" description="How fx.email reaches humans." href="/docs/elements/channel" />
136
136
  </Cards>
@@ -6,12 +6,12 @@ source: "docs/spec/unified-theory.md"
6
6
  ---
7
7
 
8
8
  Meilisearch backs the `meilisearch` index driver — typo-tolerant full-text search over
9
- HTTP. Pin `images["store.index"]` and set `drivers.store.index` to `meilisearch` where
10
- you need it (index does **not** auto-promote in docker).
9
+ HTTP. Pin `images.store.index` and set `drivers.store.index` to `meilisearch` where
10
+ you need it (index does **not** auto-promote under Compose).
11
11
 
12
12
  <Callout title="The one rule">
13
13
  Index stays `memory` in every environment until you set the driver map explicitly — there is no
14
- silent docker fallback to Meilisearch or pgvector.
14
+ silent fallback to Meilisearch or pgvector.
15
15
  </Callout>
16
16
 
17
17
  ## Quick start
@@ -24,11 +24,11 @@ you need it (index does **not** auto-promote in docker).
24
24
  ```typescript title="oke.config.ts"
25
25
  drivers: {
26
26
  store: {
27
- index: { local: "memory", docker: "meilisearch", prod: "meilisearch" },
27
+ index: { dev: "meilisearch", test: "memory", prod: "meilisearch" },
28
28
  },
29
29
  },
30
30
  images: {
31
- "store.index": "getmeili/meilisearch:v1.14",
31
+ store: { index: "getmeili/meilisearch:v1.14" },
32
32
  },
33
33
  ```
34
34
 
@@ -53,8 +53,8 @@ Recipe injects into the container:
53
53
  <Step>
54
54
  ### Search from a flow
55
55
 
56
- Use `store.index(…)` without `{ dims }` for full-text (vector dims select pgvector /
57
- libsql). Writes wait on Meilisearch tasks before returning.
56
+ Use `store.index(…)` without `{ dims }` for full-text (vector dims select pgvector).
57
+ Writes wait on Meilisearch tasks before returning.
58
58
 
59
59
  </Step>
60
60
 
@@ -87,8 +87,8 @@ Always set a non-empty `OKE_STORE_INDEX_KEY` when `MEILI_ENV=production` — Mei
87
87
  refuses insecure production mode without a master key. Prefer network isolation (compose
88
88
  network only) plus the key; do not publish `:7700` on the public internet without auth.
89
89
 
90
- Vector `ai.embed` into a meilisearch index fails loud — embeddings need `pgvector` /
91
- `libsql`, not FTS. See [Store · Index](/docs/elements/store#index).
90
+ Vector `ai.embed` into a meilisearch index fails loud — embeddings need `pgvector`,
91
+ not FTS. See [Store · Index](/docs/elements/store#index).
92
92
 
93
93
  ## What the recipe configures
94
94
 
@@ -103,7 +103,7 @@ Vector `ai.embed` into a meilisearch index fails loud — embeddings need `pgvec
103
103
  <Accordions>
104
104
  <Accordion title="oke boot: meilisearch index needs OKE_STORE_INDEX_URL">
105
105
 
106
- No silent memory fallback. Re-run `oke dev --docker` or export `OKE_STORE_INDEX_URL`.
106
+ No silent memory fallback. Re-run `oke dev` or export `OKE_STORE_INDEX_URL`.
107
107
  Docker-mode wording asks whether `docker/.env.docker` was written.
108
108
 
109
109
  </Accordion>
@@ -20,7 +20,6 @@
20
20
  "pgdog",
21
21
  "rustfs",
22
22
  "mailpit",
23
- "openbao",
24
23
  "meilisearch",
25
24
  "---AI---",
26
25
  "llama-cpp",
@@ -23,7 +23,7 @@ want its library pull UX. Pin `images.ai` and set `drivers.ai` to `ollama`.
23
23
 
24
24
  ```typescript title="oke.config.ts"
25
25
  drivers: {
26
- ai: { local: "ollama", docker: "ollama", test: "mock" }, // prod: set deliberately
26
+ ai: { dev: "ollama", test: "mock", prod: "ollama" }, // or set prod deliberately
27
27
  },
28
28
  images: {
29
29
  ai: "ollama/ollama:0.32.6", // never :latest — floor 0.17.1 (CVE-2026-7482)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "PgDog"
3
- description: "Postgres wire-protocol pooler — transaction mode on :6432, generated pgdog.toml / users.toml, DATABASE_URL rewrite."
3
+ description: "Postgres wire-protocol pooler — transaction mode on :6432, generated pgdog/ configs, DATABASE_URL rewrite."
4
4
  icon: "Package"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
@@ -21,6 +21,8 @@ transaction-pooling proxy — same wire protocol, no app code changes.
21
21
  <Step>
22
22
  ### Pin both images
23
23
 
24
+ create-oke asks **Add PgDog connection pooling…?** (or pass `--pgdog`). Manually:
25
+
24
26
  ```typescript title="oke.config.ts"
25
27
  images: {
26
28
  "store.sql": "postgres:18-alpine",
@@ -37,8 +39,9 @@ images: {
37
39
  oke docker
38
40
  ```
39
41
 
40
- Writes `./pgdog.toml` (listen + one primary database) and `./users.toml` (same
41
- user/password/database as Postgres). The pooler waits on `store-sql` health before start.
42
+ Writes `./pgdog/pgdog.toml` (listen + one primary database) and
43
+ `./pgdog/users.toml` (same user/password/database as Postgres). The pooler
44
+ waits on `store-sql` health before start.
42
45
 
43
46
  </Step>
44
47
 
@@ -59,7 +62,7 @@ echo "$OKE_STORE_SQL_URL" # still the direct Postgres URL when you need it
59
62
 
60
63
  | Variable | Role |
61
64
  | ---------------------------------------- | ---------------------------------------------------------------- |
62
- | `OKE_STORE_SQL_USER` / `PASSWORD` / `DB` | Copied into `users.toml` for client + server auth |
65
+ | `OKE_STORE_SQL_USER` / `PASSWORD` / `DB` | Copied into `pgdog/users.toml` for client + server auth |
63
66
  | `DATABASE_URL` | Rewritten to the pooler URL (`:6432`) when PgDog is in the stack |
64
67
  | `OKE_PGDOG_URL` | Same value as pooled `DATABASE_URL` when both are present |
65
68
  | `OKE_STORE_SQL_URL` | Direct Postgres host — bypass the pooler for admin / migrations |
@@ -68,10 +71,10 @@ PgDog itself has no separate credential env — it mounts the generated TOML fil
68
71
 
69
72
  ## Data and backup
70
73
 
71
- | Mount | What it is |
72
- | ----------------------------------- | ------------------------------------------------------------------ |
73
- | `./pgdog.toml:/pgdog/pgdog.toml:ro` | Generated listen + `[[databases]]` (host `store-sql`, port `5432`) |
74
- | `./users.toml:/pgdog/users.toml:ro` | Generated `[[users]]` credentials |
74
+ | Mount | What it is |
75
+ | ----------------------------------------- | ------------------------------------------------------------------ |
76
+ | `./pgdog/pgdog.toml:/pgdog/pgdog.toml:ro` | Generated listen + `[[databases]]` (host `store-sql`, port `5432`) |
77
+ | `./pgdog/users.toml:/pgdog/users.toml:ro` | Generated `[[users]]` credentials |
75
78
 
76
79
  **No database state lives in the PgDog container.** Backing up PgDog means keeping those
77
80
  two config files (they are regenerated by `oke docker`). Durable data stays on the
@@ -104,7 +107,7 @@ not wired into the generated stack yet.
104
107
  <Accordions>
105
108
  <Accordion title="pgdog unhealthy — pg_isready on :6432 fails">
106
109
 
107
- Usually the backend is not ready, or `users.toml` credentials do not match Postgres.
110
+ Usually the backend is not ready, or `pgdog/users.toml` credentials do not match Postgres.
108
111
  Confirm `store-sql` is healthy first, then re-run `oke docker` so TOML matches
109
112
  `OKE_STORE_SQL_*`. Logs often show auth failures against `store-sql:5432`.
110
113