Compare commits
	
		
			65 Commits
		
	
	
		
			v2.1.13/f2
			...
			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 | 
							
								
								
									
										150
									
								
								Daniel Chen.typ
									
									
									
									
									
								
							
							
						
						
									
										150
									
								
								Daniel Chen.typ
									
									
									
									
									
								
							| @@ -1,150 +0,0 @@ | |||||||
| #import "fontawesome.typ": fa, globe, github, linkedin, envelope |  | ||||||
| #import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG |  | ||||||
|  |  | ||||||
| // orange!! |  | ||||||
| #let color = 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, contact_data, color, doc) |  | ||||||
|  |  | ||||||
| // MAIN CONTENT STARTS here |  | ||||||
|  |  | ||||||
| = Skills |  | ||||||
|  |  | ||||||
| #indent[ |  | ||||||
|   *Languages:* Python, TypeScript, JavaScript, Rust, SQL, MATLAB, C, C++, Java, |  | ||||||
|   HTML, CSS, Dart \ |  | ||||||
|   *Frameworks:* Node.js, Express, React, Next.js, Vue, Flutter, Qt, Prisma, |  | ||||||
|   Apollo, Axum, Jest, Pytest \ |  | ||||||
|   *Tools:* Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, Heroku, |  | ||||||
|   GraphQL, STM32 |  | ||||||
| ] |  | ||||||
|  |  | ||||||
| = Experience |  | ||||||
|  |  | ||||||
| #indent[ |  | ||||||
|   #show link: underline |  | ||||||
|   #work_entry( |  | ||||||
|     "Software Engineering Intern", |  | ||||||
|     "Dropbase", |  | ||||||
|     start_date: "May 2023", |  | ||||||
|     end_date: "Aug 2023", |  | ||||||
|     location: "Remote", |  | ||||||
|     tasks: ( |  | ||||||
|       [Engineered a database-specific *SQL IDE autocompletion tool* via a heuristic |  | ||||||
|         algorithm to validate queries], |  | ||||||
|       [Developed a service to sync HubSpot and Airtable data with Google Sheets via |  | ||||||
|         *AWS Lambda*], |  | ||||||
|       [Constructed dynamic forms in *react-hook-form* by generating questions from the |  | ||||||
|         backend on-the-fly], |  | ||||||
|       [Created testing infrastructure for the backend with *Pytest* to catch |  | ||||||
|         regressions across database engines], |  | ||||||
|     ), |  | ||||||
|   ) |  | ||||||
|  |  | ||||||
|   #work_entry( |  | ||||||
|     "Backend Developer", |  | ||||||
|     "Hack the North", |  | ||||||
|     start_date: "Mar 2023", |  | ||||||
|     end_date: "present", |  | ||||||
|     location: "Waterloo, ON", |  | ||||||
|     tasks: ( |  | ||||||
|       [Streamlined registration by dynamically generating *user-specific Apple Wallet |  | ||||||
|         passes* over *Apollo GraphQL*], |  | ||||||
|       [Horizontally scaled the *Node.js* server to handle *1000+ concurrent users* with |  | ||||||
|         *Redis* and *Kubernetes*], |  | ||||||
|       [Automated judging scheduling by creating a *greedy algorithm* to match judges to |  | ||||||
|         project themes], |  | ||||||
|       [Integrated *OpenTelemetry* and Grafana in a *Kubernetes* cluster to collect |  | ||||||
|         traces and improve observability], |  | ||||||
|     ), |  | ||||||
|   ) |  | ||||||
| ] |  | ||||||
|  |  | ||||||
| = Projects |  | ||||||
| #set strong(delta: SMALL_STRONG) |  | ||||||
|  |  | ||||||
| #indent[ |  | ||||||
|   #project( |  | ||||||
|     "Comic Downloader & Converter", |  | ||||||
|     "https://github.com/potatoeggy/mandown", |  | ||||||
|     "Python, Qt", |  | ||||||
|   ) |  | ||||||
|   - Created a CLI and GUI to scrape, download, and convert webcomics into |  | ||||||
|     e-ink-optimised ebooks (EPUB, PDF) |  | ||||||
|   - Designed an *intermediate representation* to store metadata and images as a |  | ||||||
|     standardised conversion target |  | ||||||
|   - 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( |  | ||||||
|     "Kobo Sync Server", |  | ||||||
|     "https://github.com/potatoeggy/kobink", |  | ||||||
|     "Rust, Axum", |  | ||||||
|   ) |  | ||||||
|   - Developed an Axum backend to *automatically convert and sync* ebooks to a Kobo |  | ||||||
|     eReader over the network |  | ||||||
|   - *Reverse-engineered* the Kobo eReader Sync API to support updating ebook |  | ||||||
|     metadata and covers |  | ||||||
|  |  | ||||||
|   #project( |  | ||||||
|     "Box Box Revolution", |  | ||||||
|     "https://github.com/potatoeggy/boxboxrevolution", |  | ||||||
|     "Rust, STM32", |  | ||||||
|   ) |  | ||||||
|   - Created a rhythm game to detect punches with an ultrasonic sensor in line wth |  | ||||||
|     notes of popular songs |  | ||||||
|   - Developed firmware to measure from an ultrasonic sensor, tone a buzzer, and show |  | ||||||
|     scrolling notes on an LCD |  | ||||||
|  |  | ||||||
|   #project("Arch Linux Server", none, "Linux, nginx, systemd") |  | ||||||
|   - Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy |  | ||||||
|     personal projects behind *nginx* |  | ||||||
|   - Set up *Jellyfin* for media streaming, a *Minecraft* server, *Calibre* for ebook |  | ||||||
|     syncing, and other services |  | ||||||
| ] |  | ||||||
|  |  | ||||||
| = Awards |  | ||||||
|  |  | ||||||
| #show link: underline |  | ||||||
|  |  | ||||||
| - Winner of the #link("https://github.com/anyuan-chen/resketch")[EdTech] prize at |  | ||||||
|   StormHacks 2022 from 350+ participants |  | ||||||
| - Winner of the #link("https://github.com/anyuan-chen/perdiem")[IBM Open Source] prize |  | ||||||
|   at YRHacks 2022 from 90+ participants |  | ||||||
|  |  | ||||||
| = 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], |  | ||||||
|     ), |  | ||||||
|   ) |  | ||||||
| ] |  | ||||||
							
								
								
									
										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 | ||||||
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,7 +1,17 @@ | |||||||
| # resume | # Resume | ||||||
|  |  | ||||||
| Release guidelines: | ## Requirements | ||||||
|  |  | ||||||
| - The major version represents the current academic year, e.g., both post-2A and 2B would be v2. | - Typst | ||||||
| - The minor version represents the current academic term, e.g., 2A would be v2.1. the x.0 releases are reserved for beta changes. | - Font: Bitter | ||||||
| - The patch version is incremented for any other reason. | - 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 | ||||||
|  |  | ||||||
|  | ] | ||||||
							
								
								
									
										136
									
								
								lib.typ
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								lib.typ
									
									
									
									
									
								
							| @@ -1,136 +0,0 @@ | |||||||
