class: center, middle .logo[  ] ### Recitation _Monday January 27th, 2026_ # Version control & GitLab **Presented by Julian Gallimore** --- # Slides Find them on the schedule page: https://fabacademy.org/2026/schedule.html # What we'll cover 1. [Fabcloud services & How to login](#chapter-fabcloud) 1. [GitLab & CI](#chapter-gitlab-ci) 1. [Setup your local environment](#chapter-git-setup) 1. [Git pushing changes](#chapter-git-push) 1. [Setup Mkdocs framework](#chapter-setup-mkdocs) 1. [Setup Docusaurus framework](#chapter-setup-docs) --- layout: true **Fab Cloud platform** --- name: chapter-fabcloud # .logo_tiny[] FABCLOUD * [fablabs.io](https://fablabs.io) - Network map of FabLabs & Single Signon (universal logins) * [gitlab.fabcloud.org](https://gitlab.fabcloud.org/) - Open source Git repository & website hosting * [chat.academany.org](https://chat.academany.org/) - Open source collaborative chat service * [nueval.academany.org](https://nueval.academany.org/) - Custom built student evaluation tool All platforms are self-hosted and managed by Fab Foundation on AWS in the US. Have any issues contact me at it@fabacademy.org --- ## Fablabs.io - Online platform that maps the FabLab network world-wide - Discussion Forums for engaging with the wider FabLab network - Provides the user account logins for our platforms GitLab & Nueval ie. a "Login with Fablabs.io" button .logo_small.center[  ] --- ## What is GitLab GitLab is a web-based tool that provides a Git-repository hosting plus extra features, developed by GitLab Inc. * Similar to GitHub, Bitbucket * Source code hosting your Git projects, plus: * Issues tracker * Collaboration tools (ie. Merge requests, Review apps, etc) * Website hosting (GitLab Pages) * CI pipeline for automatic project building/compiling * We self-host our own version of Gitlab * We host all the Git repositories related to the academies * Where you will can edit YOUR documentation website > More info about GitLab https://docs.gitlab.com/ --- ## What do we use Gitlab for We use GitLab for all the content related to Fab Academy. 1. **Student repository** storing your documentation files 1. Use the GitLab tools to help with **project management** (issues, milestones, boards) 1. **Host** student & class websites (using [GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/index.html) 1. Notice board & ask questions in the class [issues tracker](https://gitlab.fabcloud.org/academany/fabacademy/2026/class/-/issues) --- class: middle, center ### Fab Academy GitLab structure .logo_medium.center[  ] --- ## About your website URL You can fine a list of all students participating in this academy at: **Current**: [fabacademy.org/2026/people.html](https://fabacademy.org/2026/people.html) **Alumni**: [fabacademy.org/2026/prior.html](https://fabacademy.org/2026/prior.html) #### Example website URL: fabacademy.org/2026/labs/**my-lab-name**/students/**my-name-here** #### Example repository URL: gitlab.fabcloud.org/academany/fabacademy/2026/labs/**my-lab-name**/students/**my-name** --- layout: true # GITLAB --- class: center ## HOW TO LOGIN **New students**, find your access details in an email sent to you, subject:
"_Fab Academy 2026 platform details_"
or
"_Fab Academy 2026 account setup_" --- class: center ## 1. Start at GITLAB.fabcloud.org
--- class: center ## 2. Login at FABLABS.io
.caption[ Use your username/password we provided. Use "Forgot password" if you have trouble.
_Do not create a new account, contact coordination instead_ ] --- class: center ## 4. (first time) Grant access to GitLab
--- class: center ## 5. Success! GITLAB Dashboard You should be redirected to gitlab.fabcloud.org and see your project list
--- class: middle, center ### Demo the GitLab interface * Dashboard * Fab Academy 2026 group * Student project * Sidebar links * List of project files * How to edit a file * Review CI (project builds) Visit [gitlab.fabcloud.org/academany/fabacademy/2026/](https://gitlab.fabcloud.org/academany/fabacademy/2026/) --- layout: true **About Git** --- name: chapter-git # What is Git Git is a tool used for tracking changes to files over time (official website at [git-scm.com](https://git-scm.com)) It helps you: - Save your changes as **commits** - Store everything in a **repository** - Can view history of all commits (who/when/what changed) - Revert/restore past changes (good if anything breaks) - Push commits (changes) to remote **central repo** (upstream/origin) - Multiple locations can sync their changes with remote origin repository [Learn Git by Baeldung](https://www.baeldung.com/git-guide) [Wikipedia.org/wiki/Git](https://en.wikipedia.org/wiki/Git) --- ## Git Staging Process Explained * **Working Directory** - holds the actual version of files * **Staging Area** - temporary area where you prepare changes before committing * **Repository** - permanent storage of all commits and history (local and remote) * **Remote** - central repository (e.g. GitLab) where you can sync your local copy with * [Git Staging Process Explained](https://www.baeldung.com/ops/git-guide#git-workflow) --- ## Git Staging Process The diagram below illustrates the different areas in your local git repository. .full-width[  ] --- layout: true Gitlab Web IDE --- ## Gitlab Web IDE You can use the web-based code editor (WebIDE) in GitLab. This is an VS Code-like editor where you can edit files and make your Git commits. .full-width[  ] --- ### FYI: Committing changes in Web IDE You want to make sure you always commit to your default branch, "**main**"! You do not need to use "branches" and merge requests, as you are the only one working on your project. If you get asked "are you sure?" click "continue". .full-width[  ] --- layout: true **GitLab CI** --- name: chapter-gitlab-ci # GitLab CI One of the killer features of Gitlab. CI stands for [Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration) a common practice of software development. .full-width[  ] --- ## What this is capable of: - Compiling websites with static site generators - Make beautiful documentation using Gitbook, Sphinx, Mkdocs - Automated Testing for software - Resizing images - Integrating content from different sources - ...much more Read more at [Gitlab Docs](https://docs.gitlab.com/ee/ci/) --- ## CI build process flow .full-width.center[  ] --- ## How does it work? - Your repository has a special `.gitlab-ci.yml` file (the dot is important). - Push the commit to your repository. - Then the CI server will run a "Pipeline" process for that commit. - The `.gitlab-ci.yml` file is read and the instructions are followed in a "job". - After the job completes, the results are shown in your CI pipeline history. .caption[ Keep in mind, A Pipeline is run for every commit you push. If you push very frequently together, the order running them may vary, but only the last pipeline to finish is used to publish youre website (in our cases). ] --- ## Where does a CI job run? CI jobs run on **runners**. Runners are seperate machines that execute the jobs defined in your `.gitlab-ci.yml` file and send back results to Gitlab. Since we can not know what software your project needs, we run your jobs in docker "*containers*". A docker *container* is a lightweight virtual machine run based on a docker "*image*". These docker images can come with preinstalled software, or you can create your own, which are downloaded when a job starts. ```yml image: python:3.11-bookworm ``` This will run the job in a docker container with Python 3.11 preinstalled in Debian. See how this image is build from this [Dockerfile](https://github.com/docker-library/python/blob/master/3.11/bookworm/Dockerfile) (if your curious) or see [list of Python images](https://hub.docker.com/_/python). ```yml image: node:22 ``` This will run the job in a docker container with Node.js 22 preinstalled. One common place to find images is [Docker Hub](https://hub.docker.com/). --- #### Example `.gitlab-ci.yml`: publish plain HTML files (default student project setup) ```yml # The base docker image to run this job. This example uses a simple linux image image: busybox # This is the "job" name (needs to be called "pages" to publish website) pages: # These are the commands you want to run for the job (required) script: - echo "No commands to run, just upload the public folder to Pages." # Tell GitLab we want to save a folder after finishing the job artifacts: paths: # GitLab Pages requires the publish folder be called "public" with html files - public # This defines when to run this "job" rules: # if the commit is to the default branch - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ``` --- #### Example `.gitlab-ci.yml`: build and publish MkDOCS site ```yml # What type of pre-built docker image should run this job (here we need python) image: python:3.11-slim # This is the "job" name (needs to be "pages") pages: # These are the commands that will be run in the job script: # install Git for the mkdocs revision plugin - apt update && apt-get install -y git # Install mkdocs and other themes/plugins listed in your project's requirements.txt file - pip install -r requirements.txt # Build the website html files - mkdocs build --site-dir public # Tells GitLab which folder to keep after finish building artifacts: paths: # For GitLab Pages, we need a folder called "public" with html files - public # Defines when to run this "job" when a commit is pushed rules: # (eg. only for the default branch) - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ``` --- ## Example CI Configurations Below you can find some example CI configurations for different project types. In most of these examples, just delete all your project files and replace with new files from the template. * [Mkdocs template](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-mkdocs) using Markdown and the [material theme](https://squidfunk.github.io/mkdocs-material) * [Hugo template](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-hugo) (example using a popular [static site generator](https://gohugo.io/)) * [Docusaurus template](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-docusaurus) (example using [documentation site generator](https://docusaurus.io/)) * [Example: Using NPM with framework example](https://gitlab.fabcloud.org/-/snippets/120) (React,Vue,Angular,etc) * [Example: Using NodeJS to intall TailwindCSS with HTML](https://gitlab.fabcloud.org/-/snippets/117) * Downloaded a HTML theme? Use the [default HTML template](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-html) and put your HTML files in the public folder .caption[Keem in mind, you need a `.gitlab-ci.yml` file in your project to publish/update your website] GitLab has a list of example repositories for other common static static site generators or libraries. Review their `.gitlab-ci.yml` in some of their examples at [gitlab.com/pages](https://gitlab.com/pages). --- class: middle, center ### Demo GitLab CI interface Visit [gitlab.fabcloud.org/academany/fabacademy/2026/site](https://gitlab.fabcloud.org/academany/fabacademy/2026/site/-/pipelines) --- layout: true **GIT on your computer** --- name: chapter-git-setup class: middle ## Setup Git locally 1. Install Git on your computer 2. Configure your Git environment 3. Authenticate GIT with your GitLab account 4. Pull (download) your project repository --- class: middle ## Git on your computer Most modern OS now have GIT installed, but if not check [these docs](https://docs.gitlab.com/topics/git/how_to_install_git/). * Check you have git ```terminal git --version ``` * _MacOS_: using Homebrew ```terminal brew install git ``` * _Ubuntu_: ```terminal apt install git ``` * _Windows_: See [git-scm.com/downloads](https://www.git-scm.com/downloads) for examples --- ## Git authentication To be able to pull your repository and push (upload) your changes to GitLab cloud, we need a way for your computer to prove its identity to the GitLab server. * Using SSH keys (recommended) * Using personal access tokens (less secure) .caption[Note: If you use SSH keys, any code editor you use will be able to authenticate with your GitLab account automatically.] --- ## SSH Keys Git uses the *SSH protocol* to establish secure communication between your computer and the GIT server hosting your repository, no password needed! SSH keys are a pair of files that prove your identity to a server. Your computer has a "*private*" key and usually the server (or GitLab in our case) has the corresponding "*public*" key. We call it "public" because it's safe to share - it's meant to be distributed. When making a connection, if the two keys match, the server knows it's you! (See [Wikipedia](https://wikipedia.org/wiki/Public-key_cryptography)) The OpenSSH client comes pre-installed on GNU/Linux, macOS, and Windows 10, which will be used to generate SSH keys. Otherwise search how to install SSH keys on your operating system. --- ## Generate a new SSH Key See [the GitLab docs](https://docs.gitlab.com/user/ssh/#check-for-existing-ssh-key-pairs) for more details steps. .caption[If you already have an SSH key generated (e.g., for GitHub), you can skip this step and use that one.] #### Create a new key ```terminal ssh-keygen -t ed25519 -C "my-laptop-key-for-gitlab" ``` * Accept the suggested filename and directory, unless you want something specific and know what you are doing. * Leave the passphrase empty (press *Enter* twice) (recommened to keep things simple) #### Add the private SSH key to your ssh-agent (system): ```terminal ssh-add ~/.ssh/id_ed25519 ``` .caption[] --- ### Add the public key to your GitLab profile To use SSH with GitLab, copy your public key to your GitLab account. GitLab cannot access your private key. [See GitLab docs](https://docs.gitlab.com/ee/user/ssh.html#add-an-ssh-key-to-your-gitlab-account) MacOS: Copy the contents of your public key file (`.pub`)! ```terminal tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy ``` Windows: Copy the contents of your public key file (`.pub`)! ```terminal cat ~/.ssh/id_ed25519.pub | clip ``` In GitLab, go to the top navigation bar, 1. click your Profile image > Preferences > SSH Keys 2. click "Add SSH Key". Set a *title*, pasted the copied key, click "Add key".
--- ## Verify you SSH connection Verify you can connect to Gitlab using your SSH key ```terminal ssh -T git@gitlab.fabcloud.org ``` On your first connection, you might need to verify the authenticity of the GitLab host. Follow the on-screen prompts if you see a message like: ```terminal The authenticity of host 'gitlab.fabcloud.com (13.59.248.79)' can't be established. ECDSA key fingerprint is SHA256:abcdefghijk1234567890abcdefghijk1234567890. Are you sure you want to continue connecting (yes/no)? ``` You should receive a welcome message. ```terminal Welcome to GitLab,
! ``` If the message doesn’t appear, you should troubleshoot your SSH connection. Check [GitLab docs](https://docs.gitlab.com/user/ssh_troubleshooting/). --- ## Clone your project locally * Go to your students project page (in GitLab) * Click the blue **Code** button, then copy the "*Clone with ssh*" URL. * Then in your terminal, use command `git clone` followed by the copied URL. ```terminal git clone git@gitlab.fabcloud.org:fabacademy/student-demo.git my-fabacademy-2026 ``` .caption[ Replace "my-fabacademy-2026" with the name of the folder you want on your computer. ] Go into the folder, and check that you can see your files or `git status`: ```terminal cd my-fabacademy-2026 ls -l git status ``` Having connection issues: * [Gitlab troubleshooting](https://docs.gitlab.com/user/ssh_troubleshooting/) * [Use SSH on Microsoft Windows ](https://docs.gitlab.com/user/ssh_advanced/#use-ssh-on-microsoft-windows) * See the full [GitLab ssh docs](https://docs.gitlab.com/ee/user/ssh.html) --- ## Tell GIT who you are It is a good idea to configure git on your computer with your name and email, so that when you make commits they can be attributed to you. ```terminal git config user.name "Your Name" git config user.email "your.email@example.com" ``` .caption[ Please use the **same name and email** address as your fablabs.io/Gitlab account (check your GitLab settings). ] See commit author below, from `git log`: .logo_medium.center[  ] --- name: chapter-git-push ## How to make a commit After making some changes to files, you will want to push these changes to GitLab so they can get published. First list the files in your working directory and staging area. ```terminal git status ``` Next selected the changed file(s) you want, moving them to the staging area. ```terminal git add docs/path-to-your-file.md ``` When ready, commit the selected changes in the staging area with a message. ```terminal git commit -m "Added my name" ``` After finishing work, you can push your new commit to remote repository. ```terminal git push ``` --- ## Check errors when pushing Example what an error looks like when pushing in GIT. .full-width[  ] .caption[ This error is GitLab limiting you to 2 0MB per commit. Amend your previous commit to remove some larger images/files. ] --- ## Git Tips * Use descriptive commit messages * E.g. "Added my name to home page" * E.g. "Updated week 1 assignment" * E.g. "Fix typo in introduction" * Also ok: "fix", "updated", "added" * Commit often (small, focused changes) * Makes it easier to see where something went wrong * You can commit more than one file or change at a time * Keeps commits small is size (KB) * We have a self-imposed limit of 20MB per commit * Try out "*git add -p*" to stage changes per "hunk" rather than whole files * Push end of day work (or at least before you leave the lab) * Keeps your work safe * Allows you to continue work on another computer * No need to push after every commit (but do it regularly) --- ## How to pull latest changes Before starting work, it is a good idea to check if there are commits on the remote repository you do not have locally. This can happen if you made changes directly on GitLab (WebIDE) for example or pushes from another computer. The following command will download any new commits and also handle if you also have some uncommitted changes: ```terminal git pull --rebase --autostash ``` You can also see the status of your working directory and staging area with: ```terminal git status ``` Example of message (no files changed, and in sync with remote) ```terminal On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean ``` --- ## Extra useful commands To see what has changed in the files of your working directory. (before start commiting) ```terminal git diff ``` .caption[ The markings `---` means line was removed, while `+++` means adding a line. Scoll down if file is big or move to next page with arrow keys. ] See a log of all recent commits ```terminal git log --graph ``` .caption[ You can also see visual graph history of commits in GitLab or with a GUI application ] --- ## Git Commands * `git init` - Initialize a new Git repository * `git clone
` - Clone an existing repository * `git add
` - Add files to the staging area * `git commit -m "message"` - Commit changes to the repository * `git fetch` - Only download changes from the remote repository without pulling them into your local branch * `git push` - Push changes to the remote repository * `git pull` - Pull changes from the remote repository * `git status` - Show the status of files in the working directory * `git log` - Show the commit history --- ## How to reset your local repository If things are just not working in your project or you are stuck. You can do a "hard reset" of your local repository. This command will make your local repository match to what is in your GitLab remote repository (removing any local changes and pending commits): ```terminal git reset --hard origin/main ``` --- layout:true --- # Additional links - [Learn Git by Atlassian](https://www.atlassian.com/git/tutorials/what-is-version-control) (nice descriptions and diagrams) - [Learn Git by GitTower](https://www.git-tower.com/learn/) - [Dangit, Git!](https://dangitgit.com/) (common git problems) - [Fab Academy 2019 Tutorials Git cheat ](https://fabacademy.org/2019/docs/FabAcademy-Tutorials/week01_principles_practices_project_management/git_simple.html) - [Fiore's recitation from 2019](http://fabacademy.org/2019/recitations/version-control/) - [Recitation 2020 by Kris and Viktor.](http://academany.fabcloud.io/fabacademy/2020/recitations/version-control/) --- layout: true General suggestions --- ## Tips for files in HTML * Use relative paths to your files and pages (ie. "../images/assignment.jpg") * Avoid spaces and non-ASCII characters in paths (ie. use alphanumeric and "-") * Suggest to keep all filenames lower-case (some systems are case-sensitive) * Do not use full URLs to link to your files: * *https://fabacademy.org/2026/labs/abcde/students/my-name/profile-picture.jpg* * *https://academany.fabcloud.io/fabacademy/2026/labs/abcde/students/my-name/profile-picture.jpg* * *https://gitlab.fabcloud.org/academany/fabacademy/2026/labs/abcde/students/my-name/profile-picture.jpg* * Download external files instead of linking to them: * *https://example.com/image.jpg* → (ie. download and save as *images/external-examplecom-image-name.jpg*) * But put credit to the source under the image * This makes sure the files are always present even if the external link breaks * Download external libraries * *https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.2.1/reveal.js* → (ie. download and save as *js/reveal.js*) * Makes sure the libraries are always present even if the external link breaks --- ## File sizes in your website * You should optimize your images and videos for viewing on website * Not everyone may have fast internet or data limits (ie. mobile data). Each time someone views your website, they download your images/files. * _IMHO: Good defaults (soft limits)_: * Resize images to be maximum 800px wide (that makes them less than 100KB) * Optimize each video to be like 1-5MB (MAX max 10MB) * you do not need 4k or 1080p to show a blinking light ;) * Avoid GIFs (except for memes :), videos can be smaller) * Why? * Hard limit of 500MB per published website (not the git repo) * How: 100 images of 100KB per week (_multiply by_) ~19 weeks = **185 MB** * Plus, adding some optimized videos or files per week (max 10MB) = **~200MB** * Then in theory you have ~100MB as extra space in case you want a few high quality images/videos, or for final project stuff * **PLAN** a budget of how much space you can use each week (track it!) --- ## Compression tools (quick tips) By default normal image apps, even GIMP and Photoshop are bad at image compression. So after use one of these tools: * Use a tools like [ImageMagic](https://fabacademy.org/2026/classes/computer_design/image.html) * on MacOS [ImageOptim](https://imageoptim.com/mac) app * Use web services like [TinyPNG](https://tinypng.com/) or [Squoosh](https://squoosh.app/) to compress images * This can reduce file size by 50-80% while maintaining quality * Maybe an EXIF cleaner too (you don't need your phone camera info in your images, published to the web) **Videos** try installing ccommand line too like: **ffmpeg** * Play around with settings and resolution to get as small a file possible * If you have trouble, try an app like [Handbrake](https://handbrake.fr/) --- layout: true Alternative to HTML: Markdown --- name: chapter-setup-mkdocs ## Alternative to HTML: Markdown --- ## Manually working with HTML files Working with HTML files, shared parts like the navigation bar would need to be copied to each file manually. See the two files below, the navbar need to be same.
--- ## Using Markdown for HTML * A markup language which allows easy to read and write plain-text document * Tools, like mkdocs, exist to convert markdown to valid HTML in a predictable manner
.caption[ See also [markdownlivepreview.com](https://markdownlivepreview.com/) ] --- layout: true Alternative to HTML: Markdown with Mkdocs --- ## About MkDocs * Tool, called a static site generator, made for project documentation * Documentation is mainly written in Markdown * Has a very good Material theme with lots of options/customisations * Easy to follow theme options * Builds your HTML site from the markdown and theme * Can also add extra plugins & extensions to add features to your site See more at [mkdocs.org](https://www.mkdocs.org/) and the [mkdocs-material theme](https://squidfunk.github.io/mkdocs-material/)
--- ### Basic files for a Mkdoc project * **mkdocs.yml** (configuration file for website) * **requirements.txt** (use to install mkdocs, themes, plugins) * **docs/** (folder for all markdown files and images) * eg. _docs/index.md_ * eg. _docs/assignments/week03.md_ * eg. _docs/images/profile.png_ * **.gitlab-ci.yml** (CI file to build mkdocs website and publish HTML) ### Interested? * check out [the MkDocs student template](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-mkdocs/) repository. * Download the files of the project to your local computer, replace all files in your project. * You can also use the WebIDE to delete and upload all the new files. * Read how to add pages [on mkdocs website](https://www.mkdocs.org/getting-started/#adding-pages). * check out installed [material theme](https://squidfunk.github.io/mkdocs-material/setup/) --- ## Typical CI errors ### CI does not know where to get the theme ```terminal $ mkdocs build --site-dir public ERROR - Config value: 'theme'. Error: Unrecognised theme name: 'sunshine'. The available installed themes are: material, mkdocs, readthedocs Aborted with 1 Configuration Errors! ``` > Remember, add the theme to the `requirements.txt` file with a version number --- ## Typical CI errors ### Possible mistake in _mkdocs.yml_ file or indentation: ```terminal $ mkdocs build --site-dir public Error: MkDocs encountered an error parsing the configuration file: mapping values are not allowed here in "/builds/academany/fabacademy/2026/example/site/mkdocs.yml", line 26, column 10 ``` > Check the last commit, and revert the change, or review the mkdocs.yml vs the mkdocs/theme docs. Also check the file is valid yml (ie. [yamllint.com](https://www.yamllint.com/)) --- layout: true --- ## Another option: [Docusaurus.io](https://www.docusaurus.io/) A new entry in the static site generator space, Docusaurus is gaining popularity for documentation sites. * Can use Markdown but also have ReactJs components embeded (if you like) * Has a built-in blog feature * More advanced customization but not as simple as mkdocs
See [getting started docs](https://www.docusaurus.io/docs) for more info: Example student template you can get start with: [student-template-docusaurus](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-docusaurus) --- layout: true **Example: Using Hugo framework for website** --- ## Next level: [Hugo framework](https://gohugo.io/) If you'd like a bit more advance framework vs mkdocs, one option is Hugo: * Not as readable as mkdocs but more flexible * Can use markdown for all pages, but also supports other formats and data * More advanced customization but not as simple as mkdocs * Chooses of pre-built themes at https://themes.gohugo.io/
See [getting started docs](https://gohugo.io/getting-started/) for more info on Hugo: Example student template you can get start with: [student-template-hugo](https://gitlab.fabcloud.org/academany/fabacademy/templates/student-template-hugo) --- layout: true --- class: center, middle # THANK YOU!