Compare commits

...

123 Commits

Author SHA1 Message Date
eggy
f5f6443b90 fix: typst update 2025-02-28 14:19:32 -05:00
eggy
e01d37cb47 feat: add yc 2025-02-19 16:30:14 -05:00
eggy
f9f754fc70 feat: add treehacks 2025-02-19 14:20:59 -05:00
eggy
c02b90a6f1 chore: extend htn 2025-02-13 20:32:57 -05:00
eggy
ba5bd7050a chore: do not lie about grad date 2025-02-11 23:36:36 -05:00
eggy
2b78b26957 chore: update immigr8 position 2025-02-11 23:33:55 -05:00
eggy
d667a4f8ae feat: andrew feedback 2025-02-08 00:00:27 -05:00
eggy
41fac708b6 fix: do not lie about grad date 2025-02-03 21:34:09 -05:00
eggy
b8d11e72f5 chore: reorder 2025-01-31 02:28:36 -05:00
eggy
3e3c23d628 feat: andrew review 2025-01-31 02:26:19 -05:00
eggy
55394490e0 feat: add courses 2025-01-27 09:44:38 -05:00
eggy
85fccd3cab feat: add nginx 2025-01-21 15:32:23 -05:00
eggy
5744ea0ebd chore: remove non-backend 2025-01-21 01:13:37 -05:00
eggy
6f1b367a4c chore: style 2025-01-21 01:10:37 -05:00
eggy
b6f388bd1b chore: update readme 2025-01-21 01:05:31 -05:00
eggy
96b627b2a1 feat: steph-inspired changes 2025-01-21 01:05:13 -05:00
eggy
b880164fdf chore: copy steph 2025-01-20 23:29:20 -05:00
eggy
def3a1cd3a chore: abstract size 2025-01-20 23:25:13 -05:00
eggy
d45c34c82e chore: abstract size 2025-01-20 22:31:04 -05:00
eggy
a2e924418a feat: change grad date to 2026 2025-01-20 17:10:36 -05:00
eggy
0f1209b9c2 feat: add gpa 2025-01-17 12:31:40 -05:00
eggy
d869ce32b6 feat: add awards section 2025-01-17 12:23:22 -05:00
eggy
94ff3febe8 feat: improve formatting 2025-01-17 11:42:11 -05:00
eggy
4e79e361e5 feat: build -> construct
build sounds like CI
2025-01-15 19:01:48 -05:00
eggy
e073191d8c feat: format and lines 2025-01-14 00:09:21 -05:00
eggy
91102c2375 feat: add systems 2025-01-13 23:59:39 -05:00
eggy
f0c5e8b1a0 feat(backend): add redis/kubernetes 2025-01-13 23:39:30 -05:00
eggy
ccaabbf120 chore: rename hw to systems 2025-01-13 21:10:38 -05:00
eggy
afb654e438 feat(web): add frontend tooling 2025-01-13 03:05:41 -05:00
eggy
e8d11985de chore: remove data_systems 2025-01-13 03:02:07 -05:00
eggy
f55afb83dc feat: full stack 2025-01-13 03:01:15 -05:00
eggy
9008dd3645 feat: add cpp to backend 2025-01-13 02:44:01 -05:00
eggy
e1ee8bdf93 feat: backend is done 2025-01-13 02:43:26 -05:00
eggy
5b0eca1072 chore: stash 2025-01-12 23:54:42 -05:00
eggy
71fcc86736 feat: initial resume separation 2025-01-08 14:04:24 -05:00
eggy
37e7f86319 chore: add makefile 2025-01-07 15:32:22 -05:00
eggy
cdd0b8e201 chore: abstract into libdir 2025-01-07 15:23:09 -05:00
eggy
7090fbbed0 feat: abstract everything 2025-01-07 15:19:53 -05:00
eggy
1d3c065bf7 chore: prep for v4 2025-01-07 14:57:12 -05:00
eggy
c5b2fb0bcd feat: back to traditional 2024-09-12 00:03:02 -04:00
eggy
41f12b3c20 feat: stephanie style 2024-09-10 20:23:31 -04:00
eggy
083f2667a7 chore: revert 2024-08-09 14:51:23 -04:00
eggy
164d8d28d7 feat: add link sign 2024-08-09 14:51:09 -04:00
eggy
b78603bd8d feat: add company links 2024-08-09 14:49:08 -04:00
eggy
2bdeeb3deb feat: add magna 2024-08-09 14:43:35 -04:00
eggy
cf0622dd81 feat: generic round 4 2024-06-30 17:03:42 -04:00
eggy
5cbeb07c2f feat: borrow everything in every direction 2024-06-24 23:42:50 -04:00
eggy
506d0b9da4 feat: add project dates 2024-06-24 22:26:57 -04:00
eggy
667e8af1d9 feat: add ruby 2024-06-24 15:24:37 -04:00
eggy
75ac3fb5a4 feat: adjust sizing 2 2024-06-18 00:05:04 -04:00
eggy
eb112f5b0d feat: adjust sizing 2024-06-18 00:03:43 -04:00
eggy
c6365b5c03 feat: emma version
content changes are required
2024-06-18 00:02:00 -04:00
eggy
f056b8f434 feat: better spacings 2024-06-17 23:30:08 -04:00
eggy
33f4f2520c feat: content overhaul 2024-06-17 21:28:48 -04:00
eggy
1984d47151 chore: twitch points 2024-06-14 15:47:16 -04:00
eggy
bfca633917 consistent font size 2024-06-13 23:37:18 -04:00
eggy
af0f13008a feat: increase spacing 2024-06-13 23:25:27 -04:00
eggy
d69e958304 feat: shrink spacing 2024-06-13 23:23:34 -04:00
eggy
509bd8963d feat: update style 2024-06-13 23:20:49 -04:00
eggy
3e5be4cf8f feat: eugene style 3 2024-06-13 23:05:13 -04:00
eggy
dd4006d03d feat: eugene style 2 2024-06-13 22:55:40 -04:00
eggy
b92ddd66b2 feat: switch to eugene style 2024-06-13 22:54:05 -04:00
eggy
ec13a4a5b3 feat: bring back extra point 2024-05-26 15:54:26 -04:00
eggy
a150d5de6d chore: move contact out of template 2024-05-26 15:53:40 -04:00
eggy
23fc909827 feat: eugene advice
eugene is the best
2024-05-20 10:54:33 -04:00
eggy
fd0398a22c feat: copy daniel's redis
sorry daniel i need a redis
2024-05-14 02:31:01 -04:00
eggy
bbe961ee20 feat: add ruby/rails 2024-05-14 02:22:51 -04:00
eggy
eabed81b45 fix: consistency with number spacing 2024-05-14 02:20:16 -04:00
eggy
3b70ac13fe feat: finalise web 2 2024-05-14 02:14:35 -04:00
eggy
1fdfe05eea feat: finalise web 2024-05-14 00:58:41 -04:00
eggy
4d7215700a feat: store for now 2024-05-13 20:05:38 -04:00
eggy
b6f14ed712 patch: add prisma skill 2024-04-12 17:30:57 -04:00
eggy
4648e83c55 chore: update release guidelines 2024-04-12 10:47:11 -04:00
eggy
f827c87f64 feat: version 3 changes (#2)
- Upgrade new skills
- Add Immigr8
- Remove awards
- Add but hide GBARR
- Shrink old internships

Co-authored-by: eggy <d7chen@uwaterloo.ca>
Reviewed-on: #2
2024-04-12 10:39:19 -04:00
eggy
508307cc43 feat: prep for v3
add immigr8, remove mandown and asvyn, add gbarr
2024-01-08 15:30:44 -05:00
eggy
858d6c9758 feat: unfortunately we now know spring 2023-12-21 14:28:09 -05:00
eggy
23e9324077 feat: andrew and james review 2023-12-13 21:58:12 -05:00
eggy
00659263f9 feat: better margins 2023-12-13 16:24:54 -05:00
eggy
197699e63b feat: orange again 2023-12-13 16:21:23 -05:00
eggy
b8e5b47b0b feat: better points 2023-12-13 16:17:08 -05:00
eggy
45b4a6b7e6 chore: make variables work 2023-12-12 23:19:27 -05:00
eggy
4705415045 feat: make lines include outcomes
I HATE THIS SO MUCH
2023-12-12 23:12:43 -05:00
eggy
c09d0bdc1a Revert "feat: remove awards"
This reverts commit 18ebf61e9b.
2023-12-05 15:11:51 -05:00
eggy
18ebf61e9b feat: remove awards 2023-12-05 12:23:49 -05:00
eggy
8b5a085447 feat: move education to top 2023-12-04 21:53:07 -05:00
eggy
f078060477 feat: better points 2023-12-04 21:10:10 -05:00
eggy
5eadcfe0ba feat: add android 2023-12-04 16:51:43 -05:00
eggy
10889dba25 feat: stronger points 2023-12-04 15:59:17 -05:00
eggy
6bfc3273c0 feat: stronger points 2023-12-04 15:58:57 -05:00
eggy
f0e9e96fe4 feat: add more tools 2023-12-04 14:22:55 -05:00
eggy
baa386a39e feat: better form line 2023-12-04 01:02:06 -05:00
eggy
f9b8dd6b0e feat: add more languages 2023-11-29 23:14:59 -05:00
eggy
d165a1b259 feat: make primoprod sound better 2023-11-28 16:20:35 -05:00
eggy
2cddfcbf6e feat: better dropbase wording 2023-11-28 15:56:37 -05:00
eggy
de8fb56d48 chore: better syntax 2023-11-28 03:06:22 -05:00
eggy
0f0ff6ba1f feat: add kobink
such a scuffed project
2023-11-28 03:05:41 -05:00
eggy
1591bdaba5 chore: move edu to bottom 2023-11-07 12:41:33 -05:00
eggy
7d289c8757 fix: remove (expected) 2023-11-07 12:41:19 -05:00
eggy
2d4d0dd6d4 chore: remove comment 2023-11-07 12:40:54 -05:00
eggy
6e8763b88d feat: add arch server 2023-11-07 12:39:21 -05:00
eggy
08201c3406 feat: adjust text styling 2023-11-06 21:10:59 -05:00
eggy
dd3d479a92 feat: move education to top 2023-10-28 23:11:05 -04:00
eggy
2694b2e9eb feat: fix underline 2023-10-25 21:07:12 -04:00
eggy
d0d224ba04 fix: reorder techyon 2023-10-25 21:01:38 -04:00
eggy
1ab736b2d5 chore: run fmt 2023-10-25 21:00:11 -04:00
eggy
e26e2cbeb2 feat: update mandown text 2023-10-24 12:04:46 -04:00
eggy
250150f9a1 fix: typo 2023-10-24 10:51:47 -04:00
eggy
d380bd6724 fix: bold colons 2023-10-23 23:55:09 -04:00
eggy
987f255a87 chore: refactor 2 2023-10-21 22:36:52 -04:00
eggy
19a5af8798 chore: refactor 2023-10-21 22:27:41 -04:00
eggy
7be19f3b9b feat: make lines more impactful 2023-10-21 22:18:50 -04:00
eggy
dce7a94677 feat: leave location remote for db 2023-10-21 15:12:00 -04:00
eggy
04a01d80bb fix: use basc instead of candidate 2023-10-21 15:07:26 -04:00
eggy
247eeb945e Make it orange (#1)
And make it much much prettier!

Co-authored-by: eggy <danielchen04@hotmail.ca>
Reviewed-on: #1
2023-10-21 15:06:08 -04:00
eggy
2bc466a29a feat: more advertising 2023-10-08 13:50:04 -04:00
eggy
37b543affe feat: advertise yourself more 2023-10-08 13:41:40 -04:00
eggy
b1b80349cb feat: add readme 2023-09-21 09:14:29 -04:00
eggy
f900fca1c0 chore: add back js 2023-09-18 14:06:03 -04:00
eggy
6ccf2d2fad chore: improve judging desc 2023-09-18 14:05:18 -04:00
eggy
39c736e9db feat: add judging script 2023-09-18 14:04:18 -04:00
eggy
9b031313b6 feat: mention what hack the borf is 2023-08-09 10:10:38 -04:00
eggy
1134628f06 feat: show uni end date 2023-09-05 14:11:20 -04:00
eggy
575b97fa0c feat: remove redis 2023-08-05 18:43:50 -04:00
8 changed files with 640 additions and 910 deletions

View File

@ -1,122 +0,0 @@
#import "fontawesome.typ": *
#import "lib.typ": template, education_entry, work_entry, project, indent
#set page(margin: 1.75in)
#set par(leading: 0.5em, first-line-indent: 1.8em, justify: true)
#show raw: set text(font: "New Computer Modern Mono")
#show par: set block(spacing: 0.55em)
#show heading: set block(above: 2em, below: 1em)
#set list(indent: 1em)
// Change the theme color of the cv.
#let color = black
#let name = "Daniel Chen"
#let contact_data = (
(
service: fa[#globe],
display: "eggworld.me",
link: "https://eggworld.me"
),
(
service: fa[#github],
display: "potatoeggy",
link: "https://github.com/potatoeggy"
),
(
service: fa[#linkedin],
display: "potatoeggy",
link: "https://www.linkedin.com/in/potatoeggy/"
),
(
service: fa[#envelope],
display: "daniel.chen1@uwaterloo.ca",
link: "mailto://daniel.chen1@uwaterloo.ca"
),
)
#show: doc => template(name, contact_data, color, doc)
// MAIN CONTENT STARTS here
= Skills
#indent[
*Languages*: Python, TypeScript/JavaScript, Rust, SQL, C++, Dart, Bash, Java, HTML, CSS \
*Frameworks*: Node.js, Express, React, Next.js, Vue, Flutter, Qt, Prisma, Apollo, Axum, Diesel \
*Tools*: Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, OpenTelemetry, GraphQL
]
= Experience
#indent[
#work_entry(
"Software Engineering Intern",
"Dropbase",
start_date: "May 2023", end_date: "Aug 2023",
location: "Remote",
tasks: (
"Designed a type-safe ORM-style query builder to dynamically generate JSON forms based on external data",
"Integrated Airtable and HubSpot APIs with the core product via AWS Lambda to automate data migration",
"Refactored the frontend to use react-hook-form to aggregate and validate user input, improving DX",
"Created a Pytest testing framework to verify core functionality across many different databases"
)
)
#work_entry(
"Backend Developer",
"Hack the North",
start_date: "Mar 2023", end_date: "present",
location: "Waterloo, ON",
tasks: (
"Integrated OpenTelemetry and Grafana into a Kubernetes cluster to collect traces and improve observability",
"Dynamically generated Apple Wallet URLs over Apollo Server and GraphQL for a registration ticket",
"Increased API reliability with Redis Sentinel to automatically failover to backup Redis instances",
"Slashed dev server reload time by 1500% by pre-transpiling GraphQL resolvers and offloading type-checking"
)
)
]
= Projects
#indent[
#project("Mandown", "https://github.com/potatoeggy/mandown", "Python, Qt")
- Created a real-time site scraper for metadata and images to automatically download comics
- Abstracted 4 ebook creation libraries into a common comic conversion API for e-ink devices
- Implemented image caching and multiprocessing to increase download and update speeds by 300%
- Minimised regressions between release cycles by writing unit and integration tests with 55% code coverage
// #project("Kobink", "https://github.com/potatoeggy/kobink", "Rust, Axum, Postgres")
// - ??? something here (reverse engineering)
// - ??? something here (synchronisation and DB, HTTP headers)
#project("RecipeReady", "https://github.com/vincentjguo/recipeready-server", "Flutter, Selenium, FastAPI, Android")
- Scraped thousands of websites for recipes to build a database with a robust many-to-many tag system
- Designed a REST API to filter and query recipes along with ingredient pricing from Walmart
#project("\"Pillow\" Water Quality Sensor", "https://github.com/potatoeggy/ece198", "Rust, STM32")
- Created a water quality statistics aggregator and visualiser on an embedded platform in safe Rust
- Engineered an embedded system with an STM32 microcontroller, matrix keypad, and an LCD display
#project("Primoprod", "https://github.com/potatoeggy/primoprod", "Vue, TypeScript")
- Imitated a video game UI to create an interactive, realistic, cross-platform game simulator
- Constructed an extensible JSON data schema to concisely simplify adding new game content
]
= Awards
#show link: underline
- Winner of the #link("https://github.com/anyuan-chen/resketch")[EdTech category] at StormHacks 2022 from 350+ participants
- Winner of the #link("https://github.com/anyuan-chen/perdiem")[IBM Open Source category] at YRHacks 2022 from 90+ participants
- 2nd place in the Industry 4.0 2021 engineering analytics competition from 200+ participants
= Education
#indent[
#education_entry("University of Waterloo", "Candidate for B.A.Sc. in Computer Engineering", start_date: "Sep 2022", end_date: "present",
location: "Waterloo, ON", details: (
[Secretary, Creative Writing Club],
))
]

