diff --git a/.gitattributes b/.gitattributes
index 49e49b6..3f13ad8 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -6,3 +6,4 @@
# Git LFS
*.pdf filter=lfs diff=lfs merge=lfs -text
*.mov filter=lfs diff=lfs merge=lfs -text
+*.mp4 filter=lfs diff=lfs merge=lfs -text
diff --git a/docs/assets/images/concernification_api_feedback.jpg b/docs/assets/images/concernification_api_feedback.jpg
new file mode 100644
index 0000000..79bde94
Binary files /dev/null and b/docs/assets/images/concernification_api_feedback.jpg differ
diff --git a/docs/assets/images/concernification_fm_feedback.jpg b/docs/assets/images/concernification_fm_feedback.jpg
new file mode 100644
index 0000000..d8d38ff
Binary files /dev/null and b/docs/assets/images/concernification_fm_feedback.jpg differ
diff --git a/docs/assets/images/concernification_introduction.jpg b/docs/assets/images/concernification_introduction.jpg
new file mode 100644
index 0000000..361452e
Binary files /dev/null and b/docs/assets/images/concernification_introduction.jpg differ
diff --git a/docs/assets/images/concernification_missing_feature.jpg b/docs/assets/images/concernification_missing_feature.jpg
new file mode 100644
index 0000000..4313392
Binary files /dev/null and b/docs/assets/images/concernification_missing_feature.jpg differ
diff --git a/docs/assets/images/coronavirus_dashboard.jpg b/docs/assets/images/coronavirus_dashboard.jpg
new file mode 100644
index 0000000..96d866a
Binary files /dev/null and b/docs/assets/images/coronavirus_dashboard.jpg differ
diff --git a/docs/assets/images/hochseilgarten.jpg b/docs/assets/images/hochseilgarten.jpg
new file mode 100644
index 0000000..ed5cf0e
Binary files /dev/null and b/docs/assets/images/hochseilgarten.jpg differ
diff --git a/docs/assets/images/hochseilgarten_parcours.jpg b/docs/assets/images/hochseilgarten_parcours.jpg
new file mode 100644
index 0000000..878e365
Binary files /dev/null and b/docs/assets/images/hochseilgarten_parcours.jpg differ
diff --git a/docs/assets/images/hochseilgarten_responsive.jpg b/docs/assets/images/hochseilgarten_responsive.jpg
new file mode 100644
index 0000000..bab8a41
Binary files /dev/null and b/docs/assets/images/hochseilgarten_responsive.jpg differ
diff --git a/docs/assets/images/kinect_teaser.jpg b/docs/assets/images/kinect_teaser.jpg
new file mode 100644
index 0000000..6a6a21d
Binary files /dev/null and b/docs/assets/images/kinect_teaser.jpg differ
diff --git a/docs/assets/images/maxpaynezone.jpg b/docs/assets/images/maxpaynezone.jpg
new file mode 100644
index 0000000..078867c
Binary files /dev/null and b/docs/assets/images/maxpaynezone.jpg differ
diff --git a/docs/assets/images/maxpaynezone_2.jpg b/docs/assets/images/maxpaynezone_2.jpg
new file mode 100644
index 0000000..a26532d
Binary files /dev/null and b/docs/assets/images/maxpaynezone_2.jpg differ
diff --git a/docs/assets/images/tippspiel_matches.jpg b/docs/assets/images/tippspiel_matches.jpg
new file mode 100644
index 0000000..b018678
Binary files /dev/null and b/docs/assets/images/tippspiel_matches.jpg differ
diff --git a/docs/assets/images/tippspiel_matches_responsive.jpg b/docs/assets/images/tippspiel_matches_responsive.jpg
new file mode 100644
index 0000000..4bb63d7
Binary files /dev/null and b/docs/assets/images/tippspiel_matches_responsive.jpg differ
diff --git a/docs/assets/images/tippspiel_ranking.jpg b/docs/assets/images/tippspiel_ranking.jpg
new file mode 100644
index 0000000..596fe1e
Binary files /dev/null and b/docs/assets/images/tippspiel_ranking.jpg differ
diff --git a/docs/assets/images/tippspiel_ranking_responsive.jpg b/docs/assets/images/tippspiel_ranking_responsive.jpg
new file mode 100644
index 0000000..f89581f
Binary files /dev/null and b/docs/assets/images/tippspiel_ranking_responsive.jpg differ
diff --git a/docs/assets/images/tippspiel_tipp.jpg b/docs/assets/images/tippspiel_tipp.jpg
new file mode 100644
index 0000000..6bdf1fe
Binary files /dev/null and b/docs/assets/images/tippspiel_tipp.jpg differ
diff --git a/docs/assets/images/tippspiel_tipp_responsive.jpg b/docs/assets/images/tippspiel_tipp_responsive.jpg
new file mode 100644
index 0000000..ce3ac86
Binary files /dev/null and b/docs/assets/images/tippspiel_tipp_responsive.jpg differ
diff --git a/docs/assets/images/touchcore_class_diagram.jpg b/docs/assets/images/touchcore_class_diagram.jpg
new file mode 100644
index 0000000..b2f36fc
Binary files /dev/null and b/docs/assets/images/touchcore_class_diagram.jpg differ
diff --git a/docs/assets/images/touchcore_feature_model.jpg b/docs/assets/images/touchcore_feature_model.jpg
new file mode 100644
index 0000000..d1d50a1
Binary files /dev/null and b/docs/assets/images/touchcore_feature_model.jpg differ
diff --git a/docs/assets/images/touchcore_impact_model.jpg b/docs/assets/images/touchcore_impact_model.jpg
new file mode 100644
index 0000000..d3e0fbf
Binary files /dev/null and b/docs/assets/images/touchcore_impact_model.jpg differ
diff --git a/docs/assets/images/touchcore_reuse.jpg b/docs/assets/images/touchcore_reuse.jpg
new file mode 100644
index 0000000..9abbe50
Binary files /dev/null and b/docs/assets/images/touchcore_reuse.jpg differ
diff --git a/docs/assets/images/touchcore_sequence_diagram.jpg b/docs/assets/images/touchcore_sequence_diagram.jpg
new file mode 100644
index 0000000..9fd7359
Binary files /dev/null and b/docs/assets/images/touchcore_sequence_diagram.jpg differ
diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css
index 0ffd952..4c40fb1 100644
--- a/docs/assets/stylesheets/extra.css
+++ b/docs/assets/stylesheets/extra.css
@@ -24,3 +24,13 @@
ul li .admonition.hidden {
display: none;
}
+
+/* Increase space between icon/emoji and title in card grid */
+.grid.cards .twemoji {
+ margin-right: 5px;
+}
+
+/* Hide extra figures so they only show up in the lightbox */
+.md-typeset figure.hidden, .md-typeset .glightbox .hidden {
+ display: none !important;
+}
diff --git a/docs/assets/videos/kinect_fitts_law.mp4 b/docs/assets/videos/kinect_fitts_law.mp4
new file mode 100644
index 0000000..148ac40
--- /dev/null
+++ b/docs/assets/videos/kinect_fitts_law.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:19d38119b00eb028d71a615f5506efda30f7514c46fed2f6453586ee580aec1a
+size 2255631
diff --git a/docs/assets/videos/kinect_fitts_law_close.mp4 b/docs/assets/videos/kinect_fitts_law_close.mp4
new file mode 100644
index 0000000..ec5fa5c
--- /dev/null
+++ b/docs/assets/videos/kinect_fitts_law_close.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e758a060a5a6d23e544d7751491d22e1b638828b4ae3c8093d50823ec54968fa
+size 2410266
diff --git a/docs/projects/index.md b/docs/projects/index.md
index 1166db6..cb14965 100644
--- a/docs/projects/index.md
+++ b/docs/projects/index.md
@@ -1,3 +1,413 @@
# Projects
-TBD
+A selected list of projects that I created or am/was involved in.
+They include both work projects and personal ones.
+
+## Software Engineering
+
+
+
+* :material-heart-pulse:{ .lg .middle } **Opal**
+
+ ---
+
+ A solution providing patients timely access to their medical data.
+ It empowers patients and their caregivers to play an active role in their care.
+
+ [:octicons-arrow-right-24: Tell me more](#opal)
+
+* :simple-django:{ .lg .middle } **Digital Printing Workflow**
+
+ ---
+
+ A web application built with Python and Django to manage a digital printing workflow including sending print jobs to an industrial printer via JMF/JDF.
+
+ [:octicons-arrow-right-24: Tell me more](#digital-printing-workflow)
+
+* :student:{ .lg .middle } **Concernification Study**
+
+ ---
+
+ A study web site built with TypeScript and Angular to allow study participants to provide their feedback interactively.
+
+ [:octicons-arrow-right-24: Tell me more](#concernification-study)
+
+* :fontawesome-brands-java:{ .lg .middle } **TouchCORE**
+
+ ---
+
+ A tool for software design modelling aimed at developing scalable and reusable software design models.
+
+ [:octicons-arrow-right-24: Tell me more](#touchcore)
+
+
+
+## Personal Projects
+
+
+
+* :fontawesome-solid-virus-covid:{ .lg .middle } **COVID-19 Montreal Dashboard**
+
+ ---
+
+ A dashboard built with [Plotly Dash](https://dash.plotly.com/) for the epidemiological situation of the corona virus pandemic in Montréal and Québec.
+
+ [:octicons-arrow-right-24: Tell me more](#covid-19-montreal-dashboard)
+
+* :simple-python:{ .lg .middle } **SEPAQ Availability Scraper**
+
+ ---
+
+ A scraper for availability of [SEPAQ](https://www.sepaq.com) camp sites that makes it easier to find available camping spots across all SEPAQ parks.
+
+ [:octicons-arrow-right-24: Tell me more](#sepaq-availability-scraper)
+
+* :soccer:{ .lg .middle } **Tippspiel**
+
+ ---
+
+ A web application for users to predict results of football (or soccer :wink:) matches and compete with each other.
+
+ [:octicons-arrow-right-24: Tell me more](#tippspiel)
+
+
+
+## Archive
+
+Projects in this category are older and mentioned here for completeness sake.
+In case of an open source project it means that the corresponding repository is archived.
+
+
+
+* :simple-django:{ .lg .middle } **Docker Monitor**
+
+ ---
+
+ A simple helper script that allows you to monitor docker containers to ensure they are running and healthy.
+
+ [:octicons-arrow-right-24: Tell me more](#docker-monitor)
+
+* :raised_hand:{ .lg .middle } **Kinect Project**
+
+ ---
+
+ A university project using the Kinect for an experiment to measure how humans perform pointing in 3D.
+
+ [:octicons-arrow-right-24: Tell me more](#kinect-project)
+
+* :fontawesome-brands-wordpress-simple:{ .lg .middle } **Hochseilgarten Nagold**
+
+ ---
+
+ A responsive website set up using Wordpress for a high ropes garden.
+
+
+ [:octicons-arrow-right-24: Tell me more](#hochseilgarten-nagold)
+
+* :fontawesome-brands-php:{ .lg .middle } **Max Payne Zone**
+
+ ---
+
+ A fan site for the game _Max Payne_ providing news about the game in German.
+
+ [:octicons-arrow-right-24: Tell me more](#max-payne-zone)
+
+
+
+## Project Details
+
+### Opal
+
+Since 2021 I have been working with the [Opal Health Informatics Group](https://www.opalmedapps.com) on the Opal solution (1).
+As the _Software Architect_ I am overseeing the software architecture and future design of Opal.
+I helped establish various best practices and improvements, such as using containerization, CI/CD, use of code quality tools, "everything as code", dependency management via [Renovate](https://docs.renovatebot.com/), and more.
+{ .annotate }
+
+1. Opal is a patient portal designed to empower patients with their medical information.
+ It consists of the patient portal, and a hospital-facing part to manage the medical data as well as enrich it to make it more useful for patients.
+
+A big part is the question of how many of the legacy components can be migrated to a new component.
+I proposed the [Strangler Fig Migration Pattern](https://martinfowler.com/bliki/StranglerFigApplication.html) instead of doing a "big bang replacement".
+
+I also develop and troubleshoot.
+For example, I designed and implemented support for smart devices.
+This allows a patient to send vital signs to the hospital.
+
+**Information:**
+
+* [Opal Website](https://www.opalmedapps.com/en)
+
+### Digital Printing Workflow
+
+In 2020 I built a web app for a client to manage a digital printing workflow.
+The web app helps keep the overview of print jobs and allows the user to follow the progress from planning, printing, to production, shipment, and completion (it has been invoiced).
+This web app significantly decreases the manual steps (which are error-prone) to be performed by a user and therefore reduces the potential for errors.
+It has successfully helped to manage large amounts of print jobs during peak times.
+
+[Django](https://www.djangoproject.com) is used to define a general model (data structure) for all data which is coming from various sources (XML, CSV, PDF, HTML).
+Individual small services/components are used to process these different sources.
+I did consider a microservice architecture but for the type of application it is overkill and would have unnecessarily increased the complexity.
+The services/components were developed separately and packaged as Python packages.
+Some are containerized while others are dependencies of (i.e., part of) the Django web app.
+
+A central part is the ability to print a job directly from the web app on the production printer.
+This is accomplished by integrating the printer via the industry standard _JDF_/_JMF_.
+_JMF_ stands for _Job Messaging Format_ and is a communication protocol based on XML over HTTP.
+_JDF_ stands for _Job Definition Format_ which describes the print ticket in XML for the production printer.
+
+In this project I used a linter and wrote unit tests from the beginning and have to say that has helped to increase the quality of the application.
+It has lead to only a few bugs that made it into production.
+I also used [drone](https://www.drone.io/) as the continuous integration server and for deployment to the staging environment.
+
+**Information:**
+
+* **Backend:** Python, Django, PostgreSQL
+* **Frontend:** CSS, HTML, JavaScript, jQuery, Bootstrap
+* **Other:** Docker, Unit Testing, CI/CD, Web/Document Scraping, Data Analysis (pandas), Git, Bash, XML, JSON, Network Printing via JDF/JMF
+
+### Concernification Study
+
+In 2018, during my [PhD research](../research/index.md) I designed an algorithm that extracts a feature model along with the API for each feature from a framework.
+This is done by looking at examples that are typically provided to show different use cases/features of the framework.
+I needed to evaluate the accuracy of the algorithm with a user study.
+
+To allow participant to provide feedback in an interactive way, I built a web application using [Angular](https://angular.dev/) on the client-side and [Node.js](https://nodejs.org) on the server-side.
+The feedback is collected for evaluating the result of an algorithm I designed, which extracts a concern (feature model and the corresponding API for each feature) of a software framework.
+The framework I mainly used is the _Android SDK_ (specifically the [notifications part](https://developer.android.com/reference/android/app/Notification)).
+
+
+ { width="500" }
+ Introduction to the Concernification Study with instructions
+
+
+
+ { width="500" }
+ Giving feedback on the feature model of a framework
+
+
+
+ { width="500" }
+ Adding a missing feature
+
+
+
+ { width="500" }
+ Giving feedback on the API of a feature
+
+
+The diagram part is done using [GoJS](https://gojs.net/latest/index.html), a nice JavaScript Diagram framework.
+The remainder of the UI is done using [Bootstrap](https://getbootstrap.com/) and [jQuery](https://jquery.com/).
+The study data is loaded from JSON files.
+Once a user submits the feedback, an API is called on a Node.js server which then stores the data.
+
+**Information:**
+
+* **Technologies:** Angular, TypeScript/JavaScript, Node.js, Express.js, REST, JSON, HTML, CSS, Git
+* **[Try it out](https://concernification.mattsch.com/android-notifications2-test)**
+
+### TouchCORE
+
+During my PhD, I was part of a team (as the Lead Software Developer/Software Architect) working on [TouchCORE](https://djeminy.github.io/touchcore/), which is a multitouch-enabled tool for agile concern-oriented software design modeling aimed at developing scalable and reusable software design models.
+
+
+ { width="500" }
+ Feature Model in TouchCORE
+
+
+
+ { width="500" }
+ Impact Model in TouchCORE
+
+
+
+ { width="500" }
+ Class Diagram in TouchCORE
+
+
+Besides the main focus being on reuse, the tool also focusses on allowing users to quickly and seamlessly build software design models.
+It provides a touch-based interface allowing the user to use multitouch gestures besides using the traditional keyboard and mouse.
+For example, I designed the sequence diagram editor that allows a user to define the behaviour for the given class diagram in a fast and intuitive way.
+
+
+ { width="500" }
+ Sequence Diagram in TouchCORE
+
+
+At the end, the user can generate the code for the design.
+
+The backend is built with the [Eclipse Modeling Framework (EMF)](https://www.eclipse.org/modeling/emf/) and the frontend with [MT4j](https://github.com/mschoettle/mt4j) to provide the touch-based interface.
+
+
+ { width="500" }
+ Reusing another concern (a reusable piece of a collection of functionality) in TouchCORE
+
+
+**Information:**
+
+* **Technologies:** Java, OOP, Eclipse Modeling Framework (EMF), XML, Code generation, JUnit, GUI, Git
+* **Project Management:** Bitbucket (Issue Tracker, Pull Requests, Code Reviews, Wiki)
+* **Videos:**
+ * [View Demo Video from my PhD Defence](../assets/videos/phd_defence_demo.mov)
+ * [View Demo Teaser from 2014 on Youtube](https://www.youtube.com/watch?v=Am9jp2y2Uds)
+ * [View Demo Teaser from 2013 on Youtube](https://www.youtube.com/watch?v=Dxc5LvV3Nsw)
+
+### COVID-19 Montreal Dashboard
+
+Dashboard for the epidemiological situation of the SARS-CoV-2 (coronavirus) pandemic in Montréal and Québec.
+
+
+ { width="500" }
+
+
+I started contributing to this project towards the end of 2020.
+I helped update it to the latest data formats of data provided from official sources, and adding more graphs.
+In addition, I automated the download and update of data every day.
+This helped keep the data up-to-date without any manual intervention.
+
+**Information:**
+
+* **Technologies:** Python, pandas, Plotly, Dash, Git, Bash
+* [Blog post](../blog/posts/2021/covid-19-montreal-dashboard.md)
+* [Project on GitHub](https://github.com/jeremymoreau/covid19mtl/)
+* **[View project](https://covid19mtl.ca)**
+
+### SEPAQ Availability Scraper
+
+Scraper for availability of SEPAQ camp sites.
+Makes it easier to find available camping spots across all SEPAQ parks.
+
+It extracts all availability information for specific types of camp sites (_Prêt-à-camper_(1) ).
+The information is then parsed and camping sites with a given minimum availability (number of days) are extracted and the parks with their date ranges output for review.
+{ .annotate }
+
+1. Ready to camp: You only need to bring your food and sleeping bags.
+
+The script can also be adjusted to look at specific camp sites and only look for availability in interested date ranges for those.
+
+**Information:**
+
+* **Technologies:** Python, Web Scraping
+* [Read the blog post](../blog/posts/2021/sepaq-availability-scraper.md)
+* [Project on GitHub](https://github.com/mschoettle/sepaq-availability-scraper)
+
+### Tippspiel
+
+
+ { width="500" }
+ The match schedule of a tournament with results
+
+
+
+ { width="200" }
+ The match schedule of a tournament with results on a small screen
+
+
+A _Tippspiel_ is a prediction game where the game results of (football) matches are predicted and varying points given based on the actual result.
+Starting in 2006, I have been running a _Tippspiel_ (almost) every two years for each World Cup and European Championship where approximately 50 users participate for fun.
+Besides game results, there are also additional questions (for example, which team will win the World Cup) allowing users to earn bonus points.
+
+
+ { width="500" }
+ Past guesses and making a guess for the next game
+
+
+
+ { width="200" }
+ Past guesses and making a guess for the next game on a small screen
+
+
+The frontend is built with HTML5 and CSS3, is responsive(1), and supports Retina screens.
+In the screenshots, you can see how the layout and texts are adjusted for smaller screens and mobile devices while showing the same information.
+{ .annotate }
+
+1. See the additional screenshots in the "slideshow" when you click on a screenshot.
+
+The backend is built with PHP and MySQL running on an Apache server.
+The game data is retrieved from a web service ([OpenLigaDB](https://www.openligadb.de/)) using a REST API and (their older SOAP API) returning JSON.
+A script is executed periodically by a cron job to retrieve new match results and new fixtures (for the knockout phase).
+
+**Information:**
+
+* **Technologies:** PHP, MySQL, SOAP/REST API (XML/JSON), HTML5, CSS3, Apache
+* **[View Project](https://tippspiel.mattsch.com)**
+
+### Docker Monitor
+
+INFO: This project is archived (not actively maintained anymore).
+
+Simple helper script that allows to monitor docker containers to ensure they are running and healthy.
+The script only outputs anything in the opposite case (non-running or unhealthy).
+This allows it to be used for cronjobs etc.
+
+**Information:**
+
+* **Technologies:** Python, Docker, Bash
+* [Project on GitHub](https://github.com/mschoettle/docker-monitor)
+
+### Kinect Project
+
+{ width=250, align=right }
+
+In 2011, during my graduate degree at university, my team (three in total) did a project using the _Kinect_ to build a _Fitts' Law_ 3D application.
+[Fitts' Law](https://en.wikipedia.org/wiki/Fitts%27s_law) shows how users perform the act of pointing (virtually) to an object on a screen using a pointing device (such as the mouse).
+
+The goal was to build an application that allowed to gather measurements on how humans perform pointing in a three-dimensional space.
+The Kinect and application were installed/running on a screen installed in a hallway that is showing a digital information board.
+A background application was managing the window management to switch from the information screen to the application using a dedicated gesture, and back to the screen after no input is detected by the Kinect for a certain time.
+The user can then play the game, as you can see below, and is then presented with their "performance".
+
+The Kinect backend was written in C++ making use of an (unofficial) Kinect SDK.
+The frontend was done with _Unity_, and written in C#, including its backend to store the results of each player in a SQLite database.
+The Kinect backend and frontend were connected using a socket in order to receive the detected hand gestures and movements.
+
+**Information:**
+
+* **Technologies:** C#, Unity, SQLite, C++, Subversion (SVN)
+* [Video showcasing how a person interacts with the screen and performs the experiment](../assets/videos/kinect_fitts_law.mp4)
+* [Close-up video of the screen showing the game](../assets/videos/kinect_fitts_law_close.mp4)
+
+### Hochseilgarten Nagold
+
+
+ { width=500 }
+ Click the image for more screenshots
+
+
+{ .hidden }
+
+{ .hidden }
+
+In 2014, I built website for a client with Wordpress and a theme with retina and responsive support.
+A booking calendar and custom forms are used for visitor interaction.
+Custom CSS was used for improved appearance.
+
+In May 2018, with the _General Data Protection Regulation_ (GDPR) (or _Datenschutz-Grundverordnung_ (DSGVO) in German) coming into effect, I customized the website to comply with the regulations and eliminate loading external resources.
+
+**Information:**
+
+* **Technologies:** Wordpress, Plugins, CSS, Photoshop
+
+### Max Payne Zone
+
+
+ { width=500 }
+
+
+In 2002, I took charge of _Max Payne Zone_ (MPZone) which was one of the biggest [Max Payne](https://www.remedygames.com/games/max-payne/) fan sites and the biggest one for German speakers.
+I updated and improved it maintaining its original design and re-launched it in 2003, in time for the launch of [Max Payne 2](https://www.remedygames.com/games/max-payne-2/).
+
+With a staff of 6 news posters, it provided extensive news coverage of the game and custom modifications (mods), game-related information (such as tips and walkthroughs), and an active discussion forum.
+
+
+ { width=500 }
+
+
+The amazing folks of [Remedy Entertainment](https://www.remedygames.com/) valued the efforts of the fan community and (together with their publisher [Rockstar Games](https://www.rockstargames.com/)) collaborated with us and three other big fan sites.
+We received news updates in advance, exclusive content and gear to be used for competitions.
+As a result, several competitions were held where users could win prizes.
+
+It had a custom content management system (CMS) built in PHP that allowed news posters to post news items.
+
+**Information:**
+
+* **Technologies:** Apache, CSS, HTML, MySQL, PHP (frontend and custom-built backend for content management)
diff --git a/docs/research/overview.md b/docs/research/overview.md
index 8efd76b..f46416d 100644
--- a/docs/research/overview.md
+++ b/docs/research/overview.md
@@ -53,7 +53,7 @@ I have been on the Program Committee for the following conferences/workshops:
* [MLE 2019](https://gemoc.org/events/mle2019) (co-located with [MODELS 2019](https://modelsconf19.org/))
* [MOMO 2018](https://2018.programming-conference.org/track/MOMO-2018-papers) (co-located with [ 2018](https://2018.programming-conference.org/home))
* [MODELS 2017 Artifact Evaluation](https://models17ae.itu.dk/) (open review on [GitHub](https://github.com/grammarware/models17))
-* [GEMOC 2017](https://gemoc.org/events/gemoc2017.html) (co-located with [MODELS 2017](https://www.cs.utexas.edu/models2017))
+* [GEMOC 2017](https://gemoc.org/events/gemoc2017.html) (co-located with [MODELS 2017](https://web.archive.org/web/20180628044654/https://www.cs.utexas.edu/models2017))
* [GEMOC 2016](https://gemoc.org/events/gemoc2016.html) (co-located with [MODELS 2016](https://web.archive.org/web/20240303155734/https://models2016.irisa.fr/))
* [GEMOC 2015](https://gemoc.org/events/gemoc2015.html) (co-located with [MODELS 2015](https://cruise.eecs.uottawa.ca/models2015/)),
* [MODELS 2014](https://models2014.webs.upv.es/) (co-reviewer)
diff --git a/mkdocs.yml b/mkdocs.yml
index d539492..06ec3e1 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -30,7 +30,9 @@ theme:
- navigation.expand
- navigation.indexes
- navigation.tabs
+ - navigation.top
- toc.follow
+ # - toc.integrate
logo: assets/images/profile.jpg
language: en
name: material
@@ -99,6 +101,8 @@ plugins:
exclude:
- index.md
- blog/**
+ # https://github.com/blueswen/mkdocs-glightbox
+ - glightbox
markdown_extensions:
# Abbreviations
diff --git a/pyproject.toml b/pyproject.toml
index 8cac8d2..0c19077 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -7,6 +7,7 @@ requires-python = ">=3.12"
dependencies = [
"markdown-callouts==0.4.0",
"mkdocs-git-revision-date-localized-plugin==1.3.0",
+ "mkdocs-glightbox==0.4.0",
"mkdocs-material==9.5.44",
]
diff --git a/uv.lock b/uv.lock
index 9a14153..0df3fd7 100644
--- a/uv.lock
+++ b/uv.lock
@@ -258,6 +258,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/67/e5/ffeb92db53af8c3aa2d92e21a3cf6b5f83eee7e03b9cf9234ef6b30230d5/mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1", size = 22549 },
]
+[[package]]
+name = "mkdocs-glightbox"
+version = "0.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/86/5a/0bc456397ba0acc684b5b1daa4ca232ed717938fd37198251d8bcc4053bf/mkdocs-glightbox-0.4.0.tar.gz", hash = "sha256:392b34207bf95991071a16d5f8916d1d2f2cd5d5bb59ae2997485ccd778c70d9", size = 32010 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/72/b0c2128bb569c732c11ae8e49a777089e77d83c05946062caa19b841e6fb/mkdocs_glightbox-0.4.0-py3-none-any.whl", hash = "sha256:e0107beee75d3eb7380ac06ea2d6eac94c999eaa49f8c3cbab0e7be2ac006ccf", size = 31154 },
+]
+
[[package]]
name = "mkdocs-material"
version = "9.5.44"
@@ -332,6 +341,7 @@ source = { virtual = "." }
dependencies = [
{ name = "markdown-callouts" },
{ name = "mkdocs-git-revision-date-localized-plugin" },
+ { name = "mkdocs-glightbox" },
{ name = "mkdocs-material" },
]
@@ -344,6 +354,7 @@ dev = [
requires-dist = [
{ name = "markdown-callouts", specifier = "==0.4.0" },
{ name = "mkdocs-git-revision-date-localized-plugin", specifier = "==1.3.0" },
+ { name = "mkdocs-glightbox", specifier = "==0.4.0" },
{ name = "mkdocs-material", specifier = "==9.5.44" },
]