Rewrite previous resume in Typst
parent
63aee0dc7b
commit
c175bdb709
|
@ -0,0 +1,9 @@
|
||||||
|
# My resume
|
||||||
|
|
||||||
|
## How to generate using Guix
|
||||||
|
|
||||||
|
1. Install `just` (and optionally `bat`) by adding to your Guix Home configuration or running `guix install just bat`.
|
||||||
|
|
||||||
|
2. To verify the commands `just` will run on your system, run `bat ./Justfile` (or `cat ./Justfile`).
|
||||||
|
|
||||||
|
3. Run `just` to generate `./out/resume.pdf`. Run `just run` to generate then open `./out/resume.pdf`. Run `just dev` to open a shell environment with `typst` and the required font.
|
|
@ -0,0 +1,144 @@
|
||||||
|
#{
|
||||||
|
import "resume_page.typ": resume_page
|
||||||
|
|
||||||
|
let config = (
|
||||||
|
identity: (
|
||||||
|
name: "Ethan Reece",
|
||||||
|
email: "contact@ethanreece.com",
|
||||||
|
phone: "(208) 515-2094",
|
||||||
|
location: "Richardson, TX",
|
||||||
|
website: "https://ethanreece.com/"
|
||||||
|
),
|
||||||
|
skills: (
|
||||||
|
(
|
||||||
|
title: "DevOps and System Administration",
|
||||||
|
items: (
|
||||||
|
"Linux",
|
||||||
|
"Git",
|
||||||
|
"GitHub Actions",
|
||||||
|
"Docker",
|
||||||
|
"Guix",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
title: "Programming Languages",
|
||||||
|
items: (
|
||||||
|
"JavaScript",
|
||||||
|
"C#",
|
||||||
|
"Java",
|
||||||
|
"C",
|
||||||
|
"C++",
|
||||||
|
"Guile",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
title: "Layout and Web Development",
|
||||||
|
items: (
|
||||||
|
"HTML",
|
||||||
|
"CSS",
|
||||||
|
"React",
|
||||||
|
"ASP.NET",
|
||||||
|
"Express.js",
|
||||||
|
"Astro",
|
||||||
|
"Typst",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
education: (
|
||||||
|
(
|
||||||
|
title: "The University of Texas at Dallas",
|
||||||
|
degree: "Bachelor of Science in Computer Science",
|
||||||
|
graduation: "May 2026",
|
||||||
|
gpa: "Current GPA: 3.764",
|
||||||
|
coursework: (
|
||||||
|
"Probability and Statistics for CS",
|
||||||
|
"Data Structures and Algorithms",
|
||||||
|
"Software Engineering",
|
||||||
|
"C/C++ Programming in UNIX",
|
||||||
|
"Computer Architecture",
|
||||||
|
"Discrete Mathematics II",
|
||||||
|
),
|
||||||
|
highlights: (
|
||||||
|
"Collegium V Honors Program",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
work_experience: (
|
||||||
|
(
|
||||||
|
title: "Scrumfish Software",
|
||||||
|
location: "Nampa, ID",
|
||||||
|
timeframe: "June – August (2022, 2023)",
|
||||||
|
role: "Software Engineering Intern",
|
||||||
|
skills: (
|
||||||
|
"C#/ASP.NET",
|
||||||
|
"JavaScript/React",
|
||||||
|
"Microsoft SQL Server",
|
||||||
|
"GitHub",
|
||||||
|
),
|
||||||
|
highlights: (
|
||||||
|
"Developed ASP.NET APIs for data management, multifactor authentication, and document conversion.",
|
||||||
|
"Created a React-based UI for a book critique platform, supporting document viewing, sharing, and annotation.",
|
||||||
|
"Automated the update of email templates in the database using SQL and PowerShell scripts.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
title: "R-Technics",
|
||||||
|
location: "Boise, ID",
|
||||||
|
timeframe: "June – August (2022, 2023)",
|
||||||
|
role: "Software Engineering Intern",
|
||||||
|
skills: (
|
||||||
|
"Azure",
|
||||||
|
"Windows Server",
|
||||||
|
"Docker",
|
||||||
|
"C#/ASP.NET",
|
||||||
|
),
|
||||||
|
highlights: (
|
||||||
|
"Supported server maintenance through update research, implementation, and monitoring.",
|
||||||
|
"Developed a C# program to fetch song lyrics and metadata from an API, later integrated into the main product.",
|
||||||
|
"Enhanced a server application with Docker and Linux support; established an Azure DevOps pipeline for build automation.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
professional_development: (
|
||||||
|
(
|
||||||
|
title: "Personal Server Administration",
|
||||||
|
timeframe: "2020 – Present",
|
||||||
|
role: "Hobby",
|
||||||
|
skills: (
|
||||||
|
"Linux",
|
||||||
|
"Docker",
|
||||||
|
"Guix/Guile",
|
||||||
|
"Git",
|
||||||
|
"Proxmox",
|
||||||
|
"Google Cloud",
|
||||||
|
),
|
||||||
|
highlights: (
|
||||||
|
"Manage a physical server using Proxmox, Debian VMs, and Docker for several applications.",
|
||||||
|
"Migrate new applications to Guix to utilize declarative configuration for reduced state, fine-grained system control, and increased resource efficiency.",
|
||||||
|
"Implement a VPN via Google Cloud Compute Engine to navigate CGNAT limitations.",
|
||||||
|
"Host various services including Forgejo, TrueNAS, Nextcloud, and Vaultwarden.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
title: "Cybersecurity Courses",
|
||||||
|
timeframe: "February 2023 – November 2023",
|
||||||
|
role: "CodePath CYB101, CYB102",
|
||||||
|
skills: (
|
||||||
|
"Linux",
|
||||||
|
),
|
||||||
|
highlights: (
|
||||||
|
"Gained knowledge in cybersecurity tools and defense strategies.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
set document(
|
||||||
|
title: "Resume",
|
||||||
|
author: config.identity.name,
|
||||||
|
keywords: "resume",
|
||||||
|
date: none,
|
||||||
|
)
|
||||||
|
|
||||||
|
resume_page(..config)
|
||||||
|
}
|
|
@ -0,0 +1,373 @@
|
||||||
|
#let resume_page(
|
||||||
|
identity: (
|
||||||
|
name: "",
|
||||||
|
email: "",
|
||||||
|
phone: "",
|
||||||
|
location: "",
|
||||||
|
website: "",
|
||||||
|
),
|
||||||
|
skills: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
items: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
education: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
degree: "",
|
||||||
|
graduation: "",
|
||||||
|
gpa: "",
|
||||||
|
coursework: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
work_experience: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
location: "",
|
||||||
|
timeframe: "",
|
||||||
|
role: "",
|
||||||
|
skills: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
professional_development: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
timeframe: "",
|
||||||
|
role: "",
|
||||||
|
skills: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) = {
|
||||||
|
let _block(
|
||||||
|
below: 0em,
|
||||||
|
width: 100%,
|
||||||
|
padding: (
|
||||||
|
top: 0em,
|
||||||
|
right: 0em,
|
||||||
|
bottom: 0em,
|
||||||
|
left: 0em,
|
||||||
|
),
|
||||||
|
body
|
||||||
|
) = block(
|
||||||
|
below: below,
|
||||||
|
width: width,
|
||||||
|
align(
|
||||||
|
top + left,
|
||||||
|
pad(
|
||||||
|
..padding,
|
||||||
|
body
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
let _text(
|
||||||
|
font: "Inter",
|
||||||
|
size: 10pt,
|
||||||
|
weight: "regular",
|
||||||
|
block: (
|
||||||
|
below: 0em,
|
||||||
|
width: 100%,
|
||||||
|
padding: (
|
||||||
|
top: 0em,
|
||||||
|
right: 0em,
|
||||||
|
bottom: 0em,
|
||||||
|
left: 0em,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
body
|
||||||
|
) = text(
|
||||||
|
font: font,
|
||||||
|
size: size,
|
||||||
|
weight: weight,
|
||||||
|
_block(
|
||||||
|
..block,
|
||||||
|
body
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
let _heading(title: "") = _text(
|
||||||
|
size: 13pt,
|
||||||
|
block: (below: .95em),
|
||||||
|
heading(
|
||||||
|
_text(
|
||||||
|
size: 13pt,
|
||||||
|
weight: "bold",
|
||||||
|
title
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
let section_base(
|
||||||
|
title: "",
|
||||||
|
body
|
||||||
|
) = _text(
|
||||||
|
block: (below: 2.5em),
|
||||||
|
{
|
||||||
|
_heading(title: title)
|
||||||
|
_text(
|
||||||
|
block: (
|
||||||
|
padding: (left: 1em),
|
||||||
|
),
|
||||||
|
body
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
let section_item(
|
||||||
|
title: "",
|
||||||
|
subtitle: "",
|
||||||
|
role: "",
|
||||||
|
timeframe: "",
|
||||||
|
skills: (""),
|
||||||
|
highlights: (""),
|
||||||
|
) = _text(
|
||||||
|
block: (below: 1.5em),
|
||||||
|
{
|
||||||
|
_text(
|
||||||
|
block: (below: 0.95em),
|
||||||
|
grid(
|
||||||
|
columns: (40%, 60%),
|
||||||
|
rows: 2,
|
||||||
|
gutter: 0.75em,
|
||||||
|
align: (
|
||||||
|
left,
|
||||||
|
right,
|
||||||
|
),
|
||||||
|
grid(
|
||||||
|
columns: 2,
|
||||||
|
gutter: 1.5em,
|
||||||
|
align: bottom,
|
||||||
|
text(
|
||||||
|
weight: "semibold",
|
||||||
|
title
|
||||||
|
),
|
||||||
|
text(
|
||||||
|
size: 9pt,
|
||||||
|
weight: "extralight",
|
||||||
|
subtitle
|
||||||
|
)
|
||||||
|
),
|
||||||
|
text(
|
||||||
|
weight: "regular",
|
||||||
|
timeframe
|
||||||
|
),
|
||||||
|
text(
|
||||||
|
weight: "light",
|
||||||
|
size: 9.5pt,
|
||||||
|
role
|
||||||
|
),
|
||||||
|
text(
|
||||||
|
weight: "light",
|
||||||
|
size: 9.5pt,
|
||||||
|
skills.join(", "),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
_text(
|
||||||
|
block: (
|
||||||
|
padding: (left: 2em),
|
||||||
|
),
|
||||||
|
for highlight in highlights {
|
||||||
|
_text(
|
||||||
|
block: (below: 1em),
|
||||||
|
par(
|
||||||
|
justify: true,
|
||||||
|
highlight
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
let section(
|
||||||
|
title: "",
|
||||||
|
items: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
subtitle: "",
|
||||||
|
role: "",
|
||||||
|
timeframe: "",
|
||||||
|
skills: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) = section_base(
|
||||||
|
title: title,
|
||||||
|
for item in items {
|
||||||
|
section_item(..item)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
let title_block(title: "") = _text(
|
||||||
|
size: 28pt,
|
||||||
|
block: (below: 0.60em),
|
||||||
|
weight: "extrabold",
|
||||||
|
align(
|
||||||
|
center,
|
||||||
|
title
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
let contact_info_block(
|
||||||
|
email: "",
|
||||||
|
phone: "",
|
||||||
|
location: "",
|
||||||
|
website: "",
|
||||||
|
) = _text(
|
||||||
|
size: 10.5pt,
|
||||||
|
block: (below: 2.75em),
|
||||||
|
weight: "medium",
|
||||||
|
align(
|
||||||
|
center,
|
||||||
|
grid(
|
||||||
|
columns: 4,
|
||||||
|
rows: 1,
|
||||||
|
gutter: 4em,
|
||||||
|
email,
|
||||||
|
phone,
|
||||||
|
location,
|
||||||
|
website,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
let skills_block(
|
||||||
|
skills: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
items: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) = section_base(
|
||||||
|
title: "Skills",
|
||||||
|
_text(
|
||||||
|
grid(
|
||||||
|
columns: (33%, 67%),
|
||||||
|
gutter: 1em,
|
||||||
|
..for skill in skills {
|
||||||
|
(
|
||||||
|
_text(
|
||||||
|
weight: "semibold",
|
||||||
|
skill.title
|
||||||
|
),
|
||||||
|
skill.items.join(", "),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
let education_block(
|
||||||
|
education: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
degree: "",
|
||||||
|
graduation: "",
|
||||||
|
gpa: "",
|
||||||
|
coursework: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) = section(
|
||||||
|
title: "Education",
|
||||||
|
items: education.map(school => (
|
||||||
|
title: school.title,
|
||||||
|
role: school.degree,
|
||||||
|
timeframe: school.graduation,
|
||||||
|
skills: (
|
||||||
|
school.gpa,
|
||||||
|
),
|
||||||
|
highlights: (
|
||||||
|
..school.highlights,
|
||||||
|
{
|
||||||
|
_text(
|
||||||
|
weight: "medium",
|
||||||
|
block: (
|
||||||
|
below: 0.75em,
|
||||||
|
),
|
||||||
|
"Relevant Coursework"
|
||||||
|
)
|
||||||
|
_text(
|
||||||
|
size: 9.5pt,
|
||||||
|
block: (
|
||||||
|
padding: (
|
||||||
|
left: 2em,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
school.coursework.join(", ")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
),
|
||||||
|
))
|
||||||
|
)
|
||||||
|
|
||||||
|
let work_experience_block(
|
||||||
|
work_experience: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
location: "",
|
||||||
|
timeframe: "",
|
||||||
|
role: "",
|
||||||
|
skills: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) = section(
|
||||||
|
title: "Work Experience",
|
||||||
|
items: work_experience.map(company => (
|
||||||
|
title: company.title,
|
||||||
|
subtitle: company.location,
|
||||||
|
timeframe: company.timeframe,
|
||||||
|
role: company.role,
|
||||||
|
skills: company.skills,
|
||||||
|
highlights: company.highlights,
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
|
let professional_development_block(
|
||||||
|
professional_development: (
|
||||||
|
(
|
||||||
|
title: "",
|
||||||
|
timeframe: "",
|
||||||
|
role: "",
|
||||||
|
skills: (""),
|
||||||
|
highlights: (""),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) = section(
|
||||||
|
title: "Professional Development",
|
||||||
|
items: professional_development.map(item => (
|
||||||
|
title: item.title,
|
||||||
|
timeframe: item.timeframe,
|
||||||
|
role: item.role,
|
||||||
|
skills: item.skills,
|
||||||
|
highlights: item.highlights,
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
|
page(
|
||||||
|
paper: "us-letter",
|
||||||
|
margin: (
|
||||||
|
x: 0.5in,
|
||||||
|
y: 0.4in,
|
||||||
|
),
|
||||||
|
{
|
||||||
|
title_block(title: identity.name)
|
||||||
|
contact_info_block(
|
||||||
|
email: identity.email,
|
||||||
|
phone: identity.phone,
|
||||||
|
location: identity.location,
|
||||||
|
website: identity.website,
|
||||||
|
)
|
||||||
|
skills_block(skills: skills)
|
||||||
|
education_block(education: education)
|
||||||
|
work_experience_block(work_experience: work_experience)
|
||||||
|
professional_development_block(professional_development: professional_development)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue