container-superposition 0.1.6 → 0.1.8

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 (238) hide show
  1. package/README.md +24 -15
  2. package/dist/scripts/init.js +1 -1534
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/tool/cli/args.d.ts +20 -0
  5. package/dist/tool/cli/args.d.ts.map +1 -0
  6. package/dist/tool/cli/args.js +325 -0
  7. package/dist/tool/cli/args.js.map +1 -0
  8. package/dist/tool/cli/run.d.ts +2 -0
  9. package/dist/tool/cli/run.d.ts.map +1 -0
  10. package/dist/tool/cli/run.js +318 -0
  11. package/dist/tool/cli/run.js.map +1 -0
  12. package/dist/tool/commands/adopt.d.ts.map +1 -1
  13. package/dist/tool/commands/adopt.js +1 -27
  14. package/dist/tool/commands/adopt.js.map +1 -1
  15. package/dist/tool/commands/doctor.d.ts +3 -0
  16. package/dist/tool/commands/doctor.d.ts.map +1 -1
  17. package/dist/tool/commands/doctor.js +1068 -70
  18. package/dist/tool/commands/doctor.js.map +1 -1
  19. package/dist/tool/commands/explain.d.ts.map +1 -1
  20. package/dist/tool/commands/explain.js +18 -0
  21. package/dist/tool/commands/explain.js.map +1 -1
  22. package/dist/tool/commands/migrate.d.ts +7 -0
  23. package/dist/tool/commands/migrate.d.ts.map +1 -0
  24. package/dist/tool/commands/migrate.js +52 -0
  25. package/dist/tool/commands/migrate.js.map +1 -0
  26. package/dist/tool/questionnaire/answers.d.ts +16 -0
  27. package/dist/tool/questionnaire/answers.d.ts.map +1 -0
  28. package/dist/tool/questionnaire/answers.js +102 -0
  29. package/dist/tool/questionnaire/answers.js.map +1 -0
  30. package/dist/tool/questionnaire/composer.d.ts +3 -3
  31. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  32. package/dist/tool/questionnaire/composer.js +902 -37
  33. package/dist/tool/questionnaire/composer.js.map +1 -1
  34. package/dist/tool/questionnaire/presets.d.ts +60 -0
  35. package/dist/tool/questionnaire/presets.d.ts.map +1 -0
  36. package/dist/tool/questionnaire/presets.js +164 -0
  37. package/dist/tool/questionnaire/presets.js.map +1 -0
  38. package/dist/tool/questionnaire/questionnaire.d.ts +10 -0
  39. package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -0
  40. package/dist/tool/questionnaire/questionnaire.js +580 -0
  41. package/dist/tool/questionnaire/questionnaire.js.map +1 -0
  42. package/dist/tool/schema/manifest-migrations.d.ts +5 -0
  43. package/dist/tool/schema/manifest-migrations.d.ts.map +1 -1
  44. package/dist/tool/schema/manifest-migrations.js +45 -0
  45. package/dist/tool/schema/manifest-migrations.js.map +1 -1
  46. package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
  47. package/dist/tool/schema/overlay-loader.js +25 -0
  48. package/dist/tool/schema/overlay-loader.js.map +1 -1
  49. package/dist/tool/schema/project-config.d.ts +14 -2
  50. package/dist/tool/schema/project-config.d.ts.map +1 -1
  51. package/dist/tool/schema/project-config.js +277 -34
  52. package/dist/tool/schema/project-config.js.map +1 -1
  53. package/dist/tool/schema/target-rules.d.ts +78 -0
  54. package/dist/tool/schema/target-rules.d.ts.map +1 -0
  55. package/dist/tool/schema/target-rules.js +367 -0
  56. package/dist/tool/schema/target-rules.js.map +1 -0
  57. package/dist/tool/schema/types.d.ts +123 -12
  58. package/dist/tool/schema/types.d.ts.map +1 -1
  59. package/dist/tool/utils/merge.d.ts.map +1 -1
  60. package/dist/tool/utils/merge.js +9 -0
  61. package/dist/tool/utils/merge.js.map +1 -1
  62. package/dist/tool/utils/parameters.d.ts +76 -0
  63. package/dist/tool/utils/parameters.d.ts.map +1 -0
  64. package/dist/tool/utils/parameters.js +125 -0
  65. package/dist/tool/utils/parameters.js.map +1 -0
  66. package/dist/tool/utils/paths.d.ts +2 -0
  67. package/dist/tool/utils/paths.d.ts.map +1 -0
  68. package/dist/tool/utils/paths.js +31 -0
  69. package/dist/tool/utils/paths.js.map +1 -0
  70. package/docs/creating-overlays.md +151 -2
  71. package/docs/deployment-targets.md +88 -56
  72. package/docs/examples.md +20 -17
  73. package/docs/filesystem-contract.md +5 -0
  74. package/docs/minimal-and-editor.md +65 -5
  75. package/docs/overlay-imports.md +202 -101
  76. package/docs/overlays.md +162 -34
  77. package/docs/quick-reference.md +99 -0
  78. package/docs/specs/003-mkdocs2-overlay/spec.md +114 -0
  79. package/docs/specs/004-doctor-fix/spec.md +70 -0
  80. package/docs/specs/005-cuda-overlay/spec.md +101 -0
  81. package/docs/specs/006-rocm-overlay/spec.md +109 -0
  82. package/docs/specs/007-init-project-file/spec.md +66 -0
  83. package/docs/specs/007-target-aware-generation/spec.md +126 -0
  84. package/docs/specs/008-project-file-canonical/spec.md +83 -0
  85. package/docs/specs/009-project-env/spec.md +147 -0
  86. package/docs/specs/010-compose-env-materialization/spec.md +130 -0
  87. package/docs/specs/011-overlay-parameters/spec.md +235 -0
  88. package/overlays/.shared/README.md +105 -21
  89. package/overlays/.shared/compose/common-healthchecks.md +60 -0
  90. package/overlays/.shared/compose/nvidia-gpu-devcontainer.yml +22 -0
  91. package/overlays/.shared/vscode/recommended-extensions.json +15 -11
  92. package/overlays/alertmanager/setup.sh +4 -19
  93. package/overlays/alertmanager/verify.sh +8 -9
  94. package/overlays/all/README.md +43 -0
  95. package/overlays/all/devcontainer.patch.json +6 -0
  96. package/overlays/all/overlay.yml +14 -0
  97. package/overlays/amp/setup.sh +5 -0
  98. package/overlays/bun/setup.sh +10 -1
  99. package/overlays/bun/verify.sh +6 -1
  100. package/overlays/claude-code/setup.sh +5 -0
  101. package/overlays/cloudflared/setup.sh +9 -12
  102. package/overlays/codex/README.md +9 -6
  103. package/overlays/codex/devcontainer.patch.json +7 -1
  104. package/overlays/codex/setup.sh +5 -0
  105. package/overlays/codex/verify.sh +8 -0
  106. package/overlays/comfyui/.env.example +34 -0
  107. package/overlays/comfyui/README.md +342 -0
  108. package/overlays/comfyui/devcontainer.patch.json +15 -0
  109. package/overlays/comfyui/docker-compose.yml +39 -0
  110. package/overlays/comfyui/overlay.yml +20 -0
  111. package/overlays/comfyui/setup.sh +36 -0
  112. package/overlays/comfyui/verify.sh +103 -0
  113. package/overlays/commitlint/setup.sh +5 -0
  114. package/overlays/cuda/README.md +179 -0
  115. package/overlays/cuda/devcontainer.patch.json +7 -0
  116. package/overlays/cuda/overlay.yml +17 -0
  117. package/overlays/cuda/setup.sh +32 -0
  118. package/overlays/cuda/verify.sh +38 -0
  119. package/overlays/devcontainer-cli/README.md +50 -0
  120. package/overlays/devcontainer-cli/devcontainer.patch.json +13 -0
  121. package/overlays/devcontainer-cli/overlay.yml +16 -0
  122. package/overlays/devcontainer-cli/setup.sh +14 -0
  123. package/overlays/direnv/devcontainer.patch.json +6 -0
  124. package/overlays/direnv/setup.sh +7 -6
  125. package/overlays/dotnet/setup.sh +14 -7
  126. package/overlays/duckdb/devcontainer.patch.json +1 -2
  127. package/overlays/gcloud/devcontainer.patch.json +0 -6
  128. package/overlays/gcloud/setup.sh +51 -0
  129. package/overlays/gemini-cli/setup.sh +5 -0
  130. package/overlays/git-helpers/devcontainer.patch.json +2 -1
  131. package/overlays/go/setup.sh +15 -14
  132. package/overlays/jaeger/overlay.yml +2 -0
  133. package/overlays/just/setup.sh +5 -17
  134. package/overlays/k3d/README.md +201 -0
  135. package/overlays/k3d/devcontainer.patch.json +9 -0
  136. package/overlays/k3d/overlay.yml +19 -0
  137. package/overlays/k3d/setup.sh +34 -0
  138. package/overlays/k3d/verify.sh +38 -0
  139. package/overlays/keycloak/docker-compose.yml +6 -4
  140. package/overlays/keycloak/verify.sh +4 -3
  141. package/overlays/kind/devcontainer.patch.json +1 -2
  142. package/overlays/kind/setup.sh +8 -17
  143. package/overlays/minio/setup.sh +10 -18
  144. package/overlays/mkdocs/overlay.yml +2 -1
  145. package/overlays/mkdocs2/README.md +135 -0
  146. package/overlays/mkdocs2/devcontainer.patch.json +19 -0
  147. package/overlays/mkdocs2/overlay.yml +17 -0
  148. package/overlays/mkdocs2/setup.sh +67 -0
  149. package/overlays/mkdocs2/verify.sh +35 -0
  150. package/overlays/modern-cli-tools/devcontainer.patch.json +7 -1
  151. package/overlays/modern-cli-tools/setup.sh +21 -71
  152. package/overlays/mongodb/devcontainer.patch.json +0 -6
  153. package/overlays/mongodb/setup.sh +59 -0
  154. package/overlays/mysql/verify.sh +4 -3
  155. package/overlays/nats/.env.example +1 -1
  156. package/overlays/nats/README.md +1 -1
  157. package/overlays/nats/docker-compose.yml +1 -1
  158. package/overlays/ngrok/setup.sh +9 -6
  159. package/overlays/nodejs/setup.sh +5 -0
  160. package/overlays/ollama/.env.example +14 -0
  161. package/overlays/ollama/README.md +325 -0
  162. package/overlays/ollama/devcontainer.patch.json +14 -0
  163. package/overlays/ollama/docker-compose.yml +24 -0
  164. package/overlays/ollama/overlay.yml +22 -0
  165. package/overlays/ollama/setup.sh +106 -0
  166. package/overlays/ollama/verify.sh +99 -0
  167. package/overlays/open-webui/.env.example +5 -0
  168. package/overlays/open-webui/README.md +162 -0
  169. package/overlays/open-webui/devcontainer.patch.json +14 -0
  170. package/overlays/open-webui/docker-compose.yml +23 -0
  171. package/overlays/open-webui/overlay.yml +38 -0
  172. package/overlays/openapi-tools/devcontainer.patch.json +1 -2
  173. package/overlays/openapi-tools/setup.sh +9 -8
  174. package/overlays/opencode/setup.sh +5 -0
  175. package/overlays/otel-collector/overlay.yml +2 -0
  176. package/overlays/otel-collector/setup.sh +3 -16
  177. package/overlays/otel-demo-nodejs/verify.sh +8 -9
  178. package/overlays/otel-demo-python/verify.sh +16 -10
  179. package/overlays/pandoc/README.md +22 -15
  180. package/overlays/pandoc/devcontainer.patch.json +6 -2
  181. package/overlays/pandoc/setup.sh +217 -18
  182. package/overlays/pandoc/verify.sh +16 -4
  183. package/overlays/pgvector/.env.example +6 -0
  184. package/overlays/pgvector/README.md +215 -0
  185. package/overlays/pgvector/devcontainer.patch.json +23 -0
  186. package/overlays/pgvector/docker-compose.yml +32 -0
  187. package/overlays/pgvector/overlay.yml +44 -0
  188. package/overlays/playwright/devcontainer.patch.json +3 -1
  189. package/overlays/playwright/setup.sh +37 -0
  190. package/overlays/postgres/.env.example +5 -5
  191. package/overlays/postgres/devcontainer.patch.json +4 -4
  192. package/overlays/postgres/docker-compose.yml +15 -5
  193. package/overlays/postgres/overlay.yml +19 -1
  194. package/overlays/powershell/setup.sh +49 -13
  195. package/overlays/pre-commit/setup.sh +12 -3
  196. package/overlays/prometheus/overlay.yml +2 -0
  197. package/overlays/promtail/verify.sh +16 -10
  198. package/overlays/pulumi/devcontainer.patch.json +1 -1
  199. package/overlays/python/setup.sh +28 -9
  200. package/overlays/python/verify.sh +4 -2
  201. package/overlays/qdrant/.env.example +4 -0
  202. package/overlays/qdrant/README.md +216 -0
  203. package/overlays/qdrant/devcontainer.patch.json +20 -0
  204. package/overlays/qdrant/docker-compose.yml +25 -0
  205. package/overlays/qdrant/overlay.yml +40 -0
  206. package/overlays/redpanda/docker-compose.yml +3 -5
  207. package/overlays/rocm/README.md +227 -0
  208. package/overlays/rocm/devcontainer.patch.json +4 -0
  209. package/overlays/rocm/overlay.yml +17 -0
  210. package/overlays/rocm/setup.sh +45 -0
  211. package/overlays/rocm/verify.sh +47 -0
  212. package/overlays/rust/setup.sh +11 -18
  213. package/overlays/skaffold/README.md +256 -0
  214. package/overlays/skaffold/devcontainer.patch.json +9 -0
  215. package/overlays/skaffold/overlay.yml +20 -0
  216. package/overlays/skaffold/setup.sh +33 -0
  217. package/overlays/skaffold/verify.sh +24 -0
  218. package/overlays/spec-kit/setup.sh +7 -3
  219. package/overlays/sqlite/setup.sh +14 -14
  220. package/overlays/sqlserver/docker-compose.yml +3 -3
  221. package/overlays/sqlserver/verify.sh +22 -5
  222. package/overlays/tempo/verify.sh +16 -10
  223. package/overlays/tilt/devcontainer.patch.json +1 -2
  224. package/overlays/tilt/setup.sh +14 -4
  225. package/overlays/windsurf-cli/setup.sh +27 -4
  226. package/overlays/windsurf-cli/verify.sh +13 -3
  227. package/package.json +4 -2
  228. package/templates/scripts/setup-utils.sh +228 -0
  229. package/tool/schema/config.schema.json +141 -9
  230. package/tool/schema/overlay-manifest.schema.json +38 -0
  231. package/overlays/.shared/compose/common-healthchecks.yml +0 -38
  232. /package/overlays/otel-demo-nodejs/{Dockerfile-otel-demo-nodejs → Dockerfile} +0 -0
  233. /package/overlays/otel-demo-nodejs/{package-otel-demo-nodejs.json → package.json} +0 -0
  234. /package/overlays/otel-demo-nodejs/{server-otel-demo-nodejs.js → server.js} +0 -0
  235. /package/overlays/otel-demo-nodejs/{tracing-otel-demo-nodejs.js → tracing.js} +0 -0
  236. /package/overlays/otel-demo-python/{Dockerfile-otel-demo-python → Dockerfile} +0 -0
  237. /package/overlays/otel-demo-python/{app-otel-demo-python.py → app.py} +0 -0
  238. /package/overlays/otel-demo-python/{requirements-otel-demo-python.txt → requirements.txt} +0 -0
