Ghostarr automatically collects statistics and content from your media server services (Tautulli, Komga, Audiobookshelf, ROMM, Tunarr) and generates beautiful, responsive newsletters published to Ghost CMS. Keep your users informed about what's trending, new additions, and viewing statistics - all automated!
Perfect for:
- ๐ Homelab owners sharing media with family & friends
- ๐ Media server admins wanting automated reports
- ๐ง Ghost blog owners with media content
- ๐ค Anyone who wants set-it-and-forget-it newsletters
Warning
Vibe Coded Project - This application was built 100% using AI-assisted development with Claude Code.
|
7 homelab services
|
Fully automated
|
Beautiful newsletters
|
- ๐ 5 languages (EN, FR, DE, ES, IT)
- ๐ Light/Dark/Auto themes
- ๐ฑ Fully responsive design
- ๐พ Export/Import configuration
- ๐ Complete history tracking
- Draft only - Review before publishing
- Site only - Blog post without email
- Email only - Newsletter distribution
- Site + Email - Full publication
Inform your users about planned maintenance or incidents:
- Scheduled maintenance - Planned downtime
- Outage / Network issue - Incident communication
- Update / Improvement - New features announcement
- Security - Security-related notices
services:
ghostarr:
image: sharkhunterr/ghostarr:latest
container_name: ghostarr
ports:
- "8080:8080"
volumes:
- ./config:/config
environment:
- TZ=Europe/Paris
- APP_SECRET_KEY=your-secret-key-minimum-32-characters
restart: unless-stoppeddocker compose up -dAccess: http://localhost:8080
docker run -d \
--name ghostarr \
-p 8080:8080 \
-v $(pwd)/config:/config \
-e TZ=Europe/Paris \
-e APP_SECRET_KEY=your-secret-key-minimum-32-characters \
sharkhunterr/ghostarr:latest| Variable | Default | Description |
|---|---|---|
APP_SECRET_KEY |
required | Encryption key (min 32 chars) |
TZ |
UTC |
Container timezone |
APP_LOG_LEVEL |
INFO |
Log level (DEBUG, INFO, WARNING, ERROR) |
PORT |
8080 |
Server port |
- Configure Services - Add your Tautulli, Ghost, and other service credentials
- Test Connections - Validate each service is reachable
- Create a Template - Or use the default newsletter template
- Generate! - Create your first newsletter manually or set up a schedule
Fetches watch statistics, top movies, TV shows, and user activity from your Plex server.
- Open Tautulli โ Settings โ Web Interface
- Copy the API Key
- Enter URL:
http://your-tautulli:8181
Publishes newsletters to your Ghost blog.
- Open Ghost Admin โ Settings โ Integrations
- Add a Custom Integration
- Copy the Admin API Key
- Enter URL:
http://your-ghost:2368
Enriches movies and TV shows with metadata, ratings, and artwork.
- Create account at themoviedb.org
- Generate an API key in account settings
- Only API key needed (no URL)
- ROMM - Game library (URL + username/password or API key)
- Komga - Comics library (URL + API key)
- Audiobookshelf - Audiobooks (URL + API token)
- Tunarr - TV channels (URL only, no auth required)
flowchart TB
subgraph UI["๐ฅ๏ธ Web Interface"]
REACT[React Frontend]
end
subgraph Backend["โ๏ธ FastAPI Backend :8080"]
API[REST API<br/>/api/v1/*]
SCHED[APScheduler<br/>CRON Jobs]
GEN[Newsletter<br/>Generator]
SSE[SSE Progress<br/>Streaming]
end
subgraph Data["๐พ Data Layer"]
DB[(SQLite<br/>Database)]
TPL[Jinja2<br/>Templates]
end
subgraph Services["๐ง External Services"]
TAU[Tautulli]
GHOST[Ghost CMS]
TMDB[TMDB]
ROMM[ROMM]
KOMGA[Komga]
ABS[Audiobookshelf]
TUN[Tunarr]
end
REACT -->|HTTP| API
REACT -->|SSE| SSE
API --> GEN
SCHED --> GEN
GEN --> SSE
API --> DB
SCHED --> DB
GEN --> TPL
GEN -->|Fetch Stats| TAU
GEN -->|Fetch Metadata| TMDB
GEN -->|Fetch Games| ROMM
GEN -->|Fetch Comics| KOMGA
GEN -->|Fetch Books| ABS
GEN -->|Fetch Channels| TUN
GEN -->|Publish| GHOST
sequenceDiagram
participant User as ๐ค User
participant UI as ๐ฅ๏ธ Frontend
participant API as โ๏ธ Backend
participant Services as ๐ง Services
participant Ghost as ๐ป Ghost
User->>UI: Click "Generate"
UI->>API: POST /newsletters/generate
Note over API: Create History Entry
API-->>UI: generation_id
UI->>API: SSE /progress/{id}
loop For Each Enabled Source
API->>Services: Fetch Data
Services-->>API: Movies, Shows, Games...
API-->>UI: Progress Update
end
Note over API: Render Jinja2 Template
API-->>UI: Progress: Rendering
API->>Ghost: POST /ghost/api/admin/posts
Ghost-->>API: Post Created
Note over API: Update History
API-->>UI: Progress: Complete
UI-->>User: โ
Newsletter Published!
flowchart LR
subgraph Triggers["โฐ Triggers"]
CRON[CRON Schedule]
MANUAL[Manual Execution]
end
subgraph Actions["๐ Actions"]
GEN_ACT[Generate Newsletter]
DEL_ACT[Cleanup Old Entries]
end
subgraph Results["๐ Results"]
HISTORY[History Entry]
GHOST_POST[Ghost Post]
DELETED[Deleted Records]
end
CRON --> GEN_ACT
CRON --> DEL_ACT
MANUAL --> GEN_ACT
MANUAL --> DEL_ACT
GEN_ACT --> HISTORY
GEN_ACT --> GHOST_POST
DEL_ACT --> HISTORY
DEL_ACT --> DELETED
Ghostarr is fully translated into 5 languages:
๐ฌ๐ง English โข ๐ซ๐ท Franรงais โข ๐ฉ๐ช Deutsch โข ๐ช๐ธ Espaรฑol โข ๐ฎ๐น Italiano
Change language anytime from Settings โ General.
| Layer | Technologies |
|---|---|
| Backend | Python 3.11 โข FastAPI โข SQLAlchemy โข Alembic โข APScheduler |
| Frontend | React 18 โข TypeScript โข Tailwind CSS โข Vite โข Radix UI |
| Data | SQLite โข Zustand โข React Query |
| DevOps | Docker โข GitLab CI |
| Path | Content |
|---|---|
/config/data.db |
SQLite database (settings, history, schedules) |
/config/templates/ |
Custom newsletter templates |
Ghostarr supports full configuration export including:
- User preferences
- Retention settings
- Service configurations (with encrypted credentials)
Go to Settings โ General โ Export/Import
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Run linting:
npm run lint - Submit a pull request
The Need: Sharing a media server with family and friends is great, but keeping everyone informed about new content, viewing stats, and what's trending was tedious โ manual updates, scattered information, no unified communication.
The Solution: Ghostarr was born to automate media server newsletters. Connect your services once, set up a schedule, and let your users discover what's new without you lifting a finger.
The Approach: As a young parent with limited time and no fullstack development experience (neither backend nor frontend), traditional coding wasn't an option. Built entirely through Claude Code using "vibe coding" โ pure conversation, no manual coding required.
Special thanks to the homelab community and all contributors!
MIT License - see LICENSE file for details.
Built with Claude Code ๐ค for the homelab community ๐
โญ Star on GitHub โข ๐ Report Bug โข ๐ก Request Feature





