Compare commits
	
		
			102 Commits
		
	
	
		
			v2.1.1
			...
			94ff3febe8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 94ff3febe8 | ||
|  | 4e79e361e5 | ||
|  | e073191d8c | ||
|  | 91102c2375 | ||
|  | f0c5e8b1a0 | ||
|  | ccaabbf120 | ||
|  | afb654e438 | ||
|  | e8d11985de | ||
|  | f55afb83dc | ||
|  | 9008dd3645 | ||
|  | e1ee8bdf93 | ||
|  | 5b0eca1072 | ||
|  | 71fcc86736 | ||
|  | 37e7f86319 | ||
|  | cdd0b8e201 | ||
|  | 7090fbbed0 | ||
|  | 1d3c065bf7 | ||
|  | c5b2fb0bcd | ||
|  | 41f12b3c20 | ||
|  | 083f2667a7 | ||
|  | 164d8d28d7 | ||
|  | b78603bd8d | ||
|  | 2bdeeb3deb | ||
|  | cf0622dd81 | ||
|  | 5cbeb07c2f | ||
|  | 506d0b9da4 | ||
|  | 667e8af1d9 | ||
|  | 75ac3fb5a4 | ||
|  | eb112f5b0d | ||
|  | c6365b5c03 | ||
|  | f056b8f434 | ||
|  | 33f4f2520c | ||
|  | 1984d47151 | ||
|  | bfca633917 | ||
|  | af0f13008a | ||
|  | d69e958304 | ||
|  | 509bd8963d | ||
|  | 3e5be4cf8f | ||
|  | dd4006d03d | ||
|  | b92ddd66b2 | ||
|  | ec13a4a5b3 | ||
|  | a150d5de6d | ||
|  | 23fc909827 | ||
|  | fd0398a22c | ||
|  | bbe961ee20 | ||
|  | eabed81b45 | ||
|  | 3b70ac13fe | ||
|  | 1fdfe05eea | ||
|  | 4d7215700a | ||
|  | b6f14ed712 | ||
|  | 4648e83c55 | ||
| f827c87f64 | |||
|  | 508307cc43 | ||
|  | 858d6c9758 | ||
|  | 23e9324077 | ||
|  | 00659263f9 | ||
|  | 197699e63b | ||
|  | b8e5b47b0b | ||
|  | 45b4a6b7e6 | ||
|  | 4705415045 | ||
|  | c09d0bdc1a | ||
|  | 18ebf61e9b | ||
|  | 8b5a085447 | ||
|  | f078060477 | ||
|  | 5eadcfe0ba | ||
|  | 10889dba25 | ||
|  | 6bfc3273c0 | ||
|  | f0e9e96fe4 | ||
|  | baa386a39e | ||
|  | f9b8dd6b0e | ||
|  | d165a1b259 | ||
|  | 2cddfcbf6e | ||
|  | de8fb56d48 | ||
|  | 0f0ff6ba1f | ||
|  | 1591bdaba5 | ||
|  | 7d289c8757 | ||
|  | 2d4d0dd6d4 | ||
|  | 6e8763b88d | ||
|  | 08201c3406 | ||
|  | dd3d479a92 | ||
|  | 2694b2e9eb | ||
|  | d0d224ba04 | ||
|  | 1ab736b2d5 | ||
|  | e26e2cbeb2 | ||
|  | 250150f9a1 | ||
|  | d380bd6724 | ||
|  | 987f255a87 | ||
|  | 19a5af8798 | ||
|  | 7be19f3b9b | ||
|  | dce7a94677 | ||
|  | 04a01d80bb | ||
| 247eeb945e | |||
|  | 2bc466a29a | ||
|  | 37b543affe | ||
|  | b1b80349cb | ||
|  | f900fca1c0 | ||
|  | 6ccf2d2fad | ||
|  | 39c736e9db | ||
|  | 9b031313b6 | ||
|  | 1134628f06 | ||
|  | 575b97fa0c | ||
|  | 1b0ac8d324 | 
							
								
								
									
										122
									
								
								Daniel Chen.typ
									
									
									
									
									
								
							
							
						
						
									
										122
									
								
								Daniel Chen.typ
									
									
									
									
									
								
							| @@ -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") |  | ||||||