@@ -0,0 +1,162 @@
1
+ # Open WebUI Overlay
2
+
3
+ Adds [Open WebUI](https://github.com/open-webui/open-webui) as a Docker Compose service, providing a polished browser-based chat interface for Ollama and other OpenAI-compatible LLM backends.
4
+
5
+ ## Features
6
+
7
+ - **Browser-based chat UI** — Full-featured conversational interface for local LLMs at `http://localhost:3000`
8
+ - **Ollama integration** — Pre-configured to connect to the `ollama` sidecar when the `ollama` overlay is also selected
9
+ - **Multi-model support** — Switch between different Ollama models from the UI without CLI commands
10
+ - **Conversation history** — Persists chat history in a named Docker volume across container rebuilds
11
+ - **OpenAI-compatible** — Works with any backend that speaks the OpenAI Chat Completions API
12
+ - **Port 3000** — Web interface auto-forwarded and opened in the browser
13
+
14
+ ## How It Works
15
+
16
+ Open WebUI runs as a Docker Compose service (`open-webui`) alongside your devcontainer. It connects to the Ollama service (or any OpenAI-compatible API) using the `OLLAMA_BASE_URL` environment variable.
17
+
18
+ **Service configuration:**
19
+
20
+ - Image: `ghcr.io/open-webui/open-webui:main`
21
+ - Network: `devnet` (shared with devcontainer and ollama)
22
+ - Port: `3000` on the host, mapped to `8080` inside the container
23
+ - Volume: `open-webui-data` for persistent chat history and settings
24
+
25
+ When used together with the `ollama` overlay, the stack looks like:
26
+
27
+ ```
28
+ devcontainer ─── open-webui (port 3000) ─┐
29
+ ├── devnet
30
+ ollama (port 11434) ─────┘
31
+ ```
32
+
33
+ Open WebUI reads `OLLAMA_BASE_URL` to find the Ollama API. When the `ollama` overlay is selected, this is pre-set to `http://ollama:11434`.
34
+
35
+ ## Common Commands
36
+
37
+ ### Web Interface
38
+
39
+ ```bash
40
+ # Open the web UI (auto-forwarded to localhost:3000)
41
+ # Navigate to http://localhost:3000 in your browser
42
+
43
+ # Check service status
44
+ docker compose ps open-webui
45
+
46
+ # View logs
47
+ docker compose logs open-webui
48
+ docker compose logs -f open-webui
49
+
50
+ # Restart the service
51
+ docker compose restart open-webui
52
+ ```
53
+
54
+ ### Using with Ollama
55
+
56
+ ```bash
57
+ # Pull a model with the Ollama CLI (still available in devcontainer)
58
+ ollama pull llama3.2
59
+
60
+ # The model will automatically appear in the Open WebUI model picker
61
+ # Visit http://localhost:3000 and start chatting
62
+ ```
63
+
64
+ ### REST API
65
+
66
+ Open WebUI exposes an OpenAI-compatible REST API at `http://localhost:3000/api`:
67
+
68
+ ```bash
69
+ # List available models via Open WebUI API
70
+ curl http://localhost:3000/api/models
71
+
72
+ # Chat completion via OpenAI-compatible endpoint
73
+ curl http://localhost:3000/api/chat/completions \
74
+ -H "Content-Type: application/json" \
75
+ -d '{
76
+ "model": "llama3.2",
77
+ "messages": [{"role": "user", "content": "Hello!"}]
78
+ }'
79
+ ```
80
+
81
+ ## Configuration
82
+
83
+ ### Environment Variables
84
+
85
+ Copy `.devcontainer/.env.example` to `.devcontainer/.env` and customize:
86
+
87
+ | Variable | Default | Description |
88
+ | -------------------- | --------------------- | ------------------------------------------------ |
89
+ | `OPEN_WEBUI_VERSION` | `main` | Open WebUI Docker image tag |
90
+ | `OPEN_WEBUI_PORT` | `3000` | Host port for the web interface |
91
+ | `OLLAMA_BASE_URL` | `http://ollama:11434` | Base URL of the Ollama API |
92
+ | `WEBUI_SECRET_KEY` | `supersecret` | Secret key for session signing (change for prod) |
93
+
94
+ ### Connecting to a Different LLM Backend
95
+
96
+ If you are not using the `ollama` overlay but have another OpenAI-compatible API available, set `OLLAMA_BASE_URL` in `.devcontainer/.env`:
97
+
98
+ ```bash
99
+ # Point at a remote OpenAI-compatible server
100
+ OLLAMA_BASE_URL=http://my-llm-server:8000
101
+ ```
102
+
103
+ ## Use Cases
104
+
105
+ - **Local AI chat** — Interact with local models via a polished UI instead of the CLI
106
+ - **Model comparison** — Switch between models mid-conversation to compare quality
107
+ - **Prompt engineering** — Iterate on system prompts and parameters interactively
108
+ - **Offline AI workflows** — Full AI chat capability without internet access or API costs
109
+ - **Team demos** — Share the forwarded port URL with teammates for collaborative testing
110
+
111
+ **Integrates well with:**
112
+
113
+ - `ollama` — Provides the LLM backend; Open WebUI connects automatically
114
+ - `cuda` — GPU acceleration for faster Ollama inference
115
+ - `python` — Build integrations using the Open WebUI REST API
116
+
117
+ ## Troubleshooting
118
+
119
+ ### UI Not Loading
120
+
121
+ ```bash
122
+ # Check the service is running
123
+ docker compose ps open-webui
124
+
125
+ # View startup logs
126
+ docker compose logs open-webui
127
+
128
+ # Restart the service
129
+ docker compose restart open-webui
130
+ ```
131
+
132
+ ### No Models Available
133
+
134
+ If the model picker in Open WebUI shows no models:
135
+
136
+ 1. Ensure the `ollama` overlay is selected and the Ollama service is running
137
+ 2. Pull a model with `ollama pull llama3.2` from the devcontainer terminal
138
+ 3. Refresh the Open WebUI page
139
+
140
+ ```bash
141
+ # Verify Ollama is reachable from within the Open WebUI container
142
+ docker compose exec open-webui curl -sf http://ollama:11434/api/tags
143
+ ```
144
+
145
+ ### Port Conflict on 3000
146
+
147
+ ```bash
148
+ # .devcontainer/.env
149
+ OPEN_WEBUI_PORT=3001
150
+ ```
151
+
152
+ ## References
153
+
154
+ - [Open WebUI GitHub](https://github.com/open-webui/open-webui)
155
+ - [Open WebUI Documentation](https://docs.openwebui.com)
156
+ - [Open WebUI Docker Hub](https://ghcr.io/open-webui/open-webui)
157
+
158
+ **Related Overlays:**
159
+
160
+ - [`ollama`](../ollama/README.md) — Local LLM inference server (recommended companion)
161
+ - [`cuda`](../cuda/README.md) — NVIDIA GPU acceleration for faster inference
162
+ - [`python`](../python/README.md) — Python SDK for building integrations
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
+ "runServices": ["open-webui"],
4
+ "forwardPorts": [3000],
5
+ "portsAttributes": {
6
+ "3000": {
7
+ "label": "Open WebUI",
8
+ "onAutoForward": "openBrowser"
9
+ }
10
+ },
11
+ "containerEnv": {
12
+ "OPEN_WEBUI_PORT": "3000"
13
+ }
14
+ }
@@ -0,0 +1,23 @@
1
+ version: '3.8'
2
+
3
+ services:
4
+ open-webui:
5
+ image: ghcr.io/open-webui/open-webui:${OPEN_WEBUI_VERSION:-{{cs.OPEN_WEBUI_VERSION}}}
6
+ restart: unless-stopped
7
+ volumes:
8
+ - open-webui-data:/app/backend/data
9
+ environment:
10
+ OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-{{cs.OLLAMA_BASE_URL}}}
11
+ WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY:-{{cs.WEBUI_SECRET_KEY}}}
12
+ ports:
13
+ - '${OPEN_WEBUI_PORT:-{{cs.OPEN_WEBUI_PORT}}}:8080'
14
+ extra_hosts:
15
+ - host.docker.internal:host-gateway
16
+ networks:
17
+ - devnet
18
+
19
+ volumes:
20
+ open-webui-data:
21
+
22
+ networks:
23
+ devnet:
@@ -0,0 +1,38 @@
1
+ id: open-webui
2
+ name: Open WebUI
3
+ description: Browser-based chat UI for Ollama and OpenAI-compatible LLM backends
4
+ category: dev
5
+ supports:
6
+ - compose
7
+ requires: []
8
+ suggests:
9
+ - ollama
10
+ conflicts: []
11
+ tags:
12
+ - dev
13
+ - ai
14
+ - llm
15
+ - ui
16
+ - chat
17
+ - openwebui
18
+ ports:
19
+ - port: 3000
20
+ service: open-webui
21
+ protocol: http
22
+ path: /
23
+ description: Open WebUI web interface
24
+ onAutoForward: openBrowser
25
+ parameters:
26
+ OPEN_WEBUI_VERSION:
27
+ description: Open WebUI Docker image tag
28
+ default: main
29
+ OPEN_WEBUI_PORT:
30
+ description: Host port mapped to the Open WebUI web interface (8080 inside container)
31
+ default: '3000'
32
+ OLLAMA_BASE_URL:
33
+ description: Base URL of the Ollama API (leave default when using the ollama overlay)
34
+ default: 'http://ollama:11434'
35
+ WEBUI_SECRET_KEY:
36
+ description: Secret key for Open WebUI session signing (change for any shared environment)
37
+ default: change-me-please
38
+ sensitive: true
@@ -5,6 +5,5 @@
5
5
  "apt": "curl",
6
6
  "apk": "curl"
7
7
  }