21
Makefile Normal file
View File

@ -0,0 +1,21 @@
# Define the source .typ files and the target PDF names
TYP_FILES := $(wildcard *.typ)
PDF_FILES := $(TYP_FILES:.typ=.pdf)
PREFIXED_PDFS := $(addprefix danielchen_, $(PDF_FILES))
# Rule to build all PDFs with the "danielchen_" prefix
all: $(PREFIXED_PDFS)
danielchen_%.pdf: %.typ
typst compile $< $@
# Rule for watching all .typ files concurrently
watch:
@$(foreach file, $(TYP_FILES), \
(typst watch $(file) danielchen_$(basename $(file)).pdf &) ; \
)
@wait
# Cleanup rule
clean:
rm -f danielchen_*.pdf

17
README.md Normal file
View File

@ -0,0 +1,17 @@
# Resume
## Requirements
- Typst
- Font: Bitter
- Font: Raleway, weights 400, 500, 600, 700
## Release guidelines
- Increment the major version for every work term, e.g., post-2A (WT2) and post-2B (WT3) would be v2.x.x and v3.x.x, respectively.
- Increment the minor version for every major change. These can include:
- Adding a new section
- Adding a new skill
- Adding/removing a new experience or project
- Substantially rewriting lines across multiple experiences or projects
- Increment the patch version for formatting changes or simple tweaks.

