Skip to content

Planck v0.1.4

Choose a tag to compare

@github-actions github-actions released this 19 May 11:10
· 87 commits to main since this release
46d930e

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-in read tool. 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 | sh

Windows

irm https://thebroken.link/planck/install_docker.ps1 | iex

planck_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.

SidecarManagerRELEASE_* 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.

SidecarManagermix 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