No description
- TypeScript 81.2%
- Shell 8.6%
- Dockerfile 3.9%
- JavaScript 3.3%
- Just 2.4%
- Other 0.6%
| .devcontainer | ||
| .forgejo/workflows | ||
| .windsurf | ||
| docs/security | ||
| drizzle | ||
| scripts | ||
| src | ||
| tests | ||
| .bun-version | ||
| .dockerignore | ||
| .gitignore | ||
| .updatarr.yaml | ||
| AGENTS.md | ||
| bun.lock | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| cliff.toml | ||
| CONTRIBUTING.md | ||
| docker-compose.local.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| drizzle.config.js | ||
| eslint.config.mjs | ||
| Justfile | ||
| next.config.ts | ||
| package.json | ||
| postcss.config.mjs | ||
| README.md | ||
| renovate.json | ||
| start.js | ||
| tsconfig.json | ||
| tsconfig.worker.json | ||
| VERSION | ||
Deltamon
Web page change detection and monitoring with a visual CSS selector.
Features
- Visual Selector — Click elements on pages to automatically generate CSS selectors
- Change Detection — Monitor pages for content changes with diff generation
- Regex Filtering — Filter content with whitelist/blacklist regex patterns
- Webhooks — Send notifications when changes are detected
- Scheduling — Configurable check intervals per monitor
- Bulk Operations — Manage multiple monitors at once
Quick Start
# Run with Docker
docker run -p 3000:3000 \
-e DATABASE_URL=postgres://user:pass@host:5432/deltamon \
harbor.wuastbude.de/webmon/deltamon:latest
Or with docker-compose:
services:
deltamon:
image: harbor.wuastbude.de/webmon/deltamon:latest
ports:
- 3000:3000
environment:
- DATABASE_URL=postgres://user:pass@host:5432/deltamon
restart: unless-stopped
Configuration
Environment variables:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string |
DATABASE_SCHEMA_STRATEGY |
No | Schema startup mode: auto (default), migrate, push, or none |
PUPPETEER_WS_ENDPOINT |
No | External browser endpoint (e.g., browserless.io) |
Tech Stack
- Next.js 16 — React framework with App Router
- Drizzle ORM — TypeScript ORM for PostgreSQL
- Graphile Worker — Background job processing
- Puppeteer — Headless Chrome for page fetching
- Tailwind CSS + DaisyUI — Styling
Development
# Install dependencies
just setup
# Start development server
just dev
# Run project checks
just check # lint + typecheck
just test # Docker/package/build checks
# Apply database migrations
bun run db:migrate
Building
# Build Next.js
bun run build
# Build worker
bun run build:worker
# Build Docker image
just docker-build
Notification Targets
Deltamon supports two notification target types:
- HTTP JSON: sends the full webhook payload with
POSTto the configured URL and custom headers. - Matrix Room: sends only the Matrix
m.room.messagecontent withPUTto the configured homeserver, room ID, and access token.
Matrix room messages use msgtype: "m.notice" and include the same readable Added/Removed sections as the HTTP JSON payload's message object.
HTTP JSON Payloads
Web Monitor
When content changes are detected on a web page:
{
"monitor": {
"id": "abc123",
"name": "My Monitor",
"url": "https://example.com",
"human_url": "https://example.com/page",
"type": "web"
},
"check": {
"id": "pending",
"checked_at": "2024-01-15T10:30:00Z"
},
"changes": {
"added": "New content that was added",
"removed": "Content that was removed",
"diff": "- Old line\n+ New line"
},
"message": {
"msgtype": "m.notice",
"body": "**My Monitor(https://example.com/page)**\n\n**Added:**\nNew content that was added\n\n**Removed:**\nContent that was removed",
"format": "org.matrix.custom.html",
"formatted_body": "<strong>My Monitor(<a href=\"https://example.com/page\">https://example.com/page</a>)</strong><br><br><strong>Added:</strong><br><pre><code>New content that was added</code></pre><br><strong>Removed:</strong><br><pre><code>Content that was removed</code></pre>"
},
"content": {
"full": "The complete extracted content after applying regex patterns"
},
"metadata": {
"timestamp": "2024-01-15T10:30:00Z",
"app": "Deltamon"
}
}
RSS Monitor
When new articles are detected in an RSS/Atom feed:
{
"monitor": {
"id": "abc123",
"name": "My RSS Feed",
"url": "https://example.com/feed.xml",
"human_url": "https://example.com",
"type": "rss"
},
"feed": {
"title": "Example Blog",
"url": "https://example.com/feed.xml"
},
"new_items": [
{
"id": "https://example.com/post/123",
"title": "New Blog Post Title",
"description": "Short summary of the post",
"content": "Full HTML content of the article (if available)",
"url": "https://example.com/post/123",
"published": "2024-01-15T09:00:00Z",
"authors": ["John Doe", "Jane Smith"]
}
],
"metadata": {
"timestamp": "2024-01-15T10:30:00Z",
"app": "Deltamon",
"new_items_count": 1
}
}
License
MIT