selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

piclaw logo

Self-host piclaw

v3.3.4

Browser workspace for a Pi-based coding agent

ReleaseOpen SourceMIT
docker run -d --init --name piclaw --restart unless-stopped -p 127.0.0.1:8080:8080 -e PICLAW_WEB_PORT=8080 -v "$(pwd)/home:/config" -v "$(pwd)/workspace:/workspace" ghcr.io/rcarmo/piclaw:latest
Updated9 hours ago
LanguageTypescript
Setup difficultyEasy
MobilePWA
Stars
885
Port
8080 (Web UI (bind address defaults to 0.0.0.0; the README quick start publishes it on the Docker host loopback only))
Docker
ghcr.io/rcarmo/piclaw
iPad PWA showing the mobile-first chat with a GitHub digestAgent implementing a feature with validation and CIWorkspace file tree with disk-usage sunburstGruvbox-themed terminal with git log and workspace treeAgent session picker listing multiple named sessionsTheme picker with 16 built-in themes and live previewIn-app add-on catalogue browser and installerPortainer add-on settings with keychain integration

What is piclaw?

Should you self-host piclaw?

piclaw scores 53/100 on selfhost.directory (how scoring works) and ranks #26 of 120 in AI Assistant. It has 885 GitHub stars.

It shipped 27 stable releases in the past year. The latest, v3.3.4, came out on 15 October 2026. New versions land roughly every 1 days.

Setup is easy: most people get it running in one sitting. An official Docker image is available. It is MIT-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is hermes-agent (89/100, 257 885 stars). It scores higher overall, so compare the two before you pick. See piclaw vs hermes-agent side by side.

Features

  • Browser Automation
  • Built-in code editor
  • Document and media viewersOffice and draw.io rendering come from optional add-ons
  • Encrypted secrets keychainOptional; needs a master key
  • File-based agent memory
  • MCP server support
  • Model provider selection
  • Multi-language UI
  • Persistent Chat History
  • Scheduled Tasks
  • Skills and add-on system
  • Streaming agent chat
  • VNC remote display
  • Web TerminalDisabled by default on Windows
  • Workspace file browser

piclaw README

How to install piclaw

Install piclaw with Docker

You need Docker and credentials for a model provider, or a reachable local model server.
Environment variables
PICLAW_WEB_PORT, PUID, PGID, PICLAW_AUTOSTART, PICLAW_TRUST_PROXY, PICLAW_KEYCHAIN_KEY
mkdir -p ./home ./workspace

docker run -d \
  --init \
  --name piclaw \
  --restart unless-stopped \
  -p 127.0.0.1:8080:8080 \
  -e PICLAW_WEB_PORT=8080 \
  -v "$(pwd)/home:/config" \
  -v "$(pwd)/workspace:/workspace" \
  ghcr.io/rcarmo/piclaw:latest

Recommended deployment; includes Bun, PiClaw and bundled command-line tools. The image supports Linux AMD64 and ARM64.

