jekyll-theme-conference 4.1.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +214 -149
  3. data/UPGRADE_GUIDE.md +140 -21
  4. data/_data/conference_assets.yml +3 -3
  5. data/_data/lang.yml +9 -1
  6. data/_includes/checks.html +121 -29
  7. data/_includes/conference_config.json +15 -6
  8. data/_includes/footer.html +1 -1
  9. data/_includes/get_edition.html +85 -0
  10. data/_includes/get_link.html +7 -6
  11. data/_includes/get_link_tag_streaming.html +3 -3
  12. data/_includes/get_live_timestamps.html +5 -5
  13. data/_includes/get_location_config.html +5 -0
  14. data/_includes/get_menu.html +30 -0
  15. data/_includes/get_overview_url.html +18 -0
  16. data/_includes/get_page_description.html +4 -4
  17. data/_includes/get_program_config.html +34 -21
  18. data/_includes/get_room_live_href.html +1 -1
  19. data/_includes/get_schema_event.html +28 -0
  20. data/_includes/get_start_times.html +1 -1
  21. data/_includes/get_tag_icon.html +1 -1
  22. data/_includes/get_talk_overview_talk.html +4 -4
  23. data/_includes/get_time_pronoun.html +1 -1
  24. data/_includes/get_track_properties.html +1 -1
  25. data/_includes/header.html +5 -3
  26. data/_includes/hidden_page.html +7 -5
  27. data/_includes/infobox.html +11 -8
  28. data/_includes/list_header_meta.html +9 -9
  29. data/_includes/list_header_pwa.html +1 -1
  30. data/_includes/list_speakers.html +1 -1
  31. data/_includes/modal_live.html +4 -4
  32. data/_includes/navbar.html +41 -22
  33. data/_includes/navbar_pwa.html +13 -12
  34. data/_includes/navbar_rooms.html +2 -2
  35. data/_includes/schema_conference.html +26 -48
  36. data/_includes/schema_location.html +3 -3
  37. data/_includes/schema_room.html +1 -1
  38. data/_includes/schema_speaker.html +3 -3
  39. data/_includes/schema_talk.html +9 -21
  40. data/_includes/show_live_icon.html +1 -1
  41. data/_includes/show_menu_items.html +19 -0
  42. data/_includes/show_talk_info.html +3 -3
  43. data/_includes/show_talk_time.html +3 -3
  44. data/_layouts/editions.html +20 -0
  45. data/_layouts/home.html +11 -14
  46. data/_layouts/htaccess.html +19 -0
  47. data/_layouts/json-data.html +7 -6
  48. data/_layouts/json-site.html +11 -1
  49. data/_layouts/location.html +5 -3
  50. data/_layouts/manifest.html +6 -5
  51. data/_layouts/program.html +42 -10
  52. data/_layouts/room.html +3 -2
  53. data/_layouts/speaker-overview.html +1 -1
  54. data/_layouts/speaker.html +7 -4
  55. data/_layouts/stream-overview.html +2 -2
  56. data/_layouts/sw.js +14 -2
  57. data/_layouts/talk-overview.html +4 -4
  58. data/_layouts/talk.html +5 -2
  59. data/_sass/theme.scss +37 -0
  60. data/assets/css/conference-only.bundle.css +1 -1
  61. data/assets/css/conference.bundle.css +1 -1
  62. data/assets/js/conference.bundle.js +2 -2
  63. metadata +8 -1
