Slidict
Generate presentation source files from a simple conversation.
Slidict is a CLI tool that helps you turn rough ideas into presentations through AI-guided conversations.
Unlike traditional slide generators, Slidict focuses on communication before slide creation.
Features
- Interactive CLI conversation
- Generate slides for Slidev, Marp, Asciidoctor Reveal.js, and other OSS presentation frameworks
- Local-first MVP implemented in Ruby
- Built-in Sinatra server for browsing generated slides from
public/ - OpenAI Compatible API support, so you can point Slidict at OpenAI, Ollama, LM Studio, vLLM, or any other server implementing the same
/chat/completionsendpoint - Presentation structure linter: checks whether a Markdown/Asciidoc deck's structure (not its looks) will land with an audience
Requirements
- Ruby 3.1 or later
Usage
Run the executable directly from this repository:
bin/slidict
Slidict asks a few questions and generates presentation source files. For example, this creates a Marp Markdown deck:
$ bin/slidict --framework marp
What would you like to talk about?
> PDF Difference Monitoring Service
How long is the presentation?
> 5 minutes
Who is the audience?
> Engineering managers
What should the audience remember or do?
> Approve an MVP pilot
Created public/001.md
You can also provide answers non-interactively:
bin/slidict \
--topic "PDF Difference Monitoring Service" \
--duration "5 minutes" \
--audience "Engineering managers" \
--goal "Approve an MVP pilot" \
--framework asciidoctor-revealjs \
--output slides.adoc
Add --publish to also save the generated slides to slidict.io as a draft (requires
slidict auth first). Pass --slide-id to edit an existing draft instead of creating a
new one:
# Create a new draft on slidict.io from the generated slides
bin/slidict --topic "PDF Difference Monitoring Service" --duration "5 minutes" \
--audience "Engineering managers" --goal "Approve an MVP pilot" --publish
# Edit an existing draft (slide #42) instead of creating a new one
bin/slidict --topic "PDF Difference Monitoring Service" --duration "5 minutes" \
--audience "Engineering managers" --goal "Approve an MVP pilot" --slide-id 42
Output files
Choose the framework and output path that match the presentation tool you want to use. If you omit --output, Slidict writes under public/ with the next sequential file name. Use --filename to choose the relative file name under public/; Slidict appends the framework extension when the name has no extension.
# Choose a served file name under public/
bin/slidict --filename product-demo/slides --topic "Product Demo"
Slidev -> public/001.md, public/002.md, ...
Marp -> public/001.md, public/002.md, ...
Asciidoctor Reveal.js -> public/001.adoc, public/002.adoc, ...
Commands
slidict auth
Authenticates the CLI with your GitHub account via the device code flow and saves a
CLI access token to ~/.config/slidict/credentials.json.
bin/slidict auth
slidict slides
Manage your slides on slidict.io using the CLI access token saved by slidict auth.
bin/slidict slides list [--page N]
bin/slidict slides show <id>
bin/slidict slides create [--title TEXT] [--body TEXT | --file PATH] [--body-format asciidoc|markdown] [--visibility public|unlisted|group_only]
bin/slidict slides edit <id> [--title TEXT] [--body TEXT | --file PATH] [--body-format asciidoc|markdown] [--visibility public|unlisted|group_only]
createandeditalways save the slide as a draft. Publishing requires going through the moderation flow on the Web UI; the CLI cannot publish a slide.editonly works on slides that are still drafts; editing an already-published slide must be done from the Web UI.create/editare rate limited to once per minute per user.
Run bin/slidict slides -h for the full list of options.
slidict serve
Serve generated slide files from the local public/ directory with Sinatra. The top
page lists Markdown and Asciidoc slide files below public/, so you can organize
decks in subdirectories such as public/product-demo/slides.md. Any arguments
after serve are passed through to Sinatra.
bin/slidict serve -p 4567 -o 0.0.0.0
bin/slidict --publish and --slide-id (see Usage) wrap this same create/edit
behavior so you can save the slides you just generated straight to slidict.io.
slidict lint
Diagnoses whether a Markdown or Asciidoc slide deck has a structure an audience can actually follow -- not whether it looks nice. Diagnosis only; it does not rewrite the file. Requires an LLM endpoint (see Configuration).
bin/slidict lint talk.md --llm-base-url http://localhost:11434/v1 --llm-api-key ollama --llm-model llama3
[warning] Slide 3: this slide's main point is unclear
[warning] Slide 5: "MCP" is used without first explaining it
[info] Slide 8: the closing slide is weak; consider adding a one-sentence takeaway for the audience
It checks six things across the whole deck:
- Is the audience clear?
- Can the overall point be stated in one sentence?
- Does the deck flow background → problem → solution → result/learning?
- Is any single slide overloaded with information?
- Is jargon used without first explaining it?
- Does the closing slide give the audience a concrete takeaway?
The deck format (markdown or asciidoc) is auto-detected from the file extension;
override it with --format. Run bin/slidict lint -h for the full list of options.
Configuration
Slidict generates slides with an LLM through any OpenAI Compatible API. Configure the target endpoint with environment variables or CLI flags (flags take precedence):
| Environment variable | CLI flag | Default |
|---|---|---|
SLIDICT_LLM_BASE_URL |
--llm-base-url |
(none) |
SLIDICT_LLM_API_KEY |
--llm-api-key |
(none) |
SLIDICT_LLM_MODEL |
--llm-model |
gpt-4o-mini |
If no llm-base-url is configured, Slidict uses its built-in slide template and never
calls an LLM. Once a llm-base-url is set, Slidict always calls that endpoint; if the
request fails, Slidict reports the error and exits without writing a file (no fallback).
You can force the template even when a base URL is configured with --no-llm.
Examples:
# OpenAI
export SLIDICT_LLM_BASE_URL=https://api.openai.com/v1
export SLIDICT_LLM_API_KEY=sk-...
bin/slidict --topic "PDF Difference Monitoring Service" --duration "5 minutes" \
--audience "Engineering managers" --goal "Approve an MVP pilot"
# Ollama (running locally, OpenAI Compatible API)
bin/slidict --llm-base-url http://localhost:11434/v1 --llm-api-key ollama --llm-model llama3
# LM Studio (running locally, OpenAI Compatible API)
bin/slidict --llm-base-url http://localhost:1234/v1 --llm-api-key lm-studio --llm-model local-model
Philosophy
Slidict helps you communicate ideas, not just create slides.
Many presentation tools focus on layouts, themes, and visual design.
Slidict focuses on the message.
Before generating slides, Slidict helps you:
- Clarify your message
- Build a compelling narrative
- Focus on what matters
- Create presentations people remember
Idea
↓
Conversation
↓
Story
↓
Slides
We optimize for communication, not decoration.
Roadmap
- [x] Interactive CLI
- [x] Slide generation
- [x] OpenAI Compatible API support (configurable base URL, so Ollama, LM Studio, and other compatible servers work out of the box)
- [x] Presentation structure linter (
slidict lint)
License
MIT