8
- },
9
- "postCreateCommand": "bash .devcontainer/scripts/setup-openapi-tools.sh"
8
+ }
10
9
  }
@@ -3,19 +3,20 @@
3
3
 
4
4
  set -e
5
5
 
6
+ # Source shared setup utilities (provides load_nvm)
7
+ # shellcheck source=setup-utils.sh
8
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
9
+ load_nvm
10
+
6
11
  echo "🔧 Setting up OpenAPI Tools..."
7
12
 
8
13
  # Install OpenAPI tools globally via npm
9
14
  echo "📦 Installing OpenAPI tools..."
10
15
 
11
- # Install swagger-cli (OpenAPI validation)
12
- npm install -g @apidevtools/swagger-cli || echo "⚠️ swagger-cli already installed or failed"
13
-
14
- # Install spectral (OpenAPI linting)
15
- npm install -g @stoplight/spectral-cli || echo "⚠️ spectral already installed or failed"
16
-
17
- # Install redocly CLI (documentation and bundling)
18
- npm install -g @redocly/cli || echo "⚠️ redocly already installed or failed"
16
+ # Wrap each install in run_spinner to suppress noisy deprecation warnings
17
+ run_spinner "swagger-cli" npm install -g @apidevtools/swagger-cli
18
+ run_spinner "spectral" npm install -g @stoplight/spectral-cli
19
+ run_spinner "redocly" npm install -g @redocly/cli
19
20
 
