diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..36170a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +public diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..3ea6920 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,15 @@ + +image: monachus/hugo + +variables: + GIT_SUBMODULE_STRATEGY: recursive + +pages: + script: + - hugo + artifacts: + paths: + - public + only: + - master + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..87f1e24 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "themes/reveal-hugo/static/reveal-js"] + path = themes/reveal-hugo/static/reveal-js + url = https://github.com/hakimel/reveal.js.git +[submodule "themes/reveal-hugo/static/highlight-js"] + path = themes/reveal-hugo/static/highlight-js + url = https://github.com/highlightjs/highlight.js.git diff --git a/PITCHME.yaml b/PITCHME.yaml deleted file mode 100644 index bd7a74b..0000000 --- a/PITCHME.yaml +++ /dev/null @@ -1,12 +0,0 @@ -logo : https://ccchb.de/logo/CCCHB-logo_256x256_bw.png -footnote : "Chaos Computer Club Bremen e.V." - -layout : top-left -theme : black -highlight : ir-black -theme-override : custom.css - -transition : none -published : true - -code-line-numbers : true diff --git a/README.md b/README.md index 570306c..27c2739 100644 --- a/README.md +++ b/README.md @@ -1 +1,22 @@ ## Presentations: + +2018: +- [Dezentrales Messaging](https://ccchb.github.io/presentations/decentral_messaging) + +## Create a presentation +Run: `hugo server -D` + +Create a new presentation `content//_index.md` + +Browser: http://localhost:1313/presentations/ + + +## Update +``` +hugo +cd public +git add --all +git commit -m "Publishing to gh-pages" +git push origin gh-pages +cd .. +``` diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..df3860f --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,8 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +outputs: + - "Reveal" +draft: true +--- + diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..884d55c --- /dev/null +++ b/config.toml @@ -0,0 +1,20 @@ +baseURL = "https://ccchb.github.io/presentations/" +languageCode = "en-us" +title = "Presentation from CCCHB" +disableKinds = ["sitemap", "RSS"] +theme = "reveal-hugo" + +[params.reveal_hugo] +history = true +highlight_theme = "qtcreator_dark" +margin = 0.2 +custom_theme = "css/main.css" +transition = "slide" +transition_speed = "fast" + + +[outputFormats.Reveal] +baseName = "index" +mediaType = "text/html" +isHTML = true + diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..f1f8fc1 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,9 @@ +--- +title: "Presentations from CCCHB" +outputs: + - "Reveal" +--- + +# Presentations + +- [Decentrales Messaging](./decentral_messaging) diff --git a/content/decentral_messaging/_index.md b/content/decentral_messaging/_index.md new file mode 100644 index 0000000..fc38d63 --- /dev/null +++ b/content/decentral_messaging/_index.md @@ -0,0 +1,348 @@ +--- +title: "Dezentrale Messenger" +outputs: + - "Reveal" +--- + +

Dezentrale Messenger

+
+

The very last word in instant messaging

