diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..643afc9
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,41 @@
+# This is the build workflow
+name: Build
+
+# Controls when the workflow will run
+on:
+ push:
+ pull_request:
+ workflow_call:
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ build:
+ name: Build
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ lfs: true
+ # From: https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#caching-packages
+ - name: Install poetry
+ run: pipx install poetry==1.7.1
+ - uses: actions/setup-python@v5
+ with:
+ python-version-file: .python-version
+ cache: poetry
+ # Install with --no-root because project does produce a python package
+ - run: poetry install --no-root
+ # From: https://github.com/squidfunk/mkdocs-material/blob/master/docs/publishing-your-site.md#with-github-actions
+ - name: Setup MkDocs cache
+ uses: actions/cache@v3
+ with:
+ key: mkdocs-material-${{ github.run_id }}
+ path: .cache
+ restore-keys: |
+ mkdocs-material-
+ - name: Build MkDocs site
+ run: poetry run mkdocs build
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 9325533..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: ci
-
-on:
- push:
- branches:
- - master
- - main
-
-permissions:
- contents: write
-
-jobs:
- deploy:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Configure Git Credentials
- run: |
- git config user.name github-actions[bot]
- git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- - uses: actions/setup-python@v4
- with:
- python-version: 3.x
- - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- - uses: actions/cache@v3
- with:
- key: mkdocs-material-${{ env.cache_id }}
- path: .cache
- restore-keys: |
- mkdocs-material-
- - run: pip install mkdocs-material
- - run: mkdocs gh-deploy --force
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..e00336a
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,47 @@
+# This is the release workflow
+name: Release
+
+permissions:
+ contents: write
+
+# Controls when the workflow will run
+on:
+ # Triggers the workflow on push or pull request events but only for the "main" branch
+ push:
+ branches:
+ - main
+ - beta
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+ inputs:
+ do_release:
+ description: 'Run the release job?'
+ required: true
+ default: false
+ type: boolean
+
+env:
+ test_env_var: "hello!"
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ release:
+ name: Release
+ if: ${{ inputs.do_release }}
+ needs: build
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write # to be able to publish a GitHub release
+ issues: write # to be able to comment on released issues
+ pull-requests: write # to be able to comment on released pull requests
+ id-token: write # to enable use of OIDC for npm provenance
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ - uses: ./.github/workflows/build.yml
+ - uses: actions/setup-node@v3
+ - name: Release
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ run: npx semantic-release
diff --git a/.gitignore b/.gitignore
index c49c0b1..decfc7a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
-
site
.cache
\ No newline at end of file
diff --git a/.markdownlint.yaml b/.markdownlint.yaml
new file mode 100644
index 0000000..5fdbe14
--- /dev/null
+++ b/.markdownlint.yaml
@@ -0,0 +1,3 @@
+line-length: false
+no-inline-html: false
+no-multiple-blanks: false
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..512d523
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.12.1
\ No newline at end of file
diff --git a/README.md b/README.md
index 06274a0..cdd2d71 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,28 @@
-# justenstall.github.io
+# Justen Stall's Website
My portfolio and blog website.
+
+## Developing
+
+- The site is maintained as an [MkDocs] website using the [Material for MkDocs] theme
+ - See [`mkdocs.yml`](./mkdocs.yml)
+- The site source is contained in the [`src/`](./src/) directory
+ - This is configured in [`mkdocs.yml`](./mkdocs.yml)
+ - Differed from the default (`docs/`) to reflect that this site is not documentation
+- Dependencies are managed using [Poetry] for Python
+ - See [`pyproject.toml`](./pyproject.toml)
+- Common tasks are defined using [Taskfile](https://taskfile.dev/)
+ - See [`Taskfile.yml`](./Taskfile.yml)
+
+## Testing
+
+To test the site locally, install the dependencies using [Poetry] and run the .
+
+## Deploying
+
+The site is deployed to a CloudFlare-managed domain using [CloudFlare Pages]. The guide [Deploy an MkDocs site to CloudFlare Pages](https://developers.cloudflare.com/pages/framework-guides/deploy-an-mkdocs-site/) was useful for setting this deployment up.
+
+[MkDocs]: "MkDocs"
+[Material for MkDocs]: "Material for MkDocs"
+[Poetry]: "Poetry"
+[CloudFlare Pages]: "CloudFlare Pages"
diff --git a/Taskfile.yml b/Taskfile.yml
index c424144..19ebb24 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -3,10 +3,24 @@
version: "3"
tasks:
+ poetry:
+ silent: true
+ # internal: true
+ cmds:
+ - command -v poetry
+
+ install-deps:
+ deps:
+ - poetry
+ cmds:
+ - poetry install --no-root
+
serve:
+ deps: [install-deps]
cmds:
- poetry run mkdocs serve
build:
+ deps: [install-deps]
cmds:
- poetry run mkdocs build
diff --git a/docs/theme/home.html b/docs/theme/home.html
deleted file mode 100644
index d61f2a7..0000000
--- a/docs/theme/home.html
+++ /dev/null
@@ -1,154 +0,0 @@
-{% extends "base.html" %}
-
-{% block htmltitle %}
-
-
-
-{% endblock %}
-{% block content %}{% endblock %}
-{% block footer %}
-{{ super() }}
-{% endblock %}
\ No newline at end of file
diff --git a/docs/theme/zigzag.css b/docs/theme/zigzag.css
deleted file mode 100644
index f385285..0000000
--- a/docs/theme/zigzag.css
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- Zig Zag Underline
-*/
-
-.zigzag {
- display: inline-block;
- position: relative;
-}
-
-.zigzag:after {
- content: "";
- height: .2em;
- width: 100%;
- position: absolute;
- background: url("zigzag-black.svg");
- background-size: .35em;
- bottom: 0;
- left: 0;
- -webkit-animation: zigzagPlay 1.5s infinite linear;
- -moz-animation: zigzagPlay 1.5s infinite linear;
- -ms-animation: zigzagPlay 1.5s infinite linear;
- -o-animation: zigzagPlay 1.5s infinite linear;
- animation: zigzagPlay 1.5s infinite linear;
- -webkit-animation-play-state: paused;
- -moz-animation-play-state: paused;
- -o-animation-play-state: paused;
- animation-play-state: paused;
-}
-
-.zigzag:hover:after {
- -webkit-animation-play-state: running;
- -moz-animation-play-state: running;
- -o-animation-play-state: running;
- animation-play-state: running;
-}
-
-@-webkit-keyframes zigzagPlay {
- 0% {
- background-position: 0rem;
- }
- 100% {
- background-position: -2rem;
- }
-}
-
-@-moz-keyframes zigzagPlay {
- 0% {
- background-position: 0rem;
- }
- 100% {
- background-position: -2rem;
- }
-}
-
-@-ms-keyframes zigzagPlay {
- 0% {
- background-position: 0rem;
- }
- 100% {
- background-position: -2rem;
- }
-}
-
-@-o-keyframes zigzagPlay {
- 0% {
- background-position: 0rem;
- }
- 100% {
- background-position: -2rem;
- }
-}
-
-@keyframes zigzagPlay {
- 0% {
- background-position: 0rem;
- }
- 100% {
- background-position: -2rem;
- }
-}
-
-.zigzag-play:after {
- -webkit-animation-play-state: running !important;
- -moz-animation-play-state: running !important;
- -o-animation-play-state: running !important;
- animation-play-state: running !important;
-}
-
-.zigzag-title:after {
- top: 2rem;
-}
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index 9ffb9d8..bfc91f4 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -15,7 +15,7 @@ theme:
font:
text: Inter
code: DM Mono
- custom_dir: docs/theme
+ custom_dir: src/theme
features:
- content.code.copy
- navigation.sections
@@ -32,8 +32,6 @@ extra:
link: https://github.com/justenstall
- icon: fontawesome/brands/slack
link: https://cloud-native.slack.com/team/U026HE0JFEJ
- - icon: fontawesome/brands/git-alt
- link: https://github.com/justenstall/justenstall.github.io
home:
image: assets/justenstall.jpg
description: |
@@ -41,8 +39,9 @@ extra:
extra_css:
- stylesheets/theme-colors.css
+ - stylesheets/portfolio.css
-docs_dir: docs
+docs_dir: src
plugins:
- blog:
diff --git a/poetry.lock b/poetry.lock
index 71a129a..9033767 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -973,5 +973,5 @@ files = [
[metadata]
lock-version = "2.0"
-python-versions = "^3.11"
-content-hash = "4e628d1ed7884d667a41a90cd424a10dac1b0185781af69d1af5e53c7b5e35fc"
+python-versions = "^3.12"
+content-hash = "f3dcb83ce9408583e6d66cc080e357ddbe78f442b7150e0bda4a73e4fb6eb5dc"
diff --git a/pyproject.toml b/pyproject.toml
index 6d563fa..ee4b176 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,7 +6,7 @@ authors = ["Justen Stall "]
readme = "README.md"
[tool.poetry.dependencies]
-python = "^3.11"
+python = "^3.12"
mkdocs = "^1.5.3"
mkdocs-material = {extras = ["imaging"], version = "^9.5.3"}
pygments = "^2.17.2"
diff --git a/docs/assets/app-icon-fullres.png b/src/assets/app-icon-fullres.png
similarity index 100%
rename from docs/assets/app-icon-fullres.png
rename to src/assets/app-icon-fullres.png
diff --git a/docs/assets/favicon-blue-white-black.png b/src/assets/favicon-blue-white-black.png
similarity index 100%
rename from docs/assets/favicon-blue-white-black.png
rename to src/assets/favicon-blue-white-black.png
diff --git a/docs/assets/favicon-fullres.png b/src/assets/favicon-fullres.png
similarity index 100%
rename from docs/assets/favicon-fullres.png
rename to src/assets/favicon-fullres.png
diff --git a/docs/assets/favicon-t-black-blue.png b/src/assets/favicon-t-black-blue.png
similarity index 100%
rename from docs/assets/favicon-t-black-blue.png
rename to src/assets/favicon-t-black-blue.png
diff --git a/docs/assets/favicon-t-blue-black.png b/src/assets/favicon-t-blue-black.png
similarity index 100%
rename from docs/assets/favicon-t-blue-black.png
rename to src/assets/favicon-t-blue-black.png
diff --git a/docs/assets/favicon-t-blue-white.png b/src/assets/favicon-t-blue-white.png
similarity index 100%
rename from docs/assets/favicon-t-blue-white.png
rename to src/assets/favicon-t-blue-white.png
diff --git a/docs/assets/favicon-t-white-black.png b/src/assets/favicon-t-white-black.png
similarity index 100%
rename from docs/assets/favicon-t-white-black.png
rename to src/assets/favicon-t-white-black.png
diff --git a/docs/assets/favicon-white-black-blue.png b/src/assets/favicon-white-black-blue.png
similarity index 100%
rename from docs/assets/favicon-white-black-blue.png
rename to src/assets/favicon-white-black-blue.png
diff --git a/docs/assets/favicon/android-chrome-192x192.png b/src/assets/favicon/android-chrome-192x192.png
similarity index 100%
rename from docs/assets/favicon/android-chrome-192x192.png
rename to src/assets/favicon/android-chrome-192x192.png
diff --git a/docs/assets/favicon/android-chrome-384x384.png b/src/assets/favicon/android-chrome-384x384.png
similarity index 100%
rename from docs/assets/favicon/android-chrome-384x384.png
rename to src/assets/favicon/android-chrome-384x384.png
diff --git a/docs/assets/favicon/android-chrome-512x512.png b/src/assets/favicon/android-chrome-512x512.png
similarity index 100%
rename from docs/assets/favicon/android-chrome-512x512.png
rename to src/assets/favicon/android-chrome-512x512.png
diff --git a/docs/assets/favicon/apple-touch-icon.png b/src/assets/favicon/apple-touch-icon.png
similarity index 100%
rename from docs/assets/favicon/apple-touch-icon.png
rename to src/assets/favicon/apple-touch-icon.png
diff --git a/docs/assets/favicon/browserconfig.xml b/src/assets/favicon/browserconfig.xml
similarity index 100%
rename from docs/assets/favicon/browserconfig.xml
rename to src/assets/favicon/browserconfig.xml
diff --git a/docs/assets/favicon/favicon-16x16.png b/src/assets/favicon/favicon-16x16.png
similarity index 100%
rename from docs/assets/favicon/favicon-16x16.png
rename to src/assets/favicon/favicon-16x16.png
diff --git a/docs/assets/favicon/favicon-32x32.png b/src/assets/favicon/favicon-32x32.png
similarity index 100%
rename from docs/assets/favicon/favicon-32x32.png
rename to src/assets/favicon/favicon-32x32.png
diff --git a/docs/assets/favicon/favicon.ico b/src/assets/favicon/favicon.ico
similarity index 100%
rename from docs/assets/favicon/favicon.ico
rename to src/assets/favicon/favicon.ico
diff --git a/docs/assets/favicon/mstile-150x150.png b/src/assets/favicon/mstile-150x150.png
similarity index 100%
rename from docs/assets/favicon/mstile-150x150.png
rename to src/assets/favicon/mstile-150x150.png
diff --git a/docs/assets/favicon/mstile-310x150.png b/src/assets/favicon/mstile-310x150.png
similarity index 100%
rename from docs/assets/favicon/mstile-310x150.png
rename to src/assets/favicon/mstile-310x150.png
diff --git a/docs/assets/favicon/mstile-310x310.png b/src/assets/favicon/mstile-310x310.png
similarity index 100%
rename from docs/assets/favicon/mstile-310x310.png
rename to src/assets/favicon/mstile-310x310.png
diff --git a/docs/assets/favicon/mstile-70x70.png b/src/assets/favicon/mstile-70x70.png
similarity index 100%
rename from docs/assets/favicon/mstile-70x70.png
rename to src/assets/favicon/mstile-70x70.png
diff --git a/docs/assets/favicon/og-image.jpg b/src/assets/favicon/og-image.jpg
similarity index 100%
rename from docs/assets/favicon/og-image.jpg
rename to src/assets/favicon/og-image.jpg
diff --git a/docs/assets/favicon/safari-pinned-tab.svg b/src/assets/favicon/safari-pinned-tab.svg
similarity index 100%
rename from docs/assets/favicon/safari-pinned-tab.svg
rename to src/assets/favicon/safari-pinned-tab.svg
diff --git a/docs/assets/favicon/site.webmanifest b/src/assets/favicon/site.webmanifest
similarity index 100%
rename from docs/assets/favicon/site.webmanifest
rename to src/assets/favicon/site.webmanifest
diff --git a/docs/assets/justenstall.jpg b/src/assets/justenstall.jpg
similarity index 100%
rename from docs/assets/justenstall.jpg
rename to src/assets/justenstall.jpg
diff --git a/docs/assets/misspell-black-transparent.png b/src/assets/misspell-black-transparent.png
similarity index 100%
rename from docs/assets/misspell-black-transparent.png
rename to src/assets/misspell-black-transparent.png
diff --git a/docs/biography/assets/black-knights.jpg b/src/biography/assets/black-knights.jpg
similarity index 100%
rename from docs/biography/assets/black-knights.jpg
rename to src/biography/assets/black-knights.jpg
diff --git a/docs/biography/assets/cooper-primary.png b/src/biography/assets/cooper-primary.png
similarity index 100%
rename from docs/biography/assets/cooper-primary.png
rename to src/biography/assets/cooper-primary.png
diff --git a/docs/biography/assets/fe-blue.jpg b/src/biography/assets/fe-blue.jpg
similarity index 100%
rename from docs/biography/assets/fe-blue.jpg
rename to src/biography/assets/fe-blue.jpg
diff --git a/docs/biography/assets/fe-primary.jpg b/src/biography/assets/fe-primary.jpg
similarity index 100%
rename from docs/biography/assets/fe-primary.jpg
rename to src/biography/assets/fe-primary.jpg
diff --git a/docs/biography/assets/fe-wikipedia.jpg b/src/biography/assets/fe-wikipedia.jpg
similarity index 100%
rename from docs/biography/assets/fe-wikipedia.jpg
rename to src/biography/assets/fe-wikipedia.jpg
diff --git a/docs/biography/assets/ge-monogram.png b/src/biography/assets/ge-monogram.png
similarity index 100%
rename from docs/biography/assets/ge-monogram.png
rename to src/biography/assets/ge-monogram.png
diff --git a/docs/biography/assets/ge-primary.svg b/src/biography/assets/ge-primary.svg
similarity index 100%
rename from docs/biography/assets/ge-primary.svg
rename to src/biography/assets/ge-primary.svg
diff --git a/docs/biography/assets/udayton-logo-horizontal-2color.png b/src/biography/assets/udayton-logo-horizontal-2color.png
similarity index 100%
rename from docs/biography/assets/udayton-logo-horizontal-2color.png
rename to src/biography/assets/udayton-logo-horizontal-2color.png
diff --git a/docs/biography/assets/udayton-logo-primary-2color.png b/src/biography/assets/udayton-logo-primary-2color.png
similarity index 100%
rename from docs/biography/assets/udayton-logo-primary-2color.png
rename to src/biography/assets/udayton-logo-primary-2color.png
diff --git a/docs/biography/assets/udayton-logo-vertical-2color.png b/src/biography/assets/udayton-logo-vertical-2color.png
similarity index 100%
rename from docs/biography/assets/udayton-logo-vertical-2color.png
rename to src/biography/assets/udayton-logo-vertical-2color.png
diff --git a/docs/biography/assets/udri-monogram.jpg b/src/biography/assets/udri-monogram.jpg
similarity index 100%
rename from docs/biography/assets/udri-monogram.jpg
rename to src/biography/assets/udri-monogram.jpg
diff --git a/docs/biography/assets/udri-primary.jpg b/src/biography/assets/udri-primary.jpg
similarity index 100%
rename from docs/biography/assets/udri-primary.jpg
rename to src/biography/assets/udri-primary.jpg
diff --git a/docs/biography/assets/vb.jpg b/src/biography/assets/vb.jpg
similarity index 100%
rename from docs/biography/assets/vb.jpg
rename to src/biography/assets/vb.jpg
diff --git a/docs/biography/education.md b/src/biography/education.md
similarity index 64%
rename from docs/biography/education.md
rename to src/biography/education.md
index 6367520..2c8ef06 100644
--- a/docs/biography/education.md
+++ b/src/biography/education.md
@@ -4,16 +4,31 @@
### Master's of Computer Science, University of Dayton
-![University of Dayton](assets/udayton-logo-vertical-2color.png){ align=right width=100 padding-right=20 }
+
+
Expected graduation: May 2024
Currently working on a Software Engineering research project to conclude the program.
+
+
+
+![University of Dayton](assets/udayton-logo-vertical-2color.png){ .narrow-image }
+
+
## Completed
### B.S. in Computer Science, University of Dayton
-![University of Dayton](assets/udayton-logo-vertical-2color.png){ align=right width=100 padding-right=20 }
+
+
+
Graduated in May of 2021.
+
+
+
+![University of Dayton](assets/udayton-logo-vertical-2color.png){ .narrow-image }
+
+
diff --git a/docs/biography/experience.md b/src/biography/experience.md
similarity index 61%
rename from docs/biography/experience.md
rename to src/biography/experience.md
index 96d3982..6d923ac 100644
--- a/docs/biography/experience.md
+++ b/src/biography/experience.md
@@ -2,34 +2,64 @@
## Current
+
### Data Science Engineer, University of Dayton Research Institute
-![University of Dayton Research Institute](assets/udri-primary.jpg){ align=right width=200 padding=10 }
+
Currently employed as a Data Science Engineer at the University of Dayton Research Institute.
+{ .description }
+
+![University of Dayton Research Institute](assets/udri-primary.jpg){ .image }
+
+
Worked for the student-run organization Flyer Enterprises from September 2018 to May 2021. Main project was developing a mobile application, digital loyalty card system, and a simple content management system for keeping menus up-to-date and running promotions viewable in the mobile application. Also contributed to the [FE Digital](https://www.fedigitalagency.com/) team as the lead web developer and consultant for local small businesses.
+{ .description }
-### University of Dayton Research Institute
+![Flyer Enterprises](assets/fe-primary.jpg){ .narrow-image }
-![University of Dayton Research Institute](assets/udri-primary.jpg){ align=right width=200 padding=10 }
+
+
+
+### Intern, University of Dayton Research Institute
+
+
Worked for UDRI as a part-time intern during the 2020-2021 school year.
+{ .description }
+
+![University of Dayton Research Institute](assets/udri-primary.jpg){ .image }
-### GE Aviation
+
Worked for GE Aviation as a Digital Technology intern in the Summer of 2019. Assisted the military contracts group with data analysis and automation.
+{ .description }
+
+![GE Aviation](assets/ge-primary.svg){ .image }
+
+
-### Cooper Tire & Rubber Company
-![Cooper Tire & Rubber Company](assets/cooper-primary.png){ align=right width=200 padding=10 }
+### Intern, Cooper Tire & Rubber Company
+
+
Worked for Cooper Tire as an IT Infrastructure intern in the Summer of 2018. Helped the IT department streamline their device lifecycle management and mobile device management processes.
+{ .description }
+
+![Cooper Tire & Rubber Company](assets/cooper-primary.png){ .image }
+
+