The Problem
Social media creators and small businesses lack a unified way to collect their analytics across platforms. Each network (Instagram, TikTok, YouTube, Bluesky) keeps data in its own dashboard, with no clean export path. Manual collection is tedious and error-prone, while third-party analytics tools require uploading credentials to a vendor's cloud.
What This Does
RPSync is a self-hosted Go application that gathers social media statistics into a local PostgreSQL database. The internal/fetcher/ package contains per-platform collectors (instagram.go, tiktok.go, youtube.go, bluesky.go, mastodon.go, telegram.go), each pulling data through the platform's API. A background worker (internal/worker/sync.go) runs scheduled syncs, and the internal/api/handlers/ package exposes a web UI for configuration, dashboard views, and export management.
Data can be pushed to external destinations via the internal/pusher/ package, which supports CSV export (csv.go), NocoDB (noco/), and Notion (notion.go). The application includes full auth (internal/authhelp/ handles password, TOTP 2FA, and WebAuthn passkeys) and a 26-file SQL migration chain in sql/schema/ for schema evolution.
How To Use It
Setup — The README documents two paths. The recommended path is a shell script:
curl -o install.sh https://raw.githubusercontent.com/fluffyriot/rpsync/refs/heads/main/install.sh && sudo chmod +x install.sh && ./install.sh
Manual setup uses Docker Compose. A docker-compose.yml at the repo root defines three services: db (PostgreSQL 16), app (the Go binary built from Dockerfile), and caddy (reverse proxy for HTTPS).
Configuration — A .env file is required with database credentials, ports, and three encryption keys (TOKENENCRYPTIONKEY, OAUTHENCRYPTIONKEY, SESSION_KEY), each generated via openssl rand -base64 32. The internal/config/config.go reads these values.
Running it — After docker compose up -d, access the app at the configured HTTPS port. First-run setup walks through user creation and platform credential configuration through the web UI.
Real-World Use
A photographer with presence on Instagram, YouTube, and Bluesky runs RPSync on a home server. The worker syncs post statistics nightly. The dashboard (templates/index.html) shows cross-platform engagement. Monthly, they trigger a CSV export from the internal/pusher/csv.go path to file a performance report, without ever sending credentials to a third party.
Code Health & Issues
Medium — No tests detected. With 78 Go files covering auth, OAuth flows, and API integrations, the absence of test files is a real risk. The internal/fetcher/ and internal/authhelp/ packages are exactly where unit tests would catch regressions. Medium — No CI pipeline. The .github/ directory contains only FUNDING.yml, no workflow files. There is no automated build, lint, or test gate. Low — Platform API fragility. The fetchers depend on undocumented or unstable endpoints (notably tiktok.go and instagram.go). Without tests or CI, breakage from upstream API changes will surface only at runtime. Low — Auth complexity. The codebase implements password, TOTP, WebAuthn, and OAuth flows. That's a large attack surface for a self-hosted app with no security audit trail visible in the repo.
The Bottom Line
RPSync is a solid self-hosted analytics aggregator for a single user or small team that wants full control over their social media data. The architecture is clean — clear separation between fetchers, storage, and exporters — and the Docker deployment is straightforward. It is not production-grade for multi-user deployments without adding tests and CI, but for personal use it delivers real value today.