Compare commits

..

31 Commits

Author SHA1 Message Date
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
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
3 changed files with 246 additions and 137 deletions

View File

@@ -1,8 +1,8 @@
#import "fontawesome.typ": fa, globe, github, linkedin, envelope #import "fontawesome.typ": fa, globe, github, linkedin, envelope
#import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG #import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG, render_contact_data
// orange!! // orange!!
#let color = rgb("#ff983e") #let color = blue // rgb("#ff983e")
#let name = "Daniel Chen" #let name = "Daniel Chen"
#let contact_data = (( #let contact_data = ((
@@ -23,35 +23,21 @@
link: "mailto://d7chen@uwaterloo.ca", link: "mailto://d7chen@uwaterloo.ca",
),) ),)
#show: doc => template(name, contact_data, color, doc) #show: doc => template(name, color, doc)
#render_contact_data(contact_data)
// MAIN CONTENT STARTS here // MAIN CONTENT STARTS here
= Education
#indent[
#work_entry(
"University of Waterloo",
"B.A.Sc. in Computer Engineering",
start_date: "Sep 2022",
end_date: "Apr 2027",
location: "Waterloo, ON",
tasks: (
[Courses: Object-oriented programming, data structures & algorithms, digital
computers & circuits],
),
)
]
= Skills = Skills
#indent[ #indent[
*Languages:* Python, TypeScript, JavaScript, Rust, SQL, MATLAB, C, C++, Java, *Languages:* TypeScript/JavaScript, HTML, CSS, SQL, Python, Rust \
HTML, CSS, Dart \ // Dart
*Frameworks:* Node.js, Express, React, Next.js, Vue, Flutter, Qt, Prisma, *Technologies:* React, Next.js, Express, Prisma, Apollo, GraphQL \
Apollo, Axum, Jest, Pytest \ // Qt, Jest / Pytest, Apollo, Prisma, Rails
*Tools:* Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, *Tools:* Linux, Git, Docker, Postgres, Pytest, Jest, AWS/GCP, Kubernetes,
OpenTelemetry, GraphQL, Android Terraform, Figma // Jenkins, systemd, Jira
] ]
= Experience = Experience
@@ -59,44 +45,82 @@
#indent[ #indent[
#work_entry( #work_entry(
"Software Engineering Intern", "Software Engineering Intern",
"Dropbase", "Immigr8",
start_date: "May 2023", start_date: "Jan 2024",
end_date: "Aug 2023", end_date: "Apr 2024",
location: "San Francisco, CA", location: "Remote",
tools: "React, TypeScript, Spring Boot, Postgres, AWS",
tasks: ( tasks: (
[Designed a conflict resolution algorithm for business smart tables, *reducing // [Improved client responsiveness by *80* by employing stale-while-revalidate hooks for caching and ?? SWR performance, caching, error handling],
unrecoverable errors by 75%*], [Owned the creation of an end-to-end document vault feature in *React* for users
[Launched a service to validate and import CSV/Excel attachments into DBs by to upload and verify identity documents with Textract, reducing support tickets
expanding engine support by *6x*], by *25%*],
[Shipped a HubSpot/Airtable to Google Sheets sync feature to *46000+ enterprise [Planned and executed a roadmap to *SOC 2 security compliance* by implementing
users* by writing *AWS Lambda* functions in Python, abstracting interfaces to *role-based permissions with JWTs* in Spring Boot, logging alerts to CloudWatch,
easily support future sources], and introducing new privacy controls for user data],
[Wrote and deployed a new *React* data query builder to *33000+ users* by [Optimised dashboard responsiveness by *80%* by employing stale-while-revalidate
standardising and enforcing protocols between interfaces across the stack, hooks in React and lazily loading backend models with Hibernate, improving user
eliminating the need for business users to manually write API calls], retention by *30%*],
[*Reduced request errors by 30%* by creating backend testing infrastructure with [Created CI/CD pipelines to automatically deploy AWS Lambdas with Terraform and
*Pytest* to catch regressions and test new features across database engines with Jenkins],
*90% code coverage*],
), ),
) )
#work_entry( #work_entry(
"Backend Developer & Organiser", "Software Engineering Intern",
"Dropbase",
start_date: "May 2023",
end_date: "Aug 2023",
location: "Remote",
tools: "React, TypeScript, Python, Postgres, AWS",
tasks: (
[Engineered a new React data query builder and FastAPI backend for our business
intelligence visualisation service to *33000+* users, eliminating the need for
clients to manually write API calls],
[Shipped a new tool to sync *46000+* users' HubSpot/Airtable tables to Google
Sheets with AWS Lambdas],
[Designed a conflict resolution algorithm to merge databases, reducing
unrecoverable errors by *75%*],
// [?? new tool dDeveloped a *serverless microservice* that asynchronously ingests
// 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(
"Backend Developer",
"Hack the North", "Hack the North",
start_date: "Mar 2023", start_date: "Mar 2023",
end_date: "present", end_date: "present",
location: "Waterloo, ON", location: "Waterloo, ON",
tools: "Express, TypeScript, Postgres, GraphQL",
tasks: ( tasks: (
[Streamlined event check-in times by *80%* by generating user-specific mobile [Built a new travel tool application leveraging GraphQL and Apollo Server to
ticket passes over *Express*], track bus capacity for *500+* attendees through real-time registration processes],
[Deployed a new attendee bus registration platform by creating new database [Streamlined event check-in times by *80%* for *1900+* guests by generating Apple
tables and *GraphQL* resolvers], Wallet passes over Express],
[Horizontally scaled the *Node* server to handle *1000+ concurrent users* with [Diagnosed and recovered from crashes due to load spikes up to 800k updates per
*Redis* and *Kubernetes*], hour at the world's largest student-run hackathon by autoscaling Redis and
[Integrated backend *tracing* to monitor performance and trigger alerts with Postgres on Kubernetes],
*OpenTelemetry* and *Grafana*], [Slashed dev server reload time from *130 → 9 s* by introducing threading and
[Slashed boot and reload times by *93%* by introducing *threading, profiling*, pre-transpiling generated code],
and pre-transpiling generated code], // [Upgraded the event statistics dashboard to update in real time with GraphQL
// *subscriptions with Redis PubSub*],
),
)
#work_entry(
"Software Developer",
"Organization for Transformative Works",
start_date: "Feb 2024",
end_date: "present",
location: "Remote",
tools: "Python, React, MySQL",
tasks: (
[Upgrading archive import pipelines in Python to make *4000+* user works
accessible to *7 million* users],
), ),
) )
] ]
@@ -105,54 +129,104 @@
#set strong(delta: SMALL_STRONG) #set strong(delta: SMALL_STRONG)
#indent[ #indent[
#project("Mandown", "https://github.com/potatoeggy/mandown", "Python, Qt") #project(
- Created a CLI and GUI to scrape, download, and convert webcomics into "Mandown Comic Downloader",
e-ink-optimised ebooks (EPUB, PDF) "Python, Qt",
- Designed an *intermediate representation* to store metadata and images as a repo_link: "https://github.com/potatoeggy/mandown",
standardised conversion target start_date: "Jan 2022",
- Implemented *image caching and multiprocessing* to increase download and update end_date: "present",
speeds by *300%* tasks: (
[Created a CLI and GUI to scrape, download, and convert webcomics into
e-ink-optimised PDF/EPUBs],
[Designed a scalable ebook converter with a *plugin-based architecture* to
improve compatibility],
[Implemented *image caching and multithreading* to increase download and update
speeds by *300%*],
),
)
#project( #project(
"Genshin Wish Simulator", "Kobo Sync Server",
"https://github.com/potatoeggy/primoprod", "Rust, Axum",
"Vue, TypeScript", repo_link: "https://github.com/potatoeggy/kobink",
start_date: "Nov 2023",
end_date: "present",
tasks: (
[Developed a *Rust* backend to sync custom ebook files to Kobos by reimplementing
the Kobo Sync API],
[Deployed the service behind an nginx reverse proxy and Cloudflare DNS to sync
over the internet],
),
) )
- Built a realistic and beautiful *loot box simulator* with fluid animations based
off a popular game
- Reduced action latency by *90%* by lazily loading art assets at opportune times,
such as during cutscenes
#project("Kobink", "https://github.com/potatoeggy/kobink", "Rust, Axum") // #project(
- Developed an Axum backend to *automatically convert and sync* ebooks to a Kobo // "Genshin Rewards Simulator",
eReader over the network // "Vue, TypeScript",
- *Reverse-engineered* the Kobo eReader Sync API to support updating ebook // repo_link: "https://github.com/potatoeggy/primoprod",
metadata and covers // demo_link: "https://primoprod.vercel.app",
// )
// - 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( #project(
"RecipeReady", "Jeopardy!",
"https://github.com/vincentjguo/recipeready-server", "Vue, TypeScript, WebSockets",
"Flutter, Selenium, FastAPI, Android", repo_link: "https://github.com/potatoeggy/jeopardy",
start_date: "Apr 2023",
end_date: "present",
demo_link: "https://jeopardy.eggworld.me/host",
tasks: (
[Developed a beautiful and polished game where participants buzz in on their
devices over *WebSockets*],
[Synchronised game state between clients and the host with shared types and the
*observer pattern*],
),
) )
- Developed a *Flutter app* to generate recipes based on ingredients and filters
through a FastAPI server // #project(
- Scraped thousands of websites for recipes to build a database with a robust // "RecipeReady",
*many-to-many tag system* // "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 // - Aggregated common ingredients heuristically to build a shopping list and a meal
// plan for each week // plan for each week
// #project("Arch Linux Server", none, "Linux, nginx, systemd") // #project("Arch Linux Server", "Linux, Docker, nginx, systemd", demo_link: "https://eggworld.me")
// - Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy // - Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy
// personal projects behind *nginx* // personal projects behind *nginx*
// - Set up *Jellyfin* for media streaming, a *Minecraft* server, *Calibre* for ebook // - Containerised services with *Docker* and *systemd* to simplify deployment and
// syncing, and other services // management
// #project(
// "Game Boy Advance Emulator",
// "Rust, SDL2, Vulkan",
// repo_link: "https://github.com/potatoeggy/gbarr",
// )
// - Implemented a *ARMv7 emulator* for old games to run on modern x86_64 platforms
// with *SDL2* and *Vulkan*
// - WebGPU and WASM for portability, typestate to guarantee everything is always
// valid
] ]
// = Awards = Education
// #show link: underline #indent[
#work_entry(
// - Winner of the #link("https://github.com/anyuan-chen/resketch")[EdTech] prize at "B.A.Sc. in Computer Engineering (Honours, Co-op)",
// StormHacks 2022 from 350+ participants "University of Waterloo",
// - Winner of the #link("https://github.com/anyuan-chen/perdiem")[IBM Open Source] prize start_date: "Sep 2022",
// at YRHacks 2022 from 90+ participants end_date: "Apr 2027",
location: "Waterloo, ON",
tasks: (
[Courses: Object-oriented programming, data structures & algorithms, digital
logic & circuits],
// [Extracurriculars: Creative Writing Club, Hack the North, UW Orbital Design Team],
),
)
]

