# OpenMonitor

> A vendor-neutral, durable web monitoring agent that runs on a schedule, filters search results against custom criteria, and delivers alerts via Slack or webhook.

OpenMonitor is a durable web monitoring agent built by diggerhq and deployed on the OpenComputer serverless agent platform. It runs scheduled searches across any of 13 supported search APIs, filters results against user-defined criteria sentences, and delivers notifications to Slack or a webhook endpoint. The project is open source on GitHub and written in TypeScript with no proprietary framework dependencies.

## What It Is

OpenMonitor is a self-hosted, vendor-neutral alternative to managed web monitoring services like Exa Monitors or Parallel Monitor. Instead of locking you into a single search provider, it accepts whichever search API key you already have — Exa, Parallel, Tavily, Brave, Serper, Firecrawl, Jina, Perplexity, Linkup, You.com, Kagi, Valyu, or Monid — and only that one key is required at runtime. The agent runs as a serverless session on OpenComputer, meaning every scheduled refresh is a durable, inspectable session visible in the OpenComputer dashboard.

## How It Works

The core loop is a plain TypeScript function (`agent.ts`) that, on each step, selects a model and three tools: `list_watches`, `search_watch`, and `deliver`. The managed harness runs the loop. On a daily schedule (09:00 UTC by default), the agent walks every configured watch, queries the selected provider with a date-bounded lookback, applies the optional criteria filter, and delivers results. Key architectural properties include:

- **Durable sessions:** Each run survives restarts; state is managed by the OpenComputer platform.
- **Secret injection at the edge:** Provider API keys are never visible to the agent process or its prompt — they are injected at the outbound network edge.
- **Stable item IDs:** Each result item gets a stable ID per watch and URL, enabling deduplication across runs without a database.
- **Idempotent Slack delivery:** Results are published through an outbox with retries; the stable ID doubles as an idempotency key so re-runs never double-post.

## Configuring Watches

Watches are defined in `opencomputer/agents/monitor/watches.ts`. Each watch is a query string plus an optional `criteria` sentence. When criteria is provided, the agent reads every result against it and drops non-matching items; without criteria, all new results are delivered. The schedule and lookback window are set together in `schedules/refresh.ts`.

## Deployment and Setup Path

OpenMonitor offers two deployment paths:

- **One-click via OpenComputer template:** A deploy button links directly to the OpenComputer template UI, where you set `SEARCH_PROVIDER` and the corresponding API key secret.
- **CLI from a clone:** `git clone`, `npm install`, `opencomputer login`, set the provider env var and secret, then `npm run deploy`.

The homepage also provides a 389-word prompt designed to be pasted into a coding agent (Claude Code, Codex, Grok, OpenCode) that automates the entire setup — installing the CLI, cloning the repo, configuring secrets, editing watches, deploying, and walking through Slack app creation.

Slack integration is per-environment (development and production) and is managed via a `scripts/slack.sh` helper that generates a Slack app manifest, guides through app creation at api.slack.com, and binds the bot to a specific channel.

## Extensibility and Provider Switching

Switching search providers is two commands: set the new provider secret and update the `SEARCH_PROVIDER` environment variable. Adding a new provider means copying an existing provider module, implementing the single `search(query, { since, limit })` interface, and registering it in `providers/index.ts`. The README notes that SerpApi and Google Custom Search are explicitly excluded because they require the API key as a query parameter, which is incompatible with the platform's header-only secret injection model.

## Current Status

The repository was created on 2026-09-05 and last updated the same day, indicating a very recent initial release. The project has no license specified in the repository, one open issue, and one fork at the time of indexing.

## Features
- Vendor-neutral: supports 13 search providers (Exa, Parallel, Tavily, Brave, Serper, Firecrawl, Jina, Perplexity, Linkup, You.com, Kagi, Valyu, Monid)
- Only one search API key required at runtime
- API keys never enter the agent runtime — injected at outbound edge
- Scheduled daily web searches with configurable cron and lookback window
- Per-watch criteria filtering: drops results that don't match a user-written sentence
- Slack delivery with idempotent outbox (no double-posting on re-runs)
- Webhook delivery (one POST per watch with new results)
- Stable item IDs for deduplication across runs without a database
- Durable sessions: every refresh is inspectable in the OpenComputer dashboard
- One-click deploy via OpenComputer template
- CLI-based deployment from a cloned repo
- Coding-agent setup prompt for fully automated installation
- Per-environment Slack connections (development and production)
- Extensible provider interface: add a new provider by implementing one function
- No framework dependencies — plain TypeScript

## Integrations
Exa, Parallel, Tavily, Brave Search, Serper (Google), Firecrawl, Jina Reader, Perplexity Search, Linkup, You.com, Kagi, Valyu, Monid, Slack, OpenComputer, Webhook (generic JSON POST), Claude Code, Codex, Grok, OpenCode

## Platforms
CLI, API, WEB

## Pricing
Open Source

## Links
- Website: https://www.openmonitor.website
- Documentation: https://github.com/diggerhq/openmonitor#readme
- Repository: https://github.com/diggerhq/openmonitor
- EveryDev.ai: https://www.everydev.ai/tools/openmonitor
