# Ganeti Publications

As part of the open source community, the Ganeti Engineering Teams frequently speaks at conferences and publishes material in journals/magazines/etc. Below is a list of previous and upcoming publications of the Ganeti project.

# List of talks and publications

  * Ganeticon 2015: [slides](http://ganeticon.org/)
  * Ganeticon 2014: [slides](https://sites.google.com/site/ganeticon/home/ganeticon2014?pli=1)
  * FrOSCon 2014: [slides](http://downloads.ganeti.org/presentations/froscon-2014.pdf), [recording](http://cdn.media.ccc.de/events/froscon/2014/mp4/froscon2014-1303-EN-Ganeti_h264-hq.mp4)
  * Linuxtag 2014: [slides](http://downloads.ganeti.org/presentations/linuxtag-2014.tar), [recording](http://video.fosdem.org/2014/UD2120_Chavanne/Sunday/Ganeti_the_NewArcane.webm)
  * FOSDEM 2014: [slides](http://downloads.ganeti.org/presentations/fosdem-2014.tar)
  * LISA 2013: [slides](https://code.google.com/p/ganeti/downloads/detail?name=lisa-2013-ganeti.tar#makechanges), no recording
  * LinuxCon/CloudOpen Europe 2013: [slides](http://events.linuxfoundation.org/sites/events/files/slides/LinuxCon.pdf), [video](http://www.youtube.com/watch?v=v0NpwjXEvyQ)
  * LinuxCon North America: 2013 [slides](http://people.debian.org/~ultrotter/talks/20130917_linuxconna13/ganeti_talk.html)
  * Ganeticon 2013: [website](https://sites.google.com/site/ganeticon/)
  * FrOSCon 8/2013: [slides](https://code.google.com/p/ganeti/downloads/detail?name=froscon2013.pdf#makechanges)
  * LinuxCon Japan 2013: [slides](http://people.debian.org/~ultrotter/talks/20130531_linuxconjp13/ganeti_talk.html), no recording
  * FOSDEM 2013: [slides](http://people.debian.org/~ultrotter/talks/20130202_fosdem13/ganeti_talk.html), no recording
  * LISA 2012 talk: [recording](https://www.usenix.org/conference/lisa12/ganeti-your-private-virtualization-cloud-way-google-does-it)
  * LISA 2012 tutorial: [slides](http://people.debian.org/~ultrotter/talks/20121208_lisa12tutorial/), no public recording
  * FISL 2012: [recording](http://hemingway.softwarelivre.org/fisl13/high/40t/sala40t-high-201207281400.ogg)
  * FOSDEM 2012 virt: [slides](http://people.debian.org/~ultrotter/talks/20120205_fosdem12virt/), no recording
  * FOSDEM 2012 main: [of the code we always have e0205_fosdem12main/ slides](http://people.debian.org/~ultrotter/talks/2012nt), [recording](http://video.fosdem.org/2012/maintracks/janson/ganeti.webm)
  * Debconf 2012: [recording](http://meetings-archive.debian.net/pub/debian-meetings/2012/debconf12/high/854_Ganeti_how_you_can_use_it_+_how_we_did_it.ogv)
  * LinuxCon 2011: [slides](http://events.linuxfoundation.org/archive/2011/linuxcon-europe/trotter)
  * Xen Summit 2011: [slides](https://code.google.com/p/ganeti/downloads/detail?name=XenAtGoogle2011.pdf&can=2&q=)
  * FISL 2010: [slides](https://ganeti.googlecode.com/files/ganeti-evolution-2010.pdf)
  * Xen Summit 2008: [slides](https://code.google.com/p/ganeti/downloads/detail?name=Ganeti_XenSummit_Asia_2008.pdf&can=2&q=)
  * FISL 2008: [recording](http://www.youtube.com/watch?v=GcyNBVbV2JI)
  * LISA 2007: [recording](http://static.usenix.org/media/events/lisa07/tech/mp3/trotter.mp3)


# Planned talks

Upcoming talks to be posted here.

  * (currently none)