20
21
  # Verify installations
21
22
  echo ""
@@ -3,6 +3,11 @@
3
3
 
4
4
  set -e
5
5
 
6
+ # Source shared setup utilities (provides load_nvm)
7
+ # shellcheck source=setup-utils.sh
8
+ source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
9
+ load_nvm
10
+
6
11
  echo "📦 Installing opencode AI coding agent..."
7
12
 
8
13
  # Install opencode-ai globally
@@ -19,3 +19,5 @@ ports:
19
19
  - 8888
20
20
  - 8889
21
21
  order: 2
22
+ imports:
23
+ - .shared/otel/instrumentation.env
@@ -5,23 +5,10 @@ set -e
5
5
 
6
6
  echo "🔧 Configuring OpenTelemetry Collector trace backend..."
7
7
 
8
- # Determine workspace root dynamically
9
- WORKSPACE_ROOT="${LOCAL_WORKSPACE_FOLDER:-$PWD}"
10
-
11
- if [ ! -d "$WORKSPACE_ROOT/.devcontainer" ]; then
12
- if [ -d "/workspaces" ]; then
13
- FIRST_WORKSPACE_DIR="$(find /workspaces -maxdepth 1 -mindepth 1 -type d 2>/dev/null | head -n 1)"
14
- if [ -n "$FIRST_WORKSPACE_DIR" ] && [ -d "$FIRST_WORKSPACE_DIR/.devcontainer" ]; then
15
- WORKSPACE_ROOT="$FIRST_WORKSPACE_DIR"
16
- fi
17
- fi
18
- fi
19
-
20
- if [ ! -d "$WORKSPACE_ROOT/.devcontainer" ] && [ -d "/workspace/.devcontainer" ]; then
21
- WORKSPACE_ROOT="/workspace"
22
- fi
8
+ # Resolve the .devcontainer directory relative to this script.
9
+ DEVCONTAINER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && cd .. && pwd)"
23
10
 
