impress.js 1.0 is released!

I have released impress.js v1.0. Impress.js is a framework for creating awesome 3D presentations with standard HTML5 and CSS. (Similar to Prezi + 3D and open source.)

From the release notes:

  • New plugin based architecture allows adding more features without bloating core src/impress.js file
  • Source files are in src/ and compiled into js/impress.js with npm run build. End users should continue to use js/impress.js as before.
  • 19 new plugins
  • Integrates impressConsole.js by default (press 'P' to open speaker console)
  • Markdown support for those that are too much in a hurry to type HTML
  • 5 new demo presentations under examples/ show case the new features
  • Removes the code that prevented impress.js from running on mobile phones

Impress.js was created in 2011-2012 by Bartek Szopka. With the project he was learning and exploring possibilities opened up by the new CSS 3D Transforms. While it required users to create presentations by hand coding HTML and CSS, it quickly became a popular framework for those wanting a bit more wow in their presentations, after 20 years of PowerPoints! Or, as in my case, among those that prefer to use open source software also for their desktop needs. Even after a 5 year relative hiatus, with 33k favorites it's still solidly in the Top 100 favorited Github projects!

After a 0.5 release, Bartek's active development slowed down. While he remained the active maintainer, and would merge incoming contributions, most merged commits from the following years are typo fixes, documentation (good!) and introduction of CircleCI, but without any real tests. There were also many pull requests and feature requests to add more features to the core 3D rendering engine, but they were all stalled due to a common reason: Bartek was planning for a plugin based framework, where features could be added in a modular way, rather than committing more and more code to an ever increasing single .js file. As nobody was working on implementing such a modular framework, progress stalled.

Usage of impress.js continued to grow. Many tutorials and even a book were written. The impress.js wiki also links to many templates, demos and real world presentations by users. As features weren't being merged into impress.js itself, many helper tools and editors like hovercraft and Strut were created to bridge that gap.

I discovered impress.js in 2015. Part of my job as a MongoDB Solutions Architect is to do presentations. I've spoken at many conferences over many years, and in general feel I'm quite a good speaker. MongoDB employs a speaker coach, who encouraged me to pay more attention to my slides. I felt I was already doing that, and after some introspection, I came to the conclusion I was limited by the tool. Since then I have done all of my own presentations in impress.js.

I was also looking to contribute to impress.js, and quickly got the same answer: No contributions until there's a plugin framework. There was supposed to be a Summer of Code project where a plugin framework would be created, and then everything would be awesome. But come September, there was no plugin framework.

Having read some of Bartek's thoughts on the topic, and also the source code itself, I realized that inside the single impress.js file, there already were a couple of plugins hiding. Reading that code, I could understand the idea of using JavaScript events to communicate between otherwise isolated plugins. So I wrote some qunit tests, split off the existing plugins into files under src/plugins/ and added a build system. Autoplay was the first plugin added by myself.

It turned out that taking over a stagnated project can be harder than you'd think. We had good communication with Bartek all the time, but he was no longer active. He was open about that, an it was fine. Even if I now had implemented the plugin framework, who would review it? That's a lot of work too. From a project creators point of view, you can't just hand over the project to the first person who comes asking either, someone without track record. In fact, Bartek did that, but it didn't work out anyway.

When I grew up as a young open source enthusiast, forking a project was considered a bad thing. Sometimes a necessary last resort, but generally something to avoid. Github has turned that around, and forking a repository is now encouraged. Kids these days... I decided to embrace this modern trend, and just continued adding plugins to my fork instead.

2 years later, I had implemented all feature requests in the (upstream) impress.js issue queue. In the case of Pull Requests, I took the code, made changes to make them into a plugin, and committed them with git --author to credit the original contributor. I had also created Impressionist, a 3D visual editor that adds Electron and TinyMCE around impress.js. (Still very early, that project.) My fork and also Impressionist started getting some users of their own.

So we got together with Bartek, and he finally agreed it was time to merge. He stepped up from retirement, and I would feed him my work in small portions. After getting through the major architectural bits, he stepped back again and I continued merging the rest. Due to this process, most of my commits in impress.js are now dated for late 2017, even if most of the work was actually done in 2016!

Today's v1.0 release mostly is the result of that work. There's a toolbar, a speaker console, relative positioning and markdown integration. Ideas and code born around the impress.js community, finally together. What excites me most: Now that there is a plugin architecture, and active maintainership, there are already a couple new plugins being reviewed too! I'm optimistic there will be a 2.0 version, and many more!

While I do presentations for work, working on impress.js code has been my hobby. (I'm actually a backend guy!) But having moved to the MongoDB Engineering department, I've benefited from the "Skunkworks" program where engineers periodically spend 3 days on hobby projects. I've spent my days on impress.js and Impressionist, and would therefore like to thank MongoDB for allowing me to do that.

Add new comment

The content of this field is kept private and will not be shown publicly. Cookie & Privacy Policy
  • No HTML tags allowed.
  • External and mailto links in content links have an icon.
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.
  • Use [fn]...[/fn] (or <fn>...</fn>) to insert automatically numbered footnotes.
  • Each email address will be obfuscated in a human readable fashion or, if JavaScript is enabled, replaced with a spam resistent clickable link. Email addresses will get the default web form unless specified. If replacement text (a persons name) is required a webform is also required. Separate each part with the "|" pipe symbol. Replace spaces in names with "_".
About the bookAbout this siteAcademicAmazonBeginnersBooksBuildBotBusiness modelsbzrCassandraCloudcloud computingclsCommunitycommunityleadershipsummitConsistencycoodiaryCopyrightCreative CommonscssDatabasesdataminingDatastaxDevOpsDrizzleDrupalEconomyelectronEthicsEurovisionFacebookFrosconFunnyGaleraGISgithubGnomeGovernanceHandlerSocketHigh AvailabilityimpressionistimpressjsInkscapeInternetJavaScriptjsonKDEKubuntuLicensingLinuxMaidanMaker cultureMariaDBmarkdownMEAN stackMepSQLMicrosoftMobileMongoDBMontyProgramMusicMySQLMySQL ClusterNerdsNodeNoSQLodbaOpen ContentOpen SourceOpenSQLCampOracleOSConPAMPPatentsPerconaperformancePersonalPhilosophyPHPPiratesPlanetDrupalPoliticsPostgreSQLPresalespresentationsPress releasesProgrammingRed HatReplicationSeveralninesSillySkySQLSolonSunSybaseSymbiansysbenchtalksTechnicalTechnologyThe making ofTungstenTwitterUbuntuvolcanoWeb2.0WikipediaWork from HomexmlYouTube