+(Motto vom XMPP-Client Converations) + +genofire - Chaos Computer Club Bremen e.V. + +--- + +## Agenda +- Dezentralität +- XMPP - Der Standard +- Software (Client und Server) +- Ist der Hoster gut +- Verschlüsselung +- Ausblick +- Alternativen + +--- + +## Dezentralität +- **Peer-to-Peer** + +Geräte tauschen direkt miteinander Nachrichten aus (ohne eine zentrale Componente) + +- **Federation** + +Kommunikation über zentrale Komponenten + + +{{% note %}} +**P2P** +- Postkasten, jeder kann zum Empfänger gehen und selbst etwas in den Kasten werfen. + (wenn es keine Post gibt) + +**Federation** +- E-Mail (ISP: benutzer@hoster.de) +- Telefonnummern (Addr: hat oftmals die ersten Ziffern für sich reserviert) +{{% /note %}} + +--- + +## Dezentralität + +#### Warum notwendig? + +- Eröffnet ein Wettbewerb +- kleine und viele Angriffsziele + - vor Kriminelle + - vor Regierungen + - alle Überwachen + - blockieren / sperren (Zensur) +- Verringert Missbrauch durch Vertrauen + +{{% note %}} +- _Eröffnet einen Wettbewerb:_ damit fortschritt + (Gewinne gehen zum größten Teile in die USA) + - Entscheidungen: z.B. nur noch auf Englisch, Mark Zuckerberg darf Nachrichten löschen +- _Angriffsziele:_ + - Hacker können nicht alle Server kompromentieren + - Regierungen können nicht + - den Zugang zu allen Servern verlangen (NSA - Snowden) + - alle Server blockieren (Telegram - Russland) +- _Verringert Missbrauch durch Vertrauen_ + - **Auswirkung:** nicht alle Daten können **geklaut** oder **analysiert** werden + - Analysiert zur Manipulation (Werbung oder politisch, siehe Cambridge Analytica) + - **Bei Missbrauch** leichterer Wechsel +{{% /note %}} + +--- + +## Dezentralität + + +#### Nachteile +- Komplexität steigt +- Gewollte Verringerung an Marktanteil +- Kann auch von kriminellen Elementen genutzt werden +- Nutzer müssen sich ggf. sich Ihre Adresse und Passwort sich merken + +{{% note %}} +- _Komplexität steigt:_ Da nicht nur Clients, sondern auch Server untereinander sicher (Ausfall, vertrauensvoll) kommunizieren müssen. +- _kriminellen Elementen:_ wie bei jeder Technologie kann diese auch von Bösen genutzt werden. +- _... sich merken:_ allerdings müssen Sie dies auch für Ihre E-Mail-Adresse, was noch Standard im Internet ist. +{{% /note %}} + +--- +### Extensible Messaging and Presence Protocol (XMPP) + +- Existiert seit 1999 (unter den Namen Jabber) +- IETF Standard seit 2002 + + +- Google Talk 2005 - 2013 (entwickelte Jingle) +- Facebook 2010 - 2014 +- WhatsApp nutzt es intern + +{{% note %}} +- Jingle: + - Aushandlung von Datenverbindung (angelehnt an SIP) + - für: Datenaustausch, Video/Voice-Chat, ... +{{% /note %}} + +--- + +## XMPP +#### Adressierung +JID (Jabber ID) genannt: +``` +node@domain/ressource +``` + +URI-Format: (falls MUC mit `?join` am Ende) + +``` +xmpp:node@domain?join +``` + +{{% note %}} +- MUC (Multi User Chat): Gruppenchat + +**Als User** + +- benutzer@server/gerät + +**In MUC** + +- chatraum@muc-server/nickame + +**Transport** +- ganz unterschiedlich +{{% /note %}} + +--- +## XMPP + +**Message** + +```xml + + Hello World + +``` + +Types: + +- chat +- groupchat +- headline +- normal +- error + +--- +## XMPP + +**Present**: Aktuelle Live Informationen + +```xml + + +``` + +Types: + +- error +- probe +- subscribe(d) +- unavailable +- unsubscribe(d) + +--- +## XMPP + +**IQ** (Instant Query): Abfragen mit Rückantworten + +```xml + + + +``` + +Types: + +- get +- set +- result +- error + +{{% note %}} +- Die Inhalte, die in diesen XML-Elementen drin sind, werden im RFC nicht vorgegeben und kann für viele Funktionen genutzt werden. +{{% /note %}} + +--- + +## Software Clients +#### Empfehlungen: +- Conversations (Android) + - Pix-Art Messenger +- ChatSecure (iPhone) +- Gajim (Desktop) +- ConverseJS (WebClient) +- Viele mehr + - mit [OMEMO](https://omemo.top) + - [alle](https://xmpp.org/software/clients.html) + +--- + +## Software Clients +Bombus - Client in J2ME für normale Telefone +
+ Wikipedia - Article Java +
+ +--- + +## Software Server +- **prosody** in lua + - leicht erweiterbar + - riesige Sammlung an erweiterbaren Modulen (die man nutzen muss) + +- **ejabberd** (Fork: mongooseIM) in erlang + - besitzt alle nötigen Funktionen von Haus aus + - sehr gut gewartet + +- **OpenFire** in Java + +--- + +## Ist der Hoster gut +Tools zum Testen des Servers (Auswahl an Servern) + +- [Compliance](https://compliance.conversations.im/) ([support Alles](https://compliance.conversations.im/api/compliant_servers/) / API) +- [Status](https://status.conversations.im/historical/) für S2S + Uptime + +XEPs: + +- PEP / PubSub +- MAM (für MUC) +- HTTP-Upload +- DNS-SRV for TLS (HTTPS) + +{{% note %}} +- Personal Eventing Protocol: Geolocation, Mood, Activity, Tune +- Message Archive Management: + - Vorteil gegenüber: Threema und WhatsApp (mit OMEMO auch gegenüber Telegram) + - OMEMO: Neue Geräte können alte Nachrichten nicht entschlüsseln +- HTTP-Upload: Offline und in MUC Datenaustausch +- "umgeht" Firewalls +{{% /note %}} + +--- +## XMPP + +### Verschlüsselung +- Off-The-Record +- OpenPGP +- OX +- OMEMO + +Detailert: [here](https://conversations.im/omemo) + +{{% note %}} +- Neben TLS (SSL) +{{% /note %}} + +--- + +## XMPP Verschlüsselung + +- Geräte erstellt **asynchrones** Schlüsselpaar + - öffentlichen Schlüssel wird per PubSub auf dem Server hinterlegt +- Kontakte werden durch PEP / PubSub über neuen Schlüssel informiert + - Dieser muss diesen öffentlichen Schlüssel laden + +{{% note %}} +- synchrone: Entspricht einem Passwort, was allen Gesprächsteilnehmern bekannt ist. + - asynchrone: mathematisches Verfahren mit Schlüsselpaaren (öffentlicher und privater Schlüssel) +- Kontakte = Roster +- den **neuen oder weiteren** öffentlichen Schlüssel + +- Signiert und verschlüsselt +- zurückziehen des Schlüssels +{{% /note %}} + +--- + +
+

Demo

