Warning
Still work in progress. Not ready for use.
Follow Substack newsletters on Bluesky. This repo contains:
app/— Next.js (App Router) frontend deployed on Vercelflask/— Flask backend service designed for Google Cloud Run
- What it does: Bridges a Substack publication to a Bluesky account using AT Protocol APIs. It can import recent posts, mirror older posts beyond RSS limits, and capture social graph data to improve discovery.
- How it works:
- The Flask service exposes endpoints to create the Bluesky account, import posts, and periodically build updates. It stores metadata in Firebase/Firestore and uses Cloud Tasks for async work.
- The Next.js app provides the UI: a hero grid, browse/search, and a dialog that shows the progress of “mirroring” a newsletter.
- Connect to PDS and implement
createAccount,post,followUser,updateProfile. - Implement Substack Integration
- Implement RSS Check Cron Jobs, Background post imports
- Create Skystack Web App
- List all mirrored accounts from firestore as static json for search (Currently using mock data)
- Connect
createNewsletterto UI - Import Newsletter Social Graphs, create Cloud Task endpoint for background import
- Login with Bluesky
- Implement PDS on GCP Cloud Run using snarfed/arroba instead of VM-based implementation of atproto/pds
- Increase posts mirrored limit from 50 to unlimited
- Implement Substack Notes support as well
- Expand horizon beyond Substack to all blogs? (Not just what's present in RSS Feed, even older posts)
- Backend (Flask)
cd flask
python3 -m venv .venv
source .venv/bin/activate (Or however you like you env setup)
pip install -r requirements.txt
# Copy `.env.example` to `.env`:
cp .env.example .env
set -a
source ../.env
set +a
# Run locally (port 8080)
python app.py- Frontend (Next.js)
cd app
npm install
npm run dev
# open http://localhost:3000Note: The current UI ships with a simulated progress stream. See app/README.md for how to wire the UI to the Flask /createNewsletter streaming endpoint.
- Flask → Cloud Run: Build and deploy the container, set required environment variables, and make the service public. See
flask/README.md. - Next.js → Vercel: Import
app/in Vercel and deploy. Seeapp/README.md.
- Frontend: see
app/README.md - Backend: see
flask/README.md
skystack/
app/ # Next.js frontend (Vercel)
flask/ # Flask backend (Cloud Run)
cd flask
python3 run_tests.pySome tests require real credentials and network access (see flask/tests/ and flask/README.md).
