# How to Deploy LifeOS Enhancement Components: Hooks, Statusline, Tooltips, and Spinner Verbs

> Deploy LifeOS enhancement components easily. Use the DeployComponents CLI tool to install hooks, statusline, tooltips, and spinner verbs for improved UI. Get started now!

- Repository: [Daniel Miessler 🛡️/LifeOS](https://github.com/danielmiessler/LifeOS)
- Tags: how-to-guide
- Published: 2026-08-12

---

**Deploy LifeOS UI enhancement components by running the `DeployComponents` CLI tool with `--components statusline,tooltips,spinnerverbs` or `--all` to install hooks that merge into `~/.claude/settings.json` and copy supporting scripts to `~/.claude/hooks`.**

LifeOS provides a lightweight TypeScript CLI for installing optional **non-launchd** UI enhancements that run inside your terminal session. These components—**statusline**, **tooltips**, **spinner verbs**, and **hooks**—feed real-time data into your Claude environment without requiring persistent background services. This guide explains how the deployment system works at the source level and the exact commands to run.

## What LifeOS Enhancement Components Do

Each component serves a distinct purpose in the terminal UI:

- **Statusline** – A persistent bottom bar displaying usage metrics, active agents, and system health.
- **Tooltips** – Context-sensitive help that appears when hovering over interface elements.
- **Spinner Verbs** – Animated status indicators (e.g., "Thinking…", "Fetching…") for background operations.
- **Hooks** – Thin scripts ([`.hook.ts`](https://github.com/danielmiessler/LifeOS/blob/main/.hook.ts) or [`.hook.sh`](https://github.com/danielmiessler/LifeOS/blob/main/.hook.sh)) that supply data to the statusline and tooltips.

All components are declared in the deployment system's constant array:

```ts
// LifeOS/Tools/DeployComponents.ts
const NON_LAUNCHD_COMPONENTS = ["statusline","tooltips","spinnerverbs","agents","commands"] as const;

```

(See line 51 of [[`DeployComponents.ts`](https://github.com/danielmiessler/LifeOS/blob/main/DeployComponents.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployComponents.ts).)

## How Component Deployment Works

The deployment process follows a three-stage pipeline: **probing**, **dispatching**, and **installation**.

### Stage 1: Probe and Readiness Check

Before installing, the tool validates that each component is properly wired. For the statusline, this means verifying the binary exists and is executable:

```ts
r.probe = {
    name: "statusline-wired",
    passed: wired && executable,
    detail: `wired=${wired} executable=${executable}${alreadyWired ? " (idempotent)" : ""}`
};

```

(See line 202 of [[`DeployComponents.ts`](https://github.com/danielmiessler/LifeOS/blob/main/DeployComponents.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployComponents.ts).)

### Stage 2: Deployment Dispatch

The CLI parses your `--components` flag and routes to the appropriate deployer:

```ts
case "statusline": return deployStatusline(ctx);

```

(See line 373 of [[`DeployComponents.ts`](https://github.com/danielmiessler/LifeOS/blob/main/DeployComponents.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployComponents.ts).)

### Stage 3: Hook Installation and Settings Merge

The core deployment logic lives in [[`DeployCore.ts`](https://github.com/danielmiessler/LifeOS/blob/main/DeployCore.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployCore.ts). For the statusline, it performs three atomic operations:

1. **Merges** the `statusline` configuration into `~/.claude/settings.json`
2. **Copies** [`LIFEOS_StatusLine.sh`](https://github.com/danielmiessler/LifeOS/blob/main/LIFEOS_StatusLine.sh) to the Claude hooks directory
3. **Sets** executable permissions with `chmod +x`

The underlying hook installer, [[`InstallHooks.ts`](https://github.com/danielmiessler/LifeOS/blob/main/InstallHooks.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/skills/LifeOS/Tools/InstallHooks.ts) (lines 66–111), handles the recursive copy:

```ts
const hooksPayloadDir = join(skillRoot, "install", "hooks");
const hooksDestDir = join(configRoot, "hooks");
cpSync(hooksPayloadDir, hooksDestDir, { recursive: true });

```

Because statusline, tooltips, and spinner verbs all depend on hook scripts, installing any of these components automatically provisions the required files.

## Step-by-Step Deployment Commands

### Prerequisites

Install the TypeScript runtime in the LifeOS repository:

```bash
cd /path/to/LifeOS
bun install

```

### Deploy Individual Components

Install only the statusline:

```bash
bun DeployComponents.ts --components statusline

```

Install multiple UI enhancers together:

```bash
bun DeployComponents.ts --components statusline,tooltips,spinnerverbs

```

### Deploy All Non-Launchd Components

Install every available enhancement:

```bash
bun DeployComponents.ts --all

```

This installs `statusline`, `tooltips`, `spinnerverbs`, `agents`, and `commands` in a single operation.

### Verify Installation

Confirm the statusline entry exists in your Claude settings:

```bash
cat ~/.claude/settings.json | grep statusline

```

### Activate the Enhancements

Open a new Claude session. The bottom line should now display the **statusline** with **spinner verbs** animated during operations.

> **Note on idempotency:** The deployment CLI uses `force: false` in `cpSync` operations, so re-running commands will not duplicate entries or overwrite existing files.

## Key Source Files

| File | Path | Purpose |
|------|------|---------|
| **DeployComponents.ts** | [[`LifeOS/Tools/DeployComponents.ts`](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployComponents.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployComponents.ts) | CLI entry point; parses flags and dispatches to component deployers |
| **DeployCore.ts** | [[`LifeOS/Tools/DeployCore.ts`](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployCore.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/Tools/DeployCore.ts) | Shared routines for probing and merging settings |
| **InstallHooks.ts** | [[`LifeOS/install/skills/LifeOS/Tools/InstallHooks.ts`](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/skills/LifeOS/Tools/InstallHooks.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/skills/LifeOS/Tools/InstallHooks.ts) | Merges [`hooks.json`](https://github.com/danielmiessler/LifeOS/blob/main/hooks.json) into [`settings.json`](https://github.com/danielmiessler/LifeOS/blob/main/settings.json) and copies hook scripts |
| **Statusline script** | [[`LIFEOS_StatusLine.sh`](https://github.com/danielmiessler/LifeOS/blob/main/LIFEOS_StatusLine.sh)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/LIFEOS/TOOLS/LIFEOS_StatusLine.sh) | Bash program that renders the bottom status bar |
| **Identity utilities** | [[`hooks/lib/identity.ts`](https://github.com/danielmiessler/LifeOS/blob/main/hooks/lib/identity.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/hooks/lib/identity.ts) | Shared helpers used by statusline-related hooks |
| **UpdateCounts hook** | [[`UpdateCounts.hook.ts`](https://github.com/danielmiessler/LifeOS/blob/main/UpdateCounts.hook.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/hooks/handlers/UpdateCounts.ts) | Refreshes usage caches displayed in the statusline |

## Summary

- **LifeOS enhancement components** (statusline, tooltips, spinner verbs) are **non-launchd** terminal UI features that install via the `DeployComponents` CLI.
- **Deployment merges** configuration into `~/.claude/settings.json` and **copies hook scripts** to `~/.claude/hooks`.
- **Run `bun DeployComponents.ts --components statusline,tooltips,spinnerverbs`** to install all three UI enhancers.
- **Use `--all`** to deploy every available non-launchd component at once.
- **The process is idempotent**—safe to re-run without side effects.

## Frequently Asked Questions

### What is the difference between launchd and non-launchd LifeOS components?

Non-launchd components like statusline, tooltips, and spinner verbs run entirely within your terminal session and do not require macOS launchd services. They are pure shell scripts and TypeScript hooks that Claude executes directly. Launchd components (not covered here) would require persistent background daemons.

### Can I deploy LifeOS components without modifying my existing Claude settings?

No—the deployment intentionally merges into `~/.claude/settings.json` because this is the configuration file the core LifeOS engine reads. However, the merge is additive and idempotent; it will not remove or overwrite unrelated settings you have configured.

### Where are the hook scripts physically installed after deployment?

Hook scripts are copied recursively to `~/.claude/hooks/` as implemented in [[`InstallHooks.ts`](https://github.com/danielmiessler/LifeOS/blob/main/InstallHooks.ts)](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/skills/LifeOS/Tools/InstallHooks.ts) lines 66–111. The statusline script specifically installs as `~/.claude/hooks/LIFEOS_StatusLine.sh` with executable permissions.

### What happens if I run the deploy command multiple times?

The deployment is designed to be **idempotent**. The `cpSync` operations use `force: false`, and settings merges check for existing entries before adding duplicates. You will see `(idempotent)` in probe details when components are already installed, indicating no changes were made.