How to configure piclaw

  • CPU_LIMITS2Container CPU limit in the compose deploy resources

    Container CPU limit in the compose deploy resources

  • MEMORY_LIMITS4GContainer memory limit in the compose deploy resources

    Container memory limit in the compose deploy resources

  • PGID1000Container group id remapped by /entrypoint.sh on startup (compose stack)

    Container group id remapped by /entrypoint.sh on startup (compose stack)

  • PICLAW_ABORT_SETTLE_TIMEOUT_MS1000Bounded `0..10000` ms wait for abort cleanup to settle.

    Bounded `0..10000` ms wait for abort cleanup to settle.

    values: `domains.agentControl.abortSettleTimeoutMs`

  • PICLAW_ADDON_API_FAILURE_BACKOFF_MS60000Suppression period for repeated identical add-on API failures.

    Suppression period for repeated identical add-on API failures.

    values: `domains.addons.apiFailureBackoffMs`

  • PICLAW_AGENT_TIMEOUT3600000Max foreground agent turn time (ms), including interactive web chats

    Max foreground agent turn time (ms), including interactive web chats

  • PICLAW_ASSISTANT_AVATAR_(empty)_Avatar URL for the web UI

    Avatar URL for the web UI

  • PICLAW_ASSISTANT_NAMEPiClawDisplay name in the web UI

    Display name in the web UI

  • PICLAW_AUTOSTART1Set to `0` to keep the supervisor service idle (run `pi`/`piclaw` manually)

    Set to `0` to keep the supervisor service idle (run `pi`/`piclaw` manually)

  • PICLAW_BACKGROUND_AGENT_TIMEOUT0Max background invocation time (ms; `0` disables and falls back to `PICLAW_AGENT_TIMEOUT`)

    Max background invocation time (ms; `0` disables and falls back to `PICLAW_AGENT_TIMEOUT`)

  • PICLAW_BIN_DIRDirectory the portable installer puts launchers in

    Directory the portable installer puts launchers in

  • PICLAW_CHAT_JIDweb:defaultPer-invocation IPC target fallback. Request payload fields take precedence; this value is intentionally not persisted.

    Per-invocation IPC target fallback. Request payload fields take precedence; this value is intentionally not persisted.

  • PICLAW_DATA/workspace/.piclaw/dataSessions, IPC, chats.json

    Sessions, IPC, chats.json

  • PICLAW_DB_IN_MEMORY0Test/database bootstrap switch (`1` or `true`). Retained env-only because it selects the database before persisted config can safely be read.

    Test/database bootstrap switch (`1` or `true`). Retained env-only because it selects the database before persisted config can safely be read.

  • PICLAW_DREAM_AGENT_TIMEOUT_MSbackground-agent timeout, or 360000Positive timeout for the out-of-band Dream model turn.

    Positive timeout for the out-of-band Dream model turn.

    values: `domains.dream.agentTimeoutMs`

  • PICLAW_DREAM_BACKUP_KEEP10Number of pre-Dream note backups to retain.

    Number of pre-Dream note backups to retain.

    values: `domains.dream.backupKeep`

  • PICLAW_DREAM_CRON0 1 * * *Cron schedule for AutoDream. Evaluated in the runtime timezone (`TZ` / runtime timing config), so the default is 01:00 local runtime time.

    Cron schedule for AutoDream. Evaluated in the runtime timezone (`TZ` / runtime timing config), so the default is 01:00 local runtime time.

    values: `domains.dream.cron`

  • PICLAW_DREAM_CUE_FULL_SLICE_MAX_MESSAGES50`DREAM_CUES` full-slice cutoff for day message count

    `DREAM_CUES` full-slice cutoff for day message count

  • PICLAW_DREAM_CUE_FULL_SLICE_MAX_SESSION_TREES2`DREAM_CUES` full-slice cutoff for session-tree count

    `DREAM_CUES` full-slice cutoff for session-tree count

  • PICLAW_DREAM_CUE_MAX_SNIPPETS100Global `DREAM_CUES` snippet budget before large trees downgrade from `5+5` to `2+2`

    Global `DREAM_CUES` snippet budget before large trees downgrade from `5+5` to `2+2`

  • PICLAW_DREAM_CUE_SMALL_TREE_MAX_MESSAGES10Per-session-tree cue cutoff under which all messages from that tree are included

    Per-session-tree cue cutoff under which all messages from that tree are included

  • PICLAW_DREAM_MODEL_(unset — inherits session model)_Pin Dream / AutoDream to a specific model label (e.g. `anthropic/claude-sonnet-4-20250514`). The Dream pass applies it to the temporary Dream chat, so it also covers manual `/dream` runs.

    Pin Dream / AutoDream to a specific model label (e.g. `anthropic/claude-sonnet-4-20250514`). The Dream pass applies it to the temporary Dream chat, so it also covers manual `/dream` runs.

    values: `domains.dream.model`

  • PICLAW_GITHUB_COPILOT_DYNAMIC_MODELS1Set to `0`, `false`, or `no` to disable live Copilot model discovery

    Set to `0`, `false`, or `no` to disable live Copilot model discovery

  • PICLAW_GITHUB_COPILOT_MODELS_TIMEOUT_MS3500Timeout for the Copilot `/models` request; values below 500 ms are clamped to 500 ms

    Timeout for the Copilot `/models` request; values below 500 ms are clamped to 500 ms

  • PICLAW_KEYCHAIN_KEY_(empty)_Master key for encrypting/decrypting keychain entries

    Master key for encrypting/decrypting keychain entries

  • PICLAW_KEYCHAIN_KEY_FILE_(empty)_Read master key from a file (trimmed)

    Read master key from a file (trimmed)

  • PICLAW_MAIN_SESSION_IDLE_TTL_MS180000 (3 min)Idle TTL for the main interactive session; `PICLAW_SESSION_IDLE_TTL_MS` overrides the fallback when set

    Idle TTL for the main interactive session; `PICLAW_SESSION_IDLE_TTL_MS` overrides the fallback when set

  • PICLAW_MAIN_SESSION_POOL_MAX_SIZE1Max number of warm main chat sessions kept cached under normal conditions

    Max number of warm main chat sessions kept cached under normal conditions

  • PICLAW_MAIN_SESSION_PRESSURE_IDLE_TTL_MS60000Main-session idle TTL while memory pressure mode is active

    Main-session idle TTL while memory pressure mode is active

  • PICLAW_MAIN_SESSION_PRESSURE_POOL_MAX_SIZE1Max cached main sessions while memory pressure mode is active

    Max cached main sessions while memory pressure mode is active

  • PICLAW_MAIN_SESSION_PRESSURE_RSS_BYTES402653184 (384 MB)RSS threshold that enables memory-pressure session eviction mode

    RSS threshold that enables memory-pressure session eviction mode

  • PICLAW_RECORDINGS_DIR<PICLAW_DATA>/session-recordingsRoot directory for opt-in session trace recordings.

    Root directory for opt-in session trace recordings.

    values: `domains.sessionRecordings.directory`

  • PICLAW_SEARCH_MATCH_MODEorCompatibility alias for `domains.tools.searchMatchMode`; choose `or` (any keyword) or `and` (all keywords) for multi-word FTS queries.

    Compatibility alias for `domains.tools.searchMatchMode`; choose `or` (any keyword) or `and` (all keywords) for multi-word FTS queries.

  • PICLAW_SESSION_AUTO_ROTATE1Automatically rotate oversized session files before the next prompt

    Automatically rotate oversized session files before the next prompt

  • PICLAW_SESSION_IDLE_COMPACTION_MAX_WAIT_MS300000Max ms to wait for idle when a compaction is in progress

    Max ms to wait for idle when a compaction is in progress

  • PICLAW_SESSION_IDLE_MAX_WAIT_MS10000Max ms to wait for session idle before sending a turn response

    Max ms to wait for session idle before sending a turn response

  • PICLAW_SESSION_IDLE_TTL_MS_(empty)_Shared idle TTL override for main and side sessions when their specific variables are unset

    Shared idle TTL override for main and side sessions when their specific variables are unset

  • PICLAW_SESSION_MAX_SIZE_MB32Session file size threshold (MB) for auto-rotation warnings and pre-prompt rotation

    Session file size threshold (MB) for auto-rotation warnings and pre-prompt rotation

  • PICLAW_SIDE_SESSION_IDLE_TTL_MS60000 (1 min)Idle TTL for side/background sessions; `PICLAW_SESSION_IDLE_TTL_MS` overrides the fallback when set

    Idle TTL for side/background sessions; `PICLAW_SESSION_IDLE_TTL_MS` overrides the fallback when set

  • PICLAW_SKEL_DIRpackaged skel/ directoryDeployment/package bootstrap override for the workspace skeleton source. Retained env-only because it is needed before ordinary domain config is available.

    Deployment/package bootstrap override for the workspace skeleton source. Retained env-only because it is needed before ordinary domain config is available.

  • PICLAW_SKIP_BIN_LINKSet to 1 to disable launcher installation by the portable installer

    Set to 1 to disable launcher installation by the portable installer

    values: 1

  • PICLAW_SMART_COMPACTION_METHODselectiveSmart-compaction local processing method: `selective` or `pipelined`

    Smart-compaction local processing method: `selective` or `pipelined`

  • PICLAW_SSH_PORT22SSH port for startup/default remote sessions

    SSH port for startup/default remote sessions

  • PICLAW_SSH_TARGET_(empty)_SSH target as `user@host` or `user@host:/remote/path`

    SSH target as `user@host` or `user@host:/remote/path`

  • PICLAW_STORE/workspace/.piclaw/storeSQLite database location

    SQLite database location

  • PICLAW_TOOL_OUTPUT_CLEANUP_INTERVAL_MS900000 (15 min)Cleanup interval (ms)

    Cleanup interval (ms)

  • PICLAW_TOOL_OUTPUT_PREVIEW_LINE_CHARS200Max characters per preview line in compacted tool-result summaries

    Max characters per preview line in compacted tool-result summaries

  • PICLAW_TOOL_OUTPUT_PREVIEW_LINES8Preview lines shown in compacted tool-result summaries

    Preview lines shown in compacted tool-result summaries

  • PICLAW_TOOL_OUTPUT_RETENTION_DAYS_(legacy)_Days to retain stored tool outputs (deprecated; use `_MS`)

    Days to retain stored tool outputs (deprecated; use `_MS`)

  • PICLAW_TOOL_OUTPUT_RETENTION_MS2592000000 (30 days)Milliseconds to retain stored tool outputs (preferred; overrides `_DAYS`; values are capped at 30 days)

    Milliseconds to retain stored tool outputs (preferred; overrides `_DAYS`; values are capped at 30 days)

  • PICLAW_TOOL_OUTPUT_STORE_BYTES4096Store tool output externally when payload exceeds this byte threshold

    Store tool output externally when payload exceeds this byte threshold

  • PICLAW_TOOL_OUTPUT_STORE_LINES40Store tool output externally when payload exceeds this line threshold

    Store tool output externally when payload exceeds this line threshold

  • PICLAW_TOOL_OUTPUT_STORE_THRESHOLDS_BY_TOOL_(empty)_Optional JSON map of per-tool byte/line thresholds, e.g. `{"proxmox":{"bytes":16384,"lines":200}}`

    Optional JSON map of per-tool byte/line thresholds, e.g. `{"proxmox":{"bytes":16384,"lines":200}}`

  • PICLAW_TOOL_RESULT_COMPACTION_ENABLED1Master runtime gate for tool-result compaction

    Master runtime gate for tool-result compaction

  • PICLAW_TOOL_RESULT_COMPACTION_TOOLSbash,powershell,exec_batchComma-separated or JSON-array allowlist of tools eligible for compaction

    Comma-separated or JSON-array allowlist of tools eligible for compaction

  • PICLAW_TOOL_RESULT_SEMANTIC_SUMMARY_ENABLED1Enable semantic summary generation for compacted tool results

    Enable semantic summary generation for compacted tool results

  • PICLAW_TOOL_RESULT_SEMANTIC_SUMMARY_MAX_INPUT_CHARS12000Max sampled tool-output characters sent to semantic summarizer

    Max sampled tool-output characters sent to semantic summarizer

  • PICLAW_TOOL_RESULT_SEMANTIC_SUMMARY_MAX_TOKENS320Max generated semantic summary tokens

    Max generated semantic summary tokens

  • PICLAW_TOOL_RESULT_SEMANTIC_SUMMARY_TIMEOUT_MS12000Timeout for semantic summary generation before preview fallback

    Timeout for semantic summary generation before preview fallback

  • PICLAW_TRUST_PROXY0Trust `Forwarded` / `X-Forwarded-*` headers from a reverse proxy for origin, host, proto, and client IP handling

    Trust `Forwarded` / `X-Forwarded-*` headers from a reverse proxy for origin, host, proto, and client IP handling

  • PICLAW_TURN_MAX_TOOL_EXECUTIONS64Authoritative per-turn completed tool-execution budget. Settings persists `domains.agent.toolUseMessageBudget`; values are clamped to `8..512`. Legacy `PICLAW_TURN_MAX_TOOL_USE_MESSAGES` and `PICLAW_MID_TURN_TOOL_EXECUTION_HARD_CEILING` are lower-priority compatibility aliases.

    Authoritative per-turn completed tool-execution budget. Settings persists `domains.agent.toolUseMessageBudget`; values are clamped to `8..512`. Legacy `PICLAW_TURN_MAX_TOOL_USE_MESSAGES` and `PICLAW_MID_TURN_TOOL_EXECUTION_HARD_CEILING` are lower-priority compatibility aliases.

  • PICLAW_USER_AVATAR_(empty)_Avatar URL for the human user

    Avatar URL for the human user

  • PICLAW_USER_AVATAR_BACKGROUND_(empty)_CSS background colour for the user avatar circle

    CSS background colour for the user avatar circle

  • PICLAW_USER_NAME_(empty)_Display name for the human user in the web UI

    Display name for the human user in the web UI

  • PICLAW_WEB_BIND_HOST127.0.0.1Host interface the compose port mapping is published on

    Host interface the compose port mapping is published on

  • PICLAW_WEB_HOST0.0.0.0Bind address

    Bind address

  • PICLAW_WEB_IDLE_TIMEOUT0 (disabled)Drop idle clients after this many seconds

    Drop idle clients after this many seconds

  • PICLAW_WEB_INTERNAL_SECRET_(empty)_Shared secret for unattended POST/PATCH calls to `/internal/post`; required when TOTP is enabled and you want automations to keep posting.

    Shared secret for unattended POST/PATCH calls to `/internal/post`; required when TOTP is enabled and you want automations to keep posting.

  • PICLAW_WEB_MAX_CONTENT_CHARS262144Compatibility alias for `domains.web.contentMaxChars`; max message size in characters, with oversized messages truncated with metadata.

    Compatibility alias for `domains.web.contentMaxChars`; max message size in characters, with oversized messages truncated with metadata.

  • PICLAW_WEB_NOTIFICATION_DEBUG_LABELS0Append `[Local]` / `[Web Push]` markers to notification titles for delivery debugging

    Append `[Local]` / `[Web Push]` markers to notification titles for delivery debugging

  • PICLAW_WEB_PASSKEY_MODEtotp-fallbackPasskey mode: `totp-fallback`, `passkey-only`, or `totp-only`.

    Passkey mode: `totp-fallback`, `passkey-only`, or `totp-only`.

  • PICLAW_WEB_PERSIST_THINKING0Persist agent reasoning traces into the database so they survive page reloads. See thinking-persistence.md for privacy implications.

    Persist agent reasoning traces into the database so they survive page reloads. See thinking-persistence.md for privacy implications.

  • PICLAW_WEB_PERSIST_THINKING_MAX_CHARS100000Per-turn cap on persisted thinking text (UTF-16 surrogate-safe).

    Per-turn cap on persisted thinking text (UTF-16 surrogate-safe).

  • PICLAW_WEB_PORT8080Web UI port

    Web UI port

  • PICLAW_WEB_PREVIEW_CHARS16000Compatibility alias for `domains.web.contentPreviewChars`; preview threshold, capped at the hard content limit.

    Compatibility alias for `domains.web.contentPreviewChars`; preview threshold, capped at the hard content limit.

  • PICLAW_WEB_SESSION_TTL604800 (7 days)Session cookie lifetime in seconds.

    Session cookie lifetime in seconds.

  • PICLAW_WEB_TERMINAL_ENABLED1 on Linux/macOS, 0 on WindowsEnable or disable the authenticated web terminal backend/pane

    Enable or disable the authenticated web terminal backend/pane

  • PICLAW_WEB_TLS_CERT_(empty)_Path to TLS certificate; enables HTTPS

    Path to TLS certificate; enables HTTPS

  • PICLAW_WEB_TLS_KEY_(empty)_Path to TLS private key; enables HTTPS

    Path to TLS private key; enables HTTPS

  • PICLAW_WEB_TOTP_SECRET_(empty)_Base32 TOTP secret. When set, `/login` requires a 6-digit code before issuing a `piclaw_session` cookie. Prefer keychain/service-environment storage; plaintext JSON remains a legacy compatibility path for the existing `/totp` flow.

    Base32 TOTP secret. When set, `/login` requires a 6-digit code before issuing a `piclaw_session` cookie. Prefer keychain/service-environment storage; plaintext JSON remains a legacy compatibility path for the existing `/totp` flow.

  • PICLAW_WEB_TOTP_WINDOW1TOTP step skew (number of 30s windows to accept on either side).

    TOTP step skew (number of 30s windows to accept on either side).

  • PICLAW_WEB_VNC_ALLOW_DIRECT1 on Linux/macOS/WindowsAllow or disable direct VNC targets supplied at runtime (`PICLAW_VNC_ALLOW_DIRECT` alias)

    Allow or disable direct VNC targets supplied at runtime (`PICLAW_VNC_ALLOW_DIRECT` alias)

  • PICLAW_WEB_VNC_TARGETS_(empty)_JSON allowlist for VNC targets (or use `PICLAW_VNC_TARGETS`). Supports array or object form.

    JSON allowlist for VNC targets (or use `PICLAW_VNC_TARGETS`). Supports array or object form.

  • PICLAW_WHATSAPP_PHONE_(empty)_Alias for `WHATSAPP_PHONE`

    Alias for `WHATSAPP_PHONE`

  • PICLAW_WORKSPACE/workspaceWorking directory for `pi` + `piclaw`

    Working directory for `pi` + `piclaw`

  • PUID1000Container user id remapped by /entrypoint.sh on startup (compose stack)

    Container user id remapped by /entrypoint.sh on startup (compose stack)

  • PUSHOVER_APP_TOKENPushover app token for push notifications for scheduled tasks and IPC messages

    Pushover app token for push notifications for scheduled tasks and IPC messages

  • PUSHOVER_DEVICEOptional Pushover device name

    Optional Pushover device name

  • PUSHOVER_PRIORITYOptional Pushover message priority

    Optional Pushover message priority

  • PUSHOVER_SOUNDOptional Pushover notification sound

    Optional Pushover notification sound

  • PUSHOVER_USER_KEYPushover user key for push notifications

    Pushover user key for push notifications

  • SUPERVISOR_CONF/workspace/.piclaw/supervisor/supervisord.confSupervisor config path (falls back to `/etc/supervisor/supervisord.conf`)

    Supervisor config path (falls back to `/etc/supervisor/supervisord.conf`)

  • WORKSPACE_PATH./workspacePath bind-mounted as the workspace by docker-compose.yml instead of ./workspace

    Path bind-mounted as the workspace by docker-compose.yml instead of ./workspace

piclaw releases & version history

More in Chat

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…