View File

@@ -2,6 +2,10 @@
Release guidelines: Release guidelines:
- The major version represents the current academic year, e.g., both post-2A and 2B would be v2. - 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.
- The minor version represents the current academic term, e.g., 2A would be v2.1. the x.0 releases are reserved for beta changes. - Increment the minor version for every major change. These can include:
- The patch version is incremented for any other reason. - 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.

121
lib.typ
View File

@@ -1,4 +1,4 @@
#import "fontawesome.typ": github, fa #import "fontawesome.typ": github, fa, link-icon
#let DEFAULT_STRONG = 300; #let DEFAULT_STRONG = 300;
#let SMALL_STRONG = 200; #let SMALL_STRONG = 200;
@@ -8,14 +8,19 @@
#let BODY_FONT = "Open Sans" #let BODY_FONT = "Open Sans"
#let BODY_FONT_SIZE = 10pt #let BODY_FONT_SIZE = 10pt
#let HEADING_FONT_SIZE = 1em #let HEADING_FONT_SIZE = 0.95em
#let TITLE_FONT_SIZE = 2.25em #let TITLE_FONT_SIZE = 2em
#let HEADING_LINE_GAP = 3mm #let HEADING_LINE_GAP = 3mm
#let BODY_LINE_HEIGHT = 0.85em #let BODY_LINE_HEIGHT = 0.75em
#let HEADING_DETAILS_LIST_SPACING = 0.9em
#let DETAILS_TITLE_FONT_SIZE = 1.075em
#let DETAILS_LIST_SPACING = 0.85em
// rest = not top // rest = not top
#let PAGE_MARGINS = (rest: 0.5in, top: 0.4in, left: 0.4in) #let PAGE_MARGINS = (right: 0.45in, left: 0.4in, rest: 0.4in)
// Format locations. // Format locations.
#let format_location(location) = { #let format_location(location) = {
@@ -23,15 +28,15 @@
} }
#let indent(content) = { #let indent(content) = {
block(inset: (left: 0.75em, right: 0.5em), content) block(inset: (left: 0.75em, right: 1em), content)
} }
// General entry that is split into a left and right half (for experience and education). // 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) = { #let cv_entry(left_content: none, right_content: none, details: none) = {
stack( stack(
dir: ttb, dir: ttb,
spacing: 0.9em, spacing: HEADING_DETAILS_LIST_SPACING,
grid(columns: (11fr, 6fr), column-gutter: 1cm, { grid(columns: (15fr, 4fr), column-gutter: 0cm, {
set strong(delta: DEFAULT_STRONG) set strong(delta: DEFAULT_STRONG)
set align(left) set align(left)
left_content left_content
@@ -41,9 +46,8 @@
right_content right_content
}), }),
{ {
set align(left) set strong(delta: DEFAULT_STRONG)
set strong(delta: SMALL_STRONG) list(tight: false, spacing: DETAILS_LIST_SPACING, marker: [], ..details)
details
}, },
) )
} }
@@ -52,61 +56,88 @@
#let work_entry( #let work_entry(
role, role,
company, company,
tools: none,
tasks: none, tasks: none,
start_date: none, start_date: none,
end_date: none, end_date: none,
location: none, location: none,
) = { ) = {
let task_list = if tasks != none { cv_entry(left_content: {
let list = [] set par(justify: true)
for task in tasks { text(DETAILS_TITLE_FONT_SIZE)[*#company* | _#role _]
list += [- #task]
if tools != none {
set strong(delta: SMALL_STRONG)
text[ | *#tools* ]
} }
list }, right_content: {
[_#start_date -- #end_date _]
// if location != none {
// format_location(location)
// }
}, details: tasks)
}
#let project(
title,
tools,
start_date: none,
end_date: none,
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 date_content = if start_date != none {
[_#start_date -- #end_date _]
} else { } else {
none none
} }
cv_entry(left_content: {
set par(leading: 0.75em)
text(1.1em)[*#role*]
"\n"
set strong(delta: SMALL_STRONG)
text[*#company*]
}, right_content: {
[*#start_date -- #end_date*]
if location != none { let content_title = {
"\n" + format_location(location) set text(size: DETAILS_TITLE_FONT_SIZE)
if text_link != none {
link(text_link)[#text[*#title*]]
} else {
text[*#title*]
} }
}, details: task_list)
if demo_link != none {
link(demo_link)[ #fa(link-icon) ]
}
if repo_link != none {
link(repo_link)[ #fa(github) ]
}
[ | _ #tools _ ]
}
cv_entry(
left_content: content_title,
right_content: date_content,
details: tasks,
)
} }
#let project(title, repo_link, tools) = { #let render_contact_data(data) = {
set strong(delta: DEFAULT_STRONG) align(center)[
if repo_link != none { #let elements = for el in data {
link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _ ] (link(el.link)[#{ el.service + " " + el.display }],)
} else { }
text(1.1em)[*#title*] + [ | _ #tools _ ] #text(1em)[#elements.join(" | ")]
} ]
} }
// Set name and contact data and format headings // Set name and contact data and format headings
#let template(name, contact_data, color, doc) = { #let template(name, color, doc) = {
set page(margin: PAGE_MARGINS, paper: "us-letter") set page(margin: PAGE_MARGINS, paper: "us-letter")
set list(indent: 1em, marker: []) set list(indent: 0.75em, marker: [])
set text(font: (BODY_FONT), BODY_FONT_SIZE) set text(font: (BODY_FONT), BODY_FONT_SIZE)
set par(justify: true, leading: BODY_LINE_HEIGHT) set par(leading: BODY_LINE_HEIGHT)
align(center)[ align(center)[
#text(size: TITLE_FONT_SIZE, font: TITLE_FONT, fill: color)[*#name*] #text(size: TITLE_FONT_SIZE, font: TITLE_FONT, fill: color)[*#name*]
#block(above: 0em, below: 1em) #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(1em)[#elements.join(" | ")]
}
}
] ]
show heading.where(level: 1): i => { show heading.where(level: 1): i => {