Start hereTutorial

Tutorial: from install to grounded AI in one afternoon

This walkthrough takes a real-world workflow — a product lead who wants Beside to remember launch decisions, surface follow-ups, and feed that context into Cursor — and turns it into a concrete setup. It uses every layer the docs describe.

Step 1 — Install

Easiest path: download the desktop app from the latest GitHub release. It installs the runtime, the native capture helper, the bundled plugins, and the auto-updater.

If you’re building from source:

git clone https://github.com/sagivo/beside
cd beside
pnpm install
pnpm build
pnpm desktop                # native app
# or
pnpm cli init && pnpm cli start    # headless

After install, run a sanity check:

beside doctor

A clean output is "0 fail, 0 warn". Anything red is the right thing to chase before going further.

Step 2 — Decide who provides the intelligence

Open ~/.beside/config.yaml. The default is local Ollama with Gemma; that’s a good starting point for everyone.

index:
  model:
    plugin: ollama
    ollama:
      model: gemma4:e4b
      embedding_model: nomic-embed-text
      host: http://127.0.0.1:11434
      auto_install: true

If you want hosted quality, swap the block — see Model adapters. You can mix later (custom adapter) without rebuilding the wiki.

Step 3 — Tune capture for trust

A launch workflow needs Slack, mail, design, and engineering signals. It does not need password managers, banking, or admin pages. Add the exclusions first.

capture:
  plugin: native
  capture_mode: active
  capture_audio: true
  excluded_apps: [1Password, Bitwarden, Keychain Access]
  excluded_url_patterns:
    - "^https://.*\\.bank\\."
    - "^https://admin\\."
  privacy:
    blur_password_fields: true
    pause_on_screen_lock: true
    sensitive_keywords: [password, api_key, secret]

Restart the runtime (beside start or relaunch the desktop app) so the new matchers take effect.

Step 4 — Let the indexer build the wiki

Run a one-off pass to confirm the loop:

beside index --once
beside stats

You should see frame counts climb, sessions and (if any audio captured) meetings appear, and pages start showing up under ~/.beside/index/topics/. Open them — they’re plain Markdown, edit anything that’s wrong. The strategy keeps your edits on the next pass.

For a deeper view:

beside index --reorganise

This is the merge / split / archive cycle. It’s scheduled nightly; running it on demand is fine.

Step 5 — Wire Beside into your AI agent

Confirm the MCP server is up:

curl http://127.0.0.1:3456/mcp/healthz

For Cursor / Claude Desktop / Windsurf, add Beside to the MCP servers section of your client config:

{
  "mcpServers": {
    "beside": { "url": "http://127.0.0.1:3456/mcp" }
  }
}

For stdio-launching clients (no Beside daemon running):

{
  "mcpServers": {
    "beside": { "command": "beside", "args": ["mcp", "--stdio"] }
  }
}

Restart the agent. Then ask it questions that used to mean digging through six apps:

  • "What did we decide about pricing in the last two weeks?"
  • "Summarise the customer concerns from my last three Acme calls."
  • "What follow-ups are still open in Slack and Mail?"
  • "Recall any Beside context related to the launch checklist before drafting this reply."

That’s the product promise made literal: the agent answers from your actual work.

Step 6 — Add a hook for proactive surfacing

Follow-ups are the easiest valuable hook to enable. Make sure it’s on:

hooks:
  enabled: true
  plugins:
    - { name: calendar, enabled: true }
    - { name: followups, enabled: true }

Now anything that looks like an open thread in Slack, Teams, Gmail, Outlook, or Apple Mail gets stored as a followup record and rendered on the desktop dashboard.

For a domain-specific watcher — say "any pricing decision mentioned this week" — add an inline definition (no plugin required):

hooks:
  definitions:
    - id: pricing.decisions
      title: Pricing decisions
      match:
        inputKinds: [screen]
        apps: [Slack, Mail, Notion]
        textIncludes: [pricing, tier, discount]
      throttleMs: 60000
      promptTemplate: |
        Extract pricing decisions from this screen text and return JSON:
        { "items": [{ "title": "...", "decision": "...", "owner": "..." }] }

        Text:
        {{text}}
      outputCollection: pricing-decisions
      widget:
        id: pricing-decisions
        title: Pricing decisions
        builtin: list
        defaultCollection: pricing-decisions
        placement: dashboard-aside

Reload, work normally for an hour, and a Pricing Decisions widget will start populating.

Step 7 — Decide what to keep on disk

Out of the box Beside keeps frames forever and tiers screenshots down. For a faster, smaller install:

storage:
  local:
    retention_days: 180
    vacuum:
      compress_after_minutes: 30
      compress_quality: 35
      thumbnail_after_days: 14
      delete_after_days: 60

Memory chunks (the agent-facing rows) and the wiki on disk are unaffected; you’re just compressing or removing the older raw screenshot bytes.

Step 8 — Make it durable

If you’re running headless, wire beside start into a launchd plist (~/Library/LaunchAgents/so.beside.plist) or a systemd unit. The desktop app starts on login automatically.

For backups: the entire product state is ~/.beside/. Snapshot it with your usual tool. To migrate to a new machine, copy the directory and run beside doctor to confirm permissions.

Where this leaves you

You now have:

  • Local capture you trust, with explicit exclusions.
  • A self-organising Markdown wiki under ~/.beside/index/, mirrored to ~/.beside/export/markdown/ for any tool that reads Markdown.
  • An MCP server feeding your agent of choice with grounded context.
  • One built-in hook (follow-ups) and one custom hook (pricing decisions), both visible on the dashboard.
  • A storage policy that won’t silently fill your disk.

From here, the natural next steps are: write an export plugin that pushes pages into your team wiki, or a custom capture hook that watches for the specific moments your team keeps losing track of.