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 \"100 \ across every Lighthouse metric on both web and mobile. \ The backend test coverage is over 65%.", link: "https://oxidized.systems",