+[Anleitung](https://media.kuketz.de/blog/artikel/2016/conversations/Anleitung_Conversations_V1.1_CC-BY-SA.pdf) +
+ +--- + +## Ausblick + +- Transports + - Biboumi: IRC + - Spectrum2: e.g AIM, ICQ, MSN, Yahoo, Telegram, Twitter, "WhatsApp" +- PubSub + - Blogging / Posting (siehe Movim) +- Commands + - Internet of Things + +[XEP-Liste](https://xmpp.org/extensions/) letzter Eintrag: XEP-0410: MUC Self-Ping (Schrödinger's Chat) + +{{% note %}} +- Transport WhatsApp Warnung, vor Protokolländerungen und Sperrungen +{{% /note %}} + +--- + +## Alternativen zu XMPP + +#### Peer-to-Peer +- Nutzen das Tor-Netzwerk + - **Tox** + - **Briar** + - kann auch Local per Wifi und Bluetooth genutzt werden + - ... (viele mehr) +- libp2p + +- (mir sonst keine Weiteren bekannt ...) + +--- + +## Alternativen zu XMPP + +#### Federation +- **Matrix** (Riot): + - Änderungsvorschläge am Protokoll werden durch das Unternehmen entschieden +- (mir sonst keine Weiteren bekannt ...) + + +--- + +
+

Ende

+

Hackerethik

+ + **3. Mißtraue Autoritäten – fördere Dezentralisierung.** +
diff --git a/custom.css b/custom.css deleted file mode 100644 index ff7d10b..0000000 --- a/custom.css +++ /dev/null @@ -1,22 +0,0 @@ -body { - background: #000; - background-color: #000; -} - -html:-webkit-full-screen-ancestor { - background: #000; - background-color: #000; -} - -html:-moz-full-screen-ancestor { - background: #000; - background-color: #000; -} - -.reveal pre { - box-shadow : none; -} - -.reveal .slides section > ul { - margin-left: 1em; -} diff --git a/data/home.toml b/data/home.toml new file mode 100644 index 0000000..6c4a8f7 --- /dev/null +++ b/data/home.toml @@ -0,0 +1,41 @@ +reusable = ''' + +## Reusable slides + +Store markdown in a [data template](https://gohugo.io/templates/data-templates/) and reuse it in multiple sections or presentations. + +
+ +navigate down to learn more + +
+🔽 + +--- + +Add a `example` key to data/home.toml: + +```toml +example = "I'm a slide" +``` +
+ +Set the `content` attribute to "home.example": + +```markdown +--- + +{{< slide content="home.example" >}} + +--- +``` + +--- + +💡 Each data template entry can contain one or more slides, separated by `---` with newlines. + +--- + +💡 All other slide shortcode attributes (background, transition, etc.) can be used and will be applied to each slide in the data template entry. + +''' diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..3bcbd69 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,9 @@ +[build] +command = "hugo" +publish = "public" + +[context.production.environment] +HUGO_VERSION = "0.42.2" + +[context.deploy-preview.environment] +HUGO_VERSION = "0.42.2" diff --git a/static/css/35c3.min.css b/static/css/35c3.min.css new file mode 100644 index 0000000..ec49b04 --- /dev/null +++ b/static/css/35c3.min.css @@ -0,0 +1 @@ +@font-face{font-family:"35c3-font-light";src:url("fonts/35c3-light.woff2") format("woff2"),url("fonts/35c3-light.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:"35c3-font-black";src:url("fonts/35c3-black.woff2") format("woff2"),url("fonts/35c3-black.woff") format("woff");font-weight:bold;font-style:normal}*{box-sizing:border-box}.text-white{color:#fff}.bg-white{color:#000;background-color:#fff}.text-black{color:#000}.bg-black{color:#fff;background-color:#000}.text-fresh{color:#0084b0}.bg-fresh{color:#fff;background-color:#0084b0}.text-hope{color:#00a356}.bg-hope{color:#fff;background-color:#00a356}.text-glint{color:#f9b000}.bg-glint{color:#fff;background-color:#f9b000}.text-beat{color:#e40429}.bg-beat{color:#fff;background-color:#e40429}.text-tenacity{color:#44357e}.bg-tenacity{color:#fff;background-color:#44357e}.text-base{color:#18386b}.bg-base{color:#fff;background-color:#18386b}.text-reboot{color:#4d4d4c}.bg-reboot{color:#fff;background-color:#4d4d4c}*{font-family:"35c3-font-light"}h1,h2,h3,h4,h5,h6{font-family:"35c3-font-black"}a{color:#0084b0}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-breakline{white-space:pre-wrap;word-break:break-all}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}label{font-weight:bold}blockquote{padding:10px 20px;margin:0 0 20px;border-left:4px solid transparent;border-image:linear-gradient(to bottom, #00a356, #0084b0) 1 round}code{padding:2px 4px;color:#f9b000;background-color:#4d4d4c}.table{width:100%;max-width:100%;border-spacing:0;border-collapse:collapse}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #4d4d4c}.table tr th,.table tr td{padding:8px;text-align:left;vertical-align:top;font-size:1em}hr{height:8px;border:none;background-image:linear-gradient(to right, #0084b0, #00a356)}.border{border:2px solid transparent;border-image:linear-gradient(to right, #00a356, #0084b0) 1 round}input,textarea,select{width:100%;border-radius:0;box-shadow:none;border:2px solid transparent;border-image:linear-gradient(to right, #00a356, #0084b0) 1 round;background:none;padding:6px 6px;font-size:1em;color:#4d4d4c}input:invalid,input:required,textarea:required{border-image:linear-gradient(to right, #e40429, #44357e) 1 round}input:disabled,textarea:disabled{border-image:linear-gradient(to right, #4d4d4c, #18386b) 1 round}input[type=range]{border:none;background:transparent;margin:0;padding:0;height:32px}input[type=range]:focus{outline:none}input[type=range]::-moz-range-thumb{height:26px;width:26px;border:none;border-radius:50%;background:#009483;cursor:pointer}input[type=range]::-moz-range-thumb:active,input[type=range]::-moz-range-thumb:hover{height:26px;width:26px;border:4px solid #009483;border-radius:50%;cursor:pointer}input[type=range]::-moz-range-track{width:100%;height:8px;cursor:pointer;background-image:linear-gradient(to right, #0084b0, #00a356)}select{-moz-appearance:none;appearance:none}.checkbox{position:relative;display:inline-block;width:26px;height:26px;text-indent:-9999px}.checkbox input{opacity:0;width:0;height:0}.checkbox .toggle{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.checkbox .toggle:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border:2px solid #4d4d4c;transition:.4s}.checkbox .toggle:after{content:"";position:absolute;width:14px;height:6px;left:5px;top:6px;border:3px solid transparent;border-top:none;border-right:none;transform:rotate(-45deg);transition:.4s}.checkbox input:checked+.toggle:after{border-color:#4d4d4c}.checkbox input:checked+.toggle:before{border-color:#0084b0;background-color:#0084b0}.checkbox.checkbox-hope input:checked+.toggle:before{border-color:#00a356;background-color:#00a356}.checkbox.checkbox-beat input:checked+.toggle:before{border-color:#e40429;background-color:#e40429}.checkbox:hover .toggle:after{border-color:#0084b0}.checkbox.checkbox-hope:hover .toggle:after{border-color:#00a356}.checkbox.checkbox-beat:hover .toggle:after{border-color:#e40429}.checkbox:hover input:checked+.toggle:before,.checkbox.checkbox-hope:hover input:checked+.toggle:before,.checkbox.checkbox-beat:hover input:checked+.toggle:before{background-color:transparent}.checkbox:hover input:checked+.toggle:after,.checkbox.checkbox-hope:hover input:checked+.toggle:after,.checkbox.checkbox-beat:hover input:checked+.toggle:after{border-color:transparent}.radio{position:relative;display:inline-block;width:26px;height:26px;text-indent:-9999px}.radio input{opacity:0;width:0;height:0}.radio .toggle{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.radio .toggle:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border:2px solid #4d4d4c;border-radius:100%;transition:.4s}.radio .toggle:after{content:"";position:absolute;width:11px;height:11px;left:7px;top:7px;border:1px solid transparent;border-top:none;border-right:none;border-radius:100%;transition:.4s}.radio input:checked+.toggle:after{background-color:#4d4d4c}.radio input:checked+.toggle:before{border-color:#0084b0}.radio.radio-hope input:checked+.toggle:before{border-color:#00a356}.radio.radio-beat input:checked+.toggle:before{border-color:#e40429}.radio:hover .toggle:after,.radio input:checked+.toggle:after{background-color:#0084b0}.radio.radio-hope:hover .toggle:after,.radio.radio-hope input:checked+.toggle:after{background-color:#00a356}.radio.radio-beat:hover .toggle:after,.radio.radio-beat input:checked+.toggle:after{background-color:#e40429}.switch{position:relative;display:inline-block;width:48px;height:26px;text-indent:-9999px}.switch input{opacity:0;width:0;height:0}.switch .toggle{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.switch .toggle:before{position:absolute;top:3px;left:0;right:0;bottom:3px;content:"";background-color:#4d4d4c;border-radius:26px;transition:.4s}.switch .toggle:after{position:absolute;content:"";height:26px;width:26px;left:0;bottom:0;background-color:#0084b0;transition:.2s;border-radius:50%;transition:.4s}.switch.switch-hope .toggle:after{background-color:#00a356}.switch.switch-beat .toggle:after{background-color:#e40429}.switch input:checked+.toggle:after{transform:translateX(23px);background-color:#4d4d4c}.switch input:checked+.toggle:before{background-color:#0084b0}.switch.switch-hope input:checked+.toggle:before{background-color:#00a356}.switch.switch-beat input:checked+.toggle:before{background-color:#e40429}button{font-size:1em}.btn{display:inline-block;text-align:center;padding:8px;cursor:pointer;white-space:nowrap;vertical-align:middle;border:none;color:#4d4d4c;background-color:transparent}.btn:hover{opacity:.8}.btn:active{opacity:.9}.btn-white{background-color:#fff}.btn-black{background-color:#000}.btn-fresh{color:#fff;background-color:#0084b0}.btn-hope{color:#fff;background-color:#00a356}.btn-glint{color:#fff;background-color:#f9b000}.btn-beat{color:#fff;background-color:#e40429}.btn-tenacity{color:#fff;background-color:#44357e}.btn-base{color:#fff;background-color:#18386b}.btn-reboot{color:#fff;background-color:#4d4d4c}.btn.btn-block{width:100%}.btn-xs{font-size:.7em;padding:4px}.btn-sm{font-size:.9em;padding:6px}.btn-xl{font-size:1.2em;padding:10px}.btn-round{width:2.33em;height:2.33em;border-radius:50%;overflow:hidden;display:inline-flex;justify-content:center;align-items:center;flex-direction:row}.img-auto{display:block;max-width:100%;height:auto}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media screen and (min-width: 768px){.container{width:744.96px}}@media screen and (min-width: 992px){.container{width:962.24px}}@media screen and (min-width: 1200px){.container{width:1164px}}@media screen and (min-width: 1800px){.container{width:1746px}}.row{display:grid;grid-template-columns:repeat(12, 1fr);grid-row-gap:8px;grid-column-gap:8px}.col-1{grid-column-end:span 1}.col-offset-1{grid-column-start:2}.col-2{grid-column-end:span 2}.col-offset-2{grid-column-start:3}.col-3{grid-column-end:span 3}.col-offset-3{grid-column-start:4}.col-4{grid-column-end:span 4}.col-offset-4{grid-column-start:5}.col-5{grid-column-end:span 5}.col-offset-5{grid-column-start:6}.col-6{grid-column-end:span 6}.col-offset-6{grid-column-start:7}.col-7{grid-column-end:span 7}.col-offset-7{grid-column-start:8}.col-8{grid-column-end:span 8}.col-offset-8{grid-column-start:9}.col-9{grid-column-end:span 9}.col-offset-9{grid-column-start:10}.col-10{grid-column-end:span 10}.col-offset-10{grid-column-start:11}.col-11{grid-column-end:span 11}.col-offset-11{grid-column-start:12}.col-12{grid-column-end:span 12}.col-offset-12{grid-column-start:13}@media screen and (max-width: 767px){.col-xs-1{grid-column-end:span 1}.col-xs-offset-1{grid-column-start:2}.col-xs-2{grid-column-end:span 2}.col-xs-offset-2{grid-column-start:3}.col-xs-3{grid-column-end:span 3}.col-xs-offset-3{grid-column-start:4}.col-xs-4{grid-column-end:span 4}.col-xs-offset-4{grid-column-start:5}.col-xs-5{grid-column-end:span 5}.col-xs-offset-5{grid-column-start:6}.col-xs-6{grid-column-end:span 6}.col-xs-offset-6{grid-column-start:7}.col-xs-7{grid-column-end:span 7}.col-xs-offset-7{grid-column-start:8}.col-xs-8{grid-column-end:span 8}.col-xs-offset-8{grid-column-start:9}.col-xs-9{grid-column-end:span 9}.col-xs-offset-9{grid-column-start:10}.col-xs-10{grid-column-end:span 10}.col-xs-offset-10{grid-column-start:11}.col-xs-11{grid-column-end:span 11}.col-xs-offset-11{grid-column-start:12}.col-xs-12{grid-column-end:span 12}.col-xs-offset-12{grid-column-start:13}}@media screen and (min-width: 768px){.col-sm-1{grid-column-end:span 1}.col-sm-offset-1{grid-column-start:2}.col-sm-2{grid-column-end:span 2}.col-sm-offset-2{grid-column-start:3}.col-sm-3{grid-column-end:span 3}.col-sm-offset-3{grid-column-start:4}.col-sm-4{grid-column-end:span 4}.col-sm-offset-4{grid-column-start:5}.col-sm-5{grid-column-end:span 5}.col-sm-offset-5{grid-column-start:6}.col-sm-6{grid-column-end:span 6}.col-sm-offset-6{grid-column-start:7}.col-sm-7{grid-column-end:span 7}.col-sm-offset-7{grid-column-start:8}.col-sm-8{grid-column-end:span 8}.col-sm-offset-8{grid-column-start:9}.col-sm-9{grid-column-end:span 9}.col-sm-offset-9{grid-column-start:10}.col-sm-10{grid-column-end:span 10}.col-sm-offset-10{grid-column-start:11}.col-sm-11{grid-column-end:span 11}.col-sm-offset-11{grid-column-start:12}.col-sm-12{grid-column-end:span 12}.col-sm-offset-12{grid-column-start:13}}@media screen and (min-width: 992px){.col-md-1{grid-column-end:span 1}.col-md-offset-1{grid-column-start:2}.col-md-2{grid-column-end:span 2}.col-md-offset-2{grid-column-start:3}.col-md-3{grid-column-end:span 3}.col-md-offset-3{grid-column-start:4}.col-md-4{grid-column-end:span 4}.col-md-offset-4{grid-column-start:5}.col-md-5{grid-column-end:span 5}.col-md-offset-5{grid-column-start:6}.col-md-6{grid-column-end:span 6}.col-md-offset-6{grid-column-start:7}.col-md-7{grid-column-end:span 7}.col-md-offset-7{grid-column-start:8}.col-md-8{grid-column-end:span 8}.col-md-offset-8{grid-column-start:9}.col-md-9{grid-column-end:span 9}.col-md-offset-9{grid-column-start:10}.col-md-10{grid-column-end:span 10}.col-md-offset-10{grid-column-start:11}.col-md-11{grid-column-end:span 11}.col-md-offset-11{grid-column-start:12}.col-md-12{grid-column-end:span 12}.col-md-offset-12{grid-column-start:13}}@media screen and (min-width: 1200px){.col-lg-1{grid-column-end:span 1}.col-lg-offset-1{grid-column-start:2}.col-lg-2{grid-column-end:span 2}.col-lg-offset-2{grid-column-start:3}.col-lg-3{grid-column-end:span 3}.col-lg-offset-3{grid-column-start:4}.col-lg-4{grid-column-end:span 4}.col-lg-offset-4{grid-column-start:5}.col-lg-5{grid-column-end:span 5}.col-lg-offset-5{grid-column-start:6}.col-lg-6{grid-column-end:span 6}.col-lg-offset-6{grid-column-start:7}.col-lg-7{grid-column-end:span 7}.col-lg-offset-7{grid-column-start:8}.col-lg-8{grid-column-end:span 8}.col-lg-offset-8{grid-column-start:9}.col-lg-9{grid-column-end:span 9}.col-lg-offset-9{grid-column-start:10}.col-lg-10{grid-column-end:span 10}.col-lg-offset-10{grid-column-start:11}.col-lg-11{grid-column-end:span 11}.col-lg-offset-11{grid-column-start:12}.col-lg-12{grid-column-end:span 12}.col-lg-offset-12{grid-column-start:13}}@media screen and (min-width: 1800px){.col-xl-1{grid-column-end:span 1}.col-xl-offset-1{grid-column-start:2}.col-xl-2{grid-column-end:span 2}.col-xl-offset-2{grid-column-start:3}.col-xl-3{grid-column-end:span 3}.col-xl-offset-3{grid-column-start:4}.col-xl-4{grid-column-end:span 4}.col-xl-offset-4{grid-column-start:5}.col-xl-5{grid-column-end:span 5}.col-xl-offset-5{grid-column-start:6}.col-xl-6{grid-column-end:span 6}.col-xl-offset-6{grid-column-start:7}.col-xl-7{grid-column-end:span 7}.col-xl-offset-7{grid-column-start:8}.col-xl-8{grid-column-end:span 8}.col-xl-offset-8{grid-column-start:9}.col-xl-9{grid-column-end:span 9}.col-xl-offset-9{grid-column-start:10}.col-xl-10{grid-column-end:span 10}.col-xl-offset-10{grid-column-start:11}.col-xl-11{grid-column-end:span 11}.col-xl-offset-11{grid-column-start:12}.col-xl-12{grid-column-end:span 12}.col-xl-offset-12{grid-column-start:13}}.hidden{display:none}.visible,.visible-block{display:block}.visible-inline{display:inline}.visible-inline-block{display:inline-block}.visible-print,.visible-print-block,.visible-print-inline,.visible-print-inline-block{display:none}@media print{.hidden-print{display:none}.visible-print,.visible-print-block{display:block}.visible-print-inline{display:inline}.visible-print-inline-block{display:inline-block}}@media screen and (max-width: 767px){.hidden-xs{display:none}.visible-xs,.visible-xs-block{display:block}.visible-xs-inline{display:inline}.visible-xs-inline-block{display:inline-block}}@media screen and (min-width: 768px)and (max-width: 991px){.hidden-sm{display:none}.visible-sm,.visible-sm-block{display:block}.visible-sm-inline{display:inline}.visible-sm-inline-block{display:inline-block}}@media screen and (min-width: 992px)and (max-width: 1199px){.hidden-md{display:none}.visible-md,.visible-md-block{display:block}.visible-md-inline{display:inline}.visible-md-inline-block{display:inline-block}}@media screen and (min-width: 1200px)and (max-width: 1799px){.hidden-lg{display:none}.visible-lg,.visible-lg-block{display:block}.visible-lg-inline{display:inline}.visible-lg-inline-block{display:inline-block}}@media screen and (min-width: 1800px){.hidden-xl{display:none}.visible-xl,.visible-xl-block{display:block}.visible-xl-inline{display:inline}.visible-xl-inline-block{display:inline-block}}/*# sourceMappingURL=35c3.min.css.map */ diff --git a/static/css/fonts/35c3-black.woff b/static/css/fonts/35c3-black.woff new file mode 100644 index 0000000..05da8f2 Binary files /dev/null and b/static/css/fonts/35c3-black.woff differ diff --git a/static/css/fonts/35c3-black.woff2 b/static/css/fonts/35c3-black.woff2 new file mode 100644 index 0000000..23bf0a3 Binary files /dev/null and b/static/css/fonts/35c3-black.woff2 differ diff --git a/static/css/fonts/35c3-light.woff b/static/css/fonts/35c3-light.woff new file mode 100644 index 0000000..a3660d0 Binary files /dev/null and b/static/css/fonts/35c3-light.woff differ diff --git a/static/css/fonts/35c3-light.woff2 b/static/css/fonts/35c3-light.woff2 new file mode 100644 index 0000000..5ab01ce Binary files /dev/null and b/static/css/fonts/35c3-light.woff2 differ diff --git a/static/css/main.css b/static/css/main.css new file mode 100644 index 0000000..2bc127b --- /dev/null +++ b/static/css/main.css @@ -0,0 +1,11 @@ +@import "reveal.css"; + +.reveal .slides { + text-align: left; +} +body { + background-image: url(https://ccchb.de/logo/CCCHB-logo_256x256_bw.png); + background-position: left 20px top 10px; + background-repeat: no-repeat; + background-size: 8% auto; +} diff --git a/static/css/reveal.css b/static/css/reveal.css new file mode 100644 index 0000000..e225c83 --- /dev/null +++ b/static/css/reveal.css @@ -0,0 +1,293 @@ +@import "35c3.min.css"; + +body { + color:#fff; + background-color:#000; + font-size: 32px; + font-weight: normal; + padding: 5px; +} + +.reveal { + padding: 5px; + border: 8px solid; + border-image: linear-gradient(to right, #00a356, #0084b0) 1; +} + +.reveal .controls { + color: #00a356; + right: 50px; + bottom: 50px; +} + +::selection { + color: #fff; + background: #ffc0d5; + text-shadow: none; +} + +::-moz-selection { + color: #fff; + background: #ffc0d5; + text-shadow: none; +} + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; +} + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + font-weight: 700; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; +} + +.reveal h1 { + font-size: 2.6em; +} + +.reveal h2 { + font-size: 2.2em; +} + +.reveal h3 { + font-size: 1.7em; +} + +.reveal h4 { + font-size: 1.4em; +} + +.reveal h1 { + text-shadow: none; +} + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; +} + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; +} + +.reveal strong, +.reveal b { + font-weight: bold; +} + +.reveal em { + font-style: italic; +} + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; +} + +.reveal ol { + list-style-type: decimal; +} + +.reveal ul { + list-style-type: disc; +} + +.reveal ul ul { + list-style-type: square; +} + +.reveal ul ul ul { + list-style-type: circle; +} + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; +} + +.reveal dt { + font-weight: bold; +} + +.reveal dd { + margin-left: 40px; +} + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); +} + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; +} + +.reveal q { + font-style: italic; +} + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); + border: 2px solid transparent; + border-image: linear-gradient(to right, #00a356, #0084b0) 1 round; +} + +.reveal code { + font-family: monospace; + text-transform: none; +} + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; +} + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; +} + +.reveal table th { + font-weight: bold; +} + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; +} + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; +} + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; +} + +.reveal table tbody tr:last-child th, +.reveal table tbody tr:last-child td { + border-bottom: none; +} + +.reveal sup { + vertical-align: super; +} + +.reveal sub { + vertical-align: sub; +} + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; +} + +.reveal small * { + vertical-align: top; +} + +/********************************************* + * LINKS + *********************************************/ +.reveal .roll span:after { + color: #fff; + background: #f30053; +} + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #363636; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); +} + +.reveal section img.plain { + border: 0; + box-shadow: none; +} + +.reveal a img { + -webkit-transition: all .15s linear; + -moz-transition: all .15s linear; + transition: all .15s linear; +} + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #00a356; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); +} + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress span { + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); +} + +.reveal .progress { + margin: 2px; + z-index: 1000; + background: rgba(0, 0, 0, 0.2); + color: #00a356; +} diff --git a/static/decentral_messaging/img/j2me-bombus.jpg b/static/decentral_messaging/img/j2me-bombus.jpg new file mode 100644 index 0000000..637bda4 Binary files /dev/null and b/static/decentral_messaging/img/j2me-bombus.jpg differ diff --git a/themes/reveal-hugo/LICENSE b/themes/reveal-hugo/LICENSE new file mode 100644 index 0000000..9d53fe0 --- /dev/null +++ b/themes/reveal-hugo/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Josh Dzielak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/themes/reveal-hugo/layouts/_default/baseof.html b/themes/reveal-hugo/layouts/_default/baseof.html new file mode 100644 index 0000000..0936b86 --- /dev/null +++ b/themes/reveal-hugo/layouts/_default/baseof.html @@ -0,0 +1,102 @@ + +{{- $reveal_cdn := $.Param "reveal_hugo.reveal_cdn" | default "reveal-js" -}} +{{- $highlight_cdn := $.Param "reveal_hugo.highlight_cdn" | default "highlight-js/src/styles" -}} + + + + {{ or .Page.Title .Site.Title }} + {{ with $.Param "description" }}{{ end }} + {{ with .Site.Author.name }}{{ end }} + + + + + + {{- $theme := $.Param "reveal_hugo.theme" | default "black" -}} + {{- $custom_theme := $.Param "reveal_hugo.custom_theme" -}} + {{- if $custom_theme -}} + + {{ else -}} + + {{- end -}} + + {{- $highlight_theme := $.Param "reveal_hugo.highlight_theme" | default "default" -}} + + + + + {{- partial "reveal-hugo/head" . -}} + + {{- $sectionHeadPartial := printf "%s/reveal-hugo/head" (.Page.Section | default "home") -}} + {{- if fileExists (printf "layouts/partials/%s.html" $sectionHeadPartial) -}}{{ partial $sectionHeadPartial . }}{{- end }} + + +
+
+ {{- block "main" . -}}{{- end -}} +
+ + {{- partial "reveal-hugo/end" . -}} + + {{- $sectionHeadPartial := printf "%s/reveal-hugo/end" (.Page.Section | default "home") -}} + {{- if fileExists (printf "layouts/partials/%s.html" $sectionHeadPartial) -}}{{ partial $sectionHeadPartial . }}{{- end }} +
+ + + + + + + + {{- partial "reveal-hugo/body" . }} + + {{- $sectionBodyPartial := printf "%s/reveal-hugo/body" (.Page.Section | default "home") -}} + {{- if fileExists (printf "layouts/partials/%s.html" $sectionBodyPartial) -}}{{ partial $sectionBodyPartial . }}{{- end }} + + diff --git a/themes/reveal-hugo/layouts/_default/index.html b/themes/reveal-hugo/layouts/_default/index.html new file mode 100644 index 0000000..8faa735 --- /dev/null +++ b/themes/reveal-hugo/layouts/_default/index.html @@ -0,0 +1,3 @@ +{{ define "main" }} + {{ partial "reveal-hugo/slides" (union (slice .Page) (where .Data.Pages "Type" "home")) }} +{{ end }} diff --git a/themes/reveal-hugo/layouts/_default/list.html b/themes/reveal-hugo/layouts/_default/list.html new file mode 100644 index 0000000..6c3c470 --- /dev/null +++ b/themes/reveal-hugo/layouts/_default/list.html @@ -0,0 +1,3 @@ +{{ define "main" }} + {{ partial "reveal-hugo/slides" (union (slice .Page) .Pages) }} +{{ end }} diff --git a/themes/reveal-hugo/layouts/_default/single.html b/themes/reveal-hugo/layouts/_default/single.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/reveal-hugo/layouts/partials/reveal-hugo/body.html b/themes/reveal-hugo/layouts/partials/reveal-hugo/body.html new file mode 100644 index 0000000..f2dd4bf --- /dev/null +++ b/themes/reveal-hugo/layouts/partials/reveal-hugo/body.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/reveal-hugo/layouts/partials/reveal-hugo/end.html b/themes/reveal-hugo/layouts/partials/reveal-hugo/end.html new file mode 100644 index 0000000..1ca9f46 --- /dev/null +++ b/themes/reveal-hugo/layouts/partials/reveal-hugo/end.html @@ -0,0 +1 @@ + diff --git a/themes/reveal-hugo/layouts/partials/reveal-hugo/head.html b/themes/reveal-hugo/layouts/partials/reveal-hugo/head.html new file mode 100644 index 0000000..ed1e892 --- /dev/null +++ b/themes/reveal-hugo/layouts/partials/reveal-hugo/head.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/reveal-hugo/layouts/partials/reveal-hugo/slides.html b/themes/reveal-hugo/layouts/partials/reveal-hugo/slides.html new file mode 100644 index 0000000..bb22e16 --- /dev/null +++ b/themes/reveal-hugo/layouts/partials/reveal-hugo/slides.html @@ -0,0 +1,17 @@ + +{{ range . -}} + + {{- if ne (len .Content) 0 -}} + + {{- $content := replace .Content "
\n\n
" "
" -}} + + {{- range (split $content "
") -}} + + {{- if not (in . "data-noprocess") -}} +
+ {{- end -}} + {{- . | safeHTML -}} +
+ {{- end -}} + {{- end -}} +{{- end }} diff --git a/themes/reveal-hugo/layouts/shortcodes/frag.html b/themes/reveal-hugo/layouts/shortcodes/frag.html new file mode 100644 index 0000000..c1de8c8 --- /dev/null +++ b/themes/reveal-hugo/layouts/shortcodes/frag.html @@ -0,0 +1,4 @@ + + {{ .Get "c" }} + \ No newline at end of file diff --git a/themes/reveal-hugo/layouts/shortcodes/fragment.html b/themes/reveal-hugo/layouts/shortcodes/fragment.html new file mode 100644 index 0000000..dc41e03 --- /dev/null +++ b/themes/reveal-hugo/layouts/shortcodes/fragment.html @@ -0,0 +1,4 @@ + + {{ .Inner }} + \ No newline at end of file diff --git a/themes/reveal-hugo/layouts/shortcodes/markdown.html b/themes/reveal-hugo/layouts/shortcodes/markdown.html new file mode 100644 index 0000000..f5effbc --- /dev/null +++ b/themes/reveal-hugo/layouts/shortcodes/markdown.html @@ -0,0 +1,8 @@ +
+ +
\ No newline at end of file diff --git a/themes/reveal-hugo/layouts/shortcodes/note.html b/themes/reveal-hugo/layouts/shortcodes/note.html new file mode 100644 index 0000000..5d28fce --- /dev/null +++ b/themes/reveal-hugo/layouts/shortcodes/note.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/reveal-hugo/layouts/shortcodes/section.html b/themes/reveal-hugo/layouts/shortcodes/section.html new file mode 100644 index 0000000..43611a4 --- /dev/null +++ b/themes/reveal-hugo/layouts/shortcodes/section.html @@ -0,0 +1,3 @@ +
+{{ .Inner }} +
\ No newline at end of file diff --git a/themes/reveal-hugo/layouts/shortcodes/slide.html b/themes/reveal-hugo/layouts/shortcodes/slide.html new file mode 100644 index 0000000..05aca5e --- /dev/null +++ b/themes/reveal-hugo/layouts/shortcodes/slide.html @@ -0,0 +1,58 @@ +{{- $scratch := .Scratch -}} +{{- $scratch.Set "slides" slice -}} +{{- $content := .Get "content" -}} +{{- if $content -}} + {{- $lookup := split $content "." }} + {{- $html := index .Page.Site.Data (index $lookup 0) (index $lookup 1) | markdownify -}} + {{- $slides := split $html "
" -}} + {{- range $slides -}} + {{- $scratch.Add "slides" . -}} + {{- end -}} +{{- else -}} + {{- $scratch.Add "slides" "" -}} +{{- end -}} +{{- $params := . -}} +{{- $noPrefix := slice "id" "class" -}} +{{- $noOutput := slice "content" "template" -}} +{{- $template := $params.Get "template" -}} +{{- if $template -}} + {{- $scratch.Add "templateParams" slice -}} + {{- with $.Site.Params.reveal_hugo.templates -}} + {{- $scratch.Add "templateParams" . -}} + {{- end -}} + {{- if ne $.Page.File.LogicalName "_index.md" -}} + {{- $scratch.Add "templateParams" ($.Site.GetPage $.Page.Section).Params.reveal_hugo.templates -}} + {{- end -}} + {{- with $.Page.Params.reveal_hugo.templates -}} + {{- $scratch.Add "templateParams" . -}} + {{- end -}} + {{- $scratch.Add "templateParams" (slice $.Page.Params.reveal_hugo.templates) -}} + {{- $templateParams := $scratch.Get "templateParams" }} + {{- range $templateParams -}} + {{- if (ne . nil) -}} + {{- range $key, $value := (index . $template) -}} + {{- $scratch.SetInMap "template" $key $value | safeHTMLAttr -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- range $sindex, $svalue := $scratch.Get "slides" }} +
+ {{ $svalue | safeHTML }} +{{- if ne $sindex (sub (len ($scratch.Get "slides")) 1) -}} +
+{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/themes/reveal-hugo/static/highlight-js b/themes/reveal-hugo/static/highlight-js new file mode 160000 index 0000000..3d5a9e5 --- /dev/null +++ b/themes/reveal-hugo/static/highlight-js @@ -0,0 +1 @@ +Subproject commit 3d5a9e5850760a376094418972e07b49783835fa diff --git a/themes/reveal-hugo/static/reveal-js b/themes/reveal-hugo/static/reveal-js new file mode 160000 index 0000000..c35cce5 --- /dev/null +++ b/themes/reveal-hugo/static/reveal-js @@ -0,0 +1 @@ +Subproject commit c35cce54a5d4800b90e71a43da140c0347308989 diff --git a/themes/reveal-hugo/theme.toml b/themes/reveal-hugo/theme.toml new file mode 100644 index 0000000..3a2b1b8 --- /dev/null +++ b/themes/reveal-hugo/theme.toml @@ -0,0 +1,15 @@ +name = "reveal-hugo" +license = "MIT" +licenselink = "https://github.com/dzello/reveal-hugo/blob/master/LICENSE" +homepage = "https://reveal-hugo.dzello.com/" +tags = ["presentation", "revealjs"] +features = ["presentation"] + +[author] +name = "Josh Dzielak" +homepage = "https://dzello.com/" + +[original] +name = "reveal.js" +homepage = "https://revealjs.com" +repo = "https://github.com/hakimel/reveal.js/" \ No newline at end of file