Self-hosted dashboard and pipeline for turning playlists, RSS feeds, articles, and PDFs into concise Markdown notes and a weekly email digest.
AcidPulse is designed for a small home server or NAS as the always-on orchestrator, with summaries generated by a local Ollama instance running elsewhere on your LAN.
- Monitor YouTube playlists and RSS/Atom feeds.
- Add ad-hoc URLs for YouTube videos, articles, remote PDFs, and uploaded PDFs.
- Summarize content with local Ollama models.
- Classify summaries as
news,tech, ordeep. - Write Obsidian-ready Markdown notes with YAML frontmatter.
- Send a weekly HTML email digest.
- Manage sources, queue, settings, and logs from a LAN dashboard.
Home server / NAS
- Docker container
- FastAPI dashboard
- APScheduler jobs
- SQLite state
- Source discovery and content extraction
- Obsidian Markdown writer
Ollama host
- Any reachable machine running Ollama
- Exposes Ollama HTTP API on the LAN
If Ollama is offline, discovery can still run and queued items are processed later.
- Clone the repository.
git clone <repo-url> acid-pulse
cd acid-pulse- Create runtime folders and config.
mkdir -p data obsidian
cp .env.example .env- Edit
.env.
Important values:
IMAGE_NAME=ghcr.io/infinition/acid-pulse:latest
HOST_BIND_IP=127.0.0.1
HOST_WEB_PORT=8765
HOST_DATA_DIR=./data
HOST_OBSIDIAN_DIR=./obsidian
OLLAMA_HOST=http://your-ollama-host:11434
OLLAMA_MODEL_SUMMARY=qwen2.5:14b
OLLAMA_MODEL_CLASSIFIER=llama3.1:8b
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
MAIL_TO=For LAN access, set HOST_BIND_IP to your server or NAS LAN IP. Keep it as 127.0.0.1 for local-only access.
- Start the container.
docker compose pull
docker compose up -d- Open the dashboard.
http://<host>:8765
The default Compose file uses the published GHCR image:
ghcr.io/infinition/acid-pulse:latest
Available tags are created by GitHub Actions:
lateston the default branch;- branch tags such as
main; - version tags such as
v1.0.0; - immutable
sha-...tags.
For local development builds, use the dev override:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --buildThe repository includes a GitHub Actions workflow at:
.github/workflows/docker-publish.yml
On pushes to main or master, and on v*.*.* tags, it builds and pushes the Docker image to:
ghcr.io/infinition/acid-pulse
No extra registry secret is required when publishing from the same GitHub repository. The workflow uses the built-in GITHUB_TOKEN with packages: write permission.
After the first publish, check the package visibility in GitHub Packages. GHCR packages can be private by default depending on repository/account settings.
AcidPulse does not run LLMs inside the container. It calls an existing Ollama server over HTTP.
Example setup on the Ollama machine:
ollama pull qwen2.5:14b
ollama pull llama3.1:8bMake sure the Ollama API is reachable from the Docker host. Test from the host:
curl http://your-ollama-host:11434/api/tagsYou can change the Ollama host and model names from the dashboard CONFIG tab.
Tabs:
OVERVIEW: metrics, live feed, manual batch and digest buttons.QUEUE: item status, retry, and delete actions.SOURCES: monitored YouTube playlists and RSS feeds.INGEST: ad-hoc URLs, bulk URLs, and PDF upload.EVENTS: full event log.CONFIG: Ollama, YouTube API fallback key, SMTP, schedules, and behavior settings.
Configured through .env or the CONFIG tab:
DAILY_CHECK_HOUR: daily source discovery hour.RSS_CHECK_INTERVAL_MIN: RSS discovery interval.WEEKLY_DIGEST_DAY: digest day.WEEKLY_DIGEST_HOUR: digest hour.MAX_ITEMS_PER_RUN: max queued items processed per batch.
AcidPulse uses yt-dlp for playlist discovery and transcripts. YouTube captions can rate-limit (HTTP 429) if retried too aggressively. The app includes backoff behavior for this.
Optional:
YOUTUBE_API_KEY: used only as a fallback for playlist discovery through the YouTube Data API.YT_COOKIES_PATH: optional cookies file for private or age-gated content.
A simple YouTube Data API key does not provide public transcripts. If captions are unavailable or rate-limited, a future audio transcription backend such as Whisper can be added.
The manual and scheduled digest use SMTP settings from CONFIG or .env.
The dashboard logs each mail stage:
- collect done items from the last 7 days;
- validate SMTP config;
- connect to SMTP;
- start TLS;
- authenticate;
- send message.
Some providers no longer support basic SMTP authentication. In that case, use a provider that supports app passwords/API-key SMTP, or add a provider-specific OAuth/Graph backend.
Markdown notes are written under:
<HOST_OBSIDIAN_DIR>/AcidPulse/
Each note includes frontmatter:
---
title: "..."
kind: youtube
source_url: "..."
author: "..."
published: 2026-04-25
processed: 2026-04-26
duration_s: 1840
word_count: 0
style: tech
tags:
- acid-pulse
- youtube
- tech
---docker exec acid-pulse python -m src.main --stats
docker exec acid-pulse python -m src.main --run-now
docker exec acid-pulse python -m src.main --send-digestInspect the SQLite state:
docker exec acid-pulse sqlite3 /data/state.db "SELECT id,kind,status,title FROM items LIMIT 20"Do not commit:
.envdata/obsidian/cookies.txt- SQLite database files
runtime-config.json- generated ZIP archives
These are ignored by .gitignore.
At idle the container is lightweight: FastAPI, APScheduler, and SQLite. Content fetching is mostly network-bound. LLM summarization runs on your external Ollama host, not inside the container.
MIT License. See LICENSE for details.