Draw on slides while presenting, kept as a layer fully separate from the Marp content so the deck stays pure, portable Marp. Presenter tools (D pen, T highlighter, E eraser, X laser, C clear, Esc puts the tool away) with a small floating colour/tool bar shown only when a tool is active. Strokes use coordinates normalized to the 16:9 slide so they render identically on the laptop and the beamer; in dual-screen mode the ink and the laser are mirrored live to the audience window. Persistence (decoupled from the .md): - In memory the layer is keyed by Slide.id (stable within a session). - On disk it lives in a sidecar <name>.ink.json next to the deck and as a separate entry inside the .ocideck package; the markdown is untouched. - Because slide ids are regenerated on load, the sidecar anchors strokes by order + a content fingerprint, re-attaching them after reordering and dropping them when a slide's content changed. - Deck.annotations carries the layer in memory but is never serialized to markdown; deckProvider.setAnnotations keeps it out of undo/redo. flutter analyze is clean, all tests pass (incl. new stroke/codec tests), and the macOS debug build compiles. Drawing and live beamer sync still need verification on real hardware. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| android | ||
| assets | ||
| docs | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| test | ||
| third_party | ||
| web | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| Makefile | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
OciDeck
A desktop application for building Marp presentations through a structured, slide-by-slide editor — no raw Markdown wrangling required. Compose decks from typed slide templates (title, bullets, quotes, tables, images, video, audio), preview them live, present them fullscreen, and export to Marp Markdown, PDF, and PPTX.
Built with Flutter for macOS, Windows, and Linux.
Features
- Structured slide editors — dedicated editors per slide type: title, bullets, two-column bullets, bullets + image, single/two images, quote, table, section divider, image-only, video, audio, and free-form Markdown.
- Live preview — see each slide rendered as you edit, with inline Markdown, footers, and TLP (Traffic Light Protocol) marking. Free-Markdown slides render fenced code with syntax highlighting and
$…$/$$…$$LaTeX math. - Fullscreen presenter — keyboard-driven navigation, presenter view, and a slide-grid overview.
- Media handling — drag-and-drop images, an image carousel picker, captions, and descriptions stored as sidecar metadata.
- Import / export — round-trips Marp Markdown, imports existing slides, and exports to PDF, PPTX (with speaker notes), and a self-contained offline HTML deck (code highlighting, math, and mermaid diagrams render in the browser). Decks are saved as a self-contained package with copied assets.
- Productivity — find & replace, slide finder, undo/redo, skip-slide state, multi-select with bulk copy-to-another-deck / delete / skip, and tabbed multi-deck editing.
Ctrl/Cmd+Oopens,Ctrl/Cmd+Ssaves. - Crash recovery — automatic snapshots so work survives an unexpected exit.
- Theming — a bundled Marp CSS theme (
assets/themes/ocideck.css) and a bundled EB Garamond font (no network fetch).
Requirements
- Flutter SDK
^3.12.0(Dart 3.12+) - A desktop target enabled: macOS, Windows, or Linux
Getting started
make setup # flutter pub get
flutter run -d macos # or -d windows / -d linux
Development
The Makefile is the entry point for all quality checks. Run make help for the full list.
make check # format check + static analysis + full test suite (the quality gate)
make check-full # check + dependency freshness report
make format # auto-format all Dart code
make analyze # flutter analyze only
make test # full test suite only
Targeted test groups speed up focused work:
| Target | Covers |
|---|---|
make test-contracts |
Markdown generation/parsing, save-load round-trips, field migration |
make test-preview |
Slide rendering, footers, TLP, inline Markdown, text styles |
make test-export |
PDF/PPTX export and project file-save behavior |
make test-state |
Providers, undo/redo, search/replace, settings, recovery |
make test-services |
Image, caption, and description sidecar services |
make test-presenter |
Fullscreen presenter navigation and keyboard shortcuts |
Run make check before pushing — it is the same quality gate (format check,
static analysis, full test suite) you would wire into CI.
Project layout
lib/
models/ # Deck, Slide, Settings data models
services/ # Markdown, export, file, image, caption, recovery, rasterizer
state/ # Riverpod providers (deck, editor, settings, tabs, clipboard)
widgets/ # UI: app shell, panels, dialogs, per-type editors, presenter
theme/ # App theming
State is managed with Riverpod.
File format
Presentations are saved as standard, Marp-compatible Markdown (.md) with a
defined project folder layout and an optional portable .ocideck package. The
full specification — front matter, per-slide markup, style profile, captions,
and the package format — is documented in
docs/FILE_FORMAT.md.
License
All rights reserved. (Update this section if you intend to open-source the project.)