diff --git a/backend_infra.typ b/backend_infra.typ index 8583d8c..109f3a0 100644 --- a/backend_infra.typ +++ b/backend_infra.typ @@ -9,8 +9,8 @@ end_date: "Apr 2027", location: "Waterloo, ON", tasks: ( - [Courses: Object-oriented programming, data structures & algorithms, digital - logic & circuits, operating systems], + // [Courses: Object-oriented programming, data structures & algorithms, concurrency, + // operating systems], [Extracurriculars: Hack the North Organising Team, UW Orbital Satellite Design Team, Creative Writing Club], ), @@ -20,9 +20,10 @@ #let skills = indent[ *Languages:* TypeScript/JavaScript, Rust, Python, Java, SQL, HTML/CSS \ // Dart - *Technologies:* Spring Boot, Express, Prisma, Apollo, Axum, GraphQL, React \ - *Tools:* Linux, Git, Docker, Postgres, Pytest, Jest, AWS/GCP, Kubernetes, - Terraform, Jenkins, nginx // Jenkins, systemd, Jira + *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) @@ -39,11 +40,12 @@ location: "New York, NY", tools: "Rust, TypeScript, Solidity, React, GraphQL", tasks: ( - [?? Portal claim config (db, FE, BE, how lucrative it is) padding padding - padding, automated deployments], - [?? Solana claim fees Wrote a Rust smart contract to add a fee for claiming - tokens on Solana], - [?? perf and databasest], + [Created an internal tool to spin up new custom Airdrop landing portals based off + of Figma designs with Vercel's API], + [Developed a new external REST API for customers who wanted to access our token + data programmatically], // termination display (FE), external API for customers not using our platform (BE) + [Wrote smart contracts for the Solana blockchain to add claim fees to our token + vesting platform], ), ) @@ -56,17 +58,15 @@ location: "Remote", tools: "TypeScript, Spring Boot, React, Postgres, Terraform, AWS", tasks: ( - // [Owned the creation of an end-to-end document vault feature in React for users to - // upload and verify identity documents with Textract, reducing support tickets by - // *25%*], - [Planned and executed a roadmap to *SOC 2 security compliance* by implementing - *role-based permissions with JWTs* in Spring Boot, logging alerts to CloudWatch, - and introducing new privacy controls for user data], - [?? be specific Investigated and improved initial load time by *80%* for tool - using async data fetching and optimising relations], - [?? make it clear that you deployed the entire setup, atm makes it seem like you - clicked some buttons Created CI/CD pipelines to automatically deploy AWS Lambdas - with Terraform and Jenkins], + [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 stronger privacy controls for user data], + [Reduced dashboard load time by 38% by implementing a stale-while-revalidate + caching strategy], + [Created a CI/CD system from scratch with Terraform and Jenkins to automatically + deploy AWS Lambdas], // BE-infra only, FE ver is admin dashboard ), ) @@ -79,13 +79,13 @@ location: "Remote", tools: "TypeScript, Python, React, Postgres, AWS", tasks: ( - [??? make it clearer what this is Engineered a new React data query builder and - FastAPI backend for our business intelligence visualisation service to *33000+* - users, eliminating the need for clients to manually write API calls], - [?? what is it Shipped a new database sync tool for *46000+* users by abstracting - data sources behind an adapter-based architecture and AWS Lambdas], - [?? data focus, new tool dDeveloped a *serverless microservice* that - asynchronously ingests email attachments directly into ETL pipelines], + [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], // TODO + [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*], @@ -93,7 +93,7 @@ ) #work_entry( - "Backend Developer", + "Backend / Infrastructure Developer", "Hack the North", company_link: "https://hackthenorth.com", start_date: "Mar 2023", @@ -101,15 +101,12 @@ 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], - [??? Apple wallet, mention it's a new feature], - [Diagnosed and recovered from crashes due to load spikes up to *800k* updates per - hour at the world's largest student-run hackathon by maintaining and autoscaling - Redis and Postgres on Kubernetes], - [??? CI/infra focus, deploying otel and traces], - // [Upgraded the event statistics dashboard to update in real time with GraphQL - // *subscriptions with Redis PubSub*], + [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], + [Resolved four production downtime incidents within 30 minutes of first report as + part of the on-call team], ), ) ] @@ -118,30 +115,31 @@ #set strong(delta: SMALL_STRONG) #indent[ - #project( - "Mandown Comic Downloader", + "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 PDF/EPUBs], - [Designed a scalable ebook converter with a *plugin-based architecture* to - improve compatibility], - [Implemented *image caching and multithreading* to increase download and update - speeds by *300%*], + 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", + "Kobink", "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], + [Built a backend to sync custom ebook files to Kobos by reverse-engineering and + mimicking the Kobo Sync API], ), ) @@ -184,12 +182,14 @@ // plan for each week #project( - "Arch Linux Server", + "Arch Linux Server (\"hwaboon\")", "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 + ), ) - - 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 ] \ No newline at end of file diff --git a/lib/lib.typ b/lib/lib.typ index 41df60f..87bffaa 100644 --- a/lib/lib.typ +++ b/lib/lib.typ @@ -7,7 +7,7 @@ #let HEADING_FONT = TITLE_FONT #let BODY_FONT = "Open Sans" -#let BODY_FONT_SIZE = 9.5pt +#let BODY_FONT_SIZE = 9.75pt #let HEADING_FONT_SIZE = 0.95em #let TITLE_FONT_SIZE = 2em @@ -18,6 +18,7 @@ #let DETAILS_TITLE_FONT_SIZE = 1.075em #let DETAILS_LIST_SPACING = 0.8em +#let DETAILS_LIST_INDENT = 1.5em // rest = not top #let PAGE_MARGINS = (right: 0.5in, top: 0.3in, left: 0.4in, bottom: 0.4in) @@ -47,6 +48,7 @@ }), { set strong(delta: SMALL_STRONG) + show link: underline list(tight: false, spacing: DETAILS_LIST_SPACING, marker: [•], ..details) }, ) @@ -116,7 +118,7 @@ // Set name and contact data and format headings #let template(name, color, doc) = { set page(margin: PAGE_MARGINS, paper: "us-letter") - set list(indent: 1em, marker: [•]) + 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)[