diff --git a/.gitignore b/.gitignore
index 906662f..69ddb89 100644
--- a/.gitignore
+++ b/.gitignore
@@ -403,3 +403,5 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk
+
+.idea/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..ee29aa0
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,34 @@
+variables:
+ CI_PROJECT_DIR: "."
+ CI_REGISTRY_IMAGE: hub.ducoterra.net/ducoterra/java-docs-2020
+ DEPLOY: javadocs2020
+
+stages:
+ - build
+ - deploy
+
+build:
+ only:
+ variables:
+ - $CI_COMMIT_TAG
+ stage: build
+ image:
+ name: gcr.io/kaniko-project/executor:debug
+ entrypoint: [""]
+ script:
+ - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
+
+deploy:
+ stage: deploy
+ only:
+ variables:
+ - $CI_COMMIT_TAG
+ image:
+ name: debian:10
+ entrypoint: [""]
+ script:
+ - apt -qq update >> /dev/null && apt -qq install -y curl gettext >> /dev/null
+ - curl -o /usr/bin/kubectl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
+ - chmod +x /usr/bin/kubectl
+ - curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
+ - helm upgrade --install $DEPLOY ./helm --set image=$CI_REGISTRY_IMAGE --set tag=$CI_COMMIT_TAG
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..7bbc99d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,9 @@
+FROM python:3.9.0 as BUILD
+COPY requirements.txt .
+RUN pip install -r requirements.txt
+COPY mkdocs.yml .
+COPY docs docs
+RUN mkdocs build
+
+FROM nginx:latest
+COPY --from=BUILD /site/ /usr/share/nginx/html/
diff --git a/README.md b/README.md
index fba4bd4..4a8501c 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,10 @@
-# java-2020-class
+# Docs
+```bash
+ffmpeg -i in.mov -filter:v "setpts=0.5*PTS" out.gif
+```
+
+```bash
+git config --global pager.branch false
+git config --global pager.tag false
+```
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..4f09b3b
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,8 @@
+version: '3'
+
+services:
+ docs:
+ image: hub.ducoterra.net/ducoterra/java-docs-2020:latest
+ build: .
+ ports:
+ - 8080:80
\ No newline at end of file
diff --git a/docs/day0.md b/docs/day0.md
new file mode 100644
index 0000000..e904aa6
--- /dev/null
+++ b/docs/day0.md
@@ -0,0 +1,162 @@
+# Day 0
+
+When you start programming half the battle is getting your bearings. Suddenly it matters where you put your files. You need to know where you home directory is, you need to understand file permissions, you need to understand what a file actually *is*. Trying to program without first learning about *the thing you are programming* will cause headache.
+
+Fortunately we can do some things to make your life easier. We can install an **Integrated Development Environment (IDE):** a program that lets you visualize your files and folders and quickly switch between them. We can install a **version control system (VCS)** that will let you "snapshot" your code and save it to the cloud so you never lose it. We can organize our project to be repeatable, and more importantly, un-loseable.
+
+## I have a Windows PC
+
+(or skip to [I have a Mac](#i-have-a-mac))
+
+### Install Git (windows)
+
+Git is a version control program, but you can think of it as your best friend in the cold, dark world of data loss. Git will make sure you don't lose progress. It lets you save your code at various stages and revert to previous saves if you need to. Like mentioned above, it takes a "snapshot" of your code at that point in time.
+
+1. Head to
+
+2. Click Download
+
+ 
+
+3. Run through the default install process
+
+
+### Install Java (windows)
+
+1. Head to
+
+2. Under the **Developer Tools** section, check the **JDK (AdoptOpenJDK) x64 8** option and then **Get Your Ninite**
+
+ 
+
+3. Once the file has finished downloading, click on the installer to Run through the install process.
+
+ 
+
+
+
+### Add Java to path (windows)
+
+1. Open the File Explorer, and navigate to `C:\Program Files\AdoptOpenJDK\jdk-8.x.xxx\bin`
+
+2. Copy the path to your clipboard
+
+ 
+
+3. Now click the Windows Start Button
+
+4. Start typing **environment**
+
+5. Click on **Enter the System Environment variables**
+
+ 
+
+6. Click on **Environment Variables..**
+
+7. Under the *System Variables* section, find and click the **Path** entry and then click **Edit**
+
+ 
+
+8. Click **New** and paste in the path copied in Step 1 and click **OK**
+
+ 
+
+9. Reboot your computer
+
+
+### Install BlueJ (windows)
+
+Your most important tool as a programmer is a proper editor. It should offer you a wide selection of tools but get out of your way when you don't need it
+. While there are manny advanced editors and IDEs out in the wild, its always good to start with the basics, to get a proper grasp and understanding of the
+ language.
+
+1. Head to
+
+2. Click on the download link
+
+ 
+
+3. Run through the installer, select default options
+
+ 
+
+4. Open BlueJ
+
+ 
+
+
+### Create a "Projects" folder (windows)
+
+I keep all my projects in a folder called "Projects" in my home directory. On Windows this is at `C:\Users\\Projects`. Create this folder now. Bookmark it, put it in your favorites, don't lose it.
+
+1. In BlueJ, go to the **Project** menu and click on **New Project**
+
+2. For the Name, enter `java_game`, for the Location, select the `Projects` folder you created in the step above.
+
+ 
+
+
+## I have a Mac
+
+### Install Git (mac)
+
+Git is a version control program, but you can think of it as your best friend in the cold, dark world of data loss. Git will make sure you don't lose progress. It lets you save your code at various stages and revert to previous saves if you need to.
+
+1. Head to
+
+2. Click Download
+
+ 
+
+3. Run through the default install process
+
+### Install Python (mac)
+
+1. Head to
+
+2. Select **OpenJDK 8 (LTS)** for version, and **HotSpot** for JVM and click the **Latest Release** download button
+
+ 
+
+3. Follow the standard install process
+
+ 
+
+### Install BlueJ (mac)
+
+Your most important tool as a programmer is a proper editor. It should offer you a wide selection of tools but get out of your way when you don't need it
+. While there are manny advanced editors and IDEs out in the wild, its always good to start with the basics, to get a proper grasp and understanding of the
+ language.
+
+
+Your most important tool as a programmer is a proper editor. It should offer you a wide selection of tools but get out of your way when you don't need it
+. While there are manny advanced editors and IDEs out in the wild, its always good to start with the basics, to get a proper grasp and understanding of the
+ language.
+
+1. Head to
+
+2. Click on the download link
+
+ 
+
+3. Click on the BlueJ mac zip that was downloaded to automatically unzip the file
+
+4. In the BlueJ folder that was just created, drag `BlueJ.app` to your `Applications` folder
+
+ 
+
+5. Open BlueJ
+
+ 
+
+### Create a "Projects" folder (mac)
+
+I keep all my projects in a folder called "Projects" in my home directory. On Windows this is at `/Users//Projects`. Create this folder now. Bookmark it, put it in your favorites, don't lose it.
+
+1. In BlueJ, go to the **Project** menu and click on **New Project**
+
+ 
+
+2. For the Name, enter `java_game`, for the Location, select the `Projects` folder you created in the step above.
+
+ 
\ No newline at end of file
diff --git a/docs/day1.md b/docs/day1.md
new file mode 100644
index 0000000..367823d
--- /dev/null
+++ b/docs/day1.md
@@ -0,0 +1,258 @@
+# Day 1
+
+Before we can dive into our web project we have to cover some Python basics. Let's talk about writing a python program.
+
+## The Interactive Python Prompt
+
+1. Make sure you have a (venv) to the left of your terminal cursor. Type `python` and press enter.
+
+ **NOTE**: This is not a terminal! You cannot run your django server from here. Before you can do things in the terminal you must exit by typing `exit()`!
+
+ 
+
+2. Type `1+1` and press enter. You should see `2` returned. As long as you see the `>>>` to the left of your cursor you can type any python code you want and press enter to execute it.
+
+3. Type `x=1` and press enter. Nothing should return.
+
+4. Type `x` and press enter. You should see `1` return. We've give `x` the value of `1`
+
+5. Type `x+1` and press enter. You should see `2` returned just like `1+1` above.
+
+6. Type `x=3` and press enter. Nothing should return.
+
+7. Type `x` and press enter. You should see `3` return. Variables in Python can be reassigned to anything else.
+
+8. Type `x="hello"` and press enter. Nothing should return.
+
+9. Type `x` and press enter. You should see `hello` printed to the screen. Variables in python do not have a "type" - they can be integers, strings, floats, etc and can switch between them at will.
+
+10. Type `my_name = ""` and press enter. Nothing should return
+
+11. Type `my_name` and press enter. You should see your name printed to your terminal. `my_name` is a much better variable name than `x`. It describes the thing it stores. Please use variable names that are descriptive.
+
+12. Type `my_coordinates = (1,2)` and press enter. Nothing should return.
+
+13. Type `my_coordinates` and press enter. `(1,2)` should return. This is called a `tuple`. It's useful for storing multiple points of data.
+
+14. Type `address = (123, "lane ave", "Columbus", "OH", 43212)` and press enter. Nothing should return
+
+15. Type `address` and press enter. You should see the address print to the terminal. Tuples can hold multiple types of data - 123 is a number and "lane ave" is a string.
+
+16. Type `len(address)` and press enter. You should see `5` printed to the terminal. There are 5 "things" in the tuple:
+
+ (1) `123`
+
+ (2) `"lane ave"`
+
+ (3) `**"Columbus"`
+
+ (4) `"OH"`
+
+ (5) `43212`
+
+17. Type `address[0]` and press enter. You should see `123` printed to the terminal. You just accessed the first item in the tuple. Tuples and other collections start at 0 and count up.
+
+18. Type `address[1]` and press enter. You should see `"lane ave"` print to the terminal. You just accessed the second item in the tuple
+
+19. Type `vocabulary = {"apple": "the usually round, red or yellow, edible fruit of a small tree, Malus sylvestris, of the rose family.", "banana": "a tropical plant of the genus Musa, certain species of which are cultivated for their nutritious fruit."}` and press enter. Nothing should return.
+
+20. Type `vocabulary` and press enter. {"apple": ...} should print to the terminal. This is called a dictionary.
+
+21. Type `vocabulary["apple"]` and press enter. `'the usually round, red or yellow, edible fruit of a small tree, Malus sylvestris, of the rose family.'` should print to the terminal. You just access the definition of apple. Much like tuples can be accessed with `address[0]` or `address[1]`, dictionary values can be accessed by supplying the keyword, or key for short.
+
+22. Type `exit()` and press enter. You should no longer see `>>>` to the left of the cursor.
+
+## A Python Program
+
+1. Create a new file called `my_program.py` by clicking the "add file" icon in the top left of VSCode.
+
+ 
+
+ 
+
+ 
+
+2. In this file type `print('hello, world!')` and save with ++ctrl++ + S
+
+ 
+
+3. In the terminal type `python my_program.py` and press enter. You should see `hello, world!` printed to the terminal.
+
+ 
+
+4. Congratulations! You ran your first python file. Just like the python command prompt above, running `python ` on a file with python code in it will execute that python code. Now we can run multiple lines of python at once!
+
+5. Below `print('hello, world!')` type `print('goodbye!)`
+
+ 
+
+6. Below `print('goodbye')` type
+
+ ```python
+ x = 1
+ y = 2
+ print(x + y)
+ my_name = ""
+ print(my_name)
+ ```
+
+ 
+
+7. Save the file with ++ctrl++ + S. In your terminal type `python myprogram.py` and press enter. You should see
+
+ ```bash
+ hello, world!
+ goodbye!
+ 3
+ Reese
+ ```
+
+ printed to the terminal
+
+8. This is out of order. We want to print "goodbye" last. Let's fix that with functions.
+
+9. Above `print('hello, world!')` type `def print_hello():`
+
+ 
+
+10. Indent `print('hello, world!')` by pressing ++tab++
+
+ 
+
+11. Give 'goodbye' the same treatment. This time type `def print_goodbye():`
+
+ 
+
+12. Finally add `def middle_stuff():` above the remaining cod
+
+ 
+
+13. Save the file with ++ctrl++ + S. Now type `python my_program.py` in the terminal and press enter. Nothing will return.
+
+ 
+
+14. We've given our snippets of code "names" by adding a "def" above them. These are called functions. We can call them in any order we want. Let's call them in the correct order by using their names. Add the following to the bottom of my_program.py
+
+ ```python
+ print_hello()
+ middle_stuff()
+ print_goodbye()
+ ```
+
+15. Type `python my_program.py` in the terminal and press enter. Now everything prints in order!
+
+ 
+
+## A Django Project
+
+Now that we can write some basic python we can begin our django project. Let's start by creating a view.
+
+1. Close out of my_program.py
+
+2. In the terminal type `django-admin startapp mysite`
+
+ 
+
+3. Expand the `config` folder by clicking on it
+
+ 
+
+4. Click on `settings.py` to open it
+
+5. Scroll down to line 33 and add `mysite` above `'django.contrib.admin'`
+
+ 
+
+6. Save with ++ctrl++ + S
+
+7. Click on `urls.py` to open it
+
+ 
+
+8. On line 17 add `, include` after `from django.urls import path`
+
+ 
+
+9. Add `path('', include('mysite.urls')),` above `path('admin/', admin.site.urls),`
+
+ 
+
+10. Expand the newly created `mysite` folder by clicking on it
+
+ 
+
+11. Right click on `mysite` and click "New Folder". Name it `templates`
+
+ 
+
+12. Right click on `templates` and click "New Folder". Name it `mysite`
+
+ 
+
+13. Right click on the `mysite` folder inside `templates` and click "New File". Name it `index.html`
+
+ 
+
+14. Open `index.html` by clicking on it
+
+15. Add the following to index.html
+
+ ```html
+
+
+
+ {{ data }}
+
+
+