Installation
Enso 0.1.0 is currently an unreleased, pre-production project. There is no public
package or working public source repository yet, so there is no supported public install
command. In particular, Enso does not publish an install.sh script.
If you already have an authorized Enso source checkout, the steps below describe the current source installation. Otherwise, use this documentation to evaluate Enso and wait for a public distribution before trying to install it.
Requirements
An Enso machine needs:
- macOS or Linux. The background-service integration uses launchd or systemd.
- Python 3.14. The package declares
requires-python = ">=3.14". - uv. Enso is currently installed as a uv tool from a source checkout.
- At least one supported agent CLI:
claude,codex, orgrok, already installed and authenticated for the account you intend to use. - At least one chat transport: a Slack app using Socket Mode or a Telegram bot token.
Enso drives provider CLIs; it does not install them, log into them, or replace their credentials. Before starting setup, confirm at least one provider works in your terminal:
command -v claude
command -v codex
command -v grok
Only one needs to be present. Run that CLI’s own harmless help or status command if you are unsure whether its authentication is current.
Install from a source checkout
From the root of an authorized Enso checkout, install the transports and optional viewer you need:
cd /path/to/enso
uv tool install -e '.[slack,telegram,web]'
The extras are independent:
| Extra | Adds | Include when |
|---|---|---|
slack |
Slack Bolt and its HTTP dependency | You will connect a Slack app |
telegram |
Python Telegram Bot | You will connect a Telegram bot |
web |
aiohttp, Jinja, and Markdown rendering | You want the local read-only viewer |
Install only what you use. For example, a Telegram-only host without the viewer can use:
uv tool install -e '.[telegram]'
The base CLI still includes enso web status and enso web stop without the web
extra. enso web start explains which extra is missing instead of failing with an import
traceback.
Confirm the executable is available:
command -v enso
enso --help
If the first command prints nothing, ensure uv’s tool executable directory is on PATH.
Use uv’s own environment guidance for your shell rather than hard-coding a path from
another machine.
Prepare a transport
Setup connects one transport. You can add the second later in config.json.
Slack preparation
Slack requires both a bot token and an app-level token with Socket Mode enabled. The
authorized source checkout includes assets/slack/manifest.json, which declares the exact
scopes and events Enso needs.
Before running setup:
- Create a Slack app from that manifest.
- Enable or confirm Socket Mode.
- Keep the bot token (
xoxb-…) and app-level token (xapp-…) available. - Decide which channel or direct message should receive the setup test.
- Invite the bot to every channel you later bind.
When applying the manifest to an existing app that has broader scopes, revoke the old bot token before reinstalling the app. Slack does not remove old scopes from a live token. A reinstall also removes the bot from channels, so invite it again afterward.
Telegram preparation
Telegram uses one bot token and an allowlist of numeric user ids. Setup waits for you to send the bot a private message, then records the sender’s numeric id.
Enso accepts Telegram private chats only. Users not listed in allowed_users are ignored
silently, so make sure the account you use during setup is the account you intend to
allow.
Run guided setup
Use your real Enso home only when you are ready to create persistent configuration:
enso setup
On a fresh home, the wizard proceeds in order:
- Detects supported provider CLIs on
PATHand records their available model choices and unattended permission flags. - Asks for the default provider, model, and effort.
- Connects one Slack or Telegram transport. Slack validates the bot token; Telegram waits for a private message so it can capture the user’s numeric id.
- Creates the
defaultworkspace and seeds the home instructions, bundled skills, discovery links, and empty Git root. - Writes
config.json, sends a test when a notification destination is configured, and offers to install the background service.
The wizard is intended for a fresh home. If setup reports existing or invalid state, stop and inspect it instead of repeatedly overwriting files. Enso’s configuration and workspace audit commands collect problems without requiring you to guess which file is wrong.
What setup creates
The important initial paths are:
~/.enso/
├── config.json
├── AGENTS.md
├── CLAUDE.md -> AGENTS.md
├── skills/
├── workspaces/default/
│ ├── AGENTS.md
│ ├── knowledge/
│ ├── drafts/
│ ├── uploads/
│ └── skills/
├── jobs/
├── secrets/
└── .git/
See Workspaces before changing this layout manually. The links and Git root are part of provider instruction and skill discovery, not incidental scaffolding.
Install and operate the service
If you did not install the service during setup, do it explicitly:
enso service install
enso service status
The service command supports the full lifecycle:
enso service start
enso service stop
enso service restart
enso service status
enso service uninstall
service install writes a user service for the particular enso executable on your
current PATH, then starts it. The unit is stored at:
~/Library/LaunchAgents/com.enso.agent.pliston macOS;~/.config/systemd/user/enso.serviceon Linux.
The generated service environment includes a PATH that covers every configured provider.
If you later move or reinstall a provider or Enso itself, enso doctor warns when the
service unit and current executable no longer agree.
Restart the service after editing config.json; transports, providers, bindings, and
workspace overrides load at process start. JOB.md files are different: the scheduler
reloads them every minute, so job edits need no service restart.
Verify the installation
Run the checks from narrowest to broadest:
enso config check
enso workspace audit
enso doctor
enso service status
config checkvalidates strict JSON and reports every configuration problem it can find.workspace auditchecks the Enso home, fixed directory layout, instruction links, skill links, collisions, bindings, and jobs.doctorcombines those checks with provider paths, transport extras, service state, and all job definitions.service statusconfirms whether the installed user service is actually running.
Then test the transport:
- Send
!helpin a bound Slack conversation. - Send
/helpin a bound Telegram private chat.
Use !status or /status to see the effective workspace and agent, where the agent choice
came from, the current session age, active work, and queue depth.
Read logs without exposing too much
The main rotating log is ~/.enso/enso.log:
enso logs -n 100
enso logs -f
enso logs --job morning-brief
enso logs --turn a1b2c3
enso logs --grep timeout
On macOS, service stdout and stderr also go to ~/.enso/launchd.log; this is mainly useful
when the process crashes before normal logging starts.
Avoid enso serve --debug on a shared or poorly protected machine. Debug mode records
complete prompts and raw provider events, which can include private chat content, file
paths, tool output, and secrets exposed by a provider.
Start the optional viewer
With the web extra installed:
enso web start
enso web status
The default URL is http://127.0.0.1:8787. The viewer runs separately from the service,
writes to ~/.enso/web.log, and does not survive a reboot. It is read-only and has no
authentication, so keep it on localhost unless a trusted private tunnel or authenticated
reverse proxy controls access.
Stop it independently:
enso web stop
See Web viewer for its pages and threat model.
Add the second transport or more workspaces
The first-run wizard connects one transport and creates default. Further setup is
file-based:
- Create another workspace with
enso workspace create NAME. - Add the second transport and any bindings to
~/.enso/config.json. - Run
enso config checkandenso workspace audit. - Restart the service.
- Send
statusin the newly bound conversation to confirm the route.
Follow Configuration for strict copyable examples and Workspaces before editing workspace internals.
Upgrade a source installation
Enso is pre-production and provides no migration promise yet. When an authorized source checkout is updated:
- Read its changelog and documentation before reinstalling.
- Update the checkout using the method supplied by its distributor.
- Repeat the same
uv tool install -e '.[…]'command from the source root. - Run
enso config checkandenso workspace audit. - Fix every reported incompatibility.
- Reinstall or restart the service if the Enso executable location changed.
Back up ~/.enso before testing a version that changes the config schema, database, or
home layout.
Development and isolated evaluation
Contributors with a source checkout can create the development environment with:
uv sync --all-extras
uv run ruff check .
uv run ruff format --check .
uv run mypy
uv run pytest
Always point manual development runs at a scratch home:
ENSO_HOME=/tmp/enso-dev uv run enso setup
ENSO_HOME=/tmp/enso-dev uv run enso serve --debug
That prevents development setup, config, jobs, sessions, and logs from touching the real
~/.enso home.
Installation troubleshooting
enso is not found
Confirm uv tool install succeeded, then add uv’s tool executable directory to your shell
PATH. Start a new shell and retry command -v enso.
A provider is missing
Run command -v claude, command -v codex, or command -v grok in the same environment.
If it works interactively but not as a service, run enso doctor and compare the provider
path in config.json with the service’s recorded executable paths.
The service runs but chat is silent
Check, in order:
enso doctor
enso service status
enso logs -n 100
Then confirm the chat location has a binding, the named workspace exists, the Slack bot was invited to the channel or the Telegram user id is allowed, and the configured transport extra is installed.
Configuration changed but behavior did not
Run enso config check, then enso service restart. Configuration loads only when the
service starts. Job files are the exception and reload on the scheduler’s next minute tick.