data/README.md CHANGED
@@ -20,7 +20,7 @@ The theme was created for the yearly Winterkongress conference of the [Digital S
20
20
  - [Demo: Winterkongress](https://winterkongress.ch/)
21
21
 
22
22
  > [!WARNING]
23
- > If you were using the theme up to version 3, please note the changes to migrate to the new version 4 in the [upgrade guide](UPGRADE_GUIDE.md).
23
+ > If you upgrade from an earlier major version, please note the necessary changes in the [upgrade guide](UPGRADE_GUIDE.md).
24
24
 
25
25
 
26
26
  ## Table of Contents
@@ -29,38 +29,40 @@ The theme was created for the yearly Winterkongress conference of the [Digital S
29
29
  - [Gem-based Method](#gem-based-method)
30
30
  - [Remote Theme Method](#remote-theme-method)
31
31
  - [Setup](#setup)
32
- - [Automatic Import](#automatic-import)
32
+ - [Import from pretalx](#import-from-pretalx)
33
33
  - [Automatic Build](#automatic-build)
34
34
  - [Configuration](#configuration)
35
- - [Theme Verification](#theme-verification)
35
+ - [Error Checks](#error-checks)
36
36
  - [Collection URLs](#collection-urls)
37
37
  - [Language](#language)
38
38
  - [Timezone](#timezone)
39
39
  - [Navigation Bar](#navigation-bar)
40
- - [Meta Data for Search Engines and Link Previews](#meta-data-for-search-engines-and-link-previews)
41
- - [Main Landing Page](#main-landing-page)
42
- - [Information Boxes & Modals](#information-boxes--modals)
40
+ - [Meta Data](#meta-data)
41
+ - [Information Bars & Modals](#information-bars--modals)
43
42
  - [Live Indications & Streaming](#live-indications--streaming)
44
43
  - [Progressive Web App (PWA)](#progressive-web-app-pwa)
45
- - [Talk Settings](#talk-settings)
46
- - [Location Settings](#location-settings)
47
- - [Program Settings](#program-settings)
44
+ - [Tracks & Tags](#tracks--tags)
45
+ - [Landing Page](#landing-page)
46
+ - [Location Page](#location-page)
47
+ - [Program Page](#program-page)
48
+ - [Editions](#editions)
48
49
  - [Content](#content)
49
50
  - [Schedule / Program](#schedule--program)
50
51
  - [Talks](#talks)
51
52
  - [Speakers](#speakers)
52
53
  - [Rooms](#rooms)
53
54
  - [Links](#links)
54
- - [Overview Pages](#overview-pages)
55
- - [Additional Pages](#additional-pages)
55
+ - [Pages](#pages)
56
56
  - [Design](#design)
57
57
  - [Pre-compiled Bundle (Default)](#pre-compiled-bundle-default)
58
58
  - [Split Bundle (Custom Bootstrap CSS)](#split-bundle-custom-bootstrap-css)
59
+ - [Full Custom Build (Custom SCSS)](#full-custom-build-custom-scss)
59
60
  - [Icons](#icons)
60
- - [JavaScript](#javascript)
61
+ - [Custom JavaScript](#custom-javascript)
61
62
  - [Development](#development)
62
63
  - [Jekyll Theme Development](#jekyll-theme-development)
63
64
  - [JavaScript & CSS Development](#javascript--css-development)
65
+ - [Tests](#tests)
64
66
  - [License](#license)
65
67
 
66
68
 
@@ -128,50 +130,42 @@ To install:
128
130
  bundle
129
131
  ```
130
132
 
131
- 4. Add `remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@v4.0.1"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry.
133
+ 4. Add `remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@v5.1.0"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry.
132
134
 
133
135
  ```yaml
134
- remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@v4.0.2"
136
+ remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@v5.1.0"
135
137
  ```
136
138
 
137
139
  5. Continue with the [_Setup_](#setup) section below to customize the theme and add content for your conference.
138
140
 
139
- To update the theme, change the version tag in the `remote_theme` value (e.g., `@v4.0.0` to `@v4.1.0`).
141
+ To update the theme, change the version tag in the `remote_theme` value (e.g., `@v5.0.0` to `@v5.1.0`).
140
142
 
141
143
 
142
144
  ## Setup
143
145
 
144
- The different talks, speakers and rooms are stored as a collection of files. Each file contains a small header in form of a YAML block (called [FrontMatter](https://jekyllrb.com/docs/front-matter/)) used to store additional information beside a description. Their exact use and meaning is described further below in the section [_Content_](#content). Additional configuration options can be found in the section [_Configuration_](#configuration).
146
+ Add the talks, speakers, rooms and the schedule of your conference as described in the section [_Content_](#content), and adapt the theme as described in the section [_Configuration_](#configuration). The tools below import them or build the site for you.
145
147
 
146
- The schedule defining when and in which room a talk takes place is stored as a [YAML data file](https://jekyllrb.com/docs/datafiles/) under `_data/program.yml`. For further details about it see below in the section [_Content_](#content).
148
+ > [!TIP]
149
+ > To get started quickly, use the [template repository](https://github.com/DigitaleGesellschaft/jekyll-theme-conference-template): its `main` branch is an empty site ready to be filled, its `demo` branch showcases the theme with a fictional conference.
147
150
 
148
151
  > [!TIP]
149
152
  > Please note that the generated website can be large containing many unnecessary whitespaces. It is recommended to minimize the generated output files before uploading them to a server (e.g., with [minify](https://github.com/tdewolff/minify)).
150
153
 
151
- ### Automatic Import
154
+ ### Import from pretalx
152
155
 
153
156
  In this repository, you'll find the Python file `_tools/import_schedule.py`. This script allows you to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction)-compatible JSON file, such as those exported from [pretalx.com](https://pretalx.com/p/about/).
154
157
 
155
158
  1. Copy the files `_tools/import_schedule.py` and `_tools/requirements.txt` from this repository
156
159
 
157
- 2. Create a virtual environment and activate it
158
-
159
- ```bash
160
- python -m venv .venv
161
- source .venv/bin/activate
162
- ```
163
-
164
- 3. Install the requirements
160
+ 2. Execute the script with [uv](https://docs.astral.sh/uv/), which installs the requirements, e.g., to show the help type
165
161
 
166
162
  ```bash
167
- pip install -r _tools/requirements.txt
163
+ uv run --no-project --with-requirements _tools/requirements.txt python _tools/import_schedule.py --help
168
164
  ```
169
165
 
170
- 4. Execute the script, e.g., to show the help type
166
+ With several [editions](#editions), pass the edition's id, e.g. `--edition 2026`: the script then writes to `_talks/2026/`, …, `_data/programs/2026.yml` and creates the edition's overview pages.
171
167
 
172
- ```bash
173
- python _tools/import_schedule.py --help
174
- ```
168
+ Likewise, `_tools/import_resources.py` imports resources such as slides and other documents from [pretalx.com](https://pretalx.com/p/about/) via its API. It downloads all files, stores them and updates the links of the talks concerned (see [_Links_](#links)). Run it the same way, e.g., `uv run --no-project --with-requirements _tools/requirements.txt python _tools/import_resources.py --help`. With several [editions](#editions), pass the edition's folders, e.g. `--file-folder 2026/documents/slides/ --talk-folder _talks/2026/`.
175
169
 
176
170
  ### Automatic Build
177
171
 
@@ -179,11 +173,13 @@ If you prefer not to install the full Ruby/Jekyll toolchain locally, you can lev
179
173
 
180
174
  - `build.yml`: This workflow automatically builds and optimizes the website whenever a new tag starting with `v` (e.g., `v2020.01.01`) is added. It then attaches the generated website as an archive to a release for easy download.
181
175
  - `test.yml`: This workflow automatically attempts to build the website upon a new pull request, making it suitable for use as a status check before merging.
182
- - `schedule.yml`: This workflow automatically generates schedule and content files when a new pull request includes a `schedule.json` file (refer to the 'Automatic Import' section for details). This enables quick content updates from [pretalx.com](https://pretalx.com/p/about/) exports.
176
+ - `schedule.yml`: This workflow automatically generates schedule and content files when a new pull request includes a `schedule.json` file (see [_Import from pretalx_](#import-from-pretalx)). This enables quick content updates from [pretalx.com](https://pretalx.com/p/about/) exports. With several [editions](#editions), set its `EDITION` variable to the id of the edition to import.
183
177
 
184
178
  To get started, simply copy the desired workflow file to your repository and adapt it to your needs:
185
179
 
186
180
  - `_tools/build.yml` -> `.github/workflows/build.yml`
181
+ - `_tools/test.yml` -> `.github/workflows/test.yml`
182
+ - `_tools/schedule.yml` -> `.github/workflows/schedule.yml`
187
183
 
188
184
  > [!IMPORTANT]
189
185
  > Please note that the `Gemfile.lock` of your project must be adapted to include specific versions required by GitHub's workflow server, i.e., run `bundle lock --add-platform x86_64-linux` to add support for them.
@@ -191,9 +187,9 @@ To get started, simply copy the desired workflow file to your repository and ada
191
187
 
192
188
  ## Configuration
193
189
 
194
- All configurations and customization for this theme are stored under the `conference` property in the `_config.yml` file. You can find an example configuration containing most of the here discussed parameters under `_config.example.yml` in this repository.
190
+ Most settings of this theme are stored under the `conference` property in the `_config.yml` file. Some are Jekyll's own settings at the top level (e.g. `timezone`), and the settings of the main landing page, the location page and the program page are stored in their Front Matter (sections at the end).
195
191
 
196
- ### Theme Verification
192
+ ### Error Checks
197
193
 
198
194
  Upon building, the theme runs some basic verification to check if all necessary files and configurations are in place. If it encounters an error it shows this by adding an information bar on all your sites. You can disable this, e.g., in a production environment, by setting `show_errors` to `false` (default: `true`).
199
195
 
@@ -241,7 +237,7 @@ defaults:
241
237
  layout: room
242
238
  ```
243
239
 
244
- To change the URL of the collection, simply edit the `permalink` property and replace the `:collection` tag (which translates to `talks`, `speakers` and `rooms`) with your desired value. Please note that the talk and speaker overview pages should reside in a folder of the same name.
240
+ To change the URL of the collection, simply edit the `permalink` property and replace the `:collection` tag (which translates to `talks`, `speakers` and `rooms`) with your desired value.
245
241
 
246
242
  > [!NOTE]
247
243
  > Please note that while you might want to change the URLs, the name of the three collections (`talks`, `speakers` and `rooms`) is fixed and cannot be changed.
@@ -276,7 +272,7 @@ timezone: Europe/Zurich
276
272
 
277
273
  ### Navigation Bar
278
274
 
279
- The navigation bar is located at the top and visible on every site. On the left, it shows the title of the website (`site.title`) followed by the links listed under the `links` property of the `navigation` property. See the [_Content_](#content) > [_Links_](#links) section below for the available properties per link. Please note that icons are ignored for the navigation bar.
275
+ The navigation bar is located at the top and visible on every site. On the left, it shows the title of the website (`site.title`) followed by the links listed under the `links` property of the `navigation` property. See the [_Content_](#content) > [_Links_](#links) section below for the available properties per link. Icons are only shown when installed as an app (see below).
280
276
 
281
277
  Example:
282
278
 
@@ -287,12 +283,30 @@ conference:
287
283
  - name: Program
288
284
  relative_url: /program/
289
285
  - live: true
290
- - name: Previous Editions
286
+ - name: About # dropdown menu
291
287
  menu:
292
- - name: 2020 (current)
293
- disabled: true
294
- - name: 2019
295
- relative_url: /2019/
288
+ - name: Location
289
+ relative_url: /location/
290
+ - name: Code of Conduct
291
+ relative_url: /code-of-conduct/
292
+ - name: Contact
293
+ absolute_url: mailto:info@example.org
294
+ ```
295
+
296
+ With several [_Editions_](#editions), a menu to switch between them appears at the end of the navigation bar, labelled with the page's edition. A link with `menu: editions` places it among the links instead (see [_Links_](#links)). The `editions` property under the `navigation` property adapts it:
297
+
298
+ - `name` labels the menu instead of the edition; a link's own `name` wins.
299
+ - `hide: true` removes the menu at the end, but not a link with `menu: editions`.
300
+
301
+ ```yaml
302
+ conference:
303
+ navigation:
304
+ editions:
305
+ name: Editions
306
+ links:
307
+ - name: Program
308
+ relative_url: /program/
309
+ - menu: editions
296
310
  ```
297
311
 
298
312
  Optionally, a logo or link of your organization hosting the conference can be shown on the right side of the navigation bar. It is activated through the `logo` property under the `navigation` property containing
@@ -315,7 +329,7 @@ conference:
315
329
  url: 'https://github.com'
316
330
  ```
317
331
 
318
- The navigation bar automatically collapses when the available space is too small (e.g., on a smaller screen). The breakpoints are given by [Bootstrap](https://getbootstrap.com/docs/5.3/layout/breakpoints/). The default breakpoint is `md` (collapsing if the screen width is smaller than 992px). It can be adapted by setting the `breakpoint` property under the `navigation` property to either `sm`, `md`, `lg`, or `xl`.
332
+ The navigation bar automatically collapses when the available space is too small (e.g., on a smaller screen). The breakpoints are given by [Bootstrap](https://getbootstrap.com/docs/5.3/layout/breakpoints/). The default breakpoint is `md` (collapsing if the screen width is smaller than 768px). It can be adapted by setting the `breakpoint` property under the `navigation` property to either `sm`, `md`, `lg`, or `xl`.
319
333
 
320
334
  When installed as a progressive web application (see the [_Progressive Web App (PWA)_](#progressive-web-app-pwa) section below), the navigation bar moves to the bottom. In PWA mode, it displays link icons and ignores links with `live: true`. Please note that the navigation bar has a limited width and no vertical scrolling. To hide an entry in this mode, set `pwa_hide: true` on its link.
321
335
 
@@ -331,7 +345,7 @@ conference:
331
345
  relative_url: /supporters/
332
346
  ```
333
347
 
334
- ### Meta Data for Search Engines and Link Previews
348
+ ### Meta Data
335
349
 
336
350
  The theme automatically includes the necessary `<meta>` tags to ease link previewing when sharing links based on the [Open Graph protocol](https://ogp.me/) (used by all major social networks and messenger apps) and [Twitter Cards](https://developer.x.com/en/docs/x-for-websites/cards/overview/abouts-cards) (used by X). These tags control how a link is shown when shared via different platforms and apps. The theme also includes [Schema.org](https://schema.org/) JSON-LD structured data to help search engines better understand and display the conference and its talks, potentially showing event cards, speaker information, and enhanced search listings.
337
351
 
@@ -360,7 +374,7 @@ conference:
360
374
  open_graph: "facebook_preview.png" # inside /assets/images/
361
375
  ```
362
376
 
363
- #### Meta Data for Search Engines
377
+ #### Structured Data (Schema.org)
364
378
 
365
379
  Support for [Schema.org](https://schema.org/) JSON-LD structured data is organized under the `schema_org` property part of the `meta` property. It can be disabled by setting `disable` to `true`. Different schemas are generated depending on the page type, and these schemas are interconnected. The following schemas are generated:
366
380
  - `ConferenceEvent` (main and program page)
@@ -402,6 +416,7 @@ Optionally, the following properties can be added under the `schema_org` propert
402
416
 
403
417
  ```yaml
404
418
  conference:
419
+ meta:
405
420
  schema_org:
406
421
  disable: false # Set to true to disable Schema.org JSON-LD structured data
407
422
  event_status: "scheduled" # Options: scheduled, cancelled, postponed, moved_online
@@ -419,31 +434,7 @@ conference:
419
434
  img: "conference.png" # inside /assets/images/
420
435
  ```
421
436
 
422
- ### Main Landing Page
423
-
424
- The main landing page is shown at the root of the website to greet new visitors. To show it you need to create a `index.md` file in the root of your website's folder and specify its layout as `layout: home`.
425
-
426
- The main page states your site's title (`site.title`) or a logo instead. The logo can be configured through the `header` property of the main page's FrontMatter containing
427
-
428
- - a `img` property specifying the path to the image file relative to the `/assets/images/` folder.
429
- - optionally a `img_dark` property for a dark mode version of the logo, which will be automatically displayed when the user's system is in dark mode. If not specified, the regular `img` will be used in both light and dark modes.
430
-
431
- The title/logo on the main page is followed by a description of your site (`site.description`) and the content of your `index.md` file. It ends with an optional list of link buttons. See the [_Content_](#content) > [_Links_](#links) section below for the available properties per link.
432
-
433
- ```yaml
434
- layout: home
435
- header:
436
- img: "main_logo.png"
437
- img_dark: "main_logo_dark.png" # optional: dark mode version
438
- links:
439
- - name: Program
440
- relative_url: /program/
441
- - name: Tickets
442
- disabled: true
443
- absolute_url: ''
444
- ```
445
-
446
- ### Information Boxes & Modals
437
+ ### Information Bars & Modals
447
438
 
448
439
  The theme supports two types of information displays: banners at the top of the page (`bars`) and dialog popups (`modals`). Both can be used to inform your visitors about important news and announcements.
449
440
 
@@ -511,19 +502,25 @@ This can be further extended if some talks have an associated live stream: When
511
502
 
512
503
  To activate these functionalities, each day in the `program.yml` file must contain a `date` property (see section [_Content_](#content) > [Schedule / Program](#schedule--program) below) and the `live` property has to be set in the configuration file containing
513
504
 
514
- - how long a pause between two consecutive talks has to be for the live indication to pause (`stop`),
505
+ - optionally, how long a pause between two consecutive talks has to be for the live indication to pause (`stop`, default: `240`),
506
+ - optionally, under the `now_line` property, a horizontal line in the program marking the current time (behind the talks):
507
+ - if it is shown (`enable`, default: `true`), and
508
+ - its colour, one of Bootstrap's theme colours (`color`, default: `danger`), and
515
509
  - optionally, under the `streaming` property:
516
510
  - if streaming should be enabled (`enable`), and if enabled
517
- - how many minutes the stream goes active before a talk (`prepend`),
518
- - how many minutes the stream stays active after a talk (`extend`),
519
- - how long a pause between two consecutive talks has to be for the stream to pause (`pause`),
511
+ - how many minutes the stream goes active before a talk (`prepend`, default: `5`),
512
+ - how many minutes the stream stays active after a talk (`extend`, default: `5`),
513
+ - how long a pause between two consecutive talks has to be for the stream to pause (`pause`, default: `60`),
520
514
  - if the stream is only loaded once the visitor clicks a button, as the streaming provider receives the visitor's IP address (`click_to_load`, default: `true`; set to `false` for self-hosted streams), and
521
- - an external (absolute) link to which the user will be redirected instead of opening the modal (`external`),
515
+ - an external (absolute) link to which the user will be redirected instead of opening the modal (`external`).
522
516
 
523
517
  ```yaml
524
518
  conference:
525
519
  live:
526
520
  stop: 240 # in minutes
521
+ now_line:
522
+ enable: true
523
+ color: danger # Bootstrap theme colour, e.g. primary
527
524
  streaming:
528
525
  enable: true
529
526
  pause: 60 # in minutes
@@ -535,7 +532,7 @@ conference:
535
532
 
536
533
  ### Progressive Web App (PWA)
537
534
 
538
- The theme includes built-in support for Progressive Web App (PWA) functionality, allowing your conference website to be installed on users' devices and work offline. Once a visitor opened the site, all pages (program, talks, speakers, rooms, …) and all files below `assets/` (stylesheets, scripts, images, fonts) are available offline. Documents (`documents/`) and map tiles are not. Pages and data are always loaded fresh when online, so schedule changes reach visitors right away (falling back to the stored copy if the network does not answer within 3 seconds, e.g. on a crowded conference Wi-Fi). When the site is rebuilt, installed apps only download what changed: the theme's bundles are versioned by their content, all other files are revalidated. PWA functionality is disabled by default. To enable it, multiple manual steps are necessary to add the necessary files:
535
+ The theme includes built-in support for Progressive Web App (PWA) functionality, allowing your conference website to be installed on users' devices and work offline. Once a visitor opened the site, all pages (program, talks, speakers, rooms, …) and all files below `assets/` (stylesheets, scripts, images, fonts) are available offline. Documents (`documents/`, with [editions](#editions) `<id>/documents/`) and map tiles are not. Pages and data are always loaded fresh when online, so schedule changes reach visitors right away (falling back to the stored copy if the network does not answer within 3 seconds, e.g. on a crowded conference Wi-Fi). When the site is rebuilt, installed apps only download what changed: the theme's bundles are versioned by their content, all other files are revalidated. PWA functionality is disabled by default. To enable it, multiple manual steps are necessary to add the necessary files:
539
536
 
540
537
  1. Enable and optionally customize the functionality in your `_config.yml`:
541
538
  ```yaml
@@ -546,7 +543,7 @@ The theme includes built-in support for Progressive Web App (PWA) functionality,
546
543
  # Theme color for the PWA (default: Bootstrap primary color, #0d6efd)
547
544
  theme_color: "#0d6efd"
548
545
 
549
- # Background color for the PWA (default: Bootstrap primary color, #ffffff)
546
+ # Background color for the PWA (default: white, #ffffff)
550
547
  background_color: "#ffffff"
551
548
 
552
549
  # PWA icons configuration
@@ -592,9 +589,9 @@ The theme includes built-in support for Progressive Web App (PWA) functionality,
592
589
  > [!NOTE]
593
590
  > Please note that when installed as a PWA, the navigation bar moves to the bottom and includes icons. See the [_Navigation Bar_](#navigation-bar) section above for more information.
594
591
 
595
- ### Talk Settings
592
+ ### Tracks & Tags
596
593
 
597
- Talks can optionally be organized into tracks, where each track groups talks under a common subject. Tracks are visually distinct across the website, especially in the program, by a unique color. Additionally, each talk can have one or more associated tags. Both tracks and tags are linked via the talk's Front Matter (refer to the [_Content_](#content) > [_Talks_](#talks) > section below for more details).
594
+ Talks can optionally be organized into tracks, where each track groups talks under a common subject. Tracks are visually distinct across the website, especially in the program, by a unique color. Additionally, each talk can have one or more associated tags. Both tracks and tags are linked via the talk's Front Matter (refer to the [_Content_](#content) > [_Talks_](#talks) section below for more details).
598
595
 
599
596
  To define available tracks, add the `tracks` property under the `talks` property in the configuration file. This property is a list of tracks, with each track requiring:
600
597
 
@@ -631,10 +628,34 @@ conference:
631
628
  # Talk tags
632
629
  tags:
633
630
  - name: No recording
634
- icon: video-slash
631
+ icon: camera-video-off-fill
632
+ ```
633
+
634
+ ### Landing Page
635
+
636
+ The main landing page is shown at the root of the website to greet new visitors. To show it you need to create a `index.md` file in the root of your website's folder and specify its layout as `layout: home`.
637
+
638
+ The main page states your site's title (`site.title`) or a logo instead. The logo can be configured through the `header` property of the main page's Front Matter containing
639
+
640
+ - a `img` property specifying the path to the image file relative to the `/assets/images/` folder.
641
+ - optionally a `img_dark` property for a dark mode version of the logo, which will be automatically displayed when the user's system is in dark mode. If not specified, the regular `img` will be used in both light and dark modes.
642
+
643
+ The title/logo on the main page is followed by a description of your site (`site.description`) and the content of your `index.md` file. It ends with an optional list of link buttons. See the [_Content_](#content) > [_Links_](#links) section below for the available properties per link.
644
+
645
+ ```yaml
646
+ layout: home
647
+ header:
648
+ img: "main_logo.png"
649
+ img_dark: "main_logo_dark.png" # optional: dark mode version
650
+ links:
651
+ - name: Program
652
+ relative_url: /program/
653
+ - name: Tickets
654
+ disabled: true
655
+ absolute_url: ''
635
656
  ```
636
657
 
637
- ### Location Settings
658
+ ### Location Page
638
659
 
639
660
  To help users find your venue, an [OpenStreetMap](https://www.openstreetmap.org/) container displaying a map can be shown on the location page as well as the address of the venue. You can define the initial position of the map by setting the default zoom level `default_zoom`, the center coordinates `home_coord`, and the map provider for the tiles `map_provider`. Alternative map providers can be found [here](https://leaflet-extras.github.io/leaflet-providers/preview/).
640
661
  The map contains small control buttons to zoom in and out, center the map back to the initial position, and show the visitor's current location (has to be manually activated and granted by the visitor).
@@ -644,12 +665,13 @@ To protect the visitors' privacy, the map is only loaded once the visitor clicks
644
665
  Location settings are configured directly in the Front Matter of the location page (the page with `layout: location`). The location page's Front Matter supports the following properties:
645
666
 
646
667
  - `title`: The title shown in the navigation bar for the location section (defaults to "Location")
647
- - `hide`: Set to `true` to hide the location page and all room links (default: `false`). Hidden rooms still need to exist in the `_rooms/` directory as references.
668
+ - `hide`: Set to `true` to hide the location page and all room links (default: `false`). The page then only redirects to the home page. Hidden rooms still need to exist in the `_rooms/` directory as references.
648
669
  - `map`: Map configuration object with the following properties:
649
670
  - `home_coord`: Center coordinates of the map (e.g., `47.37808, 8.53935`)
650
671
  - `default_zoom`: Initial zoom level (e.g., `17`)
651
672
  - `map_provider`: Tile provider (default: `"OpenStreetMap.Mapnik"`)
652
673
  - `click_to_load`: Load the map only after the visitor's consent (default: `true`)
674
+ - `script`: Script adapting the map, e.g. adding markers (see below)
653
675
  - `postal_address`: Postal address displayed on the location page and used in schema.org structured data. Can contain:
654
676
  - `name`: Venue name (e.g., "Zentralwäscherei")
655
677
  - `street`: Street address (e.g., "Neue Hard 12")
@@ -681,32 +703,24 @@ map:
681
703
  Welcome to our conference venue!
682
704
  ```
683
705
 
684
- The map is based on the [Leaflet](https://leafletjs.com/) JavaScript library. The map object can be customized by adding additional layers with markers, text, or shapes. To do so, edit the `assets/js/main.js` file in your project:
685
-
686
- 1. The conference JavaScript bundle (`conference.bundle.js`) is automatically loaded and provides all necessary libraries
687
- 2. Await the initialization of the theme's object using `window.conference.awaitReady()`
688
- 3. Fetch the map object and verify it is set (while the JavaScript code is executed on each page, the map object will only exist on the location page). The returned promise resolves once the visitor loaded the map.
689
- 4. Modify the map.
690
-
691
- The following example for `assets/js/main.js` adds a simple marker to the map:
706
+ The map is based on the [Leaflet](https://leafletjs.com/) JavaScript library. To add markers, text, or shapes, name a script in `map.script`, relative to `assets/js/` (e.g. `script: maps/venue.js` for `assets/js/maps/venue.js`). Once the visitor loaded the map, the theme calls the script's default export with the map object (Leaflet is available as `L`):
692
707
 
693
708
  ```javascript
694
- window.conference.awaitReady().then(async () => {
695
- const map = await window.conference.map.getMap();
696
-
697
- if (map) {
698
- let main_station = L.marker([47.37785, 8.54035], {
699
- icon: L.divIcon({
700
- className: '',
701
- html: '<span class="bi bi-train-front" aria-hidden="true"></span> Main Station',
702
- iconSize: [120, 56]
703
- })
704
- }).addTo(map);
705
- }
706
- });
709
+ // assets/js/maps/venue.js
710
+ export default function (map) {
711
+ L.marker([47.37785, 8.54035], {
712
+ icon: L.divIcon({
713
+ className: '',
714
+ html: '<span class="bi bi-train-front" aria-hidden="true"></span> Main Station',
715
+ iconSize: [120, 56]
716
+ })
717
+ }).addTo(map);
718
+ }
707
719
  ```
708
720
 
709
- ### Program Settings
721
+ With several [editions](#editions), each edition's location page names its own script. Alternatively, `assets/js/main.js` gets the map with `await window.conference.map.getMap()` after `await window.conference.awaitReady()` (resolves once the visitor loaded the map, with `null` on pages without map).
722
+
723
+ ### Program Page
710
724
 
711
725
  Program settings are configured directly in the Front Matter of the program page (the page with `layout: program`). The program page's Front Matter supports the following properties:
712
726
 
@@ -725,15 +739,91 @@ show_alltimes: true
725
739
  ---
726
740
  ```
727
741
 
742
+ ### Editions
743
+
744
+ One site can hold several editions of a conference, e.g. the current one and past ones as archive. Every edition lives below its own folder (`/2026/`, `/2025/`, …), the site's root forwards to the current edition. Without `editions`, the site holds a single edition as described in the rest of this document.
745
+
746
+ List the editions in `_config.yml` under `conference.editions`. The current edition is the first one with `current: true`, else the first one of the list. Its `id` names the edition's folders, its `name` labels it in the menu to switch between editions (default: its id).
747
+
748
+ An edition inherits the site's settings and can override some of them. An override replaces the site's setting as a whole, all others are kept; e.g. an edition with its own `navigation.links` keeps the site's `navigation.logo`.
749
+
750
+ | Setting | In `_config.yml` | Per edition |
751
+ |---|---|---|
752
+ | `title`, `description` | Jekyll, top level | yes |
753
+ | `url`, `baseurl`, `timezone` | Jekyll, top level | no |
754
+ | `meta.link_preview`, `meta.schema_org` | `conference` | yes |
755
+ | `navigation.logo`, `navigation.links`, `navigation.breakpoint`, `navigation.editions` | `conference` | yes |
756
+ | `info.bars`, `info.modals` | `conference` | yes |
757
+ | `talks.tracks`, `talks.tags` | `conference` | yes |
758
+ | `lang`, `custom_style`, `show_errors`, `pwa` | `conference` | no |
759
+ | `live` | `conference` | no, current edition only |
760
+
761
+ Settings in a page's Front Matter (e.g. of the [_Landing Page_](#landing-page) or the [_Program Page_](#program-page)) belong to its edition anyway, as every edition has its own pages.
762
+
763
+ ```yaml
764
+ conference:
765
+ editions:
766
+ - id: "2026"
767
+ current: true
768
+ title: My Conference 2026
769
+ - id: "2025"
770
+ name: 2025 (Archive)
771
+ title: My Conference 2025
772
+ talks:
773
+ tracks:
774
+ - name: Workshops
775
+ color: warning
776
+ ```
777
+
778
+ Mark each page and entry with its edition by folder, with one pair of `defaults` per edition (in addition to the layouts of the collections, see [_Collection URLs_](#collection-urls)):
779
+
780
+ ```yaml
781
+ defaults:
782
+ - scope:
783
+ path: "2026" # pages, e.g. 2026/program/index.md
784
+ values:
785
+ edition: "2026"
786
+ - scope:
787
+ path: "_*/2026" # talks, speakers and rooms, e.g. _talks/2026/keynote.md
788
+ values:
789
+ edition: "2026"
790
+ permalink: /2026/:collection/:title/
791
+ ```
792
+
793
+ With `show_errors`, pages report a page or entry whose `edition` doesn't match its folder, e.g. due to a forgotten `defaults` entry.
794
+
795
+ The content of each edition is then placed as follows:
796
+
797
+ ```
798
+ index.md layout: editions (forwards to the current edition)
799
+ 2026/index.md layout: home
800
+ 2026/program/index.md layout: program (likewise talks/, speakers/, location/, …)
801
+ 2026/documents/ files of links (slides/, bio/, …)
802
+ _talks/2026/ talks (likewise _speakers/2026/, _rooms/2026/)
803
+ _data/programs/2026.yml schedule
804
+ ```
805
+
806
+ Talks, speakers and rooms are looked up within their edition only, so names may repeat across editions (e.g. a speaker attending every year). Links with `relative_url` point into the page's edition, e.g. `/program/` to `/2026/program/`. Live indications, live streams and the offline app (PWA) cover the current edition only. To point visitors of a past edition to the current one, give it an info bar (see [_Information Bars & Modals_](#information-bars--modals)), e.g. `info: {bars: [{title: Archive, color: secondary, text: "Go to the [current edition](/2026/)."}]}` in its `editions` entry. Files below `assets/` (styles, scripts, images) and `_sass/` are shared by all editions.
807
+
808
+ Other addresses, e.g. a former `/program/`, show the site's 404 page. To forward them to the current edition on an Apache web server, create a `.htaccess` file in the root of your project:
809
+
810
+ ```yaml
811
+ ---
812
+ layout: htaccess
813
+ ---
814
+ ```
815
+
816
+ It forwards addresses that don't exist but do exist in the current edition, e.g. `/program/` to `/2026/program/`, and follows the current edition on its own. Below the Front Matter, you can add your own rules. It assumes the site lies at `baseurl` below the web server's document root. Other hosts (e.g. GitHub Pages, Netlify, nginx) ignore the file and need their own redirects.
817
+
728
818
 
729
819
  ## Content
730
820
 
731
- The different talks, speakers and rooms are stored as a collection of files. Each file contains a small header in form of a YAML block (called [FrontMatter](https://jekyllrb.com/docs/front-matter/)) used to store additional information beside a description.
821
+ The different talks, speakers and rooms are stored as a collection of files. Each file contains a small header in form of a YAML block (called [Front Matter](https://jekyllrb.com/docs/front-matter/)) used to store additional information beside a description.
732
822
  The schedule defining when and in which room a talk takes place is stored as a [YAML data file](https://jekyllrb.com/docs/datafiles/).
733
823
 
734
824
  ### Schedule / Program
735
825
 
736
- The schedule of the conference linking the talks with the rooms and indicating when each talk takes place and how long it lasts, is set in the `_data/program.yml` file. It contains a list of days, whereby each day contains a list of rooms, whereby each room contains a list of talks.
826
+ The schedule of the conference linking the talks with the rooms and indicating when each talk takes place and how long it lasts, is set in the `_data/program.yml` file (with several [editions](#editions): `_data/programs/<id>.yml` per edition). It contains a list of days, whereby each day contains a list of rooms, whereby each room contains a list of talks.
737
827
 
738
828
  Each day consists of
739
829
 
@@ -747,7 +837,7 @@ Each room consists of
747
837
  - the room's `name` (must correspond to one of the room identifiers), and
748
838
  - a list of talks (`talks`) which also can be empty `[]`.
749
839
 
750
- The order of the rooms in the list defines the order of the rooms as shown in the schedule on the program page. For the live-streaming or the room overview the order of the rooms is alphabetical but can be adapted via the [main configuration file](https://jekyllrb.com/docs/collections/#sort-by-front-matter-key).
840
+ The order of the rooms in the list defines the order of the rooms as shown in the schedule on the program page. Elsewhere (e.g. live streams or the room links on the location page), rooms follow their first appearance in the program, unless they set `order` (see [_Rooms_](#rooms)).
751
841
 
752
842
  Each talk consists of
753
843
 
@@ -839,7 +929,8 @@ links:
839
929
  Each room is represented by a file in the `_rooms/` directory. It must begin with valid [YAML Front Matter](https://jekyllrb.com/docs/frontmatter/) containing
840
930
 
841
931
  - the room's `name`
842
- - optionally, `hide: true` if the room's page should not be linked to, and
932
+ - optionally, `hide: true` if the room's page should not be linked to,
933
+ - optionally, its position (`order`, a number) where rooms are listed outside the program, otherwise rooms follow their first appearance in the program, and
843
934
  - optionally under the `live` property, a URL pointing to a live stream for the given room during the conference (see the section [_Configuration_](#configuration) > [_Live Indications & Streaming_](#live-indications--streaming) above), either:
844
935
  - as an `absolute_url`, or
845
936
  - a `relative_url`.
@@ -876,13 +967,14 @@ Using the `file:` indicator, the
876
967
  - the site's base address followed by `/documents/slides` and the value for _talks_,
877
968
  - the site's base address followed by `/documents/bio` and the value for _speakers_, or
878
969
  - the site's base address followed by `/documents` and the value for all remaining types.
879
- - the link's `icon:` is set to `file-alt`.
970
+ - With several [editions](#editions), the edition's id precedes `/documents`, e.g. `/2026/documents/slides`.
971
+ - the link's `icon:` is set to `file-earmark-text`.
880
972
 
881
973
  Using the `video:` indicator, the
882
974
 
883
975
  - link address is set to an absolute address as given by the value.
884
976
  - the link's `iframe:` attribute is set to `true` to embed the video in a popup-like modal having a default iframe ratio of 24:11.
885
- - the link's `icon:` is set to `video`.
977
+ - the link's `icon:` is set to `camera-video-fill`.
886
978
 
887
979
  Additionally, a _talk_ link can also have the following property:
888
980
 
@@ -895,35 +987,11 @@ Additionally, a _navigation bar_ or _main landing page_ link can also have the f
895
987
  - If `name_inactive` is set, its value is used as a placeholder text while the conference is **not** live. If `name_inactive` is an empty string, "Live Stream" is shown instead.
896
988
  - If streaming is enabled and any URL property is omitted, a click on the link will open the streaming modal (see section [_Configuration_](#configuration) > [_Live Indications & Streaming_](#live-indications--streaming) above).
897
989
  - `menu` containing another list of links. This creates a dropdown menu of multiple sublinks, while the URL of the parent link is ignored. The sublinks have the same properties as regular links.
990
+ - With `menu: editions`, the dropdown menu lists the [editions](#editions) instead. Without `name`, it is labelled with `navigation.editions.name`, else the page's edition. It is not shown with a single edition.
898
991
 
899
- #### Import link files
900
-
901
- There exists a Python file in this repository, `_tools/import_resources.py`, which can be used to import resources such as slides and other documents from [pretalx.com](https://pretalx.com/p/about/)) via its API. It automatically downloads all files, stores them and updates the links of the talks concerned.
992
+ ### Pages
902
993
 
903
- 1. Copy the files `_tools/import_resources.py` and `_tools/requirements.txt` from this repository
904
-
905
- 2. Create a virtual environment and activate it
906
-
907
- ```bash
908
- python -m venv .venv
909
- source .venv/bin/activate
910
- ```
911
-
912
- 3. Install the requirements
913
-
914
- ```bash
915
- pip install -r _tools/requirements.txt
916
- ```
917
-
918
- 4. Execute the script, e.g., to show the help type
919
-
920
- ```bash
921
- python _tools/import_resources.py --help
922
- ```
923
-
924
- ### Overview Pages
925
-
926
- For each of the three collections, there exists a dedicated layout giving an overview of all items in the collection. Furthermore, there exists a layout to show the program as a time schedule. Simply create an empty page and associate the corresponding layout with it:
994
+ The overviews of talks and speakers, the location with its rooms, and the program as a time schedule each have a dedicated layout. Simply create a page and associate the corresponding layout with it:
927
995
 
928
996
  - `talks/index.md` with `layout: talk-overview`
929
997
  - `speakers/index.md` with `layout: speaker-overview`
@@ -932,13 +1000,6 @@ For each of the three collections, there exists a dedicated layout giving an ove
932
1000
 
933
1001
  They can be empty but should contain the `layout` property in the Front Matter header.
934
1002
 
935
- If you choose a different location for the overview pages you must:
936
-
937
- - for the `talks` and `speakers` overview files, adapt the URL of the two collections as described further above in the section [_Configuration_](#configuration) > [_Collection URLs_](#collection-urls), and
938
- - for the `location` and `program` files, adapt the corresponding `url` parameter as described further above in the sections [_Configuration_](#configuration) > [_Location Settings_](#location-settings) and [_Configuration_](#configuration) > [_Program Settings_](#program-settings).
939
-
940
- ### Additional Pages
941
-
942
1003
  Additional static pages can easily be added as files and linked to via navigation bar or main landing page.
943
1004
 
944
1005
 
@@ -965,7 +1026,7 @@ The `assets/css/` directory contains:
965
1026
  - `map.bundle.css`: Leaflet map styles, loaded together with the map
966
1027
  - `main.scss`: For user-modifiable custom styles.
967
1028
 
968
- Including `assets/css/main.scss` in your project is optional. If included, it must begin with a [FrontMatter](https://jekyllrb.com/docs/front-matter/) header for Jekyll recognition:
1029
+ Including `assets/css/main.scss` in your project is optional. If included, it must begin with a [Front Matter](https://jekyllrb.com/docs/front-matter/) header for Jekyll recognition:
969
1030
 
970
1031
 
971
1032
  ```scss
@@ -992,7 +1053,7 @@ The `assets/css/` directory contains:
992
1053
  - `map.bundle.css`: Leaflet map styles, loaded together with the map
993
1054
  - `main.scss`: For additional custom styles.
994
1055
 
995
- Including `assets/css/main.scss` in your project is optional. If included, it must begin with a [FrontMatter](https://jekyllrb.com/docs/front-matter/) header for Jekyll recognition:
1056
+ Including `assets/css/main.scss` in your project is optional. If included, it must begin with a [Front Matter](https://jekyllrb.com/docs/front-matter/) header for Jekyll recognition:
996
1057
 
997
1058
  ```scss
998
1059
  ---
@@ -1002,7 +1063,7 @@ Including `assets/css/main.scss` in your project is optional. If included, it mu
1002
1063
  // ...
1003
1064
  ```
1004
1065
 
1005
- #### Custom SCSS
1066
+ ### Full Custom Build (Custom SCSS)
1006
1067
 
1007
1068
  Compile your Bootstrap framework by modifying [Bootstrap variables](https://getbootstrap.com/docs/5.3/customize/sass/#variable-defaults). This provides complete control over Bootstrap's SCSS variables, enabling source-level customization.
1008
1069
 
@@ -1058,7 +1119,7 @@ To use the icon font in your own content or JavaScript instead (e.g. `<i class="
1058
1119
  ```
1059
1120
 
1060
1121
 
1061
- ## JavaScript
1122
+ ## Custom JavaScript
1062
1123
 
1063
1124
  The theme includes a pre-built JavaScript bundle (`assets/js/conference.bundle.js`). This bundle is automatically included in the theme gem, pre-compiled, and minified, requiring no build tools for end users. Please do not modify this file directly.
1064
1125
 
@@ -1072,11 +1133,12 @@ To add custom JavaScript, edit the `assets/js/main.js` file in your project. Thi
1072
1133
  - `conference.modal`: Links (e.g. videos) in a modal
1073
1134
  - `conference.embed`: Embedded streams on the stream overview page
1074
1135
  - `conference.live`: Live indications following the program (incl. `setTime("09:30", "2026-02-20")`, `getTime()`, `pauseTime()`, `continueTime()`, `resetTime()` for testing)
1136
+ - `conference.nowline`: Line at the current time in the program
1075
1137
  - `conference.stream`: Live stream modal
1076
1138
  - `conference.infobox`: Dismissal of information boxes and modals
1077
1139
  - `conference.darkmode`: Dark mode according to the system preference
1078
1140
  - `conference.pwa`: Service worker registration (if PWA is enabled)
1079
- - `conference.config`: Settings of the modules, e.g. `conference.config.baseurl`
1141
+ - `conference.config`: Settings of the modules, e.g. `conference.config.baseurl`, `conference.config.edition` (the page's edition id, `null` without editions) and `conference.config.edition_current`
1080
1142
  - `conference.awaitReady()`: Promise-based initialization helper
1081
1143
  - `window.bootstrap`: Bootstrap components (Alert, Collapse, Dropdown, Modal, Tab)
1082
1144
  - `window.L`: Leaflet map library (once the map is loaded)
@@ -1132,6 +1194,7 @@ _js/
1132
1194
  ├── live.js # Live indications
1133
1195
  ├── map.js # Map functionality
1134
1196
  ├── modal.js # Links in a modal
1197
+ ├── nowline.js # Line at the current time in the program
1135
1198
  ├── program.js # Program days as tabs
1136
1199
  ├── pwa.js # Service worker registration
1137
1200
  └── stream.js # Live stream modal
@@ -1167,9 +1230,11 @@ To modify the theme's source code and rebuild:
1167
1230
  This compiles:
1168
1231
  - `_js/` → `assets/js/conference.bundle.js`
1169
1232
  - `_css/` → `assets/css/conference.bundle.css`, `assets/css/conference-only.bundle.css` and `assets/css/map.bundle.css`
1233
+
1170
1234
  This generates:
1171
1235
  - `_includes/icons/`: one include per Bootstrap Icon (inline SVG)
1172
1236
  - `_data/conference_assets.yml`: content hashes of the bundles (cache busting)
1237
+
1173
1238
  This copies:
1174
1239
  - `_css/` + any SASS file from the different framework libraries → `_sass`
1175
1240
  - Webfonts → `assets/webfonts/` (for sites using the icon font themselves)
@@ -1181,7 +1246,7 @@ To modify the theme's source code and rebuild:
1181
1246
 
1182
1247
  ### Tests
1183
1248
 
1184
- The tests build the example site in `test/fixture/` (containing edge cases such as quotes and markup in names, overnight talks, hidden entries, live streams, PWA and a map) and run on every pull request:
1249
+ The tests build the example site in `test/fixture/` (containing edge cases such as quotes and markup in names, overnight talks, hidden entries, live streams, PWA and a map) and the site with two editions in `test/fixture-editions/`, and run on every pull request:
1185
1250
 
1186
1251
  ```bash
1187
1252
  npm run build # theme bundles