1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
Ethan Reece c175bdb709
Rewrite previous resume in Typst 2024-08-02 13:05:14 -05:00
Ethan Reece 63aee0dc7b
Add Inter font 2024-07-31 18:31:59 -05:00
8 changed files with 564 additions and 6 deletions

1
.gitignore vendored
View File

@ -11,3 +11,4 @@
\#*\#
,*
.DS_Store
out

View File

@ -0,0 +1,24 @@
(define-module (font-rsms-inter-package)
#:use-module (guix)
#:use-module (guix build-system font)
#:use-module ((guix licenses) #:prefix license:))
(define-public font-rsms-inter
(package
(name "font-rsms-inter")
(version "4.0")
(source
(origin
(method url-fetch)
(uri (string-append "https://github.com/rsms/inter/releases/download/"
"v" version "/Inter-" version ".zip"))
(file-name (string-append name "-" version ".zip"))
(sha256
(base32
"196iyyvsq58z21x4r4b0qjvfki3apnnq3dvw5884z8318mfhm5zz"))))
(build-system font-build-system)
(home-page "https://rsms.me/inter")
(synopsis "The Inter font family")
(description
"Inter is a typeface carefully crafted & designed for computer screens. Inter features a tall x-height to aid in readability of mixed-case and lower-case text. Inter is a variable font with several OpenType features, like contextual alternates that adjusts punctuation depending on the shape of surrounding glyphs, slashed zero for when you need to disambiguate \"0\" from \"o\", tabular numbers, etc.")
(license license:silofl1.1)))

View File

@ -4,7 +4,8 @@
#:use-module (guix build-system gnu)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix git-download)
#:use-module (typst-package))
#:use-module (typst-package)
#:use-module (font-rsms-inter-package))
(define vcs-file?
;; Return true if the given file is under version control.
@ -20,7 +21,8 @@
#:select? vcs-file?))
(build-system gnu-build-system)
(native-inputs
`(("rust-typst-cli" ,rust-typst-cli-0.11)))
`(("rust-typst-cli" ,rust-typst-cli-0.11)
("font-rsms-inter" ,font-rsms-inter))
(synopsis "My resume in Typst")
(description "My resume in Typst")
(home-page "https://ethanreece.com")

View File

@ -1,5 +1,8 @@
default:
guix time-machine --channels=./channels.scm.lock -- shell --container --manifest=./manifest.scm -- typst compile main.typ
guix time-machine --channels=./channels.scm.lock -- shell --container --emulate-fhs --manifest=./manifest.scm -- typst compile ./src/main.typ ./out/resume.pdf --font-path=/usr/share/fonts
fonts:
guix time-machine --channels=./channels.scm.lock -- shell --container --emulate-fhs --manifest=./manifest.scm -- typst fonts --font-path=/usr/share/fonts
dev:
guix time-machine --channels=./channels.scm.lock -- shell --manifest=./manifest.scm
@ -8,4 +11,4 @@ update:
guix time-machine --channels=./channels.scm -- describe --format=channels > ./channels.scm.lock
run: default
xdg-open ./main.pdf
xdg-open ./out/resume.pdf

9
README.md 100644
View File

@ -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.

View File

@ -1,5 +1,7 @@
(add-to-load-path ".guix/modules")
(use-modules (typst-package)
(resume-package))
(resume-package)
(font-rsms-inter-package)
(gnu packages fontutils))
(packages->manifest (list rust-typst-cli-0.11))
(packages->manifest (list rust-typst-cli-0.11 font-rsms-inter fontconfig coreutils))

144
src/main.typ 100644
View File

@ -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)
}

373
src/resume_page.typ 100644
View File

@ -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)
}
)
}