| - Mocked a video game UI using CSS to create a hyper-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
									
								
							
							
						
						
									
										21
									
								
								Makefile
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										17
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | # Resume | ||||||
|  |  | ||||||
|  | ## Requirements | ||||||
|  |  | ||||||
|  | - Typst | ||||||
|  | - Font: Bitter | ||||||
|  | - Font: Open Sans, 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. | ||||||
							
								
								
									
										197
									
								
								backend_infra.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								backend_infra.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | |||||||
|  |  | ||||||
|  | #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", | ||||||
|  |     start_date: "Sep 2022", | ||||||
|  |     end_date: "Apr 2027", | ||||||
|  |     location: "Waterloo, ON", | ||||||
|  |     tasks: ( | ||||||
|  |       // [Courses: Object-oriented programming, data structures & algorithms, concurrency, | ||||||
|  |       //   operating systems], | ||||||
|  |       [Extracurriculars: Hack the North Organising Team, UW Orbital Satellite Design | ||||||
|  |         Team, Creative Writing Club], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | #let skills = indent[ | ||||||
|  |   *Languages:* TypeScript/JavaScript, Rust, Python, Java, C++, SQL, HTML/CSS \ | ||||||
|  |   // Dart | ||||||
|  |   *Technologies:* Postgres, Spring Boot, Express, Redis, Terraform, Prisma, | ||||||
|  |   Apollo, Axum, GraphQL, React \ | ||||||
|  |   *Developer Tools:* Linux, Git, Docker, Pytest, Jest, AWS, GCP, Kubernetes, | ||||||
|  |   Jenkins, nginx // Jenkins, systemd, Jira | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | #show: doc => template_common(education, skills, doc) | ||||||
|  |  | ||||||
|  | = Experience | ||||||
|  |  | ||||||
|  | #indent[ | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Magna", | ||||||
|  |     company_link: "https://magna.so", | ||||||
|  |     start_date: "Sep 2024", | ||||||
|  |     end_date: "Dec 2024", | ||||||
|  |     location: "New York, NY", | ||||||
|  |     tools: "Rust, TypeScript, Solidity, React, GraphQL", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created tooling to construct and deploy new customer landing portals based off | ||||||
|  |         of Figma designs with Vercel's API], | ||||||
|  |       [Developed a new external REST API for customers who wanted to access their token | ||||||
|  |         data programmatically], // termination display (FE), external API for customers not using our platform (BE) | ||||||
|  |       [Wrote and audited smart contracts on the Solana blockchain to add claim fees to | ||||||
|  |         our token vesting platform], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Developer", | ||||||
|  |     "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: ( | ||||||
|  |       [Owned end-to-end development of a secure document vault for users to upload ID | ||||||
|  |         documents with S3 and Textract], | ||||||
|  |       [Championed and shipped features for *SOC 2 security compliance*, including | ||||||
|  |         *role-based permissions with JWTs* in Spring Boot, alert logging with | ||||||
|  |         CloudWatch, and strong privacy controls for user data], | ||||||
|  |       [Reduced dashboard load time by 38% by implementing a stale-while-revalidate | ||||||
|  |         caching strategy], | ||||||
|  |       // [?? Calendly integration + OAuth], | ||||||
|  |       [Created a parallel *CI/CD system from scratch* with Terraform and Jenkins to | ||||||
|  |         automatically deploy AWS Lambdas], // BE-infra only, FE ver is admin dashboard | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Dropbase", | ||||||
|  |     company_link: "https://dropbase.io", | ||||||
|  |     start_date: "May 2023", | ||||||
|  |     end_date: "Aug 2023", | ||||||
|  |     location: "Remote", | ||||||
|  |     tools: "TypeScript, Python, React, Postgres, AWS", | ||||||
|  |     tasks: ( | ||||||
|  |       [Architected a data query builder and executor engine for customers to visualise | ||||||
|  |         their data warehouses by custom-tailoring forms on-the-fly, supporting complex | ||||||
|  |         nested logic for 3000+ enterprise users across 8 database types], // | ||||||
|  |       [Shipped an *LSP server for our custom query language*, including user-specific | ||||||
|  |         autocomplete and syntax highlighting], | ||||||
|  |       [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( | ||||||
|  |     "Backend / Infrastructure Developer", | ||||||
|  |     "Hack the North", | ||||||
|  |     company_link: "https://hackthenorth.com", | ||||||
|  |     start_date: "Mar 2023", | ||||||
|  |     end_date: "Oct 2024", | ||||||
|  |     location: "Waterloo, ON", | ||||||
|  |     tools: "TypeScript, Express, Postgres, Kubernetes", | ||||||
|  |     tasks: ( | ||||||
|  |       [Streamlined event check-in times for *1900+* guests by generating scannable | ||||||
|  |         mobile wallet passes over Express], | ||||||
|  |       [Overhauled CI/CD pipelines, speeding up builds by *35%* by parallelising testing | ||||||
|  |         and type checking], | ||||||
|  |       [*Introduced backend tracing* with OpenTelemetry and Grafana to profile | ||||||
|  |         performance issues in production], | ||||||
|  |       [*Resolved load spike crashes* in prod by caching queries via Redis and | ||||||
|  |         horizontally scaling services on Kubernetes], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | = Projects | ||||||
|  | #set strong(delta: SMALL_STRONG) | ||||||
|  |  | ||||||
|  | #indent[ | ||||||
|  |   #project( | ||||||
|  |     "Mandown", | ||||||
|  |     "Python, Qt", | ||||||
|  |     repo_link: "https://github.com/potatoeggy/mandown", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created a CLI and GUI to scrape and convert webcomics into e-ink-optimised files | ||||||
|  |         with a *plugin-based architecture*], | ||||||
|  |       [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( | ||||||
|  |     "Arch Linux Server", | ||||||
|  |     "Linux, Docker, nginx, systemd", | ||||||
|  |     demo_link: "https://eggworld.me", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy | ||||||
|  |         personal projects behind *nginx*], // TODO | ||||||
|  |       [Managed services with *Docker* and *systemd* to simplify deployment and resource | ||||||
|  |         constrainment], // TODO | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   // #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 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*], | ||||||
|  |   //   ), | ||||||
|  |   // ) | ||||||
|  |  | ||||||
|  |   // #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
									
									
									
									
									
								
							
							
						
						
									
										150
									
								
								lib.typ
									
									
									
									
									
								
							| @@ -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
											
										
									
								
							
							
								
								
									
										165
									
								
								lib/lib.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								lib/lib.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | |||||||
|  | #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 = "Open Sans" | ||||||
|  |  | ||||||
|  | #let BODY_FONT_SIZE = 9.75pt | ||||||
|  | #let HEADING_FONT_SIZE = 0.9em | ||||||
|  | #let TITLE_FONT_SIZE = 2em | ||||||
|  |  | ||||||
|  | #let HEADING_LINE_GAP = 3mm | ||||||
|  | #let HEADING_ABOVE_GAP = 1em | ||||||
|  | #let HEADING_BELOW_GAP = 0.75em | ||||||
|  |  | ||||||
|  | #let BODY_LINE_HEIGHT = 0.7em | ||||||
|  |  | ||||||
|  | #let HEADING_DETAILS_LIST_SPACING = 1em | ||||||
|  | #let DETAILS_TITLE_FONT_SIZE = 1.075em | ||||||
|  |  | ||||||
|  | #let DETAILS_LIST_SPACING = 0.9em | ||||||
|  | #let DETAILS_LIST_INDENT = 1.5em | ||||||
|  |  | ||||||
|  | // rest = not top | ||||||
|  | #let PAGE_MARGINS = (right: 0.4in, top: 0.3in, left: 0.3in, 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(tight: false, spacing: DETAILS_LIST_SPACING, marker: [*•*], ..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(1.05em)[*#role*] | ||||||
|  |  | ||||||
|  |     if tools != none { | ||||||
|  |       // text[ | _ #tools _ ] | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     "\n" | ||||||
|  |     set strong(delta: SMALL_STRONG) | ||||||
|  |  | ||||||
|  |     if company_link == none { | ||||||
|  |       [_#company _] | ||||||
|  |     } else { | ||||||
|  |       [#link(company_link)[_#company _]] | ||||||
|  |     } | ||||||
|  |   }, right_content: { | ||||||
|  |     [#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(1.1em)[*#title*]] | ||||||
|  |     } else { | ||||||
|  |       text(1.1em)[*#title*] | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if demo_link != none { | ||||||
|  |       link(demo_link)[#text(1.1em)[ #fa(link-icon) ]] | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if repo_link != none { | ||||||
|  |       link(repo_link)[#text(1.1em)[ #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(indent: DETAILS_LIST_INDENT, marker: [•]) | ||||||
|  |   set text(font: (BODY_FONT), BODY_FONT_SIZE) | ||||||
|  |   set par(justify: true, leading: BODY_LINE_HEIGHT) | ||||||
|  |   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
									
								
							
							
						
						
									
										46
									
								
								lib/template_common.typ
									
									
									
									
									
										Normal 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 = ("content", "skills", "education") | ||||||
|  |  | ||||||
|  | // orange!! | ||||||
|  | #let color = blue // rgb("#ff983e") | ||||||
|  | #let name = "Daniel Chen" | ||||||
|  |  | ||||||
|  | #let contact_data = (( | ||||||
|  |   service: fa[#globe], | ||||||
|  |   display: "eggworld.me", | ||||||
|  |   link: "https://eggworld.me", | ||||||
|  | ), ( | ||||||
|  |   service: fa[#github], | ||||||
|  |   display: "github.com/potatoeggy", | ||||||
|  |   link: "https://github.com/potatoeggy", | ||||||
|  | ), ( | ||||||
|  |   service: fa[#linkedin], | ||||||
|  |   display: "linkedin.com/in/potatoeggy", | ||||||
|  |   link: "https://www.linkedin.com/in/potatoeggy/", | ||||||
|  | ), ( | ||||||
|  |   service: fa[#envelope], | ||||||
|  |   display: "d7chen@uwaterloo.ca", | ||||||
|  |   link: "mailto://d7chen@uwaterloo.ca", | ||||||
|  | ),) | ||||||
|  |  | ||||||
|  | #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() | ||||||
|  |   }) | ||||||
|  | } | ||||||
							
								
								
									
										234
									
								
								systems.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								systems.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,234 @@ | |||||||
|  |  | ||||||
|  | #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", | ||||||
|  |     start_date: "Sep 2022", | ||||||
|  |     end_date: "Apr 2027", | ||||||
|  |     location: "Waterloo, ON", | ||||||
|  |     tasks: ( | ||||||
|  |       [Courses: Object-oriented programming, data structures & algorithms, digital | ||||||
|  |         logic & circuits, operating systems], | ||||||
|  |       [Extracurriculars: Hack the North Organising Team, UW Orbital Satellite Design | ||||||
|  |         Team], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | #let skills = indent[ | ||||||
|  |   *Languages:* Python, C, C++, Rust, Java, MATLAB, HTML/CSS/JavaScript \ | ||||||
|  |   // Dart | ||||||
|  |   *Technologies:* Qt, PySide2, React, Spring Boot, Express, GraphQL \ | ||||||
|  |   // Qt, Jest / Pytest, Apollo, Prisma, Rails | ||||||
|  |   *Tools:* Linux, Git, Docker, Quartus, Pytest, Jest, Postgres, AWS/GCP, | ||||||
|  |   Kubernetes, Terraform // Jenkins, systemd, Jira | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | #show: doc => template_common(education, skills, doc) | ||||||
|  |  | ||||||
|  | = Experience | ||||||
|  |  | ||||||
|  | #indent[ | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Magna", | ||||||
|  |     company_link: "https://magna.so", | ||||||
|  |     start_date: "Sep 2024", | ||||||
|  |     end_date: "Dec 2024", | ||||||
|  |     location: "New York, NY", | ||||||
|  |     tools: "Rust, TypeScript, Solidity, React, GraphQL", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created tooling to automate constructing and deploying new customer landing | ||||||
|  |         portals based off of Figma designs], | ||||||
|  |       [Developed a new external REST API for customers who wanted to access their token | ||||||
|  |         data programmatically], // termination display (FE), external API for customers not using our platform (BE) | ||||||
|  |       [Wrote and audited smart contracts on the Solana blockchain to add claim fees to | ||||||
|  |         our token vesting platform], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Developer", | ||||||
|  |     "Immigr8", | ||||||
|  |     company_link: "https://immigr8now.com", | ||||||
|  |     start_date: "Jan 2024", | ||||||
|  |     end_date: "Apr 2024", | ||||||
|  |     location: "Remote", | ||||||
|  |     tools: "TypeScript, Spring Boot, React, Terraform, AWS", | ||||||
|  |     tasks: ( | ||||||
|  |       [Owned end-to-end development of a secure document vault for users to upload ID | ||||||
|  |         documents with S3 and Textract], | ||||||
|  |       [Championed and shipped features for *SOC 2 security compliance*, including | ||||||
|  |         *role-based permissions with JWTs* in Spring Boot, alert logging with | ||||||
|  |         CloudWatch, and strong privacy controls for user data], | ||||||
|  |       [Reduced dashboard load time by *38%* by implementing a stale-while-revalidate | ||||||
|  |         caching strategy], | ||||||
|  |       [Created a parallel *CI/CD system from scratch* with Terraform and Jenkins to | ||||||
|  |         automatically deploy AWS Lambdas], // BE-infra only, FE ver is admin dashboard | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Dropbase", | ||||||
|  |     company_link: "https://dropbase.io", | ||||||
|  |     start_date: "May 2023", | ||||||
|  |     end_date: "Aug 2023", | ||||||
|  |     location: "Remote", | ||||||
|  |     tools: "Python, TypeScript, React, AWS", | ||||||
|  |     tasks: ( | ||||||
|  |       [Shipped an *LSP server for our custom query DSL*, including user-specific | ||||||
|  |         autocomplete and syntax highlighting], | ||||||
|  |       [Architected a data query builder and executor engine for customers to visualise | ||||||
|  |         their data warehouses by custom-tailoring forms on-the-fly, supporting complex | ||||||
|  |         nested logic for 3000+ enterprise users across 8 database types], // | ||||||
|  |       [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( | ||||||
|  |     "Backend Developer", | ||||||
|  |     "Hack the North", | ||||||
|  |     company_link: "https://hackthenorth.com", | ||||||
|  |     start_date: "Mar 2023", | ||||||
|  |     end_date: "Oct 2024", | ||||||
|  |     location: "Waterloo, ON", | ||||||
|  |     tools: "TypeScript, Express, Postgres, Kubernetes", | ||||||
|  |     tasks: ( | ||||||
|  |       [Overhauled CI/CD pipelines, speeding up builds by *35%* by parallelising testing | ||||||
|  |         and type checking], | ||||||
|  |       [Introduced backend tracing with OpenTelemetry and Grafana to profile performance | ||||||
|  |         issues in production], | ||||||
|  |       [Resolved load spike crashes in prod by caching queries via *Redis* and | ||||||
|  |         horizontally scaling services on *Kubernetes*], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | = Projects | ||||||
|  | #set strong(delta: SMALL_STRONG) | ||||||
|  |  | ||||||
|  | #indent[ | ||||||
|  |   // #project( | ||||||
|  |   //   "Game Boy Advance Emulator", | ||||||
|  |   //   "Rust, SDL2, Vulkan", | ||||||
|  |   //   repo_link: "https://github.com/potatoeggy/gbarr", | ||||||
|  |   //   tasks: ( | ||||||
|  |   //     [Implemented an *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], | ||||||
|  |   //   ), | ||||||
|  |   // ) | ||||||
|  |  | ||||||
|  |   #project( | ||||||
|  |     "Mandown", | ||||||
|  |     "Python, Qt", | ||||||
|  |     repo_link: "https://github.com/potatoeggy/mandown", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created a CLI and GUI to scrape and convert webcomics into e-ink-optimised files | ||||||
|  |         with a *plugin-based architecture*], | ||||||
|  |       [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( | ||||||
|  |     "PNG Crawler", | ||||||
|  |     "C++", | ||||||
|  |     tasks: ( | ||||||
|  |       [Developed a web crawler and a custom PNG validator to download and parse PNGs | ||||||
|  |         from the internet with *libcurl*], | ||||||
|  |       [Optimised the crawler to download and process images concurrently with *POSIX | ||||||
|  |         threads* and curl_multi], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #project( | ||||||
|  |     "Arch Linux Server", | ||||||
|  |     "Linux, Docker, nginx, systemd", | ||||||
|  |     demo_link: "https://eggworld.me", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy | ||||||
|  |         personal projects behind *nginx*], // TODO | ||||||
|  |       [Managed services with *Docker* and *systemd* to simplify deployment and resource | ||||||
|  |         constrainment], // TODO | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   // #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( | ||||||
|  |   //   "Kobo Sync Server", | ||||||
|  |   //   "Rust, Axum", | ||||||
|  |   //   repo_link: "https://github.com/potatoeggy/kobink", | ||||||
|  |   //   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], | ||||||
|  |   //   ), | ||||||
|  |   // ) | ||||||
|  |  | ||||||
|  |   // #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 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*], | ||||||
|  |   //   ), | ||||||
|  |   // ) | ||||||
|  |  | ||||||
|  |   // #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 | ||||||
|  |  | ||||||
|  |   // #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 | ||||||
|  |   //   personal projects behind *nginx* | ||||||
|  |   // - Containerised services with *Docker* and *systemd* to simplify deployment and | ||||||
|  |   //   management | ||||||
|  | ] | ||||||
							
								
								
									
										193
									
								
								web_fullstack.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								web_fullstack.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | |||||||
|  |  | ||||||
|  | #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", | ||||||
|  |     start_date: "Sep 2022", | ||||||
|  |     end_date: "Apr 2027", | ||||||
|  |     location: "Waterloo, ON", | ||||||
|  |     tasks: ( | ||||||
|  |       [Extracurriculars: Hack the North Organising Team, UW Orbital Satellite Design | ||||||
|  |         Team, Creative Writing Club], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | #let skills = indent[ | ||||||
|  |   *Languages:* TypeScript/JavaScript, HTML/CSS, SQL, Python, Java, Rust \ | ||||||
|  |   // Dart | ||||||
|  |   *Technologies:* React, Vue, Next.js, Spring Boot, Express, Prisma, Apollo, | ||||||
|  |   GraphQL, Axum, Tailwind, Redux, SASS \ | ||||||
|  |   *Tools:* Linux, Git, Docker, Postgres, Jest, AWS/GCP, Kubernetes, Figma, | ||||||
|  |   Terraform // Jenkins, systemd, Jira | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | #show: doc => template_common(education, skills, doc) | ||||||
|  |  | ||||||
|  | = Experience | ||||||
|  |  | ||||||
|  | #indent[ | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Magna", | ||||||
|  |     company_link: "https://magna.so", | ||||||
|  |     start_date: "Sep 2024", | ||||||
|  |     end_date: "Dec 2024", | ||||||
|  |     location: "New York, NY", | ||||||
|  |     tools: "Rust, TypeScript, React, GraphQL, Figma", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created tooling to construct and deploy new customer landing portals based off | ||||||
|  |         of Figma designs with Vercel's API], | ||||||
|  |       [Developed a new external REST API for customers who wanted to access their token | ||||||
|  |         data programmatically], | ||||||
|  |       [Revamped error propagation to support returning multiple errors per request, | ||||||
|  |         reducing support tickets by *20%*], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Immigr8", | ||||||
|  |     company_link: "https://immigr8now.com", | ||||||
|  |     start_date: "Jan 2024", | ||||||
|  |     end_date: "Apr 2024", | ||||||
|  |     location: "Tampa, FL (Remote)", | ||||||
|  |     tools: "TypeScript, Spring Boot, React, Postgres, Terraform, AWS", | ||||||
|  |     tasks: ( | ||||||
|  |       [Owned end-to-end development of a secure document vault for users to upload ID | ||||||
|  |         documents with S3 and Textract], | ||||||
|  |       [Championed and shipped features for *SOC 2 security compliance*, including | ||||||
|  |         *role-based permissions with JWTs* in Spring Boot, alert logging with | ||||||
|  |         CloudWatch, and strong privacy controls for user data], | ||||||
|  |       [Reduced dashboard load time by 38% by implementing a stale-while-revalidate | ||||||
|  |         caching strategy], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   #work_entry( | ||||||
|  |     "Software Engineering Intern", | ||||||
|  |     "Dropbase", | ||||||
|  |     company_link: "https://dropbase.io", | ||||||
|  |     start_date: "May 2023", | ||||||
|  |     end_date: "Aug 2023", | ||||||
|  |     location: "San Francisco, CA (Remote)", | ||||||
|  |     tools: "TypeScript, Python, React, Postgres, AWS", | ||||||
|  |     tasks: ( | ||||||
|  |       [Architected a data query builder and executor engine for customers to visualise | ||||||
|  |         their data warehouses by custom-tailoring forms on-the-fly, supporting complex | ||||||
|  |         nested logic for 3000+ enterprise users across 8 database types], // | ||||||
|  |       [Shipped an LSP server for our custom query DSL, including customer-specific | ||||||
|  |         autocomplete and syntax highlighting], | ||||||
|  |       [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( | ||||||
|  |     "Backend Developer", | ||||||
|  |     "Hack the North", | ||||||
|  |     company_link: "https://hackthenorth.com", | ||||||
|  |     start_date: "Mar 2023", | ||||||
|  |     end_date: "Oct 2024", | ||||||
|  |     location: "Waterloo, ON", | ||||||
|  |     tools: "TypeScript, Express, Postgres, Kubernetes", | ||||||
|  |     tasks: ( | ||||||
|  |       [Built a new travel registration application leveraging GraphQL to track bus | ||||||
|  |         capacity for *500+* attendees in real time], | ||||||
|  |       [Streamlined event check-in times for *1900+* guests by generating scannable | ||||||
|  |         mobile wallet passes over Express], | ||||||
|  |       [Introduced tracing with OpenTelemetry and Grafana to profile performance issues | ||||||
|  |         in production], | ||||||
|  |       // [Upgraded the event statistics dashboard to update in real time with GraphQL | ||||||
|  |       //   *subscriptions with Redis PubSub*], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | = Projects | ||||||
|  | #set strong(delta: SMALL_STRONG) | ||||||
|  |  | ||||||
|  | #indent[ | ||||||
|  |   #project( | ||||||
|  |     "Mandown", | ||||||
|  |     "Python, Qt", | ||||||
|  |     repo_link: "https://github.com/potatoeggy/mandown", | ||||||
|  |     tasks: ( | ||||||
|  |       [Created a CLI and GUI to scrape, download, and convert webcomics into | ||||||
|  |         e-ink-optimised comic files], | ||||||
|  |       [Redesigned the ebook converter with a *plugin-based architecture* to increase | ||||||
|  |         accessibility for new contributors], | ||||||
|  |       [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( | ||||||
|  |   //   "Kobo Sync Server", | ||||||
|  |   //   "Rust, Axum", | ||||||
|  |   //   repo_link: "https://github.com/potatoeggy/kobink", | ||||||
|  |   //   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], | ||||||
|  |   //   ), | ||||||
|  |   // ) | ||||||
|  |  | ||||||
|  |   #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 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*], | ||||||
|  |     ), | ||||||
|  |   ) | ||||||
|  |  | ||||||
|  |   // #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 | ||||||
|  |  | ||||||
|  |   // #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 | ||||||
|  |   //   personal projects behind *nginx* | ||||||
|  |   // - Containerised services with *Docker* and *systemd* to simplify deployment and | ||||||
|  |   //   management | ||||||
|  | ] | ||||||
		Reference in New Issue
	
	Block a user