Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
788 lines (590 sloc) 29.8 KB

Slide Format

You can break your slides up into sections of however many subdirectories deep you need. ShowOff will recursively check all the directories mentioned in your showoff.json file for any markdown files (.md). Each markdown file can have any number of slides in it, separating each slide with the '!SLIDE' keyword and one or more optional slide styles.

For example, if you run 'showoff create my_new_pres' it will create a new starter presentation for you with one .md file at one/ which will have the following contents:


# My Presentation #

!SLIDE bullets incremental transition=fade

# Bullet Points #

* first point
* second point
* third point

That represents two slides, the first contains just a large title, and the second is faded into view showing the title and three bullets that are then incrementally shown. In order for ShowOff to see those slides, your showoff.json file needs to look something like this:

  "name": "Something",
  "description": "Example Presentation",
  "sections": [

If you have multiple sections in your talk, you can make this json array include all the sections you want to show in which order you want to show them. Template configuration is done in showoff.json as well.

Instead of a hash, you can use a plain string as an entry in the sections section of showoff.json. And if that plain string starts with '#' then it is interpreted not as a filename, but as markdown. This is used for inserting interstitial slides or notes – for instance, Alex Chaffee's Ruby Notes uses it to insert lab instructions between lecture slide sections, which may vary from venue to venue.

You can use angle brackets around the `!SLIDE` keyword and styles, if you'd like. For example:

<!SLIDE bullets incremental transition=fade>

This lets you keep the ability to emit an HTML document from your Markdown source file – say, for a TextMate preview or a GitHub rendering

You can link to specific slides using either a slide number, the name of the slide, or the GitHub style normalized version of the first line of text on the slide. The number can be found in the URL of your browser, and the name is shown in the debug output or in the status bar of the presenter view. Normalized names have all non alpha-numeric characters replaced with a hyphen.

Markdown Format

Showoff renders Markdown format as documented at Many of the rendering engines supported by Showoff provide extensions allowing more formatting options not available in core Markdown. Each engine provides different options and the defaults for each are documented in the Markdown Engine section. The full options supported by each engine can be found in their respective documentations.

Some of the extensions include:


Recognize and parse bare links even when they are not marked up properly.


Parse definition lists, PHP-Markdown style.


Parse strikethrough text surrounded with two ~~ characters.


Parse superscripts after a `^` character.


Parse tables, PHP-Markdown style.


Parse underscored emphasis as underlines. This is _underlined_ but this is still *emphasis*.

Showoff extensions to the language are documented below.

Slide Styles

Some useful styles for each slide are listed below. Many of them can be combined.


centers images on a slide


allows an image to take up the whole slide


sizes and separates bullets properly (fits up to 5, generally)


sizes and separates more bullets (smaller, closer together)


creates a different background for titles


monospaces h1 title slides


for pasted commandline sections (needs leading '$' for commands, then output on subsequent lines)


monospaces everything on the slide


can be used with 'bullets' and 'commandline' styles, will incrementally update elements on arrow key rather than switch slides


changes to a dark background and light text.


make all slide text 80%


make all slide text 70%


on Javascript, Coffeescript, Ruby, and Shell highlighted code slides, you can click on the code to execute it and display the results on the slide


this slide should only appear in the printed version of the presentation


this slide will not appear in the printed version of the presentation


rather than adding a slide to the main presentation, add a slide to supplemental materials. See below.


Render form elements on this slide with a given form ID. See below, and in FORMS.rdoc.


Scales a background image to the largest size that both height and width are onscreen. The default is to completely fill the slide.


This will enlarge all the contents of the slide to the maximum possible size. Caution, this should only be used for slides with just a few words or short phrases!


If you've included videos on the slide, this style will cause them to play when you switch to this slide.


If you tag this slide as an activity, then audience members' presentations will get a toggle button on their slide, and their presentation will stop tracking along until they toggle it to complete. The presenter sees a count of all incompletes in the lower right of their slide preview.

Check out the example directory included to see examples of most of these.

Callout paragraph styles

Several custom “callout” paragraph styles are included. This allows you to highlight points in your presentation, with a callout box and an optional icon. To do this, add .callout or .callout.[style] as the first word of your paragraph, such as:

# Example callout paragraphs

.callout This paragraph will be highlighted with an outlined box. Adding the `.info` modifier adds an info icon.


Font Awesome

Font awesome icons can be included by using [fa-iconname] which creates an <i> tag with the “fa” class and any other classes contained in the [ and ] characters. The “fa-” string needs to be the first thing in the brackets so [fa-smile-o someclass] will render as an <i> tag but [someclass fa-smile-o] will not.

See the Font Awesome project for a list of icons you can use.

Supplemental Materials

Supplemental materials may be created by including supplemental and the name of a type in the <!SLIDE> styles. For example, you might have a slide like

<!SLIDE supplemental exercises>
# Lab ~~~SECTION:MAJOR~~~.~~~SECTION:MINOR~~~: This is a lab
## Objective: Do something
[... slide content ...]

The supplemental materials may be accessed at localhost:9090/supplemental/$type-name. For example, the material described in the example above would be accessed at localhost:9090/supplemental/exercises. If you have slides and supplemental material that are related to one another, they could be contained in the same file. This makes it extraordinarily easy to reorder the presentation.

Slide Transitions

Transitions can be supplied through the use of transition=tname on the !SLIDE definition, where tname is one of the following supported transitions:

  • blindX

  • blindY

  • blindZ

  • cover

  • curtainX

  • curtainY

  • fade

  • fadeZoom

  • growX

  • growY

  • none (this is the default)

  • scrollUp

  • scrollDown

  • scrollLeft

  • scrollRight

  • scrollHorz

  • scrollVert

  • shuffle

  • slideX

  • slideY

  • toss

  • turnUp

  • turnDown

  • turnLeft

  • turnRight

  • uncover

  • wipe

  • zoom

The transitions are provided by jQuery Cycle plugin. See to view the effects and for how to add custom effects.

Slide Backgrounds

A custom per slide background can be set in the slide options. For example:


Unlike image tags on a slide, the path to background images must start from the root of the presentation.

By default, the background will be scaled to completely cover the slide. If you specify the background-fit slide style, then the background will be scaled to the largest size that both height and width fit within the slide.

Language Highlighting

Showoff uses Highlight.js (version 9.2.0) to highlight code blocks. If you begin a code block with *four spaces* and three @-signs followed by a programming language name, that line will be stripped and the rest of the block will become sparkly and colorful. You can uppercase the name if you like, and if you add the `numbers` keyword, it will be rendered with line numbers.

@@@ Ruby
10.times { puts "Whee!" }

With line numbers:

@@@ Ruby numbers
10.times { puts "Whee!" }

To highlight a specific line in your snippet of code, simply prefix it with a *.

@@@ Ruby execute
['one', 'two', 'three'].collect do |item|
  puts item
﹡  puts item.upcase  # This line will be highlighted to call attention to it

Supported languages include:

1c             dts            livescript     ruby
accesslog      dust           lua            ruleslanguage
actionscript   elixir         makefile       rust
apache         elm            markdown       scala
applescript    erb            mathematica    scheme
arduino        erlang         matlab         scilab
armasm         erlang-repl    maxima         scss
asciidoc       fix            mel            smali
aspectj        fortran        mercury        smalltalk
autohotkey     fsharp         mipsasm        sml
autoit         gams           mizar          sqf
avrasm         gauss          mojolicious    sql
axapta         gcode          monkey         stan
bash           gherkin        nginx          stata
basic          glsl           nimrod         step21
brainfuck      go             nix            stylus
cal            golo           nsis           swift
capnproto      gradle         objectivec     taggerscript
ceylon         groovy         ocaml          tcl
clojure        haml           openscad       tex
clojure-repl   handlebars     oxygene        thrift
cmake          haskell        parser3        tp
coffeescript   haxe           perl           twig
cos            hsp            pf             typescript
cpp            htmlbars       php            vala
crmsh          http           powershell     vbnet
crystal        inform7        processing     vbscript
cs             ini            profile        vbscript-html
csp            irpf90         prolog         verilog
css            java           protobuf       vhdl
d              javascript     puppet         vim
dart           json           python         x86asm
delphi         julia          q              xl
diff           kotlin         qml            xml
django         lasso          r              xquery
dns            less           rib            yaml
dockerfile     lisp           roboconf       zephir
dos            livecodeserver rsl

Instructions for adding support for new languages can be found at

Syntax highlighting styles

You can configure the highlighting style used by providing a highlight key in the showoff.json file. For example:

  "name": "Something",
  "description": "Example Presentation",
  "highlight": "agate",

Highlighting styles include:

agate                     atelier-seaside.light        mono-blue
androidstudio             atelier-sulphurpool.dark     monokai
arta                      atelier-sulphurpool.light    monokai_sublime
ascetic                   brown_paper                  obsidian
atelier-cave.dark         codepen-embed                paraiso.dark
atelier-cave.light        color-brewer                 paraiso.light
atelier-dune.dark         dark                         pojoaque
atelier-dune.light        darkula                      railscasts
atelier-estuary.dark      default                      rainbow
atelier-estuary.light     docco                        school_book
atelier-forest.dark       far                          solarized_dark
atelier-forest.light      foundation                   solarized_light
atelier-heath.dark        github-gist                  sunburst
atelier-heath.light       github                       tomorrow-night-blue
atelier-lakeside.dark     googlecode                   tomorrow-night-bright
atelier-lakeside.light    hybrid                       tomorrow-night-eighties
atelier-plateau.dark      idea                         tomorrow-night
atelier-plateau.light     ir_black                     tomorrow
atelier-savanna.dark      kimbie.dark                  vs
atelier-savanna.light     kimbie.light                 xcode
atelier-seaside.dark      magula                       zenburn

Console Windows

If you'd like to show a representation of a console window, you can use the syntax highlight styles of Console and PowerShellConsole. You can also add the class of nochrome if you don't want the window titlebars drawn.

For example:

@@@ Console
root@localhost # echo "This is a console window"


@@@ PowerShellConsole
PS C:\> echo "This is a PowerShell window"


@@@ Console nochrome
root@localhost # echo "This is a console window with no titlebar"


@@@ PowerShellConsole nochrome
PS C:\> echo "This is a PowerShell window with no titlebar"

Rendering Diagrams

Showoff includes the Mermaid diagram renderer, which allows you to describe diagrams with a simple language and style them with CSS. To do so, create a code block using a highlight style of render-diagram.

For example:

@@@ render-diagram
    dateFormat  YYYY-MM-DD
    title Adding GANTT diagram functionality to mermaid
    section A section
    Completed task            :done,    des1, 2014-01-06,2014-01-08
    Active task               :active,  des2, 2014-01-09, 3d
    Future task               :         des3, after des2, 5d
    Future task2              :         des4, after des3, 5d
    section Critical tasks
    Completed task in the critical line :crit, done, 2014-01-06,24h
    Implement parser and jison          :crit, done, after des1, 2d
    Create tests for parser             :crit, active, 3d
    Future task in critical line        :crit, 5d
    Create tests for renderer           :2d
    Add to mermaid                      :1d

See for a syntax tutorial.


Showoff extends Markdown to render a limited subset of form elements. This is mostly useful for polls, quizzes, surveys, etc. See FORMS.rdoc for more complete information.


Presenter Notes

Surround presenter notes with ~~~SECTION:notes~~~ and ~~~ENDSECTION~~~ tags. It will display in the bottom section of the presenter view. The footer on the display window will also display shorter notes. Toggle these with the n key while in the presentation.


This is a presenter note example.


Personal Notes

In some use cases, it's useful to have personal notes that are separate from the presenter notes built into the presentation itself. For example, you might share a presentation repository with others, but would like the ability add your own notes to slides. This can be done by creating a markdown file in the _notes directory of your presentation. The filename should mirror the name of the slide.

For example, if the name displayed in the presenter view status bar was Introduction/About then the personal notes file should be _notes/Introduction/

Handout Notes

Surround handout notes with ~~~SECTION:handouts~~~ and ~~~ENDSECTION~~~ tags. It will display below the slide in the printed version..


This is supplementary material that will appear in the printed version.


Handout notes are best viewed by printing the /print view from your browser. Each slide will be printed on a new page and handout notes will be included below the slide contents. Handout notes can contain any markup that the slide itself can.

Adding Notes Sections

You can add arbitrary section types by simply declaring them on a slide. All sections attached to a slide can be chosen from a flyaway tab widget in the notes field in the presenter. For example, if a slide contained the following notes sections,

This is a presenter note example.

This is supplementary material that will appear in the printed version.

This is an additional notes section that may be chosen from the tab bar.

then the section selector would contain notes, handouts, and guide.

Printing Notes Sections

When printing the presentation, you can choose which notes section to attach below the slides.

# Prints the presenter notes
showoff static print notes

# Prints a section called "guide"
showoff static print guide

By default, the handouts section will be attached. In other words, showoff static print will behave just like showoff static print handouts.

Other Tags


This is the section major number. It is a counter that increments each time a subsection tag is encountered.


This is the section minor number. It is incremented each time it is used and reset each time a subsection tag is encountered.


Includes the content of a file in the _files directory on the slide as code. If the optional filetype is included then the code block will be syntax highlighted appropriately.


Just generates a <div class="pagebreak">continued...</div> HTML snippet which is styled as a hard page break in modern HTML rendering engines.


Generates a Table of Contents using the subsection titles. Some renderers (such as PrinceXML) are able to autonumber the table with links to content.


Places a continuously updating block displaying the live results from the form with the given ID. This is most useful when you're performing a poll or pop quiz during the presentation.


If you want to show a slideshow while you wait to speak, you can run a preshow. Add a _preshow directory to your project (I use a symlink, so I don't have to add all the images into Git), put a bunch of images in the _preshow directory and optionally add a preshow.json file that provides descriptions for any of the images. If you then press 'P' on the display screen at the beginning of your presentation, it will prompt you for a number of minutes until you start. Then it will count down the time until then, flipping through your pictures to entertain the audience in the meantime. Press 'P' again to stop, or wait until the timer runs out.

Your optional <tt>preshow.json<tt> file should be formatted like so:

  "ImageFileName1.png":"Image Title and/or Description",
  "ImageFileName2.jpg":"Image Title and/or Description",

Download Files

Add a line that starts with .download and contains the name of a file in the _files subdirectory of your presentation.

.download file.tar.gz

Once the instructor has viewed the next slide in your presentation, the file listed here will be available to download on the /download page. For example, if the file was referenced on page #42, then the file would be listed when the instructor advances to slide #43.

Note, this means only the next slide, not any subsequent slide.

To share files on an ad-hoc basis, the instructor can simply drop files into _files/share. All files existing in this directory will be listed when students hit the download page. Showoff does not need to be restarted, even if you drop files in here during a presentation.

Showing Plain Old Markdown

If a Markdown file has no !SLIDE keywords, then Showoff will treat every line beginning with a single hash – i.e. every H1 – as a new slide in “bullets” style. Remember that you can't specify classes or transitions in this mode, and as soon as you add one !SLIDE you need them everywhere.

Custom JavaScript

To insert custom JavaScript into your presentation you can either place it into a file (with extension .js) into the root directory of your presentation or you can embed a <script> element directly into your slides. This JavaScript will be executed–as usually–as soon as it is loaded.

If you want to trigger some JavaScript as soon as a certain page is shown or when you switch to the next or previous slide, you can bind a callback to a custom event:


will be triggered as soon as you enter a page


will be triggered when you switch to the next page


will be triggered when you advance to the next increment on the page


will be triggered when you switch to the previous page

These events are triggered on the “div.content” child of the slide, so you must add a custom and unique class to your SLIDE to identify it:

!SLIDE custom_and_unique_class
# 1st Example h1
// bind to custom event
$(".custom_and_unique_class").bind("showoff:show", function (event) {
  // animate the h1
  var h1 = $("h1");
    .slideUp(300, function () { $(this).css({textDecoration: "line-through"}); })

This will bind an event handler for *showoff:show* to your slide. The h1-element will be animated, as soon as this event is triggered on that slide.

If you bind an event handler to the custom events *showoff:next* or *showoff:prev*, you can prevent the default action (that is switching to the appropriate slide) by calling *event.preventDefault()*:

!SLIDE prevent_default
# 2nd Example h1
$(".prevent_default").bind("showoff:next", function (event) {
  var h1 = $("h1");
  if (h1.css("text-decoration") === "none") {
    h1.css({textDecoration: "line-through"})

This will bind an event handler for *showoff:next* to your slide. When you press the right arrow key the first time, the h1-element will be decorated. When you press the right array key another time, you will switch to the next slide.

The same applies to the *showoff:prev* event, of course.

Custom Stylesheets

To insert custom Stylesheets into your presentation you can either place it into a file (with extension .css) into the root directory of your presentation or you can embed a <link> element directly into your slides. This stylesheet will be applied as soon as it is loaded.

The content generated by the slide is wrapped with a div with the class .content like this.

<div ref="intro/01_slide/1" class="content" style="margin-top: 210px;">
<h1>jQuery &amp; Sinatra</h1>
<h2>A Classy Combination</h2>

This makes the .content tag a perfect place to add additional styling if that is your preference. An example of adding some styling might look like:

.content {
  color: black;
  font-family: helvetica, arial;
h1, h2 {
  color: rgb(79, 180, 226);
  font-family: Georgia;
.content::after {
  position: absolute;
  right: 120px;
  bottom: 120px;
  content: url(jay_small.png);

Note that the example above uses CSS3 styling with ::after and the content -attribute to add an image to the slides. Another example might be to customize the Console styling to look more retro:

/* rock it old school */
pre.highlight code.language-console,
pre.highlight code.console {
  color: #ffcc00; /* amber */
  font-weight: bold;

If you would like to use CSS to change the size of your slides from the default of 1024x768, you'll want to use rules such as:

.slide {
    width: 1280px !important;
    height: 800px !important;

You can style individual paragraphs and images by including a class name prefixed with a period as the first word of the text or of the description. For example, a styled paragraph would look like:

.customstyle This is a paragraph of text. It's nothing special except that the
<tt>&lt;p&rt;</tt> tag will have the class <tt>customstyle</tt> applied to it.

A styled image will look like:

![.fancyborder This is a really fancy image](../_images/unicorns_and_rainbows.png)

Custom Fonts

It's easy to use custom fonts in your presentations by including the font files in your presentation directory and referencing them from your stylesheets.

For example, you may have declarations in your stylesheet to define the font you want to use and the file to load the font from. Remember that the path to the font should include the file/ prefix.

@font-face {
	font-family: 'Tibetan Bold';
	src: URL('file/NotoSansTibetan-Bold.ttf') format ('ttf');

@font-face {
	font-family: 'Tibetan';
	src: URL('file/NotoSansTibetan-Regular.ttf') format ('ttf');

Then you can use that named font-family anywhere in your styles.

.content {
  font-family: 'Tibetan';
.content h1 {
  font-family: 'Tibetan Bold';

A good source of fonts covering all languages is the Google Noto Font project.


Templates can come handy if you need more than what you can achieve via CSS. To configure templates you'll have to specify them in the showoff.json by adding an entry called “templates”. This entry is an object where you can specify as many templates as you want. The default template is marked with the “default” key.

  "name": "Something",
  "description": "Example Presentation",
  "templates" : {
      "default" : "tpl1.tpl",
      "special" : "tpl2.tpl"
  "sections": [

If the “default” key is not given, no template will be used for the default slide. If you want to apply a certain layout to a slide you have to specify it in the slide header:

# Header

Template Commands

You can place content anywhere in your template, but you have to explicitly mark the location using a special command:


is replaced by the slide content


is replaced by the current slide number


is replaced by the total number of slides


is replaced by any value (*) from the showoff.json configuration. This can be used to specify an author, venue, etc. A simple example would be ~~~CONFIG:author~~~

The usage of these replacements is not limited to templates, but anywhere in your slides.

Template Hints

You can basically put everything you want into templates, but you should make sure that the CSS is applied fine. The best way to apply a custom layout is to create a container that uses absolute positioning and has width and height set to 100% which are then derived from the parent slide element.

Live code execution

Showoff can execute code from a slide and display the results live for demonstration purposes. To do this, mark your code block with the keyword execute. Any code that Showoff has handlers for can be executed. This includes:

Executed directly in the browser
  • Coffeescript

  • Javascript

Executed on the machine running the Showoff presentation
  • Perl

  • Puppet

  • Python

  • Ruby

  • Shell

See PRESENTATION.rdoc to learn how to define your own handlers to evaluate any language you'd like.

Security: code must exist in a slide file on disk for Showoff to execute it. This doesn't mean that you're immune from attack though. It's possible to create a presentation with embedded Javascript that will automatically call back and execute malicious code on a slide. To help mitigate this attack profile, Showoff must be started with the -x or --executecode flags to enable code execution.

Shell code

@@@ Shell execute
find . -name '*.md'

Ruby code

@@@ Ruby execute
[1,2,3,4].map do |num|
    num * num

If you need supporting libraries when you evaluate Ruby code, you can put Ruby files (*.rb) into the root directory of the presentation and they will be auto-required when the presentation loads.

Editor Support

The “add slide” feature can allow you to add the necessary boilerplate from your editor.

TextMate Bundle
  • !showoff add -t code Check This Code

And your buffer will get

# Check This Code #
    @@@ Ruby

added where your cursor was. Binding this to a keybinding can allow you to add new slides quickly. See the commandline section for interesting Showoff commands.