Published: Mar 4, 2025 by Isaac Johnson
Today we are going to attempt to build out an app with Bolt.diy which is the official OS backend to Bolt.new. I’m to try a few different ways as well as augment with Google Gemini Code Assist as well as Github Copilot (free). I’m also going to compare with something built purely with Gemini Code Assist, Copilot and Midjourney.
Spoiler: I’ll get it going below, but only after many tries with many timeouts. There are some things with Bolt.diy that tend to work better in Firefox. Also, the best working instances came from running docker compose locally; provided you have the CPU/GPU to handle it.
Setup
Let’s clone the repo
builder@LuiGi:~/Workspaces$ git clone https://github.com/stackblitz-labs/bolt.diy.git
Cloning into 'bolt.diy'...
remote: Enumerating objects: 8959, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 8959 (delta 16), reused 11 (delta 11), pack-reused 8927 (from 3)
Receiving objects: 100% (8959/8959), 7.25 MiB | 8.67 MiB/s, done.
Resolving deltas: 100% (5509/5509), done.
builder@LuiGi:~/Workspaces$ cd bolt.diy/
builder@LuiGi:~/Workspaces/bolt.diy$
I can then docker build the image
builder@LuiGi:~/Workspaces/bolt.diy$ docker build . --target bolt-ai-development
[+] Building 97.9s (13/13) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 2.72kB 0.0s
=> [internal] load metadata for docker.io/library/node:20.18.0 1.3s
=> [auth] library/node:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 427B 0.0s
=> [base 1/6] FROM docker.io/library/node:20.18.0@sha256:a7a3b7ec6de4b11bb2d673b31de9d28c6da09c557ee65453672c8e4f754c23fc 50.4s
=> => resolve docker.io/library/node:20.18.0@sha256:a7a3b7ec6de4b11bb2d673b31de9d28c6da09c557ee65453672c8e4f754c23fc 0.0s
=> => sha256:a7a3b7ec6de4b11bb2d673b31de9d28c6da09c557ee65453672c8e4f754c23fc 6.41kB / 6.41kB 0.0s
=> => sha256:2fdabcc143ddee8d2041316316a238a35f56423362c503fd93e06b1bff79ed56 6.61kB / 6.61kB 0.0s
=> => sha256:c3cc7b6f04730c072f8b292917e0d95bb886096a2b2b1781196170965161cd27 24.06MB / 24.06MB 6.9s
=> => sha256:202ae32103f362765c42bb8283fbec5167cb7c5687feca97ad6bfbf4af3df444 2.49kB / 2.49kB 0.0s
=> => sha256:b2b31b28ee3c96e96195c754f8679f690db4b18e475682d716122016ef056f39 49.58MB / 49.58MB 11.4s
=> => sha256:2112e5e7c3ff699043b282f1ff24d3ef185c080c28846f1d7acc5ccf650bc13d 64.39MB / 64.39MB 15.6s
=> => sha256:af247aac076473044d24960a352a8ec6f154cf0a28f4fbf35fe5d43b52687ba2 211.29MB / 211.29MB 38.0s
=> => sha256:2768a6d600d198b5718b29d1969ea6ab9b8b21360dff78d13b9538f72c39ad82 3.32kB / 3.32kB 11.8s
=> => extracting sha256:b2b31b28ee3c96e96195c754f8679f690db4b18e475682d716122016ef056f39 5.4s
=> => sha256:8090fa0edd88988819cd881e9de2459a837e9cda762ca011e8b77f61bc42ac3c 48.22MB / 48.22MB 23.7s
=> => sha256:4cf85a38fb04969a4853c458afc84c5078320d8927ec4c87d36dbdd3cc736962 1.25MB / 1.25MB 16.1s
=> => sha256:22496bd6ed1beb11b73e005e295874fae0231e98e60289a5e82ca92d0b4997ca 446B / 446B 16.4s
=> => extracting sha256:c3cc7b6f04730c072f8b292917e0d95bb886096a2b2b1781196170965161cd27 1.4s
=> => extracting sha256:2112e5e7c3ff699043b282f1ff24d3ef185c080c28846f1d7acc5ccf650bc13d 9.4s
=> => extracting sha256:af247aac076473044d24960a352a8ec6f154cf0a28f4fbf35fe5d43b52687ba2 9.0s
=> => extracting sha256:2768a6d600d198b5718b29d1969ea6ab9b8b21360dff78d13b9538f72c39ad82 0.0s
=> => extracting sha256:8090fa0edd88988819cd881e9de2459a837e9cda762ca011e8b77f61bc42ac3c 2.4s
=> => extracting sha256:4cf85a38fb04969a4853c458afc84c5078320d8927ec4c87d36dbdd3cc736962 0.0s
=> => extracting sha256:22496bd6ed1beb11b73e005e295874fae0231e98e60289a5e82ca92d0b4997ca 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 3.19MB 0.1s
=> [base 2/6] WORKDIR /app 0.3s
=> [base 3/6] COPY package.json pnpm-lock.yaml ./ 0.1s
=> [base 4/6] RUN npm install -g corepack@latest 1.4s
=> [base 5/6] RUN corepack enable pnpm && pnpm install 28.6s
=> [base 6/6] COPY . . 0.2s
=> [bolt-ai-development 1/1] RUN mkdir -p ${WORKDIR}/run 0.4s
=> exporting to image 14.9s
=> => exporting layers 14.9s
=> => writing image sha256:e53d6f78e8f0e5936a8ba390c9fcb39c9b1592b1605819fd335aefc80f3a00bf 0.0s
I can see it built
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> e53d6f78e8f0 33 seconds ago 1.82GB
I can tag and push it to my private CR
builder@LuiGi:~/Workspaces/bolt.diy$ docker tag e53d6f78e8f0 harbor.freshbrewed.science/freshbrewedprivate/boltdiy:0.1
builder@LuiGi:~/Workspaces/bolt.diy$ docker push harbor.freshbrewed.science/freshbrewedprivate/boltdiy:0.1
The push refers to repository [harbor.freshbrewed.science/freshbrewedprivate/boltdiy]
7690c87c2bb9: Pushed
4fb1e303fbba: Pushed
03a71a0c7cf7: Pushed
b8e0c75a2ff7: Pushed
bcb885017ef0: Pushed
be16a895febb: Pushed
7df03414f5a4: Pushed
c8f2469bd408: Pushed
393a1f3c1d17: Pushed
cb4ea2995b11: Pushed
96d99c63b722: Pushed
00547dd240c4: Pushed
b6ca42156b9f: Pushed
24b5ce0f1e07: Pushed
0.1: digest: sha256:6c61c99ffeb4e0aed3bd97bd73c09219b20ca6d6dbebdbb70e6ca26817c2265f size: 3261
I can no go to my Docker running host and pull it
builder@builder-T100:~$ docker pull harbor.freshbrewed.science/freshbrewedprivate/boltdiy:0.1
0.1: Pulling from freshbrewedprivate/boltdiy
b2b31b28ee3c: Pull complete
c3cc7b6f0473: Pull complete
2112e5e7c3ff: Pull complete
af247aac0764: Pull complete
2768a6d600d1: Pull complete
8090fa0edd88: Pull complete
4cf85a38fb04: Pull complete
22496bd6ed1b: Pull complete
f5ef8ee6508f: Pull complete
b72f70bdab45: Pull complete
730d11a82ce3: Pull complete
325268dbd776: Pull complete
7ab50fec58cf: Pull complete
0be61ce03a7a: Pull complete
Digest: sha256:6c61c99ffeb4e0aed3bd97bd73c09219b20ca6d6dbebdbb70e6ca26817c2265f
Status: Downloaded newer image for harbor.freshbrewed.science/freshbrewedprivate/boltdiy:0.1
harbor.freshbrewed.science/freshbrewedprivate/boltdiy:0.1
Now let’s try and run it
$ docker run -p 5173:5173 -e NODE_ENV=production -e COMPOSE_PROFILES=production -e PORT=5173 -e RUNNING_IN_DOCKER=true -e O
LLAMA_API_BASE_URL=http://192.168.1.143:11434 harbor.freshbrewed.science/freshbrewedprivate/boltdiy:0.1
> bolt@0.0.6 dev /app
> node pre-start.cjs && remix vite:dev "--host"
fatal: not a git repository (or any of the parent directories): .git
★═══════════════════════════════════════★
B O L T . D I Y
⚡️ Welcome ⚡️
★═══════════════════════════════════════★
📍 Current Version Tag: v"0.0.6"
📍 Current Commit Version: "no-git-info"
Please wait until the URL appears here
★═══════════════════════════════════════★
fatal: not a git repository (or any of the parent directories): .git
[warn] Data fetching is changing to a single fetch in React Router v7
┃ You can use the `v3_singleFetch` future flag to opt-in early.
┃ -> https://remix.run/docs/en/2.13.1/start/future-flags#v3_singleFetch
┗
fatal: not a git repository (or any of the parent directories): .git
➜ Local: http://localhost:5173/
➜ Network: http://172.17.0.14:5173/
That didn’t work tho
I’ll try pulling the repo and running docker compose
builder@builder-T100:~/bolt.diy$ cat .env.local
PORT=5173
RUNNING_IN_DOCKER=true
OLLAMA_API_BASE_URL=http://192.168.1.143:11434
builder@builder-T100:~/bolt.diy$ docker compose --profile development up
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OLLAMA_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OLLAMA_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
[+] Building 0.0s (0/0)
Attaching to boltdiy-app-dev-1
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | > bolt@0.0.6 dev /app
boltdiy-app-dev-1 | > node pre-start.cjs && remix vite:dev "--host" "0.0.0.0"
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | fatal: detected dubious ownership in repository at '/app'
boltdiy-app-dev-1 | To add an exception for this directory, call:
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | git config --global --add safe.directory /app
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | ★═══════════════════════════════════════★
boltdiy-app-dev-1 | B O L T . D I Y
boltdiy-app-dev-1 | ⚡️ Welcome ⚡️
boltdiy-app-dev-1 | ★═══════════════════════════════════════★
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | 📍 Current Version Tag: v"0.0.6"
boltdiy-app-dev-1 | 📍 Current Commit Version: "no-git-info"
boltdiy-app-dev-1 | Please wait until the URL appears here
boltdiy-app-dev-1 | ★═══════════════════════════════════════★
boltdiy-app-dev-1 | fatal: detected dubious ownership in repository at '/app'
boltdiy-app-dev-1 | To add an exception for this directory, call:
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | git config --global --add safe.directory /app
boltdiy-app-dev-1 | [warn] Data fetching is changing to a single fetch in React Router v7
boltdiy-app-dev-1 | ┃ You can use the `v3_singleFetch` future flag to opt-in early.
boltdiy-app-dev-1 | ┃ -> https://remix.run/docs/en/2.13.1/start/future-flags#v3_singleFetch
boltdiy-app-dev-1 | ┗
boltdiy-app-dev-1 | fatal: detected dubious ownership in repository at '/app'
boltdiy-app-dev-1 | To add an exception for this directory, call:
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | git config --global --add safe.directory /app
boltdiy-app-dev-1 | ➜ Local: http://localhost:5173/
boltdiy-app-dev-1 | ➜ Network: http://172.19.0.2:5173/
This time it came up
But all it showed was SaaS endpoints
For some reason, by default the local models are disabled.
we can click a gear icon (barely visible) in the lower left and get to the settings for local to enable
If I do nothing else, the drop down won’t show the models I have installed
I found this issue about not finding models is actually a bug others have reported.
I’ll try on the Ollama host
builder@bosgamerz9:~/bolt.diy$ cat .env.local | grep OLLAMA
OLLAMA_API_BASE_URL=http://127.0.0.1:11434
builder@bosgamerz9:~/bolt.diy$ sudo docker compose --profile development up
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OLLAMA_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OLLAMA_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
[+] Running 1/1
! app-dev Warning pull access denied for bolt-ai, repository does not exist or may require 'docker login': denied: req... 0.7s
[+] Building 26.6s (13/13) FINISHED docker:default
=> [app-dev internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 2.72kB 0.0s
=> [app-dev internal] load metadata for docker.io/library/node:20.18.0 0.9s
=> [app-dev internal] load .dockerignore 0.0s
=> => transferring context: 427B 0.0s
=> [app-dev base 1/6] FROM docker.io/library/node:20.18.0@sha256:a7a3b7ec6de4b11bb2d673b31de9d28c6da09c557ee65453672c8e4f754c23fc 8.1s
=> => resolve docker.io/library/node:20.18.0@sha256:a7a3b7ec6de4b11bb2d673b31de9d28c6da09c557ee65453672c8e4f754c23fc 0.0s
=> => sha256:202ae32103f362765c42bb8283fbec5167cb7c5687feca97ad6bfbf4af3df444 2.49kB / 2.49kB 0.0s
=> => sha256:2112e5e7c3ff699043b282f1ff24d3ef185c080c28846f1d7acc5ccf650bc13d 64.39MB / 64.39MB 1.7s
=> => sha256:c3cc7b6f04730c072f8b292917e0d95bb886096a2b2b1781196170965161cd27 24.06MB / 24.06MB 1.3s
=> => sha256:a7a3b7ec6de4b11bb2d673b31de9d28c6da09c557ee65453672c8e4f754c23fc 6.41kB / 6.41kB 0.0s
=> => sha256:2fdabcc143ddee8d2041316316a238a35f56423362c503fd93e06b1bff79ed56 6.61kB / 6.61kB 0.0s
=> => sha256:b2b31b28ee3c96e96195c754f8679f690db4b18e475682d716122016ef056f39 49.58MB / 49.58MB 1.7s
=> => sha256:af247aac076473044d24960a352a8ec6f154cf0a28f4fbf35fe5d43b52687ba2 211.29MB / 211.29MB 4.7s
=> => extracting sha256:b2b31b28ee3c96e96195c754f8679f690db4b18e475682d716122016ef056f39 0.8s
=> => sha256:2768a6d600d198b5718b29d1969ea6ab9b8b21360dff78d13b9538f72c39ad82 3.32kB / 3.32kB 1.9s
=> => sha256:8090fa0edd88988819cd881e9de2459a837e9cda762ca011e8b77f61bc42ac3c 48.22MB / 48.22MB 3.0s
=> => sha256:4cf85a38fb04969a4853c458afc84c5078320d8927ec4c87d36dbdd3cc736962 1.25MB / 1.25MB 2.1s
=> => sha256:22496bd6ed1beb11b73e005e295874fae0231e98e60289a5e82ca92d0b4997ca 446B / 446B 2.3s
=> => extracting sha256:c3cc7b6f04730c072f8b292917e0d95bb886096a2b2b1781196170965161cd27 0.2s
=> => extracting sha256:2112e5e7c3ff699043b282f1ff24d3ef185c080c28846f1d7acc5ccf650bc13d 0.9s
=> => extracting sha256:af247aac076473044d24960a352a8ec6f154cf0a28f4fbf35fe5d43b52687ba2 2.3s
=> => extracting sha256:2768a6d600d198b5718b29d1969ea6ab9b8b21360dff78d13b9538f72c39ad82 0.0s
=> => extracting sha256:8090fa0edd88988819cd881e9de2459a837e9cda762ca011e8b77f61bc42ac3c 0.8s
=> => extracting sha256:4cf85a38fb04969a4853c458afc84c5078320d8927ec4c87d36dbdd3cc736962 0.0s
=> => extracting sha256:22496bd6ed1beb11b73e005e295874fae0231e98e60289a5e82ca92d0b4997ca 0.0s
=> [app-dev internal] load build context 0.1s
=> => transferring context: 3.19MB 0.0s
=> [app-dev base 2/6] WORKDIR /app 0.5s
=> [app-dev base 3/6] COPY package.json pnpm-lock.yaml ./ 0.0s
=> [app-dev base 4/6] RUN npm install -g corepack@latest 0.8s
=> [app-dev base 5/6] RUN corepack enable pnpm && pnpm install 10.8s
=> [app-dev base 6/6] COPY . . 0.1s
=> [app-dev bolt-ai-development 1/1] RUN mkdir -p ${WORKDIR}/run 0.1s
=> [app-dev] exporting to image 5.3s
=> => exporting layers 5.3s
=> => writing image sha256:7f7d22b20b3b36310c663c801fa50ad93e38543150b401dc9070564244ae1829 0.0s
=> => naming to docker.io/library/bolt-ai:development 0.0s
=> [app-dev] resolving provenance for metadata file 0.0s
[+] Running 3/3
✔ app-dev Built 0.0s
✔ Network boltdiy_default Created 0.1s
✔ Container boltdiy-app-dev-1 Created 4.9s
Attaching to app-dev-1
app-dev-1 |
app-dev-1 | > bolt@0.0.6 dev /app
app-dev-1 | > node pre-start.cjs && remix vite:dev "--host" "0.0.0.0"
app-dev-1 |
app-dev-1 | fatal: detected dubious ownership in repository at '/app'
app-dev-1 | To add an exception for this directory, call:
app-dev-1 |
app-dev-1 | git config --global --add safe.directory /app
app-dev-1 |
app-dev-1 | ★═══════════════════════════════════════★
app-dev-1 | B O L T . D I Y
app-dev-1 | ⚡️ Welcome ⚡️
app-dev-1 | ★═══════════════════════════════════════★
app-dev-1 |
app-dev-1 | 📍 Current Version Tag: v"0.0.6"
app-dev-1 | 📍 Current Commit Version: "no-git-info"
app-dev-1 | Please wait until the URL appears here
app-dev-1 | ★═══════════════════════════════════════★
app-dev-1 | fatal: detected dubious ownership in repository at '/app'
app-dev-1 | To add an exception for this directory, call:
app-dev-1 |
app-dev-1 | git config --global --add safe.directory /app
app-dev-1 | [warn] Data fetching is changing to a single fetch in React Router v7
app-dev-1 | ┃ You can use the `v3_singleFetch` future flag to opt-in early.
app-dev-1 | ┃ -> https://remix.run/docs/en/2.13.1/start/future-flags#v3_singleFetch
app-dev-1 | ┗
app-dev-1 | fatal: detected dubious ownership in repository at '/app'
app-dev-1 | To add an exception for this directory, call:
app-dev-1 |
app-dev-1 | git config --global --add safe.directory /app
app-dev-1 | ➜ Local: http://localhost:5173/
app-dev-1 | ➜ Network: http://172.18.0.2:5173/
That said, nothing seems to work for local Ollama
I’ll try editing the systemctl to add origins
builder@bosgamerz9:~/bolt.diy$ sudo systemctl edit ollama.service
Successfully installed edited file '/etc/systemd/system/ollama.service.d/override.conf'.
builder@bosgamerz9:~/bolt.diy$ cat /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_ORIGINS=*"`
Then restart the service
builder@bosgamerz9:~/bolt.diy$ sudo systemctl restart ollama.service
I finally did a sed on the docker-compose file to set localhost:
builder@bosgamerz9:~/bolt.diy$ cat docker-compose.yaml
services:
app-prod:
image: bolt-ai:production
build:
context: .
dockerfile: Dockerfile
target: bolt-ai-production
ports:
- '5173:5173'
env_file: '.env.local'
environment:
- NODE_ENV=production
- COMPOSE_PROFILES=production
# No strictly needed but serving as hints for Coolify
- PORT=5173
- GROQ_API_KEY=${GROQ_API_KEY}
- HuggingFace_API_KEY=${HuggingFace_API_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY}
- GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY}
- OLLAMA_API_BASE_URL=http://127.0.0.1:11434
- XAI_API_KEY=${XAI_API_KEY}
- TOGETHER_API_KEY=${TOGETHER_API_KEY}
- TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL}
- AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG}
- VITE_LOG_LEVEL=${VITE_LOG_LEVEL:-debug}
- DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX:-32768}
- RUNNING_IN_DOCKER=true
extra_hosts:
- 'host.docker.internal:host-gateway'
command: pnpm run dockerstart
profiles:
- production
app-dev:
image: bolt-ai:development
build:
target: bolt-ai-development
env_file: '.env.local'
environment:
- NODE_ENV=development
- VITE_HMR_PROTOCOL=ws
- VITE_HMR_HOST=localhost
- VITE_HMR_PORT=5173
- CHOKIDAR_USEPOLLING=true
- WATCHPACK_POLLING=true
- PORT=5173
- GROQ_API_KEY=${GROQ_API_KEY}
- HuggingFace_API_KEY=${HuggingFace_API_KEY}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- OPEN_ROUTER_API_KEY=${OPEN_ROUTER_API_KEY}
- XAI_API_KEY=${XAI_API_KEY}
- GOOGLE_GENERATIVE_AI_API_KEY=${GOOGLE_GENERATIVE_AI_API_KEY}
- OLLAMA_API_BASE_URL=http://127.0.0.1:11434
- TOGETHER_API_KEY=${TOGETHER_API_KEY}
- TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL}
- AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG}
- VITE_LOG_LEVEL=${VITE_LOG_LEVEL:-debug}
- DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX:-32768}
- RUNNING_IN_DOCKER=true
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- type: bind
source: .
target: /app
consistency: cached
- /app/node_modules
ports:
- '5173:5173'
command: pnpm run dev --host 0.0.0.0
profiles: ['development', 'default']
app-prebuild:
image: ghcr.io/stackblitz-labs/bolt.diy:latest
ports:
- '5173:5173'
environment:
- NODE_ENV=production
- COMPOSE_PROFILES=production
# No strictly needed but serving as hints for Coolify
- PORT=5173
- OLLAMA_API_BASE_URL=http://127.0.0.1:11434
- DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX:-32768}
- RUNNING_IN_DOCKER=true
extra_hosts:
- 'host.docker.internal:host-gateway'
command: pnpm run dockerstart
profiles:
- prebuilt
And now it seems to work
And I can confirm that unblocked the Dockerhost version as well
Via Kubernetes and Ingress
I’m going to try exposing this to see if works any better
$ gcloud dns --project=myanthosproject2 record-sets create boltdiy.steeped.space --zone="steepedspace" --type="A" --ttl="300" --rrdatas="75.73.224.240"
NAME TYPE TTL DATA
boltdiy.steeped.space. A 300 75.73.224.240
I can now make an ingress to connect to the Dockerhost for when I’m away from my home network
$ cat ingress.boltdiy.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: boltdiy-external-ip
subsets:
- addresses:
- ip: 192.168.1.100
ports:
- name: boltdiyint
port: 5173
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: boltdiy-external-ip
spec:
clusterIP: None
clusterIPs:
- None
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
- IPv6
ipFamilyPolicy: RequireDualStack
ports:
- name: boltdiy
port: 80
protocol: TCP
targetPort: 5173
sessionAffinity: None
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: gcpleprod2
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.org/websocket-services: boltdiy-external-ip
generation: 1
labels:
app.kubernetes.io/instance: boltdiyingress
name: boltdiyingress
spec:
rules:
- host: boltdiy.steeped.space
http:
paths:
- backend:
service:
name: boltdiy-external-ip
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- boltdiy.steeped.space
secretName: boltdiy-tls
I’ll create the ingress
$ kubectl apply -f ./ingress.boltdiy.yaml
endpoints/boltdiy-external-ip created
service/boltdiy-external-ip created
ingress.networking.k8s.io/boltdiyingress created
When the cert is satisified
$ kubectl get cert boltdiy-tls
NAME READY SECRET AGE
boltdiy-tls True boltdiy-tls 73s
I can now test https://boltdiy.steeped.space
I used Cursor to find a fix
Then applied and ran with Docker compose on my Dockerhost
builder@builder-T100:~/bolt.diy$ docker compose --profile development down
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
[+] Running 2/2
✔ Container boltdiy-app-dev-1 Removed 0.8s
✔ Network boltdiy_default Removed 0.3s
builder@builder-T100:~/bolt.diy$ docker compose --profile development up
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
WARN[0000] The "GROQ_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "HuggingFace_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPENAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "ANTHROPIC_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "OPEN_ROUTER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "XAI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "GOOGLE_GENERATIVE_AI_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "TOGETHER_API_BASE_URL" variable is not set. Defaulting to a blank string.
WARN[0000] The "AWS_BEDROCK_CONFIG" variable is not set. Defaulting to a blank string.
[+] Building 0.0s (0/0)
[+] Running 2/2
✔ Network boltdiy_default Created 0.3s
✔ Container boltdiy-app-dev-1 Created 20.0s
Attaching to boltdiy-app-dev-1
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | > bolt@0.0.6 dev /app
boltdiy-app-dev-1 | > node pre-start.cjs && remix vite:dev "--host" "0.0.0.0"
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | fatal: detected dubious ownership in repository at '/app'
boltdiy-app-dev-1 | To add an exception for this directory, call:
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | git config --global --add safe.directory /app
boltdiy-app-dev-1 |
boltdiy-app-dev-1 | ★═══════════════════════════════════════★
boltdiy-app-dev-1 | B O L T . D I Y
boltdiy-app-dev-1 | ⚡️ Welcome ⚡️
boltdiy-app-dev-1 | ★═══════════════════════════════════════★
I can now access bolt.diy without issue
I still need to hop to settings and enable Ollama
Usage
I’m going to swing big first.
I’ll describe the basics of an app:
Create a devotional webapp that with a login page that allows login or create account. We need to know name and email. Optionally they may add phone and an icon picture. Once the user is logged in lets them see a landing page with groups, schedules, plans. there should be a right-hand pane to show their next scheduled rotation. allow light and dark themes.
Using Groq it started, but then just stopped going further
Mistral hit my limit
I tried Firefox
But new errors. I’ve tried fixing the origins in the config
server: {
host: true,
allowedHosts: [
'localhost',
'boltdiy.steeped.space'
],
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'credentialless',
'Cross-Origin-Resource-Policy': 'cross-origin'
}
},
build
Gemini times out
However, I see errors in Gemini so it might be the calls
Nothing was working so I pivoted to running locally
I tried downloading and running
builder@LuiGi:/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j$ npm install
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm WARN deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
added 821 packages, and audited 822 packages in 7m
263 packages are looking for funding
run `npm fund` for details
12 vulnerabilities (6 low, 6 moderate)
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
npm notice
npm notice New major version of npm available! 10.5.0 -> 11.1.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.1.0
npm notice Run npm install -g npm@11.1.0 to update!
npm notice
builder@LuiGi:/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j$ npm start
> start
> remix-serve ./build/server/index.js
Error: ENOENT: no such file or directory, stat '/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j/build/server/index.js'
at Object.statSync (node:fs:1659:25)
at reimportServer (/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j/node_modules/@remix-run/serve/dist/cli.js:83:39)
at run (/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j/node_modules/@remix-run/serve/dist/cli.js:112:21)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
builder@LuiGi:/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j$
I opened it up in Cursor and saw I need to npm run build
first
builder@LuiGi:/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j$ npm run build
> build
> remix vite:build
warn Route discovery/manifest behavior is changing in React Router v7
┃ You can use the `v3_lazyRouteDiscovery` future flag to opt-in early.
┃ -> https://remix.run/docs/en/2.13.1/start/future-flags#v3_lazyRouteDiscovery
┗
warn Data fetching is changing to a single fetch in React Router v7
┃ You can use the `v3_singleFetch` future flag to opt-in early.
┃ -> https://remix.run/docs/en/2.13.1/start/future-flags#v3_singleFetch
┗
vite v5.4.14 building for production...
✓ 85 modules transformed.
build/client/.vite/manifest.json 1.12 kB │ gzip: 0.31 kB
build/client/assets/root-DxwBsIzs.css 6.79 kB │ gzip: 2.01 kB
build/client/assets/root-RND1-uet.js 1.73 kB │ gzip: 0.98 kB
build/client/assets/entry.client-D9x4GCfA.js 3.74 kB │ gzip: 1.42 kB
build/client/assets/_index-DnPs6FvX.js 5.05 kB │ gzip: 2.05 kB
build/client/assets/jsx-runtime-56DGgGmo.js 8.11 kB │ gzip: 3.05 kB
build/client/assets/components-BoXGomAp.js 246.87 kB │ gzip: 79.69 kB
✓ built in 11.51s
vite v5.4.14 building SSR bundle for production...
✓ 6 modules transformed.
build/server/.vite/manifest.json 0.22 kB
build/server/assets/server-build-DxwBsIzs.css 6.79 kB
build/server/index.js 12.86 kB
✓ built in 2.19s
Now I can run
builder@LuiGi:/mnt/c/Users/isaac/Downloads/devotional_webapp_with_auth_and_scheduling_dyr59j$ npm start
> start
> remix-serve ./build/server/index.js
[remix-serve] http://localhost:3000 (http://172.19.76.98:3000)
Seems to just be a blank remix template
Trying Bolt.new
I tried the same prompt on Bolt.new. Is what I’m asking for not making sense?
The preview page was blank.
Perhaps it needs to connect to Supabase?
I think it’s now creating a supabase project
That seemed to do it
Here we can see the app it created, supabase setup and fixing a bug:
I tried Bolt.diy locally again, this time with Mistral AI’s Codestral backend
i fed the error back into Bolt and asked it to fix
That looks like it’s actually working
Let me see if I can pivot to a local sqllite db
Local Laptop Bolt.diy issues
The problem I’m having isn’t actually docker. The issue is a lot of the work is pushed to the browser which brings the whole laptop to a crawl as it uses every bit of RAM when it’s working a solution
Running locally is okay, but the layout is funky and images are missing
I can create an account and login
Though in debugging I did see an image load
I want to Dockerize this. I’ll use Github Copilot to solve it
I will now try building
I changed it myself
$ cat Dockerfile
# Use an official Node.js runtime as a parent image
FROM node:21-alpine AS build
# Set the working directory in the container
WORKDIR /app
# Copy package.json and package-lock.json to the working directory
COPY package.json ./
# Install dependencies
RUN npm install
# Copy the rest of the application code to the working directory
COPY . .
# Build the application
RUN npm run build
EXPOSE 4173
# Start Nginx when the container launches
CMD ["npm", "run", "preview","--host"]
Then test and ran
builder@LuiGi:~/Workspaces/devWebApp$ docker build -t mytest1:0.1 .
[+] Building 44.0s (12/12) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 520B 0.0s
=> [internal] load metadata for docker.io/library/node:21-alpine 0.7s
=> [auth] library/node:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [1/6] FROM docker.io/library/node:21-alpine@sha256:78c45726ea205bbe2f23889470f03b46ac988d14b6d813d095e2e9909f586f93 8.1s
=> => resolve docker.io/library/node:21-alpine@sha256:78c45726ea205bbe2f23889470f03b46ac988d14b6d813d095e2e9909f586f93 0.0s
=> => sha256:78c45726ea205bbe2f23889470f03b46ac988d14b6d813d095e2e9909f586f93 1.43kB / 1.43kB 0.0s
=> => sha256:6908bbe242172d79727839290c3d893aa66607aec20e405823c8e56b0b27d8c4 1.16kB / 1.16kB 0.0s
=> => sha256:cad63adc9266f2381a0730aabdb7f8dc65ef32c446cdeb238dae9a54a1ea490f 7.23kB / 7.23kB 0.0s
=> => sha256:d25f557d7f31bf7acfac935859b5153da41d13c41f2b468d16f729a5b883634f 3.62MB / 3.62MB 1.9s
=> => sha256:9e36186fec5a5e04e517871f6901245a86def1db1f6864470f5669a7baf2582f 43.94MB / 43.94MB 5.9s
=> => sha256:14d453f422e7d10a7e49d97e6a77f66239fcc1503954b4a887b7ac16e66220a8 1.38MB / 1.38MB 1.0s
=> => sha256:24ff74239155098e7efecdea07095e1d467cb0c2bd55b3795b0a080716951fe7 450B / 450B 1.3s
=> => extracting sha256:d25f557d7f31bf7acfac935859b5153da41d13c41f2b468d16f729a5b883634f 0.2s
=> => extracting sha256:9e36186fec5a5e04e517871f6901245a86def1db1f6864470f5669a7baf2582f 1.6s
=> => extracting sha256:14d453f422e7d10a7e49d97e6a77f66239fcc1503954b4a887b7ac16e66220a8 0.0s
=> => extracting sha256:24ff74239155098e7efecdea07095e1d467cb0c2bd55b3795b0a080716951fe7 0.0s
=> [internal] load build context 2.6s
=> => transferring context: 135.21MB 2.5s
=> [2/6] WORKDIR /app 0.3s
=> [3/6] COPY package.json ./ 0.1s
=> [4/6] RUN npm install 26.0s
=> [5/6] COPY . . 1.5s
=> [6/6] RUN npm run build 5.4s
=> exporting to image 1.6s
=> => exporting layers 1.6s
=> => writing image sha256:af7ed179e6d1e2c9f496886b162be0f149a6e3654724c7bce9460233e2808cdc 0.0s
=> => naming to docker.io/library/mytest1:0.1 0.0s
builder@LuiGi:~/Workspaces/devWebApp$ docker run -p 4173:4173 mytest1:0.1
> vite-react-typescript-starter@0.0.0 preview
> vite preview --host
➜ Local: http://localhost:4173/
➜ Network: http://172.17.0.2:4173/
which we can see now running in docker
We can see that indeed logins worked and it saved credentials, but the UI is a bit wonky.
Python
I started to build an app just using copilot
and then Gemini to help improve the UI
While it stopped short of showing me a logo, it did fix the styling to look much much better
Though I’ll use Gemini with 2.0 Flash to kick out a functional logo
Like having two helpful assistants, I would often go back and forth between Gemini Code Assist and Copilot for help
I was pleased enough with this basic setup
I’ll create a private repo in Forgejo and push so that I can use as a basis for more apps.
My thoughts here are that if I have a base template, I can add some polish then re-use it for a variety of ideas.
I’ll use those instructions above to create a remote URL and push to the origin
builder@LuiGi:~/Workspaces/devAppNew$ git remote add origin https://forgejo.freshbrewed.science/builderadmin/flaskAppBase.git
builder@LuiGi:~/Workspaces/devAppNew$ git push -u origin main
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 16 threads
Compressing objects: 100% (23/23), done.
Writing objects: 100% (24/24), 36.26 KiB | 9.06 MiB/s, done.
Total 24 (delta 10), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To https://forgejo.freshbrewed.science/builderadmin/flaskAppBase.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
I’ll even make a tag in Forgejo now that it’s pushed
One more time
I came back and tried again. With the local Ollama I gave it 12 hours to reply and it just sat there
I tried the URL and an external endpoint, it too timed out
I went over to the Linux box that hosts Ollama and tried the docker compose up with the local settings there. Perhaps if I do everything local it will work.
You can see it picked up the local Ollama settings
But whether I was using local Ollama, Mistral or GroqCloud, it just timed out and didn’t return anything
Summary
We attempted to run Bolt.diy many different ways. The only successful path i found was actually to run locally with Docker compose and even then it brough my laptop to a crawl.
I tried a few engines but they all generated just fair results. I tweaked with other AI assistants before trying to just switch all-together to an AI generated app with Gemini Code Assist and Copilot. I really do find myself dancing between the two on a regular basis.
Lastly, I took that final basic Flask framework and pushed it into Forgejo to be a base template for the next round of the project.
I’m not sure if I’m just doing things wrong or what, but I didn’t find Bolt.diy to really do what I wanted. I plan to keep testing with the hopes I can tweak it through to success.
But for now, I’m going to wait for Bolt.diy to bake a bit longer or have better setup instructions.