diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..d9c56c9 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,38 @@ +name: Build Typst document +on: [push, workflow_dispatch] + +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: experimental + + - name: Delete old resume if exists + run: | + rm -f ./BLAKE_PAYNE_COMPUTER_ENGINEERING.pdf + + - name: Typst + uses: lvignoli/typst-action@main + with: + source_file: ./BLAKE_PAYNE_COMPUTER_ENGINEERING.pdf + options: src/main.typ + + - name: Upload PDF file + uses: actions/upload-artifact@v4 + with: + name: PDF + path: ./**/*.pdf + + - name: Commit changes + run: | + git config user.name "github-actions" + git config user.email "github-actions@github.com" + git add *.pdf + git commit -m "Add generated PDF from artifact" || echo "No changes to commit" + git push origin experimental diff --git a/.gitignore b/.gitignore index 723ef36..828d485 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.idea \ No newline at end of file +.idea +.vscode +*.pdf \ No newline at end of file diff --git a/BLAKE PAYNE COMPUTER ENGINEERING 10-30-2025.pdf b/BLAKE PAYNE COMPUTER ENGINEERING 10-30-2025.pdf deleted file mode 100644 index 7241d0a..0000000 Binary files a/BLAKE PAYNE COMPUTER ENGINEERING 10-30-2025.pdf and /dev/null differ diff --git a/BLAKE_PAYNE_COMPUTER_ENGINEERING.pdf b/BLAKE_PAYNE_COMPUTER_ENGINEERING.pdf new file mode 100644 index 0000000..21cca87 Binary files /dev/null and b/BLAKE_PAYNE_COMPUTER_ENGINEERING.pdf differ diff --git a/README.md b/README.md index ed98cda..8e6084c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -### \[ [current resume](/BLAKE%20PAYNE%20COMPUTER%20ENGINEERING%2010-30-2025.pdf) \] +### \[ [current resume](/BLAKE_PAYNE_COMPUTER_ENGINEERING.pdf) \] #### ~how to compile my lovely resume~ ```bash -typst compile --root .. src/main.typ BLAKE\ PAYNE\ COMPUTER\ ENGINEERING\ 10-30-2025.pdf +typst compile --root . src/main.typ BLAKE\ PAYNE\ COMPUTER\ ENGINEERING\ $(date "+%m-%d-%Y").pdf ``` ### markdown is now cringe btw diff --git a/src/main.typ b/src/main.typ index b26991d..e7147c6 100644 --- a/src/main.typ +++ b/src/main.typ @@ -1,103 +1,92 @@ -#import "./resume.typ": resume, custom-title, work-heading, project-heading, education-heading, skills, activity-heading, spacer, courses +#import "./resume.typ": * // Put your personal information here #let name = "Blake Payne" -#let phone = "" // pls don't dox yourself :sob: +#let phone = "123-456-4890" // pls don't dox yourself :sob: #let location = "Dayton, OH" -#let email = "" // pls don't dox yourself :sob: // grep -qE "^#let email = "([^"])+"" resume.typ +#let email = "example@example.com" // pls don't dox yourself :sob: +// grep -qE "^#let email = "([^"])+"" resume.typ #let github = "payne1778" #let linkedin = "blake-payne" #show: resume.with( - author-position: center, - personal-info-position: center, author-name: name, phone: phone, location: location, email: email, - website: "", linkedin-user-id: linkedin, github-username: github ) #custom-title("Education")[ #education-heading( - "Bachelor of Science in Computer Engineering", // major - "December 2026", // grad-date - "Wright State University", // uni - "Dayton, OH", // location - "GPA: 3.88" // gpa + major: "Bachelor of Science in Computer Engineering", + grad-date: "December 2026", + uni: "Wright State University", + location: "Dayton, OH ", + gpa: "3.84" )[ Minor in German ] #education-heading( - "Combined B.S./M.S. (4+1) Program in Computer Engineering", - "December 2027", - "Wright State University", - "Dayton, OH", - "" - )[] -] - -#custom-title("Courses")[ - #courses( - "Operating System Internals & Design", - "Operating System Concepts & Usage", - "Differential Equations w/ Matrix Algebra", - "Computer Organization", - "Data Structures & Algorithms", - "Digital Circuit Design w/ VDHL", - "Calculus I-II", - "Computer Science I-II", - "Analog Circuit Theory", - ) + major: "Combined B.S./M.S. (4+1) Program in Computer Engineering", + grad-date: "December 2027", + uni: "Wright State University", + location: "Dayton, OH" + )[] ] #custom-title("Skills")[ #skills()[ - - *Programming Languages:* Java, Python, Bash, GoLang, C/C++, MATLAB - - *Development Tools:* VSCode, Zed, git, IntelliJ, PyCharm, Rider, CLion, MATLAB IDE - - *Computer Software:* Linux (Arch, Nix), Windows, Microsoft Office Products, Google Workspace Products + - *Programming Languages:* Java, Python, C, GoLang, HTML, JS/TS, MATLAB + - *Relevant Technologies:* Java Swing, Scripting, Restful APIs, Typst, Embedded Boards, Ollama, MariaDB, SQL, TOML + - *Development Tools:* VSCode, Zed, git, JetBrains IDEs, Bruno, Docker, make, ArduinoIDE, Oracle VirtualBox ] ] #custom-title("Projects")[ #project-heading( - "LLM Benchmarker", // name - "July 2025", // start date - "Present" // end date + name: "Karto", + technologies: "Angular, Spring Boot, MariaDB, MySQL, HTTP C.R.U.D. Requests", + repo-name: "cs4900-karto", + github-username: github, + start-date: "August 2025", + end-date: "December 2025" )[ - - Benchmarking LLMs from Ollama in Java by evaluating their accuracy on linear algebra problems using the - Wolfram Alpha API, contributing insights to LLM mathematical reasoning in the CS research community + - Developed a full-stack vehicle management web application using Angular and Spring Boot for tracking vehicles, maintenance history, and trusted gas stations + - Designed and implemented RESTful CRUD APIs backed by MySQL/MariaDB, including database schema design and secure, account-scoped authentication ] + #project-heading( - "Translation Library", - "June 2025", - "Present" + name: "LLM Benchmarker", + technologies: "Java, Ollama, RESTful APIs", + repo-name: "bencher", + github-username: github, + start-date: "July 2025" )[ - - Building a cross-language TOML-based translation library with a Python CLI and Java Package for managing - multilingual content across apps and tools - - Streamlining internationalization by standardizing translation files for smoother developer/translator collaboration + - Building a Java-based benchmarking framework to evaluate Ollama-sourced LLMs on linear algebra solving performance using the Wolfram Alpha API ] + #project-heading( - "Submission Organizer", - "November 2024", - "December 2024" + name: "Translation Library", + technologies: "Python, TOML, Pydantic, Typer CLI", + repo-name: "tl-python", + github-username: github, + start-date: "June 2025" )[ - - Co-engineered a lecture-wide file organizer in Python to process, filter, and sort student submissions, significantly - reducing manual effort for TAs and saving dozens of hours during grading + - Developing a cross-language TOML-based translation library Python package for managing multilingual content + - Standardizing internationalization workflows to improve consistency between developers and translators ] ] #custom-title("Experience")[ #work-heading( - "Computer Science Teaching Assistant", // title - "Wright State University On-Campus Employment ", // company - "Fairborn, OH", // location - "August 2024", // start-date - "Present" // end-date + title: "Computer Science Teaching Assistant", + company: "Wright State University On-Campus Employment ", + location: "Fairborn, OH", + start-date: "August 2024", )[ - - Led weekly lecture sections for \~50 students, facilitating engaging discussions and academic support through + - Led weekly lecture sections for an average 50 student class size, facilitating engaging discussions and academic support through office hours and personalized communication - Collaborated with faculty and a team of TAs to coordinate grading logistics, address student concerns, and ensure consistency across course delivery @@ -108,29 +97,32 @@ #custom-title("Extracurricular Activities")[ #activity-heading( - "Tau Beta Pi Engineering Honor Society, Vice President", - "October 2024", - "Present" + position: "Vice President", + activity: "Tau Beta Pi Engineering Honor Society", + start-date: "October 2024", + end-date: "Present" ) #activity-heading( - "IEEE Wright State University Student Chapter, Treasurer", - "August 2023", - "Present" + position: "Treasurer", + activity: "IEEE Wright State University Student Chapter", + start-date: "August 2023", + end-date: "Present" ) #activity-heading( - "Wright State Honors Program", - "December 2022", - "Present" + position: "University Scholar", + activity: "Wright State Honors Program", + start-date: "December 2022", + end-date: "Present" ) #activity-heading( - "Make-IT-Wright Hackathon 2025", - "January 2025", - "February 2025" + position: "Participant & Winner", + activity: "Make-IT-Wright Hackathon", + start-date: "January 2025, February 2026", ) #activity-heading( - "ACM Programming Contest", - "October 2023, October 2024", - "" + position: "Participant", + activity: "ACM Annual Fall Programming Contest", + start-date: "October 2023, October 2024" ) ] @@ -138,13 +130,12 @@ #custom-title("Achievements")[ #activity-heading( - "College of Computer Science & Engineering Dean’s List", - "August 2023", - "Present" + activity: "College of Computer Science & Engineering Dean’s List", + start-date: "August 2023", + end-date: "Present" ) #activity-heading( - "Wright State Honors Program Competitive Scholarship", - "June 2023", - "" + activity: "Wright State Honors Program Competitive Scholarship", + start-date: "June 2023" ) ] diff --git a/src/resume.typ b/src/resume.typ index 619985c..d9c959c 100644 --- a/src/resume.typ +++ b/src/resume.typ @@ -4,7 +4,7 @@ bottom-margin: 0.4in, left-margin: 0.4in, right-margin: 0.4in, - font: "Liberation Serif", + font: "Liberation Serif ", font-size: 11pt, personal-info-font-size: 10pt, author-name: "", @@ -34,7 +34,7 @@ ) set text( - font: font, size: font-size, lang: "en", ligatures: false + font: font, size: font-size, lang: "en", ligatures: true ) show heading.where( @@ -91,18 +91,17 @@ // Custom functions // ---------------- -#let generic_1x2(r1c1, r1c2) = { +#let generic_1x2(cols: (1fr, 1fr), r1c1, r1c2) = { + assert.eq(type(cols), array) grid( - columns: (1fr, 1fr), + columns: cols, align(left)[#r1c1], align(right)[#r1c2] ) - v(-0.5em) } -#let generic_2x2(cols, r1c1, r1c2, r2c1, r2c2) = { +#let generic_2x2(cols: (1fr, 1fr), r1c1, r1c2, r2c1, r2c2) = { assert.eq(type(cols), array) - grid( columns: cols, align(left)[#r1c1 \ #r2c1], @@ -110,109 +109,147 @@ ) } -#let generic_1x3(cols, r1c1, r1c2, r1c3) = { - assert.eq(type(cols), array) - - grid( - columns: cols, - align(center)[#r1c1], - align(center)[#r1c2], - align(center)[#r1c3] - ) - v(-0.5em) -} - #let spacer() = { v(0.5em) } -#let custom-title(title, spacing-between: -0.001em, body) = { +#let custom-title(title, body) = { [= *#title*] body - v(spacing-between) + v(0.2em) } -#let education-heading(major, grad-date, uni, location, gpa, body) = { +#let education-heading( + major: "", + grad-date: "", + uni: "", + location: "", + gpa: "", + body +) = { + assert(major != "", message: "major should not be null") + assert(uni != "", message: "uni name should not be null") + assert(location != "", message: "university name should not be null") + + if gpa != "" { + gpa = "GPA: " + gpa + } + generic_2x2( - (70%, 30%), + cols: (70%, 30%), [*#major*], [*#grad-date*], - [#uni | #location], [#gpa] + [#uni | #location], gpa ) v(-0.1em) + if body != [] { v(-0.4em) set par(leading: 0.6em) set list(indent: 0.5em) body } - v(-0.1em) -} - -#let courses(c1, c2, c3, c4, c5, c6, c7, c8, c9) = { - generic_1x3( - (31%, 34%, 36%), - [#c1], [#c2], [#c3] - ) - generic_1x3( - (31%, 34%, 36%), - [#c4], [#c5], [#c6] - ) - generic_1x3( - (31%, 34%, 36%), - [#c7], [#c8], [#c9] - ) - v(0.1em) } #let skills(body) = { - if body != [] { - set par(leading: 0.6em) - set list( - body-indent: 0.1em, - indent: 0em, - marker: [] - ) - body - } + assert(body != [], message: "skills body should not be null") + + set par(leading: 0.6em) + set list( + body-indent: 0.1em, + indent: 0em, + marker: [] + ) + body } -#let project-heading(name, start-date, end-date, body) = { +#let project-heading( + name: "", + technologies: "", + repo-name: "", + github-username: "", + start-date: "", + end-date: "Present", + body +) = { + assert(body != [], message: "project body should not be null") + assert(start-date != "", message: "project start date should not be null") + generic_1x2( [*#name*], [*#start-date* - *#end-date*] ) - if body != [] { - v(-0.1em) - set par(leading: 0.6em) - set list(indent: 0.5em) - body + v(-0.7em) + + if technologies != "" and repo-name != "" { + generic_1x2( + cols: (70%, 30%), + emph(technologies), + link("https://github.com/" + github-username + "/" + repo-name)[ + #underline(offset: 0.2em)[gh.com/#repo-name] + ] + ) + v(-0.5em) } + + v(-0.1em) + set par(leading: 0.6em) + set list(indent: 0.6em) + body } -#let work-heading(title, company, location, start-date, end-date, body) = { +#let work-heading( + title: "", + company: "", + location: "", + start-date: "", + end-date: "Present", + body +) = { + assert(body != [], message: "work body should not be null") + assert(title != "", message: "work title should not be null") + assert(company != "", message: "company title should not be null") + assert(location != "", message: "company location title should not be null") + assert(start-date != "", message: "start date should not be null") + generic_2x2( - (1fr, 1fr), [*#title*], [*#start-date* - *#end-date*], emph(company), emph(location) ) v(-0.04em) - if body != [] { - v(-0.4em) - set par(leading: 0.6em) - set list(indent: 0.5em) - body - } + + v(-0.4em) + set par(leading: 0.6em) + set list(indent: 0.5em) + body } -#let activity-heading(activity, start-date, end-date) = { +#let activity-heading( + position: "", + activity: "", + start-date: "", + end-date: "" +) = { + assert(activity != "", message: "activity name should not be null") + assert(start-date != "", message: "activity start date should not be null") + + let activity-position = ""; + let dates = ""; + if end-date == "" { - generic_1x2( - [#activity], [#start-date] - ) + dates = start-date; } else { - generic_1x2( - [#activity], [#start-date - #end-date] - ) + dates = [#start-date - #end-date] + } + + if position == "" { + activity-position = activity + } + else { + activity-position = [#emph(position), #activity] } - // v(-0.05em) + + generic_1x2( + activity-position, dates + ) + v(-0.5em) }