Compare commits
2 Commits
79c9bedf4f
...
c175bdb709
Author | SHA1 | Date |
---|---|---|
Ethan Reece | c175bdb709 | |
Ethan Reece | 63aee0dc7b |
|
@ -11,3 +11,4 @@
|
|||
\#*\#
|
||||
,*
|
||||
.DS_Store
|
||||
out
|
||||
|
|
|
@ -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)))
|
|
@ -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")
|
||||
|
|
7
Justfile
7
Justfile
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -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))
|
||||
|
|
|
@ -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