24
- OTEL_CONFIG="$WORKSPACE_ROOT/.devcontainer/otel-collector-config-otel-collector.yaml"
11
+ OTEL_CONFIG="$DEVCONTAINER_DIR/otel-collector-config-otel-collector.yaml"
25
12
 
26
13
  if [ ! -f "$OTEL_CONFIG" ]; then
27
14
  echo "⚠️ OTel Collector config not found"
@@ -6,19 +6,18 @@ echo "🔍 Verifying OTel Demo (Node.js) installation..."
6
6
  # Track overall success
7
7
  ALL_CHECKS_PASSED=true
8
8
 
9
- # Check if service is running
10
- if docker ps --format '{{.Names}}' | grep -q otel-demo-nodejs; then
11
- echo " OTel Demo (Node.js) service is running"
9
+ # Check if HTTP health endpoint is accessible (primary health signal).
10
+ # docker ps is informational only not reliably accessible in all devcontainers.
11
+ if curl -s -o /dev/null -w "%{http_code}" http://otel-demo-nodejs:8080/health 2>/dev/null | grep -q "200"; then
12
+ echo "✓ Demo app HTTP endpoint is accessible"
12
13
  else
13
- echo "✗ OTel Demo (Node.js) service is not running"
14
+ echo "✗ Demo app HTTP endpoint not responding (http://otel-demo-nodejs:8080/health)"
14
15
  ALL_CHECKS_PASSED=false
