No description
  • TypeScript 81.2%
  • Shell 8.6%
  • Dockerfile 3.9%
  • JavaScript 3.3%
  • Just 2.4%
  • Other 0.6%
Find a file
wuast94 9bf88e4509
All checks were successful
Release / Analyze (push) Successful in 39s
Release / Build (push) Successful in 11m51s
Release / Release (push) Successful in 15s
Merge pull request 'chore: lock file maintenance' (#505) from updatarr/lock-file-maintenance-a692014015 into main
2026-08-14 14:26:39 +02:00
.devcontainer chore: update debian packages 2026-07-11 15:49:54 +02:00
.forgejo/workflows chore: update github actions 2026-07-31 10:40:57 +02:00
.windsurf fest(regex): regenerate Drizzle migrations and improve local development setup 2026-01-18 01:08:35 +01:00
docs/security chore: remove dependency-track sbom tooling 2026-07-08 19:32:35 +02:00
drizzle feat(database): add configurable schema initialization strategy with auto-detection 2026-05-06 21:15:32 +02:00
scripts chore: remove dependency-track sbom tooling 2026-07-08 19:32:35 +02:00
src fix: avoid synchronous preview state effect 2026-05-17 02:20:42 +02:00
tests chore: remove dependency-track sbom tooling 2026-07-08 19:32:35 +02:00
.bun-version fix: use packaged Geist fonts for builds 2026-05-14 21:28:00 +02:00
.dockerignore fix(docker): correct Debian package pins 2026-06-19 06:19:01 +02:00
.gitignore chore: remove dependency-track sbom tooling 2026-07-08 19:32:35 +02:00
.updatarr.yaml fix(deps): enforce TypeScript compatibility in Updatarr 2026-07-23 14:25:10 +02:00
AGENTS.md fix(core): migrate from Phoenix/Elixir to Next.js/Bun project instructions 2026-05-05 23:15:49 +02:00
bun.lock chore: lock file maintenance 2026-08-14 14:12:36 +02:00
CHANGELOG.md chore(release): v1.5.6 [skip ci] 2026-05-10 15:08:31 +00:00
CLAUDE.md ci: remove VERSION/CHANGELOG commits and create releases via API instead 2026-05-13 14:22:15 +02:00
cliff.toml ci: standardize forgejo workflows 2026-06-21 18:10:50 +02:00
CONTRIBUTING.md fix(core): migrate from Phoenix/Elixir to Next.js/Bun project instructions 2026-05-05 23:15:49 +02:00
docker-compose.local.yml chore: update postgres to 18.6-alpine 2026-08-13 23:12:53 +02:00
docker-compose.yml fix(docker-compose): use harbor image instead of local build and remove env_file 2025-12-06 03:46:12 +01:00
Dockerfile chore: update debian packages 2026-07-11 15:49:54 +02:00
drizzle.config.js fix(init): inmit 2025-12-06 00:01:57 +01:00
eslint.config.mjs chore(deps): support eslint 10 2026-05-15 01:19:57 +02:00
Justfile chore: remove dependency-track sbom tooling 2026-07-08 19:32:35 +02:00
next.config.ts fix(init): inmit 2025-12-06 00:01:57 +01:00
package.json chore: update npm dependencies 2026-08-11 15:55:51 +02:00
postcss.config.mjs fix(init): inmit 2025-12-06 00:01:57 +01:00
README.md feat(database): add configurable schema initialization strategy with auto-detection 2026-05-06 21:15:32 +02:00
renovate.json fix(deps): match TypeScript peer range 2026-07-23 09:46:24 +02:00
start.js feat(database): add configurable schema initialization strategy with auto-detection 2026-05-06 21:15:32 +02:00
tsconfig.json fix(core): migrate from Phoenix/Elixir to Next.js/Bun project instructions 2026-05-05 23:15:49 +02:00
tsconfig.worker.json chore(deps): update dependency eslint to v9.39.4 2026-05-02 16:45:36 +02:00
VERSION chore(release): v1.5.6 [skip ci] 2026-05-10 15:08:31 +00:00

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 POST to the configured URL and custom headers.
  • Matrix Room: sends only the Matrix m.room.message content with PUT to 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