diff --git a/Cargo.lock b/Cargo.lock
index 4fb0dc4..a3a88eb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -164,9 +164,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
-version = "1.3.0"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "axum"
@@ -379,9 +379,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.1.21"
+version = "1.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0"
+checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0"
dependencies = [
"jobserver",
"libc",
@@ -718,9 +718,9 @@ checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
[[package]]
name = "flate2"
-version = "1.0.33"
+version = "1.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253"
+checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -1643,9 +1643,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.5"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62871f2d65009c0256aed1b9cfeeb8ac272833c404e13d53d400cd0dad7a2ac0"
+checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b"
dependencies = [
"bitflags 2.6.0",
]
diff --git a/assets/austin_rooks_cv.pdf b/assets/austin_rooks_cv.pdf
index eb6f9cb..29e05e3 100644
Binary files a/assets/austin_rooks_cv.pdf and b/assets/austin_rooks_cv.pdf differ
diff --git a/content/cv.pdf b/content/cv.pdf
new file mode 100644
index 0000000..cbb0a9c
Binary files /dev/null and b/content/cv.pdf differ
diff --git a/content/cv.typ b/content/cv.typ
new file mode 100644
index 0000000..408ca32
--- /dev/null
+++ b/content/cv.typ
@@ -0,0 +1,124 @@
+#set text(font: "Berkeley Mono", size: 0.9em)
+#set page(margin: 0.5in)
+
+#set list(indent: 1em, marker: "*")
+
+#let resume = yaml("cv.yml")
+
+#let datetime-from-str(s) = {
+ let RE = regex("^([1-2][0-9]{3})-([0-1][0-9])-([0-3][0-9])$")
+
+ let caps = s.match(RE).captures.map(int)
+
+ datetime(year: caps.at(0), month: caps.at(1), day: caps.at(2))
+}
+
+#let section-item(
+ name,
+ url: none,
+ note: none,
+ description: none,
+ start: none,
+ end: none,
+ body: none,
+) = {
+ name = if url == none {
+ name
+ } else {
+ [#underline(link(url, name))]
+ }
+
+ note = if note != none {
+ [ | #note ]
+ }
+
+ description = if description != none {
+ [ _ #description _ ]
+ }
+
+ let date = if start == none and end == none {
+ none
+ } else if start == none {
+ panic("cannot specify only end")
+ } else {
+ let end = if end == none {
+ "Present"
+ } else {
+ datetime-from-str(end).display("[month repr:short]. [year]")
+ }
+
+ [#datetime-from-str(start).display("[month repr:short]. [year]") - #end]
+ }
+
+ body = if type(body) == array {
+ list(..body)
+ } else {
+ body
+ }
+
+ block(below: 1em)[#box[=== #name] #note #h(1fr) #date]
+ description
+ body
+}
+
+#let section(name, items, f) = {
+ let items = items.map(f)
+
+ block(below: 1.5em)[== #name]
+ line(length: 100%)
+ block(above: 1.5em, for item in items {
+ section-item(item.remove("name"), ..item)
+ })
+}
+
+= #text(size: 1.25em, resume.basics.name)
+
+#resume.basics.label
+
+#link("mailto:" + resume.basics.email, resume.basics.email) |
+#link("https://" + resume.basics.url, resume.basics.url)
+
+#resume.basics.profiles.map(p => link(p.url)[*\[#lower(p.network)\]* #p.username]).join(" | ")
+
+#resume.basics.about
+
+#block(above: 1em)
+
+#section("Technical Skills", resume.skills, s => {
+ (name: s.name, body: s.keywords.join(", "))
+})
+
+#block(above: 1em)
+#section("Experience", resume.work, w => {
+ (
+ name: w.name,
+ note: w.position,
+ description: w.at("description", default: none),
+ start: w.at("startDate"),
+ end: w.at("endDate", default: none),
+ body: w.highlights,
+ )
+})
+
+#block(above: 1em)
+#section("Personal Projects (Self-Hosted)", resume.projects, p => {
+ (
+ name: p.name,
+ url: p.at("url", default: none),
+ note: p.keywords.join(", "),
+ description: p.at("description", default: none),
+ body: p.highlights,
+ )
+})
+
+#block(above: 1em)
+#section("Education", resume.education, e => {
+ (
+ name: e.institution,
+ note: "GPA: " + e.score,
+ description: e.studyType + " in " + e.area,
+ start: e.at("startDate"),
+ end: e.at("endDate"),
+ )
+})
+
diff --git a/content/cv.yml b/content/cv.yml
new file mode 100644
index 0000000..2183fae
--- /dev/null
+++ b/content/cv.yml
@@ -0,0 +1,103 @@
+basics:
+ name: Austin Rooks
+ label: Software Engineer
+ email: austin@r00ks.io
+ url: r00ks.io
+ about: Experienced Software Engineer with a demonstrated history of working in
+ full stack web development. Skilled in TypeScript (React, Qwik), Rust (Actix,
+ Axum), CSS, and SQL (Postrgesql). Gumptious and curious. Interested in distributed systems.
+ profiles:
+ - network: GitHub
+ username: austionian
+ url: https://github.com/austionian
+ - network: LinkedIn
+ username: /in/austinrooks
+ url: https://www.linkedin.com/in/austinrooks
+ - network: Mastodon
+ username: r00ks
+ url: https://fosstodon.org/@r00ks
+
+work:
+ - name: Northwestern Mutual
+ position: Software Engineer, III
+ startDate: 2024-03-01
+ highlights:
+ - name: Northwestern Mutual
+ position: Software Engineer, II
+ startDate: 2022-04-01
+ endDate: 2024-03-01
+ highlights:
+ - Helped implement an initial subgraph for an entire business vertical in the web and mobile transition to graphql.
+ - Reduced the entire client website’s LCP by 500ms on average and an almost a full second for p90 requests.
+ - Mentored junior developers and helped teach test engineers how to write e2e test.
+ - Created a shared module that wrapped a standard express instance that provides easier testing and mocking for front end BFFs.
+ - name: Oxidized Systems
+ position: Owner, Software Engineer
+ startDate: 2021-01-01
+ highlights:
+ - Previous work includes converting a headless JS app into a Qwik/
+ Qwik-City (TypeScript) frontend and an Actix (Rust) backend for web and native mobile clients to consume.
+ - The frontend scores 100 across every Lighthouse metric on both web and mobile. The backend test coverage is over 65%.
+
+projects:
+ - name: r00ks.io
+ url: https://github.com/austionian/bl0g
+ description: A personal website and blog, written in Rust.
+ startDate: 2023-07-26
+ keywords:
+ - Rust
+ - Tailwind CSS
+ - HTMX
+ - Markdown
+ - Typst
+ highlights:
+ - Minimal JS, uses HTMX for simple and efficient page transitions.
+
+ - name: Gathering Surf
+ url: https://gathering.surf
+ description: A surf forecast for lake surfers
+ keywords:
+ - Rust
+ - Tailwind CSS
+ highlights:
+ - Streams API responses to the client as they are resolved and parsed.
+
+skills:
+ - name: Programming Languages
+ keywords:
+ - Rust
+ - JavaScript
+ - TypeScript
+ - Python
+ - Bash
+ - HTML
+ - CSS
+ - SQL
+
+ - name: Frameworks/Databases
+ keywords:
+ - React/ Redux
+ - Graphql/ Apollo
+ - Tailwind CSS
+ - PostgreSQL
+ - MongoDB
+ - HTMX
+ - Express
+ - Axum
+ - Actix
+ - Flask
+ - Django
+ - Qwik
+
+ - name: Tools
+ keywords:
+ - Docker
+ - Git
+
+education:
+ - institution: University of Hawaii at Manoa
+ studyType: Bachelor of Arts
+ area: English, cum laude
+ startDate: 2009-08-01
+ endDate: 2013-05-01
+ score: "3.69"
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..e13c995
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,7 @@
+services:
+ web:
+ image: bl0g:latest
+ ports:
+ - "1111:1111"
+ environment:
+ API_TOKEN: ${API_TOKEN}
diff --git a/justfile b/justfile
index adb8071..2f57f53 100644
--- a/justfile
+++ b/justfile
@@ -18,6 +18,12 @@ build-tailwind:
echo -e "\nMinifying css"
sh -c './tailwindcss -i ./src/styles/styles.css -o ./assets/styles.css --minify'
+build-cv:
+ #!/bin/bash
+ echo -e "\nBuilding resume"
+ typst compile ./content/cv.typ ./assets/austin_rooks_cv.pdf
+ echo -e "\nDone :)"
+
# Script to run the axum server in watch mode.
run-axum:
#!/bin/bash
@@ -59,6 +65,9 @@ update:
docker-build:
docker build --tag bl0g --file Dockerfile .
-# Transfers the docker image to the pi
+docker-deploy:
+ DOCKER_HOST="ssh://austin@raspberrypi.local" docker compose up -d
+
+# Builds the new images, saves it to the pi, remotely starts it up with docker compose
deploy:
- just docker-build && docker save bl0g | bzip2 | ssh austin@raspberrypi.local docker load && ssh austin@raspberrypi.local ./deploy_blog.sh
+ just docker-build && docker save bl0g | bzip2 | ssh austin@raspberrypi.local docker load && just docker-deploy
diff --git a/src/job.rs b/src/job.rs
index 60945b3..af0e3e9 100644
--- a/src/job.rs
+++ b/src/job.rs
@@ -39,7 +39,7 @@ pub static JOBS: [Job; 3] = [
description: "Previous work includes converting a headless JS app into a \
Qwik/ Qwik-City (TypeScript) frontend and an Actix (Rust) backend \
for web and native mobile clients to consume.
The \
- frontend scores \
+ frontend scores \
across every Lighthouse metric on both web and mobile. \
The backend test coverage is over 65%.",
link: "https://oxidized.systems",