215
backend_infra.typ Normal file
View File

@ -0,0 +1,215 @@
#import "lib/template_common.typ": template_common, work_entry, project, indent, SMALL_STRONG
#let education = indent[
#work_entry(
"University of Waterloo",
"B.A.Sc. in Computer Engineering, Honours — 3.7/4.0 GPA",
start_date: "Sep 2022",
end_date: "Apr 2027",
location: "Waterloo, ON",
tasks: (
[*Involvements*: UW Orbital Satellite Design Team, Intramurals (Beach
Volleyball), Creative Writing Club (Founder)],
[*Hackathons*: #link("https://devpost.com/software/poof-3qshno")[TreeHacks 2025],
StormHacks 2022 (#link("https://devpost.com/software/perdiem")[EdTech Winner]),
YRHacks 2022 (#link("https://devpost.com/software/resketch")[IBM Open Source Winner])],
),
)
]
#let skills = indent[
*Languages:* Python, TypeScript/JavaScript, Rust, Java, C/C++, SQL, HTML/CSS \
// Dart
*Frameworks:* Node, React, Vue, GraphQL, Spring Boot, Express, Redis, Terraform,
Prisma, Apollo, Axum \
*Tools:* Linux, Postgres, Git, Docker, AWS, GCP, Kubernetes, Figma, Jenkins,
nginx // Jenkins, systemd, Jira
]
#show: doc => template_common(education, skills, doc)
= Experience
#indent[
#work_entry(
"Backend Lead",
"Hack the North",
company_link: "https://hackthenorth.com",
start_date: "Mar 2023",
end_date: "Jan 2025",
location: "Waterloo, ON",
tools: "TypeScript, Express, Postgres, Kubernetes",
tasks: (
[Led 6-person engineering team, shipping shift scheduling system and hardware
inventory system to *6000+ users*],
[Streamlined event check-in times for *1900+* guests by automatically generating
Apple Wallet passes],
[Overhauled CI/CD pipelines, speeding up builds by *35%* by parallelising testing
and type checking with *Buildkite*],
[Resolved slowdowns by *introducing OpenTelemetry tracing* onto *Grafana*
dashboards managed in *Kubernetes*],
[ Slashed dev server reload time by *93%* by introducing threading and
pre-transpiling generated code ],
),
)
#work_entry(
"Software Engineering Intern",
"Magna (YC W22)",
company_link: "https://magna.so",
start_date: "Sep 2024",
end_date: "Dec 2024",
location: "New York, NY",
tools: "Rust, TypeScript, Solidity, React, GraphQL",
tasks: (
[Enabled *one-click creation and deployment* of
#link("https://claim.paramgaming.com/")[landing] #link("https://claim.moonray.game/")[pages]
that each distribute *1 million+* token allocations],
[Investigated and *improved initial load times by >60%* for client sites by
caching blockchain reads in *Redis*],
[Created and refactored data models, controllers, and *GraphQL APIs* to store and
deploy site configurations],
[Reduced boilerplate to write database queries by *90%* decoupling business and
domain logic],
),
)
// #work_entry(
// "Data Engineer",
// "Archive Of Our Own",
// company_link: "https://www.transformativeworks.org/",
// start_date: "Jan 2024",
// end_date: "Sep 2024",
// location: "Remote",
// tools: "Python, Ruby, Rails, Docker",
// tasks: (
// [?? Imported #link(
// "https://archiveofourown.org/admin_posts/30949",
// )[*3* now-defunct sites']
// content databases for #link(
// "https://archiveofourown.org/admin_posts/31009",
// )[*8+ million registered users*] by building ETL pipelines],
// [Introduced static typing to Python codebase with *mypy* to catch *10+*
// production bugs and improve maintainability],
// ),
// )
#work_entry(
"Software Engineering Intern",
"Dropbase (YC W20)",
company_link: "https://dropbase.io",
start_date: "May 2023",
end_date: "Aug 2023",
location: "Remote",
tools: "TypeScript, Python, React, Postgres, AWS",
tasks: (
[Shipped *static analysis tool* for platform's *custom SQL dialect* by
recursively processing an abstract syntax tree],
[Architected platform to clone, sync, and visualise databases for *3000+
enterprise users* in *Python* and *React*],
[Designed *merge conflict resolution system* to handle data mismatches, reducing
user-reported errors by *35%*],
[Built a unified API to seamlessly query and filter *8 data sources* such as
MySQL, Airtable, and Stripe],
// [Developed a serverless microservice to asynchronously ingest email attachments
// directly into ETL pipelines],
// [??? emphasise test driven development or remove line *Reduced request errors by 30%* by creating backend testing infrastructure with
// *Pytest* to catch regressions and test new features across database engines with
// *90% code coverage*],
),
)
#work_entry(
"Software Developer Intern",
"Immigr8",
company_link: "https://immigr8now.com",
start_date: "Jan 2024",
end_date: "Apr 2024",
location: "Remote",
tools: "TypeScript, Spring Boot, React, Postgres, Terraform, AWS",
tasks: (
[Built and launched passport/private document storage platform for *200+ users*
using *Spring Boot* and *React*],
[Secured REST endpoints with *role-based permissions* and *JWTs*; monitored and
logged alerts via CloudWatch],
[Implemented document *OCR pipeline* with Lambda, Textract, and *S3* to
automatically parse and tag uploads],
[Created parallel *CI/CD system from scratch* with *Terraform* and Jenkins to
deploy *AWS Lambdas* on commit], // BE-infra only, FE ver is admin dashboard
),
)
]
= Projects
#indent[
#project(
"Mandown",
"Python, Qt",
repo_link: "https://github.com/potatoeggy/mandown",
tasks: (
[Created a CLI and GUI to convert webcomics into e-ink-optimised files with *50+
stars* and *7 forks* over *3 years*],
[Expanded support for new formats and features
*#link("https://github.com/potatoeggy/mandown/issues/55")[based on]
#link("https://github.com/potatoeggy/mandown/issues/89")[user]
#link("https://github.com/potatoeggy/mandown/issues/63")[demand]*, minimising
regressions with #link(
"https://github.com/potatoeggy/mandown/blob/master/tests/test_source_batoto.py",
)[E2E tests]],
[Implemented *image caching and multithreading* to increase download and
processing speeds by *300%*],
),
)
// #project(
// "Kobink",
// "Rust, Axum",
// repo_link: "https://github.com/potatoeggy/kobink",
// tasks: (
// [Built a backend to sync custom ebook files to Kobos by reverse-engineering and
// mimicking the Kobo Sync API],
// [??],
// ),
// )
// #project(
// "Genshin Rewards Simulator",
// "Vue, TypeScript",
// repo_link: "https://github.com/potatoeggy/primoprod",
// demo_link: "https://primoprod.vercel.app",
// tasks: (
// [Built a realistic and beautiful *loot box simulator* with CSS animations based
// off a popular game],
// [Reduced action latency by *90%* by lazily loading art assets at opportune times,
// such as during cutscenes],
// ),
// )
#project(
"Jeopardy!",
"Vue, TypeScript, WebSockets",
repo_link: "https://github.com/potatoeggy/jeopardy",
demo_link: "https://jeopardy.eggworld.me/host",
tasks: (
[Developed a beautiful and polished client/server game with *real-time
multiplayer* in *Vue* and *WebSockets*],
[Designed a *custom JSON protocol* over *WebSockets* to synchronise game state
and handle buzzer events],
),
)
// #project(
// "RecipeReady",
// "https://github.com/vincentjguo/recipeready-server",
// "Flutter, Selenium, FastAPI, Android",
// )
// - Developed a *Flutter app* to generate recipes based on ingredients and filters
// through a FastAPI server
// - Scraped thousands of websites for recipes to build a database with a robust
// *many-to-many tag system*
// - Aggregated common ingredients heuristically to build a shopping list and a meal
// plan for each week
]

