Build, run, and package AI workers with a desktop workspace and portable runtime.
Website · Docs · Sign in · Getting Started
Holaboss enables you to build AI workers that go beyond one-off task execution—they operate continuously, taking initiative to drive real business outcomes. You can easily manage and coordinate multiple AI workers, each with its own dedicated workspace tailored to specific roles and responsibilities. These work environments are fully portable, meaning the AI workers you train—along with their context, tools, and skills—can be packaged and shared with others, unlocking true scalability and collaboration.
- Marketplace Experience
- Desktop Workspace
- Getting Started
- Architecture Overview
- AI Labour Market
- Capability Hub
- Hosted Features
- Technical Details
- Model Configuration
- Independent Runtime Deploy
- OSS Release Notes
- macOS DMG Bundling
- Node.js 22+
- npm
If you use Codex, Claude Code, Cursor, Windsurf, or another coding agent, you can hand it the setup instructions in one sentence:
Clone the Holaboss repo from https://github.com/holaboss-ai/holaboss-ai.git if needed, or use the current checkout if it is already open, then follow INSTALL.md exactly to bootstrap local desktop development. If the environment cannot open Electron, stop after verification and tell me the next manual step.
That prompt is meant for coding agents. It stays self-contained by naming the repo and clone URL, while leaving the actual installation details in the repo-local INSTALL.md runbook.
This is the baseline installation flow for local desktop development.
Install the desktop dependencies:
npm run desktop:installCopy the desktop env template and fill in the required values:
cp desktop/.env.example desktop/.envIf you want to verify the desktop code before launching the app, run:
npm run desktop:typecheckRun the desktop app in development:
npm run desktop:devnpm run desktop:dev already runs the desktop predev hook for you. That hook validates the dev environment, rebuilds native modules, and ensures a staged runtime bundle exists under desktop/out/runtime-<platform>. If the bundle is missing or older than your local runtime sources, it automatically runs npm run desktop:prepare-runtime:local.
If you want to stage the local runtime bundle from this repo explicitly ahead of time, you can still run:
npm run desktop:prepare-runtime:localIf you want to stage the latest released runtime bundle for your current host platform instead of rebuilding from local runtime sources:
npm run desktop:prepare-runtimedesktop:prepare-runtime pulls the latest published runtime bundle for the current platform from GitHub Releases and stages it into desktop/out/runtime-<platform>. desktop:prepare-runtime:local builds the runtime from your local source checkout and then stages that local bundle into the same location.
Holaboss is split into three cooperating layers:
desktop/provides the operator UI, workspace management, and the local packaged-runtime experienceruntime/owns agent execution, queueing, harness integration, apps, MCP orchestration, runtime APIs, and durable state- the sandbox root stores the live workspace tree, runtime state, request artifacts, and memory bodies used by the runtime
Those layers are intentionally separated by authority:
- human-authored workspace policy lives in files like
AGENTS.md,workspace.yaml, skills, and app manifests - runtime-owned execution truth lives in
state/runtime.dbplus streamed output events - runtime-owned operator profile data lives in
state/runtime.db - durable memory bodies live under
memory/, while their governance and recall metadata live instate/runtime.db
Two runtime control surfaces also stay explicit rather than being flattened away:
- capability evaluation is a pipeline from static registry, to model-visible projection, to permission, to execution readiness; the current runtime only exposes callable tools today, but the typed registry already reserves future non-tool surfaces such as MCP resources, MCP prompt or command surfaces, and trust-sensitive plugin or local capabilities
- prompt assembly is section-based and channel-aware; the runtime keeps explicit section ids, precedence bands, volatility, and channel metadata, then renders compatibility outputs back to
system_promptand orderedcontext_messagesfor the active harness
At a high level, one run follows this path:
- the desktop or API queues work for a workspace session
- the runtime resolves the workspace plan, capability surface, prompt sections, and request snapshot
- prompt sections keep base runtime doctrine, session policy, capability policy, workspace policy, and runtime continuity context distinct even when the harness ultimately receives only
system_promptpluscontext_messages
- prompt sections keep base runtime doctrine, session policy, capability policy, workspace policy, and runtime continuity context distinct even when the harness ultimately receives only
- the selected harness executes the run and streams output events
- the runtime persists normalized turn artifacts, updates compaction continuity, writes session/runtime memory projections, and performs durable memory writeback
- future runs restore continuity from durable runtime artifacts first (including the session-memory projection), then add a small recalled durable-memory context selected from markdown memory manifests
The runtime keeps four different kinds of state on purpose:
- raw streamed events for replay and live UI updates
- normalized turn artifacts for querying, debugging, and continuity
- runtime-owned operator profile state for canonical user identity
- markdown memory projections for human-readable runtime state and durable recalled knowledge
The most important runtime continuity artifacts are:
turn_results- one normalized record per run with status, stop reason, token usage, prompt-section ids, request fingerprint, capability fingerprint, and assistant output
- compaction boundaries
- durable handoff artifacts that summarize a run boundary, record recent runtime context, preserve selected turn ids, and define explicit restoration ordering
- session-memory projections
- per-session markdown continuity snapshots under
memory/workspace/<workspace-id>/runtime/session-memory/used for fast resume context in later runs
- per-session markdown continuity snapshots under
- request snapshots
- sanitized exact request-state artifacts used for replay, debugging, and future cache diagnostics
- runtime user profile
- canonical operator identity fields such as the persisted display name used by the runtime and agent prompt context
This split avoids overloading transcript history with too many jobs. Raw history is still the replay truth, but resume, compaction, and memory promotion work from durable higher-level artifacts rather than repeatedly scraping prior messages.
Holaboss workspaces live under the runtime sandbox root. In the desktop app, that root is the local sandbox-host data directory; in standalone runtime deploys it defaults to /holaboss.
<sandbox-root>/
state/
runtime-config.json
runtime.db
workspace/
.holaboss/
workspace-mcp-sidecar-state.json
<server>.workspace-mcp-sidecar.stdout.log
<server>.workspace-mcp-sidecar.stderr.log
<workspace-id>/
.git/
AGENTS.md
workspace.yaml
ONBOARD.md
skills/
<skill-id>/
SKILL.md
apps/
<app-id>/
app.runtime.yaml
.holaboss/
workspace_id
harness-session-state.json
input-attachments/<batch-id>/*
pi-agent/auth.json
pi-agent/models.json
pi-sessions/...
...
memory/
MEMORY.md
workspace/
<workspace-id>/
MEMORY.md
runtime/
latest-turn.md
session-state/
session-memory/
recent-turns/
blockers/
permission-blockers/
knowledge/
facts/
procedures/
blockers/
references/
preference/
MEMORY.md
*.md
workspace.yamlis the root runtime plan for the workspace. It defines the single active agent, skill enablement/order, MCP registry, and any installed workspace apps.AGENTS.mdis the root prompt file. Workspace instructions are expected there rather than inline inworkspace.yaml.- each new workspace is initialized as a local git repository after its scaffold or template is materialized. That repository is intended for agent-owned local version control checkpoints rather than remote sync.
skills/is the fixed workspace-local skill directory. Workspace skills are always discovered from<workspace-root>/skills, and each skill directory must containSKILL.md.apps/contains workspace-local apps. Each installed app lives underapps/<app-id>/and must provideapp.runtime.yaml.<workspace-id>/.holaboss/stores runtime-managed workspace state such as the identity marker, persisted harness session mapping, staged input attachments, and Pi harness state.workspace/.holaboss/is separate from the per-workspace.holaboss/directory. It stores shared workspace-root state for MCP sidecars and their logs.state/runtime.dbis the durable runtime registry for workspaces, sessions, bindings, queue state, turn results, compaction boundaries, request snapshots, and durable memory catalog metadata. Theworkspace_idfile exists mainly as an on-disk identity marker for workspace discovery and migration.memory/is sandbox-global, not inside a single workspace directory. It stores workspace-scoped and user-scoped markdown memory files used by the runtime memory service.
The memory system is intentionally split by purpose and by authority. Human-authored workspace instructions stay in AGENTS.md, runtime-owned continuity stays in state/runtime.db, and durable memory bodies stay in markdown under memory/.
Holaboss currently has four memory layers:
- session continuity lives in runtime-owned artifacts such as
turn_resultsand compaction boundaries instate/runtime.db - session-memory continuity projections live under
memory/workspace/<workspace-id>/runtime/session-memory/ - operational projections live under
memory/workspace/<workspace-id>/runtime/ - durable recalled memory lives under
memory/workspace/<workspace-id>/knowledge/andmemory/preference/
Alongside those layers, the runtime also keeps a canonical operator profile in state/runtime.db. That profile is not treated as markdown memory. It is runtime-owned identity state used first for things like the current user's name, with auth-provided identity only acting as a non-destructive fallback when the local profile is empty.
The runtime also keeps pending user-memory proposals in state/runtime.db. These are input-scoped candidates such as inferred user preferences. They can shape the current run ephemerally, but they are not promoted into durable memory or into the canonical runtime profile until the user explicitly accepts them.
That means short-horizon execution state, canonical operator identity, and long-lived recalled memory are not mixed together.
Compaction boundaries are the durable handoff point for session continuity. Each boundary stores a compact summary, recent runtime context, preserved turn ids, and explicit restoration ordering so later runs can rebuild continuity from durable artifacts before falling back to broader transcript history.
runtime/ memory files are volatile operational snapshots. They describe the latest turn, recent turns, active blockers, and permission blockers. They are useful for inspection and debugging, but they are not treated as durable knowledge.
knowledge/ and preference/ are the durable memory surfaces. These files are indexed by MEMORY.md files:
memory/MEMORY.mdis the root durable-memory indexmemory/workspace/<workspace-id>/MEMORY.mdindexes durable workspace knowledgememory/preference/MEMORY.mdindexes durable user preference memory
Runtime files are intentionally excluded from the MEMORY.md indexes. The runtime recalls durable memory from the indexed knowledge and preference files, while resume or compaction context comes from runtime-owned session artifacts instead of from markdown memory alone.
The source-of-truth boundary is deliberate:
- runtime execution truth lives in
state/runtime.db - canonical operator profile data lives in
state/runtime.db - durable memory content lives in markdown under
memory/ - durable memory metadata and governance live in the runtime catalog in
state/runtime.db
In practice, that means:
turn_results, compaction boundaries, request snapshots, and the runtime user profile are runtime-owned canonical artifacts- markdown memory files are the canonical readable bodies for durable memory
- the durable memory catalog controls recall, freshness, and verification policy
Holaboss does not auto-write runtime state into AGENTS.md. AGENTS.md stays as the workspace's canonical human-authored instruction surface.
The current memory lifecycle is:
- User input is queued, and strong-signal user-scoped proposals can be captured into runtime-owned pending proposal records in
state/runtime.db. - The current run can use those pending proposals as ephemeral prompt context without treating them as durable memory yet.
- A run finishes and the runtime persists
turn_results. - Post-turn writeback updates the current compaction boundary and records ordered restoration inputs for later resume.
- Post-turn writeback generates volatile runtime projections under
memory/workspace/<workspace-id>/runtime/, includingsession-memory/. - Model-assisted durable extraction attempts to promote selected workspace-scoped items into
knowledge/using recent turn context. - Deterministic durable extraction remains as a fallback safety path when model extraction is unavailable or sparse.
- Accepted user-scoped proposals are promoted into durable preference memory or into the canonical runtime profile, depending on what they target.
MEMORY.mdindexes are refreshed for durable memory only.- Future runs restore session continuity from the latest compaction boundary first, then enrich continuity with the current session-memory snapshot.
- Future runs recall a small durable subset from markdown memory manifests (model-selected when available, deterministic fallback otherwise) and inject it as prompt context.
This keeps replay, inspection, and durable recall separate instead of overloading one mechanism for all three jobs.
The durable memory catalog currently supports these memory classes:
preference- example: response style such as concise vs detailed
identity- reserved for durable identity facts beyond the canonical runtime profile, such as role, signing identity, or other reusable identity context
fact- examples: workspace command facts such as which command to use for verification, or business facts such as meeting cadence and approval rules
procedure- examples: numbered release or onboarding steps, or business workflows such as follow-up, reporting, handoff, escalation, and review processes
blocker- example: recurring permission blockers that appear across multiple turns
reference- reserved for durable references that should usually be reconfirmed before use
Current writeback is intentionally conservative. The runtime only promotes facts and procedures that are explicit enough to survive beyond a single turn, and it keeps transient runtime state out of durable knowledge.
User-scoped inferred preferences and other behavioral updates now flow through the pending proposal lane first. Workspace facts and procedures can still be persisted automatically, but user-scoped changes that affect future behavior are designed to wait for explicit confirmation before promotion.
Durable recall is governed separately from storage:
- every durable memory entry carries a scope, type, verification policy, and staleness policy
- every durable memory entry also carries provenance metadata such as source type, observation time, verification time, and confidence
- recall prefers user preferences first, then query-matched workspace procedures, facts, blockers, and references
- stale references are penalized more aggressively than stable or workspace-sensitive memories
- recalled durable memory is injected as context, not merged into the base system prompt
Recall selection is manifest-based at query time. The runtime scans durable markdown memory files, reads frontmatter and compact summaries, and builds a bounded manifest. A model selector can choose a small relevant subset from that manifest; if model selection is unavailable, the runtime falls back to deterministic keyword-and-metadata ranking. Recalled entries include a compact selection trace and optional excerpt snippets for debugging and operator visibility. Retrieval stays separate from storage so alternate indexes can be added later without changing canonical markdown memory files.
Use these rules of thumb when reasoning about the system:
AGENTS.md- human-authored workspace policy and operating instructions
state/runtime.db- execution truth, session continuity, canonical runtime profile, memory catalog metadata
memory/workspace/<workspace-id>/runtime/- volatile runtime projections for inspection and debugging
memory/workspace/<workspace-id>/runtime/session-memory/- session-scoped continuity snapshots consumed during resume/compaction restoration
memory/workspace/<workspace-id>/knowledge/- durable workspace memory that may be recalled in later runs
memory/preference/- durable user preference memory
If a piece of information is only needed to resume the latest session, it belongs in runtime continuity. If it is the canonical current-user identity used by the runtime, it belongs in the runtime profile. If it should be recalled later without replaying the full session, it belongs in durable memory. If it is a standing workspace rule, it belongs in AGENTS.md.
The richer labour-market and marketplace experience lives in the Holaboss product after login, but the OSS desktop already includes a browsable kit gallery and local fallback templates so you can understand the model.
| Worker | Description |
|---|---|
| Social Operator | AI social media content creation and scheduling across X, LinkedIn, and Reddit. |
| Gmail Assistant | Minimal Gmail workspace for inbox search, thread reading, and draft creation via MCP. |
| Build in Public | Turns GitHub activity into social posts automatically. |
| Starter Workspace | A minimal blank canvas for building your own workflows from scratch. |
Ready to publish your worker or explore the hosted marketplace?
- Workspace apps can be installed, started, stopped, set up, and kept running through the runtime API.
- Integration endpoints cover catalog browsing, connections, bindings, OAuth flows, and broker proxy/token helpers.
- Browser capability endpoints let workers operate on a browser surface when that capability is enabled.
- Workspace skills are staged from workspace directories and merged with embedded runtime skills.
- Workspace and app MCP servers can be prepared and exposed to agent runs through sidecars and resolved tool references.
- Runtime tools already expose onboarding and cronjob helpers to the agent layer.
Signing in adds the hosted Holaboss layer on top of the OSS foundation. That includes product-authenticated marketplace templates, remote control-plane services, richer integration flows, and backend-connected collaboration surfaces.
If you only want the open-source local workflow, you can ignore those services and stay on the baseline desktop + runtime path above.
- local desktop development
- local runtime packaging
- local workspace and runtime flows
- local typechecking and runtime tests
- local model/provider overrides through
runtime-config.jsonor environment variables
- hosted sign-in flows
- authenticated marketplace template materialization
- auth-backed product features
- backend-connected Holaboss services
desktop/- Electron desktop appruntime/api-server/- Fastify runtime API serverruntime/harness-host/- harness host for agent and tool executionruntime/state-store/- SQLite-backed runtime state storeruntime/harnesses/- harness packaging scaffold.github/workflows/- release and publishing workflows
Run the desktop typecheck:
npm run desktop:typecheckRun runtime tests:
npm run runtime:testOn a fresh clone, prepare the runtime packages first:
npm run runtime:state-store:install
npm run runtime:state-store:build
npm run runtime:harness-host:install
npm run runtime:harness-host:build
npm run runtime:api-server:install
npm run runtime:testRun desktop end-to-end tests:
npm run desktop:e2eBuild a local macOS desktop bundle with the locally built runtime embedded:
npm run desktop:dist:mac:localStage the latest released runtime bundle for your current host platform:
npm run desktop:prepare-runtimeThe root package.json is a thin command wrapper for the desktop app. The actual desktop project still lives in desktop/package.json.
runtime/ remains independently buildable and testable. The desktop app consumes its packaged output rather than importing runtime source files directly.
For local desktop work, the default flow is:
npm run desktop:install
cp desktop/.env.example desktop/.env
npm run desktop:prepare-runtime:local
npm run desktop:devFor runtime-only work, the main command is:
npm run runtime:state-store:install
npm run runtime:state-store:build
npm run runtime:harness-host:install
npm run runtime:harness-host:build
npm run runtime:api-server:install
npm run runtime:testThe app ships with a default model setup. In most cases, you do not need to edit runtime-config.json by hand.
- default model:
openai/gpt-5.4 - default provider id for unprefixed models:
openai
Holaboss already provides model configuration in the desktop app.
- Open
Settings->Model Providers. - Connect a provider such as OpenAI, Anthropic, OpenRouter, Gemini, or Ollama.
- Enter your API key and use the built-in provider defaults or edit the model list for that provider.
- Changes autosave to
runtime-config.json, and the chat model picker will use the configured provider models.
You can route the runtime directly to a provider endpoint (for example OpenAI) without a model-proxy rewriter.
- set
model_proxy_base_urlto the provider API base, for examplehttps://api.openai.com/v1 - set
auth_tokento your provider API key - set
default_model, for exampleopenai/gpt-5.4oranthropic/claude-sonnet-4-20250514
Runtime URL behavior:
- if
model_proxy_base_urlis a proxy root, runtime appends provider routes (/openai/v1,/anthropic/v1) - direct mode is enabled when you provide a provider endpoint (recommended: include
/v1, for examplehttps://api.openai.com/v1) - known provider hosts
api.openai.comandapi.anthropic.comalso work without an explicit path; runtime normalizes them to/v1
The runtime resolves model settings from:
runtime-config.json- environment variables
- built-in defaults
By default, runtime-config.json lives at:
${HB_SANDBOX_ROOT}/state/runtime-config.json
You can override that path with:
HOLABOSS_RUNTIME_CONFIG_PATH
model_proxy_base_url- base URL root for your proxy, for example
https://your-proxy.example/api/v1/model-proxy
- base URL root for your proxy, for example
auth_token- token sent as
X-API-Key
- token sent as
sandbox_id- sandbox identifier propagated into runtime execution context and proxy headers
default_model- default model selection, for example
openai/gpt-5.4
- default model selection, for example
HOLABOSS_DEFAULT_MODEL- environment override for
default_model
- environment override for
SANDBOX_AGENT_DEFAULT_MODEL- fallback env if
HOLABOSS_DEFAULT_MODELis not set
- fallback env if
Use provider-prefixed model ids when you want to be explicit:
openai/gpt-5.4openai/gpt-4.1-mini-2025-04-14anthropic/claude-sonnet-4-20250514
The runtime also treats unprefixed claude... model ids as Anthropic models:
claude-sonnet-4-20250514
If a model id is unprefixed and does not start with claude, the runtime treats it as openai/<model>.
{
"runtime": {
"default_provider": "holaboss",
"default_model": "holaboss/gpt-5.2",
"sandbox_id": "local-sandbox"
},
"providers": {
"holaboss": {
"kind": "holaboss_proxy",
"base_url": "https://your-proxy.example/api/v1/model-proxy",
"api_key": "your-holaboss-proxy-token"
},
"openai_direct": {
"kind": "openai_compatible",
"base_url": "https://api.openai.com/v1",
"api_key": "sk-your-openai-key"
},
"anthropic_direct": {
"kind": "anthropic_native",
"base_url": "https://api.anthropic.com/v1",
"api_key": "sk-ant-your-anthropic-key"
},
"openrouter_direct": {
"kind": "openrouter",
"base_url": "https://openrouter.ai/api/v1",
"api_key": "sk-or-your-openrouter-key"
},
"ollama_direct": {
"kind": "openai_compatible",
"base_url": "http://localhost:11434/v1",
"api_key": "ollama"
}
},
"models": {
"holaboss/gpt-5.2": { "provider": "holaboss", "model": "gpt-5.2" },
"holaboss/gpt-5-mini": { "provider": "holaboss", "model": "gpt-5-mini" },
"holaboss/gpt-4.1-mini": { "provider": "holaboss", "model": "gpt-4.1-mini" },
"holaboss/claude-sonnet-4-5": { "provider": "holaboss", "model": "claude-sonnet-4-5" },
"holaboss/claude-opus-4-1": { "provider": "holaboss", "model": "claude-opus-4-1" },
"openai_direct/gpt-5.2": { "provider": "openai_direct", "model": "gpt-5.2" },
"openai_direct/gpt-5-mini": { "provider": "openai_direct", "model": "gpt-5-mini" },
"openai_direct/gpt-5-nano": { "provider": "openai_direct", "model": "gpt-5-nano" },
"openai_direct/gpt-4.1": { "provider": "openai_direct", "model": "gpt-4.1" },
"openai_direct/gpt-4.1-mini": { "provider": "openai_direct", "model": "gpt-4.1-mini" },
"anthropic_direct/claude-sonnet-4-5": { "provider": "anthropic_direct", "model": "claude-sonnet-4-5" },
"anthropic_direct/claude-opus-4-1": { "provider": "anthropic_direct", "model": "claude-opus-4-1" },
"openrouter_direct/deepseek/deepseek-chat-v3-0324": {
"provider": "openrouter_direct",
"model": "deepseek/deepseek-chat-v3-0324"
},
"openrouter_direct/openai/gpt-5.2": {
"provider": "openrouter_direct",
"model": "openai/gpt-5.2"
},
"openrouter_direct/anthropic/claude-sonnet-4-5": {
"provider": "openrouter_direct",
"model": "anthropic/claude-sonnet-4-5"
},
"ollama_direct/qwen2.5:0.5b": {
"provider": "ollama_direct",
"model": "qwen2.5:0.5b"
}
}
}Provider kind values supported by the runtime resolver:
holaboss_proxyopenai_compatibleanthropic_nativeopenrouter
This is the simplest end-to-end check for the local ollama_direct path.
- Install and start Ollama on your machine.
- Pull a minimal local model:
ollama pull qwen2.5:0.5b- Launch the desktop app.
- Open
Settings -> Models. - Connect
Ollamawith:- base URL:
http://localhost:11434/v1 - API key:
ollama - models:
qwen2.5:0.5b
- base URL:
- Open a workspace chat and select
ollama_direct/qwen2.5:0.5b. - Send this prompt:
Reply with exactly: OK
Expected result:
- the run starts with provider
ollama_direct - the model resolves to
qwen2.5:0.5b - the assistant replies with
OK
If the model does not show up or the request fails, verify Ollama directly first:
curl http://localhost:11434/v1/chat/completions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ollama' \
-d '{"model":"qwen2.5:0.5b","messages":[{"role":"user","content":"Reply with exactly: OK"}],"temperature":0}'export HOLABOSS_MODEL_PROXY_BASE_URL="https://your-proxy.example/api/v1/model-proxy"
export HOLABOSS_SANDBOX_AUTH_TOKEN="your-proxy-token"
export HOLABOSS_DEFAULT_MODEL="anthropic/claude-sonnet-4-20250514"These env vars override the file-based values above. sandbox_id still needs to come from runtime-config.json.
The runtime bundle can be deployed independently of the Electron desktop app.
The standalone deploy shape is:
- build a platform-specific runtime bundle directory under
out/runtime-<platform>/ - archive it as a
tar.gz - extract it on the target machine
- launch
bin/sandbox-runtime
The launcher environment should stay consistent with how the desktop app starts the runtime:
HB_SANDBOX_ROOT: runtime workspace/state rootSANDBOX_AGENT_BIND_HOST: runtime API bind hostSANDBOX_AGENT_BIND_PORT: runtime API bind portSANDBOX_AGENT_HARNESS: harness selector, defaults topiHOLABOSS_RUNTIME_WORKFLOW_BACKEND: workflow backend selector, desktop usesremote_apiHOLABOSS_RUNTIME_DB_PATH: SQLite runtime DB pathPROACTIVE_ENABLE_REMOTE_BRIDGE: desktop enables this with1PROACTIVE_BRIDGE_BASE_URL: remote bridge base URL when bridge flows are enabled
Health check:
curl http://127.0.0.1:8080/healthzBuild the Linux runtime bundle:
bash runtime/deploy/package_linux_runtime.sh out/runtime-linux
tar -C out -czf out/holaboss-runtime-linux.tar.gz runtime-linuxInstall it on a target Linux machine:
sudo mkdir -p /opt/holaboss
sudo tar -C /opt/holaboss -xzf holaboss-runtime-linux.tar.gz
sudo ln -sf /opt/holaboss/runtime-linux/bin/sandbox-runtime /usr/local/bin/holaboss-runtime
sudo mkdir -p /var/lib/holabossRun it with desktop-compatible environment variables:
HB_SANDBOX_ROOT=/var/lib/holaboss \
SANDBOX_AGENT_BIND_HOST=127.0.0.1 \
SANDBOX_AGENT_BIND_PORT=8080 \
SANDBOX_AGENT_HARNESS=pi \
HOLABOSS_RUNTIME_WORKFLOW_BACKEND=remote_api \
HOLABOSS_RUNTIME_DB_PATH=/var/lib/holaboss/state/runtime.db \
PROACTIVE_ENABLE_REMOTE_BRIDGE=1 \
PROACTIVE_BRIDGE_BASE_URL=https://your-bridge.example \
holaboss-runtimeIf the runtime should accept connections from other machines, use SANDBOX_AGENT_BIND_HOST=0.0.0.0 instead of 127.0.0.1.
Build the macOS runtime bundle:
bash runtime/deploy/package_macos_runtime.sh out/runtime-macos
tar -C out -czf out/holaboss-runtime-macos.tar.gz runtime-macosInstall it on a target macOS machine:
sudo mkdir -p /opt/holaboss
sudo tar -C /opt/holaboss -xzf holaboss-runtime-macos.tar.gz
sudo ln -sf /opt/holaboss/runtime-macos/bin/sandbox-runtime /usr/local/bin/holaboss-runtime
mkdir -p "$HOME/Library/Application Support/HolabossRuntime"Run it with the same environment contract:
HB_SANDBOX_ROOT="$HOME/Library/Application Support/HolabossRuntime" \
SANDBOX_AGENT_BIND_HOST=127.0.0.1 \
SANDBOX_AGENT_BIND_PORT=8080 \
SANDBOX_AGENT_HARNESS=pi \
HOLABOSS_RUNTIME_WORKFLOW_BACKEND=remote_api \
HOLABOSS_RUNTIME_DB_PATH="$HOME/Library/Application Support/HolabossRuntime/state/runtime.db" \
PROACTIVE_ENABLE_REMOTE_BRIDGE=1 \
PROACTIVE_BRIDGE_BASE_URL=https://your-bridge.example \
holaboss-runtime- The packaged bundle includes the runtime app and its packaged runtime dependencies.
- The packaged runtime bundle includes a Node binary under
node-runtime/node_modules/.bin/nodethat matches the packaging environment and starts it automatically. - The desktop app launches the same
bin/sandbox-runtimeentrypoint and passes the same bind host, bind port, sandbox root, and workflow-related environment variables.
- License: MIT. See
LICENSE. - Security issues: report privately to
security@holaboss.ai. SeeSECURITY.md.
This section is the canonical flow for producing Holaboss macOS DMG installers.
Run from the repository root:
npm run desktop:install
GITHUB_TOKEN="$(gh auth token)" npm --prefix desktop run dist:mac:dmgIf you want to package an unreleased runtime built from your local source tree instead of downloading the latest released runtime:
npm run desktop:install
npm --prefix desktop run dist:mac:dmg:localOutput location:
desktop/out/release/*.dmg
Notes:
- Local DMG commands force ad-hoc signing via
--config.mac.identity=-. - Local artifacts are intended for smoke tests and are not notarized for distribution.
If you want to ship a DMG built locally on your Mac with Developer ID signing and Apple notarization, run:
npm run desktop:install
npm --prefix desktop run prepare:runtime:local
npm --prefix desktop run prepare:packaged-config
npm --prefix desktop run build
CSC_LINK="file:///absolute/path/to/Certificates.p12" \
CSC_KEY_PASSWORD="your_p12_password" \
APPLE_ID="your_apple_id_email" \
APPLE_APP_SPECIFIC_PASSWORD="your_app_specific_password" \
APPLE_TEAM_ID="YOURTEAMID" \
npm --prefix desktop exec -- node scripts/run-electron-builder.mjs --mac dmg --arm64Behavior:
- with
CSC_LINK+CSC_KEY_PASSWORD, the app is signed with your Developer ID certificate - with
APPLE_ID,APPLE_APP_SPECIFIC_PASSWORD, andAPPLE_TEAM_ID, electron-builder submits for notarization and staples the result - if you omit
APPLE_*, signing can still happen but notarization does not
Use the manual workflow .github/workflows/release-macos-desktop.yml (Release macOS Desktop).
Required GitHub repository secrets:
MAC_CERTIFICATE(base64-encoded Developer ID Application.p12)MAC_CERTIFICATE_PASSWORDAPPLE_IDAPPLE_APP_SPECIFIC_PASSWORDAPPLE_TEAM_ID
Trigger the release from the GitHub UI or with GitHub CLI:
gh workflow run "Release macOS Desktop" \
--ref main \
-f ref=main \
-f release_tag=holaboss-desktop-v0.1.0 \
-f release_title="Holaboss Desktop v0.1.0" \
-f prerelease=falseWhat this workflow does:
- creates or updates the specified GitHub release and tag
- builds the matching macOS runtime bundle from the selected ref
- builds, signs, and notarizes the desktop DMG
- uploads
Holaboss-macos-arm64.dmgto the release
After downloading the built app, run:
codesign --verify --deep --strict --verbose=2 /path/to/Holaboss.app
spctl -a -vv -t exec /path/to/Holaboss.app
xcrun stapler validate /path/to/Holaboss.app
