DraftSpring is an open-source automation app for publishing content to Ghost blogs with AI-assisted ideation, outlining, drafting, editing, image generation, human review checkpoints, and scheduled publishing.
It started as a hosted product experiment. We killed the SaaS, kept the useful machinery, and cleaned up the repo so other Ghost users and technical teams can run or fork the app for their own publishing workflows.
DraftSpring helps turn a Ghost blog into a repeatable publishing pipeline:
- Analyze an existing Ghost site or content niche.
- Collect seed ideas, URLs, notes, or prompts.
- Generate article ideas.
- Let a human approve ideas before work continues.
- Build outlines and drafts with configurable AI models.
- Humanize/edit/review the article.
- Generate or attach article images.
- Send review links for approval.
- Publish approved posts to Ghost.
- Track usage/cost and publishing status.
The app has two parts:
backend/— FastAPI API, SQLite persistence, Ghost publishing integration, LLM pipeline, worker process, email, Stripe billing hooks.frontend/— React/Vite dashboard for login, settings, article batches, review workflows, usage, and admin screens.
DraftSpring is open source. The hosted SaaS experiment is retired; this repo is the app source for teams who want to run or adapt the publishing workflow themselves.
You are responsible for deployment, security, billing configuration, and model/API costs.
- Python 3.12+
- Node.js 20+
- npm
- A Ghost site with a Ghost Admin API key
- At least one supported AI provider key for production use
cd backend
python3.12 -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
cp .env.example .env
uvicorn app.main:app --reload --host 127.0.0.1 --port 8223The backend runs migrations automatically on startup and stores local data in ./data/ghostwriter.db by default.
cd frontend
npm install
npm run devBy default the frontend expects the API to be available on the same origin in production. For local development, adjust frontend/src/api/client.js or Vite proxy settings if you run the API on a different port.
In a second backend shell:
cd backend
source .venv/bin/activate
python -m app.worker_mainThe API accepts and schedules work; the worker advances article batches through the pipeline.
Copy backend/.env.example to backend/.env and fill in only the providers you use.
Important defaults:
APP_ENV=developmentuses mock LLM behavior by default.APP_ENV=productionuses live model providers.- Local storage is enabled by default.
- Stripe is optional. Keep Stripe variables empty for in-house use.
See:
docs/configuration.mddocs/ai-models.mddocs/stripe.mddocs/ghost.mddocs/architecture.mddocs/development.md
Current defaults live in backend/app/config.py:
- OpenAI text:
gpt-5.4 - Gemini text:
gemini-2.5-pro - Anthropic text:
claude-sonnet-4-6 - Image generation:
gemini-3-pro-image-previewthrough the Google GenAI SDK
Change them with environment variables:
OPENAI_MODEL_ID=gpt-4.1
GEMINI_MODEL_ID=gemini-2.5-pro
ANTHROPIC_MODEL_ID=claude-sonnet-4-6See docs/ai-models.md for the exact pipeline/provider behavior.
DraftSpring includes Stripe Checkout, Customer Portal, webhooks, and subscription gating because the original experiment was a hosted SaaS.
If you want to productize it, configure:
STRIPE_SECRET_KEY=...
STRIPE_PRICE_ID=...
STRIPE_WEBHOOK_SECRET=...
STRIPE_TRIAL_DAYS=7If you want to use it internally, leave Stripe empty and remove or bypass subscription gating as described in docs/stripe.md.
No real Cloud Horizon/CofounderGPT production keys are included in this repository. The repo contains environment variable names and fake test placeholders only.
Before deploying your fork:
- Generate your own
ENCRYPTION_KEY. - Use your own Ghost Admin API key.
- Use your own model provider API keys.
- Use your own Stripe/Resend/S3 credentials if enabling those features.
- Never commit
.env, Ghost production config, databases, logs, or uploaded content.
MIT. Use it, fork it, strip it down, or turn it into something better.
Created by the makers of Vacation Tracker and Competitor Tracker.