AI Slop Self-hosted GitHub Projects v2 change watcher for LAN/Tailscale deployments.
- Next.js App Router and TypeScript.
- Radix UI primitives.
- Postgres.
- Docker Compose.
- GitHub GraphQL polling.
- Optional GitHub webhook ingestion with signature validation.
- AgentAutomator-backed repository reads with automatic GitHub GraphQL fallback.
- AgentAutomator project policy, daily briefing, PR review, rules lifecycle, and preview-gated remote actions.
- LM Studio OpenAI-compatible summaries, with Codex/OpenCode command fallbacks.
- SMTP email and Telegram notification settings.
docker compose up --buildOpen http://localhost:3000.
The Compose stack exposes only the dashboard on host port 3000. Postgres stays internal to Docker to avoid conflicts with an existing local Postgres on port 5432.
cd app
cp .env.example .env.local
npm install
npm run db:migrate
npm run devYou need Postgres running and DATABASE_URL configured.
Use a classic PAT for GitHub Projects v2 polling. Fine-grained PATs can read private repos, issues, and pull requests, but they do not currently expose the Projects v2 read permission this app needs.
Configured projects are added and edited from the dashboard. The poller supports org and user Projects v2 and records board item changes, issue/PR metadata changes, and the latest issue/PR comments returned by GitHub. The comments-per-issue/PR polling limit is configurable in settings.
Classic PAT checklist:
- Required scopes:
read:projectandrepo. read:projectis needed for Projects v2 GraphQL access.repois needed because your linked repositories are private.- If using an organization with SSO, authorize the token for that org.
- Paste the token into the dashboard settings, then use
Test GitHubbefore running sync.
Fine-grained PATs are not enough for this app until GitHub adds Projects v2 permissions to them. If you see Resource not accessible by personal access token when syncing a project, replace the token with a classic PAT that has repo + read:project.
GitHub App alternative:
- Install the app on the target org/user repositories.
- Grant read access to Projects, Issues, Pull requests, Metadata, and Discussions/comments where applicable.
- Use an installation token as the dashboard GitHub token.
Use any OpenAI-compatible LM Studio endpoint.
Same machine as Docker:
http://host.docker.internal:1234/v1
Server to PC over Tailscale:
http://100.x.y.z:1234/v1
Configure provider order from the dashboard, for example:
lmstudio,codex,opencode,none
Use a Gmail app password, not your normal account password. Typical settings:
SMTP host: smtp.gmail.com
SMTP port: 587
SMTP user: your Gmail address
SMTP password: app password
Create a bot with BotFather, then paste the bot token and target chat ID in the dashboard.
Webhooks are optional for LAN/Tailscale mode. If you expose the app to GitHub or tunnel it, configure this endpoint:
POST /api/webhooks/github
Set the same webhook secret in the dashboard. Supported events are stored as normalized webhook changes, while polling remains the reconciliation source of truth.
GET /api/healthchecks the app database connection.- Dashboard buttons test GitHub and LM Studio connections.
- This app is designed for LAN/Tailscale. No dashboard auth is enabled by default.
- Keep Postgres volume backups if the history matters:
postgres-datacontains the reconstructed event history. - Do not expose LM Studio publicly. If the app runs on a different server, point it at your PC's Tailscale IP.
- For Gmail SMTP, use an app password and keep 2FA enabled.
Current verification commands:
cd app
npm run typecheck
npm test
npm run build
npx -y react-doctor@latest . --verboseFrom the repo root:
docker compose configEnd-to-end smoke test, with Githubers and AgentAutomator already running. The default path does not require a local model or GPU:
node tests/smoke.mjs --with-modelSee tests/README.md for the daemon command and optional environment knobs.
docker compose ps
docker compose logs -f app
docker compose downHealth check:
curl http://localhost:3000/api/healthSee plan.md and plan_status.md for implementation status.