150
lib.typ
View File

@ -1,150 +0,0 @@
#import "fontawesome.typ": github, fa
// Reduce space between paragraphs.
#let par_space = 0.75em
// Reduce space between headings and descriptions.
#let sep_space = par_space + 0.1em
#let subtitle_space = par_space - 0.2em
// Format start and end dates.
#let format_date(start_date: none, end_date: none) = {
let date = {
if end_date == none {
start_date
} else if start_date == none {
end_date
} else {
[#start_date -- #end_date]
}
}
[*#date*]
}
// Format locations.
#let format_location(location) = {
[_#block(above: 0.7em, location)_]
}
#let indent(content) = {
block(
inset: (left: 1em, right: 0.5em),
content
)
}
// General entry that is split into a left and right half (for experience and education).
#let cv_entry(left_content: none, right_content: none, details: none) = {
stack(
dir: ttb,
spacing: 0.75em,
grid(
columns: (11fr, 6fr),
column-gutter: 1cm,
{
set align(left)
left_content
},
{
set align(right)
right_content
}
),
{
set align(left)
details
}
)
}
// Entry for education.
#let education_entry(university, degree, start_date: none, end_date: none, location: none, details: none) = {
let details_list = if details != none {
let list = []
for detail in details {
list += [- #detail]
}
list
} else {
none
}
cv_entry(
left_content: {
text(1.2em)[*#university*] + "\n" + emph[#degree]
},
right_content: {
format_date(start_date: start_date, end_date: end_date)
if location != none {
"\n" + format_location(location)
}
},
details: details_list
)
}
// Entry for work.
#let work_entry(role, company, tasks: none, start_date: none, end_date: none, location: none) = {
let task_list = if tasks != none {
let list = []
for task in tasks {
list += [- #task]
}
list
} else {
none
}
cv_entry(
left_content: {
text(1.1em)[*#role*] + "\n" + text[#emph[#company]]
},
right_content: {
format_date(start_date: start_date, end_date: end_date)
if location != none {
"\n" + format_location(location)
}
},
details: task_list
)
}
#let project(title, repo_link, tools) = {
link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _]
}
// Set name and contact data and format headings
#let template(name, contact_data, color, doc) = {
set page(margin: (rest: 0.5in, top: 0.4in), paper: "us-letter")
set list(indent: 1.25em, marker: [•])
set text(font: "Latin Modern Sans", 11pt)
set par(justify: true, leading: 0.65em)
align(center)[
#text(size: 2em)[*#name*]
#block(above: 0em, below: 1em)
#{
if contact_data != none and contact_data.len() > 0 {
let elements = for el in contact_data {
(link(el.link)[#{el.service + " " + el.display}],)
}
text(1.1em)[#elements.join(" | ")]
}
}
]
show heading.where(level: 1): i => {
set align(left)
let title = smallcaps(i.body)
set block(above: 1em)
set text(weight: "light", size: 0.9em, fill: color, font: "New Computer Modern")
stack(
dir: ttb,
spacing: 1.5mm,
title,
line(length: 100%, stroke: color + 0.4pt)
)
}
doc
}

File diff suppressed because it is too large Load Diff

172
lib/lib.typ Normal file
View File

@ -0,0 +1,172 @@
#import "fontawesome.typ": github, fa, link-icon
#let DEFAULT_STRONG = 300;
#let SMALL_STRONG = 300;
#let TITLE_FONT = "Bitter"
#let HEADING_FONT = TITLE_FONT
#let BODY_FONT = "Raleway"
#let BODY_FONT_SIZE = 10pt
#let HEADING_FONT_SIZE = 0.95em
#let TITLE_FONT_SIZE = 2em
#let HEADING_LINE_GAP = 3mm
#let HEADING_ABOVE_GAP = 1.2em
#let HEADING_BELOW_GAP = 0.75em
#let BODY_LINE_HEIGHT = 0.7em
#let HEADING_DETAILS_LIST_SPACING = 0.9em
#let DETAILS_LIST_SPACING = 0.7em
#let DETAILS_LIST_INDENT = 1.25em
#let JOB_TITLE_FONT_SIZE = 1.05em
// rest = not top
#let PAGE_MARGINS = (right: 0.5in, top: 0.3in, left: 0.4in, bottom: 0.4in)
// Format locations.
#let format_location(location) = {
[_#block(above: 0.7em, location)_]
}
#let indent(content) = {
block(inset: (left: 0.75em, right: 0.5em), content)
}
// General entry that is split into a left and right half (for experience and education).
#let cv_entry(left_content: none, right_content: none, details: none) = {
stack(
dir: ttb,
spacing: HEADING_DETAILS_LIST_SPACING,
grid(columns: (15fr, 5fr), column-gutter: 0cm, {
set strong(delta: DEFAULT_STRONG)
set align(left)
left_content
}, {
set strong(delta: SMALL_STRONG)
set align(right)
right_content
}),
{
set strong(delta: SMALL_STRONG)
show link: underline
list(..details)
},
)
}
// Entry for work.
#let work_entry(
role,
company,
tools: none,
tasks: none,
start_date: none,
end_date: none,
location: none,
company_link: none,
) = {
cv_entry(left_content: {
text(JOB_TITLE_FONT_SIZE)[*#role*]
if tools != none {
// text[ | _ #tools _ ]
}
"\n"
set strong(delta: SMALL_STRONG)
if company_link == none {
[_#company _]
} else {
[#link(company_link)[_#company _]]
}
}, right_content: {
text(style: "italic")[#start_date -- #end_date]
if location != none {
"\n" + format_location(location)
}
}, details: tasks)
}
#let project(title, tools, repo_link: none, demo_link: none, tasks: none) = {
set strong(delta: DEFAULT_STRONG)
let text_link = if demo_link != none { demo_link } else { repo_link }
let content_title = {
if text_link != none {
link(text_link)[#text(JOB_TITLE_FONT_SIZE)[*#title*]]
} else {
text(JOB_TITLE_FONT_SIZE)[*#title*]
}
if demo_link != none {
link(demo_link)[#text(JOB_TITLE_FONT_SIZE)[ #fa(link-icon) ]]
}
if repo_link != none {
link(repo_link)[#text(JOB_TITLE_FONT_SIZE)[ #fa(github) ]]
}
[ | _ #tools _ ]
}
cv_entry(left_content: content_title, details: tasks)
}
// Set name and contact data and format headings
#let template(name, color, doc) = {
set page(margin: PAGE_MARGINS, paper: "us-letter")
set list(
tight: false,
indent: DETAILS_LIST_INDENT,
spacing: DETAILS_LIST_SPACING,
marker: [*•*],
)
set text(font: (BODY_FONT), BODY_FONT_SIZE)
set par(justify: true, leading: BODY_LINE_HEIGHT)
set underline(offset: 0.2em)
align(center)[
#text(size: TITLE_FONT_SIZE, font: TITLE_FONT, fill: color)[*#name*]
#block(above: 0em, below: 1em)
]
show heading.where(level: 1): i => {
set align(left + horizon)
let title = smallcaps(i.body)
let colored_line(header_text) = {
let size = measure(header_text)
// 100% - spacing - width of text
line(
length: 100% - HEADING_LINE_GAP - size.width,
stroke: (paint: color, thickness: 2pt, cap: "round"),
)
}
set block(above: HEADING_ABOVE_GAP, below: HEADING_BELOW_GAP)
set text(size: HEADING_FONT_SIZE, fill: color, font: HEADING_FONT)
stack(
dir: ltr,
spacing: HEADING_LINE_GAP,
title,
box(height: 2pt, fill: color, colored_line(title)),
)
}
set strong(delta: SMALL_STRONG)
doc
}
#let render_contact_data(data) = {
align(center)[
#let elements = for el in data {
(link(el.link)[#{ el.service + " " + el.display }],)
}
#text(1em)[#elements.join(" | ")]
]
}

46
lib/template_common.typ Normal file
View File

@ -0,0 +1,46 @@
#import "fontawesome.typ": fa, globe, github, linkedin, envelope
#import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG, render_contact_data
#let SEQUENCE = ("education", "content", "skills")
// orange!!
#let color = blue // rgb("#ff983e")
#let name = "Daniel Chen"
#let contact_data = ((
service: fa[#github],
display: "potatoeggy",
link: "https://github.com/potatoeggy",
), (
service: fa[#envelope],
display: "d7chen@uwaterloo.ca",
link: "mailto://d7chen@uwaterloo.ca",
), (
service: fa[#linkedin],
display: "potatoeggy",
link: "https://www.linkedin.com/in/potatoeggy/",
), (
service: fa[#globe],
display: "eggworld.me",
link: "https://eggworld.me",
))
#show: doc => template(name, color, doc)
#let template_common(education, skills, doc) = {
template(name, color, {
render_contact_data(contact_data)
SEQUENCE.map(section => {
if section == "education" [
= Education
#education
] else if section == "skills" [
= Technical Skills
#skills
] else if section == "content" [
#doc
]
}).join()
})
}