Logbook Plugin: Automatic Work Journal from Screen Snapshots
Learn how the Logbook plugin records screen activity as a timestamped work journal. Ideal for users needing automated standup notes or daily activity summaries.
Read this when
- You want a Dayflow-style timeline of your day in the Control UI
- You are enabling or configuring the bundled Logbook plugin
- You want standup summaries or day recall grounded in screen activity
The Logbook plugin automatically records screen activity as a work journal. It periodically takes screenshots from a connected node, creates timestamped summaries of the activity, and displays timeline cards in the Control UI. The plugin can also produce daily standup notes and respond to questions about a specific workday.
State managed by OpenClaw stays on the Gateway under <state-dir>/logbook/, though model processing may occur remotely. Captured screenshots are sent to the configured vision route, while observations and timeline text use the default agent model. To keep both screen content and derived activity text on the local machine, configure local model routes for each stage.
Logbook ships bundled but is disabled by default. Enabling the plugin automatically activates screen capture on the Gateway because captureEnabled defaults to true.
Before you begin
These prerequisites are required:
- A connected node exposing
screen.snapshotorlogbook.snapshot. The macOS app node must have Screen Recording permission. A headless macOS node host (openclaw node host run) uses the plugin-providedlogbook.snapshotcommand, which relies on the systemscreencapturetool. - The bundled Codex plugin must be enabled and authenticated. Codex provides the structured image extraction contract that Logbook depends on. Sign in using
openclaw models auth login --provider openai; alternative authentication methods are described in the Codex harness. - A working default agent model. After the vision pass, Logbook uses this model to generate cards, standup notes, and day Q&A responses.
Quickstart
Enable both the Codex and Logbook plugins:
openclaw plugins enable codex
openclaw plugins enable logbook
Set an explicit vision model to ensure deterministic startup:
{
plugins: {
entries: {
codex: {
enabled: true,
},
logbook: {
enabled: true,
config: {
visionModel: "codex/gpt-5.6-sol",
},
},
},
},
}
If you use plugins.allow, include both codex and logbook. Restart the Gateway after modifying the plugin configuration, then check the registrations and open the dashboard:
openclaw gateway restart
openclaw plugins inspect logbook --runtime --json
openclaw nodes status --connected
openclaw nodes describe --node <idOrNameOrIp>
openclaw dashboard
The node description must contain screen.snapshot or logbook.snapshot. Headless nodes advertise logbook.snapshot only after the plugin becomes active. If the command is missing, refer to Node troubleshooting.
The Logbook tab appears only when the plugin is enabled and an operator.write Control UI session is active. The status row should display Capturing with no errors. A timeline card appears when the analysis window closes, or you can click Analyze now after capturing some activity.
How it works
- Capture: every
captureIntervalSeconds(default 30s), Logbook runs the capture command on the selected node and saves a scaled JPEG frame. Consecutive identical frames are marked as idle and excluded from analysis. - Observe: after an analysis window (default 15 minutes) passes, the plugin samples up to 16 active frames and submits them to the vision model. The model returns timestamped activity observations, for example "VS Code: editing store.ts, fixing a type error". A capture gap exceeding two minutes or local midnight also ends the current window.
- Synthesize: observations combined with the last 45 minutes of existing cards are refined into timeline cards (each 10-60 minutes long) that include a title, summary, category, primary application, and any brief distractions.
- Prune: frames older than
retentionDays(default 14) are removed. Cards, observations, and cached standups are preserved.
Day boundaries and timeline clocks follow the Gateway's local timezone, not the browser's timezone. Frames and the SQLite timeline database are stored under <state-dir>/logbook/.
Model and data flow
Logbook relies on two separate model routes:
| Stage | Data sent | Model route |
|---|---|---|
| Observe | Up to 16 sampled JPEG frames plus their capture times | visionModel, or a compatible borrowed tools.media Codex entry |
| Synthesize cards | Timestamped observations and recent timeline cards | Default agent model through the plugin LLM runtime |
| Generate standup | Cards for the selected day and previous day | Default agent model through the plugin LLM runtime |
| Ask your day | The question, selected-day cards, and recent observations | Default agent model through the plugin LLM runtime |
The full SQLite database is never sent to either model. Raw screenshots are only used during the observation stage; card synthesis, standup generation, and Q&A receive only derived text.
Configuration
{
plugins: {
entries: {
codex: {
enabled: true,
},
logbook: {
enabled: true,
config: {
captureEnabled: true,
captureIntervalSeconds: 30,
analysisIntervalMinutes: 15,
nodeId: "my-mac",
screenIndex: 0,
maxWidth: 1440,
visionModel: "codex/gpt-5.6-sol",
retentionDays: 14,
},
},
},
},
}
All Logbook configuration keys are optional. Numeric values are rounded to integers and clamped to the supported range.
| Key | Default | Range or values | Behavior |
|---|---|---|---|
captureEnabled | true | boolean | Persistent master switch for new snapshots; the timeline remains available when false |
captureIntervalSeconds | 30 | 5-600 | Delay between capture attempts |
analysisIntervalMinutes | 15 | 3-120 | Target observation window; gaps and midnight can close it earlier |
nodeId | unset | node id or display name | Pins capture to one connected node; matching is case-insensitive |
screenIndex | 0 | 0-16 | Zero-based display index |
maxWidth | 1440 | 480-3840 | Requested capture size cap; headless macOS applies it to the largest dimension |
visionModel | unset | provider/model | Explicit structured route; malformed refs pause analysis, unsupported providers fail batches |
retentionDays | 14 | 1-365 | Deletes old frames; cards, observations, and standups remain |
Without nodeId, Logbook first tries a connected app node that exposes screen.snapshot, and if that is not available, it falls back to a headless node exposing logbook.snapshot. In an unpinned setup, when a node fails, it is replaced by the next eligible node. The pause toggle on the dashboard only lasts for the current session and is cleared when the Gateway restarts; for a permanent stop, use captureEnabled: false.
Vision model selection
The observation model is resolved by Logbook in the following order:
plugins.entries.logbook.config.visionModel- The first Codex entry under
tools.media.modelsthat supports images
Other media providers are skipped since they do not currently offer the structured extraction contract required by Logbook. When tools.media.image.enabled: false is set, borrowed media defaults are disabled, though an explicit Logbook visionModel still takes effect.
Dashboard tab
- Timeline: expandable cards for each activity with category colors, the primary app, distraction chips, and a snapshot keyframe.
- Day at a glance: focus ratio, category breakdown, and top applications.
- Daily standup: transforms yesterday and today into a ready-to-paste summary.
- Ask your day: natural-language queries answered from the tracked timeline, for example "when did I review the gateway PR?".
- Analyze now: immediately closes the current capture window rather than waiting for the analysis interval.
Gateway methods
The following Gateway RPC methods are registered by Logbook:
| Method | Parameters | Scope | Result |
|---|---|---|---|
logbook.status | none | operator.read | Status of capture, analysis, model, node, Gateway day, and Gateway timezone |
logbook.days | none | operator.read | Days with timeline-card counts and card time boundaries |
logbook.timeline | { day?: "YYYY-MM-DD" } | operator.read | Derived cards and day statistics; defaults to the Gateway's current day |
logbook.frames | { startMs, endMs } | operator.write | Frame metadata within the requested epoch-millisecond range |
logbook.frame | { frameId } | operator.write | A single raw JPEG frame as base64 |
logbook.standup | { day?, refresh? } | operator.write | Cached or regenerated standup text for a specific day |
logbook.ask | { day?, question } | operator.write | Timeline-based answer for a day |
logbook.capture.set | { paused } | operator.write | Session-only pause state and updated status |
logbook.analyze.now | none | operator.write | Begins pending analysis, or returns a reason why it could not start |
Read methods return operational state or derived text. Raw screenshot pixels, model-spending actions, and runtime mutations require operator.write. The Control UI tab also requires operator.write because it exposes those actions and raw frame previews; a read-only client can still call the derived-text methods directly.
Privacy notes
- Snapshots may capture anything on screen, including secrets. Frames never leave the machine except as sampled input to the configured observation model.
- Observations, recent cards, and questions may leave the machine through the default agent model during card synthesis, standup generation, or Q&A. Apply the provider's data-handling policy to both model routes.
- For a fully local pipeline, use local routes for both the structured observation model and the default agent model.
- Frames, the timeline database, and temporary captures are written with owner-only file permissions.
- Adding
screen.snapshottogateway.nodes.commands.denyacts as the screen-capture kill switch: it prevents app-node capture and Logbook's ownlogbook.snapshotcommand. - Setting
tools.media.image.enabled: falsealso prevents Logbook from borrowing the media image models for analysis; only an explicitvisionModelin the plugin config is used in that case.
Troubleshooting
The Logbook tab is missing
Verify all three conditions:
openclaw plugins list --enabledincludeslogbook.- The Gateway was restarted after the plugin or allowlist change.
- The Control UI connection has
operator.write; read-only sessions do not receive the interactive tab descriptor.
If plugins.allow is set, it must include both logbook and codex for the recommended configuration.
Capture reports an error
openclaw nodes status --connected
openclaw nodes describe --node <idOrNameOrIp>
openclaw logs --follow
- Ensure the node exposes
screen.snapshotorlogbook.snapshot. - Grant Screen Recording permission on the capture Mac.
- If
nodeIdis configured, verify it matches the node id or display name. - Confirm that
gateway.nodes.commands.denydoes not containscreen.snapshot.
After three consecutive failures, Logbook backs off for ten capture ticks and then retries. In an unpinned setup, it can rotate to another eligible node.
Captures succeed but no cards appear
- A Model missing status indicates that no suitable structured vision path could be located. Activate and authorize the Codex plugin, or configure a working explicit
visionModel. While the model is absent, captured frames stay queued and become analyzable once the setup is corrected. - Either wait for
analysisIntervalMinutesor click Analyze now once some activity has been recorded. - Repeated, unchanged frames count as idle evidence and are excluded from analysis batches. Before running a test, ensure the screen content changes.
- When the most recent batch reports an error, resolve the model or authentication issue and then press Analyze now. Failed batches are only reprocessed when you take that explicit step, preventing unnecessary model usage charges.