15
16
  fi
16
17
 
17
- # Check if HTTP endpoint is accessible
18
- if curl -s -o /dev/null -w "%{http_code}" http://otel-demo-nodejs:8080/health 2>/dev/null | grep -q "200"; then
19
- echo "✓ Demo app HTTP endpoint is accessible"
20
- else
21
- echo "⚠️ Demo app HTTP endpoint not responding yet (may still be starting)"
18
+ # Informational: check via docker ps if available.
19
+ if docker ps --format '{{.Names}}' 2>/dev/null | grep -q otel-demo-nodejs; then
20
+ echo "✓ OTel Demo (Node.js) container visible in docker ps"
22
21
  fi
23
22
 
24
23
  # Final result
@@ -6,19 +6,25 @@ echo "🔍 Verifying OTel Demo (Python) installation..."
6
6
  # Track overall success
7
7
  ALL_CHECKS_PASSED=true
8
8
 
9
- # Check if service is running
10
- if docker ps --format '{{.Names}}' | grep -q otel-demo-python; then
11
- echo "✓ OTel Demo (Python) service is running"
12
- else
13
- echo " OTel Demo (Python) service is not running"
9
+ # Wait for demo app HTTP health endpoint (primary health signal).
10
+ # docker ps is informational only not reliably accessible in all devcontainers.
11
+ APP_READY=false
12
+ for i in {1..40}; do
13
+ if curl -s -o /dev/null -w "%{http_code}" http://otel-demo-python:8081/health 2>/dev/null | grep -q "200"; then
14
+ echo "✓ Demo app HTTP endpoint is accessible"
15
+ APP_READY=true
16
+ break
17
+ fi
18
+ sleep 3
19
+ done
20
+ if [ "$APP_READY" = false ]; then
21
+ echo "✗ Demo app HTTP endpoint not responding after 120 s (http://otel-demo-python:8081/health)"
14
22
  ALL_CHECKS_PASSED=false
