Skip to content

gooley/storybook

Repository files navigation

Storybook 📚✨

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.

Deploy Your Own

The easiest way to run your own Storybook is on Railway — one click, no terminal required.

Deploy on Railway

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.

Other Deployment Options

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:latest

Open http://localhost:3000 and the setup wizard will guide you through the rest.

How Much Does It Cost?

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.

FAQ

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.


Development

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 dev
Environment 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 -d

See docker-compose.yml for the full configuration.

About

A photo-inspired AI web and android storybook app

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors