Conjure is a Rails app for building visual presentation decks with AI. You define a visual world, write slide prompts, generate multiple image variations per slide, pick finalists, refine them, and export the finished deck.
It is a standard Rails 8 app with SQLite, Hotwire, Tailwind, Solid Queue, Solid Cable, and Active Storage. No Redis is required for local development.
- Ruby: tested here with
ruby 4.0.1 - Bundler
- SQLite3
- A Gemini API key for image generation
- Optionally, a Gemini API key for text generation
The repo now pins Ruby 4.0.1 in .ruby-version, and this README was verified against that version.
git clone <your-fork-or-this-repo-url>
cd conjure
bin/setup --skip-server
bin/devThen open http://localhost:1618.
Notes:
bin/setupinstalls gems, generatesconfig/active_record_encryption.key, prepares the database, and clears logs/tmp files.- Plain
bin/setupwill start the dev stack for you at the end.--skip-serveris useful if you want the explicit two-step flow above. - Always use
bin/dev, notrails s. It starts three processes via foreman: the Rails server, the Tailwind watcher, and the Solid Queue job worker. Runningrails salone means background jobs (image generation) won't process and Turbo Stream updates won't arrive — generated images will appear broken until you refresh. - If
foremanis missing,bin/devinstalls it automatically.
On first boot, Conjure redirects you to Settings until an image-generation key is configured.
Use these fields:
| Setting field | Required | Used for | Notes |
|---|---|---|---|
Nano Banana 2 API key |
Yes | Gemini image generation | This is the key the app requires before you can use the rest of the UI. |
LLM API key |
No, but recommended | Gemini text generation | Used for outline-to-slides and prompt assembly. |
Important details:
- The image-generation path uses Gemini image generation (
gemini-3.1-flash-image-preview). - The text-generation path currently also calls Gemini (
gemini-3-flash-preview). - If your Gemini key has access to both image and text models, you can use the same key in both fields.
- If you leave the LLM key blank, the app still works, but it falls back to simpler behavior:
- outline generation degrades to splitting lines into slides
- prompt assembly degrades to concatenating the grimoire and slide text
API keys are stored in the app database using Active Record Encryption. The local encryption key file at config/active_record_encryption.key is generated by bin/setup and is gitignored.
To load sample grimoires and a sample project:
bin/rails db:seed- Open Settings and add your API keys.
- Open Grimoire library and create or edit a grimoire. A grimoire is the visual theme for a deck.
- Create a Project and choose a grimoire.
- In Incantations, add slides manually or use Generate from outline.
- Click Conjure in the project sidebar and choose how many variations per slide you want.
- In Visions, review generated images and select one winner per slide.
- In Final cut, refine selected slides if needed and export the deck.
Conjure currently supports:
- Export to Figma: downloads a ZIP of selected slide PNGs
- Export PDF: downloads a PDF of selected slides
- Export project: downloads a ZIP with grimoire text, slide text, prompts, metadata, and generated images
Export PDF is only fully useful once every slide has a selected vision.
# initial setup without starting the dev server
bin/setup --skip-server
# start the local app
bin/dev
# reset the local database during setup
bin/setup --reset --skip-server
# load sample data
bin/rails db:seed
# run the test suite
bundle exec rspecRun:
bin/setup --skip-serverThat generates the local encryption key file the app needs in order to store encrypted API keys.
Remove the stale PID file and start again:
rm -f tmp/pids/server.pid
bin/dev- Make sure the image key is set in Settings
- Add the optional LLM key if you want better outline parsing and prompt assembly
- Keep in mind that total image calls scale with
slides × variations
- Local databases and uploaded/generated files live under
storage/ - Generated images are stored with Active Storage
- Background jobs run through Solid Queue
- Real-time generation updates are pushed with Turbo Streams