Skip to content

changedetection.io

Website change monitoring platform. changedetection.io watches any URL for content changes, compares page snapshots, and sends alerts via email, webhooks, Slack, Telegram, and 80+ other notification services. Supports CSS and XPath selectors to target specific page elements for precise change detection.

Architecture

changedetection.io runs in two modes depending on whether the browser sidecar is enabled:

ModeFetch MethodJavaScriptBest For
Without browser (default)Python requests❌ Not executedStatic pages, RSS, APIs, plain HTML
With browserPlaywright + Chromium✅ Full renderingSPAs, React/Vue apps, dynamically loaded content
Choose your fetch mode before deploying

The decision to enable browser.enabled is the most important configuration choice for this chart. Without the browser sidecar, changedetection.io cannot detect changes on JavaScript-rendered pages (single-page applications, lazy-loaded content, price tracking on modern e-commerce sites). With the browser enabled, memory requirements increase significantly — each Playwright worker holds a Chromium instance in memory.

Key Features

  • Plain HTTP monitoring — fast, lightweight fetch for static pages and APIs
  • Playwright browser sidecar — full JavaScript rendering via browserless/chromium
  • CSS and XPath selectors — target specific elements for precise change detection
  • Visual diff — side-by-side content comparison
  • 80+ notification channels — email, webhooks, Slack, Telegram, Gotify, and more
  • REST API — programmatic management of watches and history
  • Persistent storage — SQLite database and all page snapshots on a persistent volume

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install changedetection helmforge/changedetection

OCI registry:

helm install changedetection oci://ghcr.io/helmforgedev/helm/changedetection

Deployment Examples

# values.yaml — changedetection.io without browser sidecar
# Use for: static pages, RSS feeds, plain HTML sites, APIs
changedetection:
  baseUrl: 'https://changes.example.com'
  timezone: 'America/Sao_Paulo'

persistence:
  enabled: true
  size: 10Gi

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: changes.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: changedetection-tls
      hosts:
        - changes.example.com
# values.yaml — changedetection.io with Playwright/Chromium browser sidecar
# Use for: SPAs, React/Vue apps, JavaScript-rendered pages, modern e-commerce
changedetection:
  baseUrl: 'https://changes.example.com'
  fetchWorkers: 4 # Reduce workers to limit concurrent Chromium instances

browser:
  enabled: true

persistence:
  enabled: true
  size: 20Gi # Increase storage for browser-rendered snapshots

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: changes.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Browser mode with explicit resource limits
# Chromium per-instance uses ~300-500MB RAM.
# With fetchWorkers: 4, plan for ~2GB RAM for the browser container.
changedetection:
  baseUrl: 'https://changes.example.com'
  fetchWorkers: 4

browser:
  enabled: true
  resources:
    requests:
      memory: 1Gi
      cpu: 250m
    limits:
      memory: 2Gi
      cpu: 1000m

resources:
  requests:
    memory: 256Mi
    cpu: 100m
  limits:
    memory: 512Mi
    cpu: 500m

persistence:
  enabled: true
  size: 20Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: changes.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Throttled configuration for many watches
# minimumSecondsRecheckTime prevents hammering monitored sites
changedetection:
  baseUrl: 'https://changes.example.com'
  fetchWorkers: 5
  minimumSecondsRecheckTime: '300' # At least 5 minutes between rechecks per watch

persistence:
  enabled: true
  size: 50Gi # Larger PVC for many snapshots over time

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: changes.example.com
      paths:
        - path: /
          pathType: Prefix

Configuration Reference

Core

ParameterTypeDefaultDescription
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.
commonLabelsobject{}Extra labels added to all resources.

Image

ParameterTypeDefaultDescription
image.repositorystringghcr.io/dgtlmoon/changedetection.iochangedetection.io container image.
image.tagstring"0.54.7"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.
imagePullSecretsarray[]Pull secrets for private registries.

changedetection.io Configuration

ParameterTypeDefaultDescription
changedetection.portinteger5000Internal HTTP port.
changedetection.baseUrlstring""Public URL of the instance. Used in notification links.
changedetection.fetchWorkersinteger10Number of concurrent fetch workers. Reduce when using the browser sidecar.
changedetection.minimumSecondsRecheckTimestring""Minimum interval between rechecks in seconds. Empty means no minimum.
changedetection.timezonestring""Container timezone for scheduling and display.
changedetection.extraEnvarray[]Extra environment variables for advanced configuration.
Reduce fetchWorkers when enabling the browser sidecar

The default fetchWorkers: 10 means up to 10 concurrent Chromium instances when browser.enabled: true. Each Chromium instance consumes 300–500 MB of RAM. For most deployments, fetchWorkers: 4 or fetchWorkers: 5 provides a good balance between parallelism and memory usage. Set browser.resources.limits.memory accordingly.

Set baseUrl for clickable notification links

Notification messages sent by changedetection.io include a link back to the watch diff view. If baseUrl is empty, these links will not work. Set it to the public URL of your instance (e.g. https://changes.example.com).

Browser Sidecar

The browser sidecar runs browserless/chromium in the same pod and provides Playwright-based rendering for JavaScript-heavy pages. changedetection.io automatically routes requests through the browser when it is enabled.

ParameterTypeDefaultDescription
browser.enabledbooleanfalseEnable the Playwright/Chromium sidecar container.
browser.image.repositorystringghcr.io/browserless/chromiumBrowser sidecar container image.
browser.image.tagstring"v2.46.0"Browser image tag.
browser.image.pullPolicystringIfNotPresentBrowser image pull policy.
browser.resourcesobject{}Resource requests and limits for the browser container. Set memory limits.
Browser sidecar without memory limits can OOMKill the pod

Without browser.resources.limits.memory, the Chromium sidecar has no memory ceiling. Pages with heavy JavaScript or memory leaks can cause the pod to be OOMKilled. Always set browser.resources.limits.memory when enabling the browser sidecar. Start with 2Gi and monitor actual usage.

Persistence

changedetection.io stores its SQLite database and all page snapshots (HTML content captured on each change) in /datastore. Snapshot volume grows over time based on the number of watches and their history retention.

ParameterTypeDefaultDescription
persistence.enabledbooleantrueEnable a PVC for /datastore (SQLite database + all page snapshots).
persistence.sizestring10GiPVC size. Increase based on number of watches and history retention.
persistence.storageClassstring""StorageClass for the PVC.
persistence.accessModesarray["ReadWriteOnce"]PVC access modes.
persistence.existingClaimstring""Use an existing PVC instead of creating one.
No built-in S3 backup — protect the PVC manually

Unlike other HelmForge charts, changedetection.io does not include a built-in S3 backup CronJob. The PVC contains both the SQLite database and all captured page snapshots. Implement an external backup strategy (e.g. Velero volume snapshots, NFS snapshots, or a custom CronJob) to protect this data.

Service

ParameterTypeDefaultDescription
service.typestringClusterIPKubernetes service type.
service.portinteger80Service port exposed to the cluster.
service.annotationsobject{}Annotations for the Service.

Ingress

ParameterTypeDefaultDescription
ingress.enabledbooleanfalseEnable an Ingress resource.
ingress.ingressClassNamestringtraefikIngress class name.
ingress.annotationsobject{}Annotations for the Ingress (e.g. cert-manager).
ingress.hostsarray[]Ingress host and path rules.
ingress.tlsarray[]TLS configuration (secret name and hosts).

Probes

ParameterTypeDefaultDescription
probes.startup.enabledbooleantrueEnable startup probe.
probes.startup.initialDelaySecondsinteger5Startup probe initial delay.
probes.startup.periodSecondsinteger5Startup probe period.
probes.startup.timeoutSecondsinteger3Startup probe timeout.
probes.startup.failureThresholdinteger30Startup probe failure threshold.
probes.liveness.enabledbooleantrueEnable liveness probe.
probes.liveness.initialDelaySecondsinteger0Liveness probe initial delay.
probes.liveness.periodSecondsinteger15Liveness probe period.
probes.liveness.timeoutSecondsinteger5Liveness probe timeout.
probes.liveness.failureThresholdinteger3Liveness probe failure threshold.
probes.readiness.enabledbooleantrueEnable readiness probe.
probes.readiness.initialDelaySecondsinteger0Readiness probe initial delay.
probes.readiness.periodSecondsinteger10Readiness probe period.
probes.readiness.timeoutSecondsinteger5Readiness probe timeout.
probes.readiness.failureThresholdinteger3Readiness probe failure threshold.

Resources and Security

resources applies to the main changedetection.io container only. Set browser.resources separately for the Chromium sidecar when browser.enabled: true.

ParameterTypeDefaultDescription
resourcesobject{}CPU and memory for the changedetection.io container.
podSecurityContextobject{}Pod-level security context.
securityContextobject{}Container-level security context.

Service Account

ParameterTypeDefaultDescription
serviceAccount.createbooleanfalseCreate a dedicated ServiceAccount.
serviceAccount.namestring""Override the ServiceAccount name.
serviceAccount.annotationsobject{}Annotations for the ServiceAccount.

Scheduling

ParameterTypeDefaultDescription
nodeSelectorobject{}Node selector for scheduling.
tolerationsarray[]Tolerations for scheduling.
affinityobject{}Affinity rules.
topologySpreadConstraintsarray[]Topology spread constraints.
priorityClassNamestring""PriorityClass for the pod.
terminationGracePeriodSecondsinteger30Termination grace period.
podLabelsobject{}Extra labels for the pod.
podAnnotationsobject{}Extra annotations for the pod.

Extra

ParameterTypeDefaultDescription
extraVolumesarray[]Extra volumes to attach to the pod.
extraVolumeMountsarray[]Extra volume mounts for the container.
extraManifestsarray[]Extra Kubernetes manifests deployed alongside the chart.

More Information