Planck v0.1.4
Release notes — v0.1.3 / v0.1.4
v0.1.3 shipped the features below to Hex.pm. v0.1.4 is a same-day follow-up
that fixes the release CI; all user-facing changes are from v0.1.3.
planck_docker — initial release
A Docker Compose stack that runs Planck with a local LLM, web search, workspace
indexing, and document extraction. Designed to be self-hosted by a technical user.
llama.cpp (CPU)
- CPU-only image built from
PrismML-Eng/llama.cpp(pinned commit). Runs
Bonsai-8B-Q1_0 (1.16 GB) conversationally on modern CPUs — no GPU required. - Configurable via env vars:
LLAMA_THREADS(default 8),LLAMA_CTX_SIZE
(default 32768),LLAMA_PORT(default 11434).
Bundled sidecar
Four tools pre-installed in the Planck image and copied to the workspace on
first run:
read— shadows the built-inreadtool. Text and code files are read
directly; binary formats (PDF, DOCX, XLSX, ODS, PPTX, …) are extracted via
Apache Tika. Results cached with mtime invalidation.search_workspace— full-text search over indexed workspace files via
Typesense.search_web— privacy-respecting web search via a local Searxng instance.web_fetch— fetches a URL, extracts clean markdown via
@mozilla/readability+ turndown. Results cached with offset/limit pagination.
Install
Linux / macOS
curl -fsSL https://thebroken.link/planck/install_docker.sh | shWindows
irm https://thebroken.link/planck/install_docker.ps1 | iexplanck_agent
Generic JSON schema validation
Tool.validate_args/2 now validates every tool invocation against its declared
JSON Schema before execute_fn is called. Covers required fields, types, enums,
and any other constraint in the schema — no per-tool boilerplate needed. Errors
name the offending field and, for enums, list the valid values.
Wired centrally in resolve_tool_fn, so all tools — built-in, inter-agent, and
sidecar — are covered automatically. Depends on ex_json_schema ~> 0.11.
spawn_agent provider enum
The provider parameter now declares an explicit enum:
["anthropic", "openai", "google", "ollama", "llama_cpp"]. Invalid provider
names are caught by schema validation with a clear error before the tool runs.
planck_headless
ResourceStore — sidecar tools preserved across reloads
ResourceStore.reload/0 now preserves sidecar tools alongside registered tools
and on_reload callbacks. Previously, any config file change that triggered a
reload silently wiped the sidecar tool list until restart.
SidecarManager — RELEASE_* env isolation
Sidecar processes no longer inherit OTP release environment variables. The
release start script was adding entries to PATH that caused child elixir
invocations to resolve to the release wrapper script, which hard-codes
-boot ${RELEASE_BOOT_SCRIPT} and fails. The env is now stripped before
spawning sidecar processes.
SidecarManager — mix setup fallback
SidecarManager now calls mix setup before mix compile if the sidecar
declares a setup alias, falling back to mix deps.get otherwise. Enables
sidecars that need extra setup steps (e.g. npm install) to declare them in
mix.exs without changes to planck_headless.
Watcher — graceful degradation without inotify
Watcher.init/1 now handles :ignore from FileSystem.start_link/1 (returned
when inotify-tools is absent on Linux) instead of crashing. The watcher starts
in no-op mode and logs a warning.
PathList Windows fix
PathList.cast/1 now splits on ~r/;|:(?![\/\\])/ instead of ":", preserving
Windows drive-letter colons (C:\...) while still splitting Unix paths. Semicolons
are accepted as an alternative separator on all platforms.
planck_cli
Session-switch UI fixes
- Streaming preserved across switches — switching to an active session now
correctly shows the streaming state and orchestrator indicator. - Overlay reset on switch — the agent context overlay is closed when switching
sessions, preventing stale content from a previous session leaking into the new one. - Errored tools show correct state after reload — tool entries that errored now
render with the error indicator after a page refresh or session switch. - Input section shown for errored tools with empty args — the error context is
always visible even when a tool call has no arguments.
Sidecar tools auto-sync for dynamic sessions
When the sidecar connects, SessionLive now calls Planck.Agent.add_tool/2 for
each sidecar tool on the active dynamic session's orchestrator. On disconnect,
tools are removed symmetrically. Also syncs immediately when a session loads if
the sidecar is already connected.
LLM stream timeout — production
config/runtime.exs now sets receive_timeout: :timer.hours(1) in prod. The
previous 30-second default caused spurious timeouts with local CPU inference
(e.g. llama.cpp), which can take tens of seconds before emitting the first token.
Windows Docker install script
docs/install_docker.ps1 — PowerShell equivalent of install_docker.sh. Creates
~/planck/, writes .env with a crypto-random SEARXNG_SECRET, downloads the
Bonsai model via WebClient (streams to disk), fetches compose.yml, pulls images,
and starts the stack. Accepts -Bind <addr> (default 127.0.0.1).
Binary targets (v0.1.4)
| Platform | Binary | Notes |
|---|---|---|
| Linux x86_64 | planck_linux |
|
| macOS arm64 | planck_macos_arm |
|
| Windows x86_64 | planck_windows.exe |
|
| Linux arm64 | — | Dropped: Burrito 1.5.0 requires Zig 0.15.2, which generates an LLVM-incompatible musl triple on aarch64 |
| macOS x86_64 | — | Dropped: macos-13 runner deprecated with no available capacity |