| #import "fontawesome.typ": github, fa |  | ||||||
|  |  | ||||||
| #let DEFAULT_STRONG = 300; |  | ||||||
| #let SMALL_STRONG = 200; |  | ||||||
|  |  | ||||||
| #let TITLE_FONT = "Bitter" |  | ||||||
| #let HEADING_FONT = TITLE_FONT |  | ||||||
| #let BODY_FONT = "Open Sans" |  | ||||||
|  |  | ||||||
| #let BODY_FONT_SIZE = 10pt |  | ||||||
| #let HEADING_FONT_SIZE = 1em |  | ||||||
| #let TITLE_FONT_SIZE = 2em |  | ||||||
|  |  | ||||||
| #let HEADING_LINE_GAP = 3mm |  | ||||||
| #let BODY_LINE_HEIGHT = 0.85em |  | ||||||
|  |  | ||||||
| // rest = not top |  | ||||||
| #let PAGE_MARGINS = (rest: 0.5in, top: 0.4in) |  | ||||||
|  |  | ||||||
| // 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.9em, |  | ||||||
|     grid(columns: (11fr, 6fr), column-gutter: 1cm, { |  | ||||||
|       set strong(delta: DEFAULT_STRONG) |  | ||||||
|       set align(left) |  | ||||||
|       left_content |  | ||||||
|     }, { |  | ||||||
|       set strong(delta: SMALL_STRONG) |  | ||||||
|       set align(right) |  | ||||||
|       right_content |  | ||||||
|     }), |  | ||||||
|     { |  | ||||||
|       set align(left) |  | ||||||
|       set strong(delta: SMALL_STRONG) |  | ||||||
|       details |  | ||||||
|     }, |  | ||||||
|   ) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 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: { |  | ||||||
|     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 { |  | ||||||
|       "\n" + format_location(location) |  | ||||||
|     } |  | ||||||
|   }, details: task_list) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #let project(title, repo_link, tools) = { |  | ||||||
|   set strong(delta: DEFAULT_STRONG) |  | ||||||
|   if repo_link != none { |  | ||||||
|     link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _ ] |  | ||||||
|   } else { |  | ||||||
|     text(1.1em)[*#title*] + [ | _ #tools _ ] |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Set name and contact data and format headings |  | ||||||
| #let template(name, contact_data, color, doc) = { |  | ||||||
|   set page(margin: PAGE_MARGINS, paper: "us-letter") |  | ||||||
|   set list(indent: 1.25em, 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) |  | ||||||
|     #{ |  | ||||||
|       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 + horizon) |  | ||||||
|     let title = smallcaps(i.body) |  | ||||||
|  |  | ||||||
|     let colored_line(header_text) = style(styles => { |  | ||||||
|       let size = measure(header_text, styles) |  | ||||||
|  |  | ||||||
|       // 100% - spacing - width of text |  | ||||||
|       line( |  | ||||||
|         length: 100% - HEADING_LINE_GAP - size.width, |  | ||||||
|         stroke: (paint: color, thickness: 2pt, cap: "round"), |  | ||||||
|       ) |  | ||||||
|     }) |  | ||||||
|  |  | ||||||
|     set block(above: 0.9em, below: 0.75em) |  | ||||||
|     set text(size: 1em, fill: color, font: HEADING_FONT) |  | ||||||
|     stack( |  | ||||||
|       dir: ltr, |  | ||||||
|       spacing: HEADING_LINE_GAP, |  | ||||||
|       title, |  | ||||||
|       box(height: 2pt, fill: color, colored_line(title)), |  | ||||||
|     ) |  | ||||||
|   } |  | ||||||
|   doc |  | ||||||
| } |  | ||||||
							
								
								
									
										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