15
23
  fi
16
24
 
17
- # Check if HTTP endpoint is accessible
18
- if curl -s -o /dev/null -w "%{http_code}" http://otel-demo-python:8081/health 2>/dev/null | grep -q "200"; then
19
- echo "✓ Demo app HTTP endpoint is accessible"
20
- else
21
- echo "⚠️ Demo app HTTP endpoint not responding yet (may still be starting)"
25
+ # Informational: check via docker ps if available.
26
+ if docker ps --format '{{.Names}}' 2>/dev/null | grep -q otel-demo-python; then
27
+ echo "✓ OTel Demo (Python) container visible in docker ps"
22
28
  fi
23
29
 
24
30
  # Final result
@@ -6,9 +6,10 @@ Adds a complete Markdown → PDF pipeline to your devcontainer, powered by Pando
6
6
 
7
7
  - **Pandoc 3.x** — Latest release binary from GitHub (not the outdated apt version)
8
8
  - **TeX Live / XeLaTeX** — Full Unicode-capable PDF engine (`texlive-xetex`, `texlive-fonts-extra`, `texlive-latex-extra`)
9
- - **Quality fonts** — Carlito (body), JetBrains Mono (code), Noto Sans Symbols 2 (Unicode fallback) via system packages
9
+ - **Quality fonts** — Carlito (body), JetBrains Mono (code), Noto Sans Symbols 2 (Unicode fallback), and Noto Color Emoji via system packages
10
10
  - Uses the `cross-distro-packages` feature with fallback package names for Carlito (`fonts-carlito|fonts-crosextra-carlito`)
