Academic poster generator that converts Markdown files to beautiful HTML posters with live preview, drag-and-drop editing, and PDF export.
uv pip install -e .
playwright install chromium # Required for PDF export# Create a new poster from a template
postergeist new my-poster --template gradient
# Start the live editor
postergeist serve my-poster/poster.md
# Export to HTML
postergeist export my-poster/poster.md -o poster.htmlPosters are written in Markdown with YAML frontmatter for configuration. Each ## Heading creates a new cell on the poster.
---
title: "My Research Poster"
subtitle: "Optional subtitle"
authors:
- name: Alice Smith
affiliation: "1"
- name: Bob Jones
affiliation: "1,2"
affiliations:
- key: "1"
name: University of Example
- key: "2"
name: Institute of Science
poster:
size: A0-landscape # Paper size (see below)
template: gradient # Built-in or custom theme
columns: [1, 2, 1] # Relative column widths
logos: # One or more logos (top-left)
- images/logo1.png
- images/logo2.png
qr_code: https://example.com # QR code URL (top-right)
qr_label: "Project Page" # Label next to QR code
colors: # Override template colors
primary: "#2d1b69"
secondary: "#e87f24"
fonts: # Override template fonts
heading: Roboto Slab
body: Open Sans
font_scale: 1.0 # Global font scale factor
style: # Override template layout
column_gap: "8mm" # Gap between columns
cell_gap: "3mm" # Gap between cells
cell_padding: "6mm" # Padding inside cells
poster_margin: "12mm" # Outer margin around poster body
header_padding: "8mm 12mm" # Padding inside the header
---Each ## Heading starts a new cell. Use HTML comments to control placement:
## Introduction
<!-- col: 0 -->
Your content here with **bold**, *italic*, and other markdown.
## Results
<!-- col: 1, h: 1.5 -->
This cell is in column 1 with 1.5x height.
## Analysis
<!-- col: 2 -->
Content for the third column.Cell options (in <!-- ... --> comments):
col: N— Place cell in column N (0-indexed)h: N— Relative height (default: 1.0, higher = taller)split: true— Split cell horizontally (use|||to separate halves)
Cells without a title (no ## Heading text) render as content-only, without a header bar.
Create side-by-side content within a single cell:
## Comparison
<!-- col: 0, split: true -->
### Left Side
Content for the left half.
|||
### Right Side
Content for the right half.Standard markdown tables are supported and automatically contained within cells:
| Method | Score | Time |
|--------|-------|------|
| Baseline | 0.75 | 10s |
| **Ours** | **0.95** | **3s** |Inline math with $E = mc^2$ and display math with:
$$\text{Quality} = \frac{\text{PSNR} \times \text{SSIM}}{\text{Time}}$$Rendered via KaTeX.
```mermaid
graph LR
A[Input] --> B[Process]
B --> C[Output]
```Diagrams automatically adapt to the active template's color scheme.
Standard markdown images with automatic captions from alt text:
Alt text is rendered as a caption below the image. Markdown formatting (bold, italic, code) is supported in captions — bold text is highlighted in the primary color.
Display images side by side with captions:
{grid:2:center}

Syntax: {grid:N} or {grid:N:align}
N— Number of images in the grid (2, 3, 4, etc.)align— Vertical image alignment:top,center, orbottom(default:bottom)
Caption formatting: Markdown bold (**text**), italic (*text*), and inline code are rendered in captions. Bold text is highlighted in the primary color.
Image weights: Control relative widths of grid items with {w:N} at the start of the alt text:
{grid:2}

Captions are automatically aligned horizontally across all grid items, regardless of image heights.
| Name | Dimensions |
|---|---|
A0-landscape |
1189 × 841 mm |
A0-portrait |
841 × 1189 mm |
A1-landscape |
841 × 594 mm |
A1-portrait |
594 × 841 mm |
A2-landscape |
594 × 420 mm |
A2-portrait |
420 × 594 mm |
A3-landscape |
420 × 297 mm |
A3-portrait |
297 × 420 mm |
48x36 |
48 × 36 in |
36x24 |
36 × 24 in |
36x48 |
36 × 48 in |
42x30 |
42 × 30 in |
56x36 |
56 × 36 in |
Specify any size with units:
size: 40x30in # inches
size: 1200x800mm # millimeters
size: 100x70cm # centimeters| Name | Description | Fonts |
|---|---|---|
classic |
Traditional academic poster with bold header | DM Sans / Source Serif 4 |
modern-dark |
Sleek dark theme with neon accents and glassmorphism | Oswald / Montserrat |
modern-light |
Light counterpart to Modern Dark with the same fonts and layout | Oswald / Montserrat |
minimal |
Clean white design with subtle borders and elegant typography | Averia Serif Libre / Geist |
gradient |
Vibrant gradient header with rounded cards and soft shadows | Poppins / Lora |
List templates: postergeist templates
Preview any template by adding ?template=NAME to the URL in the browser (e.g., http://localhost:8765/?template=modern-dark).
Create a YAML file next to your poster markdown (e.g., my-theme.yaml) and reference it in frontmatter:
# poster.md frontmatter
poster:
template: my-themeExample my-theme.yaml:
name: "My Custom Theme"
description: "A personalized poster theme"
colors:
primary: "#1a5276"
secondary: "#2ecc71"
accent: "#e74c3c"
background: "#ecf0f1"
surface: "#ffffff"
text: "#2c3e50"
text_light: "#ffffff"
header_bg: "linear-gradient(135deg, #1a5276 0%, #2ecc71 100%)"
cell_border: "rgba(26,82,118,0.2)"
poster_bg: "#ecf0f1"
table_header_bg: "#1a5276"
table_header_text: "#ffffff"
fonts:
heading: "Merriweather"
body: "Lato"
style:
cell_radius: "3mm"
cell_shadow: "0 1mm 4mm rgba(0,0,0,0.1)"
cell_border_width: "0px"
cell_padding: "6mm"
cell_gap: "3mm"
column_gap: "5mm"Any omitted keys fall back to the classic template defaults. Fonts are loaded from Google Fonts automatically.
| Key | Description |
|---|---|
primary |
Cell headings, bold text, key accents |
secondary |
Chart accents, links, active elements |
accent |
Highlights, callouts |
background |
Page background behind cells |
surface |
Cell background color |
text |
Body text color |
text_light |
Header text color (on dark backgrounds) |
header_bg |
Poster header background (supports gradients) |
cell_border |
Cell border color |
poster_bg |
Outer poster frame/border color |
body_bg |
Background between cells and columns (defaults to background) |
table_header_bg |
Table header row background (supports gradients) |
table_header_text |
Table header text color |
| Key | Default | Description |
|---|---|---|
cell_radius |
0px |
Cell corner radius |
cell_shadow |
none |
Cell box shadow |
cell_border_width |
0px |
Cell border width |
cell_padding |
5mm |
Padding inside cells |
cell_gap |
3mm |
Gap between cells in a column |
column_gap |
5mm |
Gap between columns |
poster_margin |
10mm |
Outer margin around the poster body (all sides) |
header_padding |
6mm 10mm |
Padding inside the header (CSS shorthand) |
image_border |
none |
Border around images (useful for dark themes, e.g. 0.3mm solid rgba(255,255,255,0.12)) |
image_radius |
1mm |
Image corner radius |
The development server (postergeist serve) provides a live editor with:
- Drag-and-drop — Reorder cells by dragging their headers
- Cell resize — Drag the bottom edge of cells to adjust height
- Column resize — Drag between columns to adjust widths
- Split cell resize — Drag the divider between split cell halves to adjust proportions
- Split/merge — Split cells into side-by-side halves or merge them back
- Live reload — Edits to the markdown file are instantly reflected
- Preview/Edit toggle — Switch between editing and clean preview modes
All layout changes (reorder, resize, column widths) are saved back to the markdown file automatically.
Click Export PDF in the toolbar to generate a high-quality PDF using Playwright's headless Chromium. The PDF matches the exact poster dimensions with full color fidelity.
Requires Playwright:
playwright install chromiumpostergeist new <directory> [-t template] [--example]
Create a new poster project
postergeist serve <file.md> [--host HOST] [--port PORT] [--preview] [--no-browser]
Start the development server with live editing
postergeist export <file.md> [-o output.html]
Export poster to standalone HTML
postergeist templates
List available built-in templates
Postergeist includes a Claude Code skill that automatically converts academic paper PDFs into posters.
The skill is located at .claude/skills/paper-to-poster/SKILL.md. It's automatically available when using Claude Code in this project.
/paper-to-poster path/to/paper.pdf
/paper-to-poster https://arxiv.org/abs/2408.00653
/paper-to-poster paper.pdf CVPR 2026
The skill accepts:
- Local PDF paths — extracts content and figures directly
- URLs — downloads the PDF first (supports ArXiv abs/pdf links, direct PDF URLs)
- Optional conference name — used as subtitle and to inform style choices
- Extracts text and figures from the PDF using PyMuPDF (handles raster images, vector drawings, and complex LaTeX figures)
- Generates a 3-column poster markdown:
- Column 1 (narrow): Motivation, problem statement, approach overview
- Column 2 (wide): Key results, main figures, visual comparisons
- Column 3 (narrow): Supporting tables, ablations, references
- Reviews the poster against the original paper for accuracy and completeness
- Optimizes whitespace by adjusting cell heights
The generated poster uses all available Postergeist features: split cells, image grids, mermaid diagrams, math equations, blockquotes, and tables.
my-poster/
├── poster.md # Your poster content
├── my-theme.yaml # Optional custom theme
└── images/
├── logo.png
├── figure1.png
└── figure2.png
