Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down
### Launcher Mode (Web Console)

The `launcher` image includes all three binaries (`picoclaw`, `picoclaw-launcher`, `picoclaw-launcher-tui`) and starts the web console by default, which provides a browser-based UI for configuration and chat.
It also ships with a Node.js runtime so npm-based MCP servers and scripts can run inside the launcher container without rebuilding the image.

```bash
docker compose -f docker/docker-compose.yml --profile launcher up -d
Expand Down
2 changes: 1 addition & 1 deletion docker/Dockerfile.goreleaser.launcher
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM alpine:3.21
FROM node:24-alpine3.23

ARG TARGETPLATFORM

Expand Down
25 changes: 25 additions & 0 deletions docker/launcher_dockerfile_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package docker

import (
"os"
"strings"
"testing"
)

func TestLauncherDockerfileIncludesNodeRuntime(t *testing.T) {
data, err := os.ReadFile("Dockerfile.goreleaser.launcher")
if err != nil {
t.Fatalf("read Dockerfile.goreleaser.launcher: %v", err)
}

content := string(data)
if !strings.Contains(content, "FROM node:") {
t.Fatalf("launcher Dockerfile should use a Node.js runtime base image, got:\n%s", content)
}
if !strings.Contains(content, "COPY $TARGETPLATFORM/picoclaw-launcher /usr/local/bin/picoclaw-launcher") {
t.Fatal("launcher Dockerfile should still copy the launcher binary")
}
if !strings.Contains(content, "ENTRYPOINT [\"picoclaw-launcher\"]") {
t.Fatal("launcher Dockerfile should keep picoclaw-launcher as the entrypoint")
}
}