11
11
  - **`diagram.lua`** — Lua filter from [pandoc-ext/diagram](https://github.com/pandoc-ext/diagram) for rendering code-block diagrams
12
+ - **`emoji-fallback.lua`** — Built-in Lua filter that rewrites unsupported emoji and flag glyphs to plain-text placeholders for reliable XeLaTeX PDF builds
12
13
  - **Mermaid CLI (`mmdc`)** — Installed when the `nodejs` overlay is present; skipped gracefully otherwise
13
14
  - **`~/.pandoc/pandoc.yaml`** — Ready-to-use defaults file (XeLaTeX engine, font settings, table tweaks)
14
15
  - **VS Code Extensions:** Markdown All in One (`yzhang.markdown-all-in-one`), markdownlint (`DavidAnson.vscode-markdownlint`)
@@ -30,13 +31,17 @@ Markdown
30
31
 
31
32
  Font discovery is updated with `fc-cache -fv` after installation so XeLaTeX can locate the apt-installed fonts.
32
33
 
34
+ The generated defaults also enable an emoji fallback filter for LaTeX output. The overlay now installs Noto Color Emoji as well, which may improve glyph coverage in some contexts, but the fallback filter remains enabled because XeLaTeX still is not reliable for full emoji and flag rendering. The filter converts unsupported glyphs such as `🇵🇹` to `[PT]` and generic emoji such as `😀` to `[emoji]` before XeLaTeX runs, preventing the `Unicode character ... not set up for use with LaTeX` failure.
35
+
36
+ The setup script also installs a `/usr/local/bin/pandoc` wrapper that automatically applies `~/.pandoc/pandoc.yaml` unless you explicitly pass `-d` or `--defaults`. That makes plain commands like `pandoc doc.md -o doc.pdf` use the overlay defaults.
37
+
33
38
  ## Common Commands
34
39
 
35
40
  ### Basic PDF export
36
41
 
37
42
  ```bash
38
- # Use the default pandoc.yaml
39
- pandoc -d ~/.pandoc/pandoc.yaml document.md -o document.pdf
43
+ # Uses the installed wrapper, which applies ~/.pandoc/pandoc.yaml automatically
44
+ pandoc document.md -o document.pdf
40
45
 
41
46
  # Override the output font on the fly
42
47
  pandoc -d ~/.pandoc/pandoc.yaml -V mainfont="DejaVu Serif" document.md -o document.pdf
@@ -45,8 +50,7 @@ pandoc -d ~/.pandoc/pandoc.yaml -V mainfont="DejaVu Serif" document.md -o docume
45
50
  ### PDF with Mermaid diagrams (requires nodejs overlay)
46
51
 
47
52
  ```bash
48
- pandoc -d ~/.pandoc/pandoc.yaml \
49
- --lua-filter ~/.pandoc/filters/diagram.lua \
53
+ pandoc --lua-filter ~/.pandoc/filters/diagram.lua \
50
54
  document.md -o document.pdf
51
55
  ```
52
56
 
@@ -95,6 +99,8 @@ The setup script writes a defaults file with proven settings:
95
99
 
96
100
  ```yaml
97
101
  pdf-engine: xelatex
102
+ filters:
103
+ - /home/your-user/.pandoc/filters/emoji-fallback.lua
98
104
 
99
105
  variables:
100
106
  mainfont: 'Carlito'
@@ -129,8 +135,9 @@ variables:
129
135
  toc: true
130
136
  toc-depth: 3
131
137
  number-sections: true
132
- lua-filter:
133
- - ~/.pandoc/filters/diagram.lua
138
+ filters:
139
+ - /home/your-user/.pandoc/filters/emoji-fallback.lua
140
+ - /home/your-user/.pandoc/filters/diagram.lua
134
141
  ```
135
142
 
136
143
  Then build with:
@@ -154,21 +161,21 @@ number-sections: true
154
161
  Uncomment in `~/.pandoc/pandoc.yaml`:
155
162
 
156
163
  ```yaml
157
- lua-filter:
158
- - ~/.pandoc/filters/diagram.lua
164
+ filters:
165
+ - /home/your-user/.pandoc/filters/emoji-fallback.lua
166
+ - /home/your-user/.pandoc/filters/diagram.lua
159
167
  ```
160
168
 
161
169
  ## Unicode and Emoji
162
170
 
163
- XeLaTeX handles Unicode well with the Noto and Carlito fonts, but emoji (🎉 🚀) require a colour emoji font (e.g. `fonts-noto-color-emoji`) which is not installed by default due to size. For documents with emoji, either:
171
+ XeLaTeX handles normal Unicode text well with the bundled fonts. The overlay now also installs Noto Color Emoji, which can help with emoji coverage, but the failure mode in PDF builds is still usually emoji or regional-indicator flags, for example `🇵🇹`, which XeLaTeX may reject before font fallback can help.
164
172
 
165
- 1. Replace emoji with text equivalents before generating the PDF:
173
+ The overlay now enables `~/.pandoc/filters/emoji-fallback.lua` by default for LaTeX output. It keeps normal Unicode text intact and rewrites unsupported emoji to plain-text placeholders:
166
174
 
167
- ```bash
168
- sed 's/🎉/[celebration]/g; s/🚀/[rocket]/g' doc.md | pandoc -d ~/.pandoc/pandoc.yaml -o doc.pdf
169
- ```
175
+ - `🇵🇹 Porto` becomes `[PT] Porto`
176
+ - `😀` becomes `[emoji]`
170
177
 
171
- 2. Install `fonts-noto-color-emoji` and add `\setmainfont{Noto Color Emoji}` for the emoji font fallback in your `header-includes`.
178
+ If you want to experiment with more native emoji rendering, keep the installed emoji font and override the default Pandoc/LaTeX settings in a project-local `pandoc.yaml`, but the placeholder filter is still the reliable default for PDF generation.
172
179
 
173
180
  ## Use Cases
174
181
 
@@ -2,13 +2,17 @@
2
2
  "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
3
  "features": {
4
4
  "./features/cross-distro-packages": {
5
- "apt": "texlive-xetex texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra texlive-lang-european fonts-carlito|fonts-crosextra-carlito fonts-noto fonts-noto-extra fonts-noto-mono fonts-jetbrains-mono fontconfig perl chromium",
6
- "apk": "fontconfig perl chromium"
5
+ "apt": "texlive-xetex texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra texlive-lang-european lmodern fonts-carlito|fonts-crosextra-carlito fonts-noto fonts-noto-extra fonts-noto-mono fonts-jetbrains-mono fonts-noto-color-emoji fontconfig librsvg2-bin perl chromium",
6
+ "apk": "fontconfig noto-fonts-emoji|noto-emoji perl chromium"
7
7
  }
8
8
  },
9
9
  "customizations": {
10
10
  "vscode": {
11
11
  "extensions": ["yzhang.markdown-all-in-one", "DavidAnson.vscode-markdownlint"]
12
12
  }
13
+ },
14
+ "remoteEnv": {
15
+ "PUPPETEER_EXECUTABLE_PATH": "/usr/local/bin/chromium-no-sandbox",
16
+ "PUPPETEER_SKIP_DOWNLOAD": "true"
13
17
  }
14
18
  }