Make personalized, AI-illustrated storybooks starring your kids, family, and friends.
Add photos of the people in your child's life, and Storybook generates unique illustrated stories featuring them as characters. Each story is one-of-a-kind, with custom illustrations that look like the people your kids know and love.
The easiest way to run your own Storybook is on Railway — one click, no terminal required.
What you'll need:
- A Railway account (~$5/month)
- An OpenRouter API key (for AI story + image generation, ~$1-5/month depending on usage)
- (Optional) An ElevenLabs API key (for reusable ambient loops and sound effects)
That's it! After deploying, the app walks you through setting up your password and API key — no config files or terminals needed.
Your data is private. Stories, photos, and all data stay on your own server. Password protection is required during setup.
Deploy on Fly.io (~$2.40/month, requires CLI)
See docs/deploy-fly.md for a step-by-step guide.
Run with Docker
docker run -d \
-p 3000:3000 \
-v storybook-data:/app/data \
-e DATA_DIR=/app/data \
ghcr.io/gooley/storybook:latestOpen http://localhost:3000 and the setup wizard will guide you through the rest.
| Component | Cost | Notes |
|---|---|---|
| Hosting (Railway) | ~$5/month | Often within free trial credits |
| AI generation (OpenRouter) | ~$1-5/month | Depends on how many stories you make |
| Sound effects (ElevenLabs) | Up to ~$0.50/story | Optional — capped at up to 4 generated clips per story |
| Total | ~$6-10/month | For a typical family making 5-20 stories/month |
OpenRouter lets you choose which AI models to use. Cheaper models work great for most stories.
Is my family's data safe?
Yes. Everything runs on your own server — photos, stories, and data are never shared with anyone. The app requires a password to access. AI models process your prompts but don't store them (see OpenRouter's privacy policy).
How do I get an OpenRouter API key?
See docs/getting-openrouter-key.md for a step-by-step guide with screenshots. It takes about 2 minutes.
Can I use this on a tablet?
Yes! There's an Android companion app designed for e-ink tablets. See android/README.md for build instructions.
What are sound effects?
Stories can include up to two longer ambient soundscape loops (forest sounds, rain, etc.) reused across pages, plus up to two total event sound effects (doors creaking, footsteps, etc.) generated by ElevenLabs. Sound effects are optional — add an ElevenLabs API key in Settings or during setup to enable them. You can generate audio for existing stories from the book debug page.
Architecture
├── android/ # Kotlin/Compose Android app (local-first, syncs to server)
├── server/ # Node.js/Express API (SQLite, image storage)
└── web/ # React SPA (character management, story browser)
Local development
# Server (API on :3000)
cd server && npm install && npm run dev
# Web (dev server on :5173)
cd web && npm install && npm run devEnvironment variables
| Variable | Required | Default | Description |
|---|---|---|---|
DATA_DIR |
No | ./data |
Where SQLite DB and uploads are stored |
OPENROUTER_API_KEY |
No* | — | OpenRouter API key (*can be set via in-app wizard instead) |
ELEVENLABS_API_KEY |
No | — | ElevenLabs API key for sound effects (can also be set via in-app settings) |
AUTH_MODE |
No | local |
local = in-app password auth, external = skip auth (for reverse proxy setups) |
PORT |
No | 3000 |
Server port |
Docker Compose (self-managed)
docker compose up -dSee docker-compose.yml for the full configuration.