./target/generated-slides/index.html
Your name here
TODO fill in your own details here
💥 New TLP project (As of last month!)
Open source training material, and the tools to maintain and publish them
Slides! Workshops! Labs! Tutorials!
Come help us!
Duplicated effort
Wisdom of the crowd
IP approved resources
Review of material
Free to reuse or re-purpose under the ALv2
A repo for all protects material
A place to create "official" material
To provide certifications
Content and releases
Ownership?
Licensing is more complex
Is ALv2 the best license for content?
Slide file formats
They do have advantages and neat features
…but lots of disadvantages
Easy to edit
Easy to translate
Real version control
Searchable
Speaker notes / timer
Keyboard navigation
Vertical slides
Simple markup
Styled via CSS
PDF generation
Content goes in src/main
Edit the index.adoc
file in asciidoc
Images go in resources/images
Build with mvn install
HTML in browser
./target/generated-slides/index.html
Self hosted web server
Put your text here
== !
No title
== Slide One
== Slide Two
== Slide Three
image::cat.jpg[Cat, width=50%]
video::sydney.mp4[width=640, start=30, end=60, options=autoplay]
video::dQw4w9WgXcQ[youtube]
video::148751763[vimeo]
sydney.mp4
image::stars.jpg[background, size=cover]
Slide attribute, so different syntax
Place the following immediately before the slide header (ie, the ==
line)
[background-video="sydney.mp4",background-video-loop=true]
== Background Video
Some content
* one
* two
* three
one
two
three
* one
* two
** one
** two
one
two
one
two
[.notes]
--
* your notes go here
* Slides should contain sufficient notes that a reasonably knowledgeable
individual could pick them up and present confidently.
--
HTML pass through
Layout Flex / grid
ASCII to diagrams
=== Next Slide
Use this when you want a 'deep dive' on a topic, or expect additional questions on a particular slide.
This is the next slide
How deep does the rabbit hole go?
:IANAL: I am not a lawyer
with urllib.request.urlopen("https://whimsy.apache.org/public/public_ldap_people.json") as url:
data = json.loads(url.read().decode())
people = data["people"]
print(":committers: " + str(len(people)))
Uses highlight.js
Works for 34 "commonly used" languages.
use Acme::Bleach;
print "Hello world!";
May need to put at the top of your doc:
// Highlight code samples
:source-highlighter: highlight.js
Graduated as a TLP in August 2025
Working with a few projects on content
Did you speak at this conference?
Have some internal training material?
Have slide decks from other conference?
Consider donating
Writer? Work with a project to produce materials.
Designer? Help us make presentations more appealing.
Programmer? Improve the tools and developer experience.
Ask now, see me after the session, or email me at Your email here.