diff --git a/flake.nix b/flake.nix index d0ddda0..3ba17f4 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,6 @@ system: let pkgs = import inputs.nixpkgs { inherit system; }; - inherit (pkgs) lib; typixLib = inputs.typix.lib.${system}; @@ -35,20 +34,12 @@ ''; }; - src = lib.fileset.toSource { - root = ./.; - fileset = lib.fileset.unions [ - (lib.fileset.fromSource (typixLib.cleanTypstSource ./.)) - ./src/info.toml - ]; - }; + src = typixLib.cleanTypstSource ./.; commonArgs = { typstSource = "src/main.typ"; typstOutput = "out/main.pdf"; - fontPaths = [ - "${pkgs.work-sans}/share/fonts/opentype" - ]; + fontPaths = [ ]; virtualPaths = [ ]; }; diff --git a/src/info.toml b/src/info.toml deleted file mode 100644 index a8816e4..0000000 --- a/src/info.toml +++ /dev/null @@ -1,13 +0,0 @@ -[personal] -name = "Felix Schröter" -title = "Senior Software Engineer & Tech Lead" -location = "Lüneburg, Germany" -email = "dev@felschr.com" -github = "github.com/felschr" -linkedin = "linkedin.com/in/schroeter" -website = "felschr.com" - -[layout] -font = "Work Sans" -paper = "a4" -accent_color = "#246a48" diff --git a/src/lib/main.typ b/src/lib/main.typ deleted file mode 100644 index 1743285..0000000 --- a/src/lib/main.typ +++ /dev/null @@ -1,333 +0,0 @@ -#import "@preview/scienceicons:0.0.6": ( - email-icon, - github-icon, - linkedin-icon, - orcid-icon, - website-icon, -) - -// based on https://github.com/stuxf/basic-typst-resume-template - -#let common-doc( - author: "", - font: "Work Sans", - paper: "a4", - accent-color: "#000000", - body, -) = { - // Sets document metadata - set document(author: author, title: author) - - // Document-wide formatting, including font and margins - set text( - // LaTeX style font - font: font, - size: 10pt, - lang: "en", - // Disable ligatures so ATS systems do not get confused when parsing fonts. - ligatures: false, - ) - - set page( - margin: 1.5cm, - paper: paper, - ) - - // Link styles - show link: underline - - - // Small caps for section titles - show heading.where(level: 2): it => [ - #pad(top: 0pt, bottom: -10pt, [#smallcaps(it.body)]) - #line(length: 100%, stroke: 1pt) - ] - - // Accent Color Styling - show heading: set text(fill: rgb(accent-color)) - - show link: set text(fill: rgb(accent-color)) - - // Name will be aligned left, bold and big - show heading.where(level: 1): it => [ - #set align(left) - #set text( - weight: 700, - size: 20pt, - ) - #pad(it.body) - ] - - body -} - -// Personal Info Helper -#let contact-item(value, icon: "", prefix: "", link-type: "") = { - if value != "" { - if icon != "" { - icon + " " - } - if link-type != "" { - link(link-type + value)[#(prefix + value)] - } else { - value - } - } -} - -// Personal Info -#let personal-info( - position: left, - with-icons: false, - separator: " | ", - pronouns: "", - phone: "", - location: "", - email: "", - github: "", - linkedin: "", - personal-site: "", - orcid: "", -) = { - pad( - top: 0.25em, - align(position)[ - #{ - let items = ( - contact-item(pronouns), - contact-item(phone), - contact-item(location), - contact-item( - email, - icon: if with-icons { email-icon() } else { "" }, - link-type: "mailto:", - ), - contact-item( - github, - icon: if with-icons { github-icon() } else { "" }, - link-type: "https://", - ), - contact-item( - linkedin, - icon: if with-icons { linkedin-icon() } else { "" }, - link-type: "https://", - ), - contact-item( - personal-site, - icon: if with-icons { website-icon() } else { "" }, - link-type: "https://", - ), - contact-item( - orcid, - icon: orcid-icon(color: rgb("#AECD54")), - prefix: "orcid.org/", - link-type: "https://orcid.org/", - ), - ) - items.filter(x => x != none).join(separator) - } - ], - ) -} - -#let resume( - author: "", - pronouns: "", - location: "", - email: "", - github: "", - linkedin: "", - phone: "", - personal-site: "", - orcid: "", - accent-color: "#000000", - font: "Work Sans", - paper: "a4", - body, -) = { - show: common-doc.with( - author: author, - font: font, - paper: paper, - accent-color: accent-color, - ) - - // Level 1 Heading - [= #(author)] - - personal-info( - position: left, - pronouns: pronouns, - location: location, - email: email, - phone: phone, - github: github, - linkedin: linkedin, - personal-site: personal-site, - orcid: orcid, - ) - - // Main body. - set par(justify: true) - - body -} - -#let cover-letter( - author: "", - title: "", - pronouns: "", - location: "", - email: "", - github: "", - linkedin: "", - phone: "", - personal-site: "", - orcid: "", - accent-color: "#000000", - font: "Work Sans", - paper: "a4", - body, -) = { - show: common-doc.with( - author: author, - font: font, - paper: paper, - accent-color: accent-color, - ) - - grid( - columns: (70%, auto), - [ - #[= #(author)] - #if (title != "") { - [#text(title, fill: rgb(accent-color), size: 12pt)] - } \ - #location - ], - personal-info( - with-icons: true, - position: left, - separator: "\n", - pronouns: pronouns, - email: email, - phone: phone, - github: github, - linkedin: linkedin, - personal-site: personal-site, - orcid: orcid, - ), - ) - - body -} - -// Generic two by two component for resume -#let generic-two-by-two( - top-left: "", - top-right: "", - bottom-left: "", - bottom-right: "", -) = { - [ - #top-left #h(1fr) #top-right \ - #bottom-left #h(1fr) #bottom-right - ] -} - -// Generic one by two component for resume -#let generic-one-by-two( - left: "", - right: "", -) = { - [ - #left #h(1fr) #right - ] -} - -// Cannot just use normal --- ligature becuase ligatures are disabled for good reasons -#let dates-helper( - start-date: "", - end-date: "", -) = { - start-date + " " + $dash.em$ + " " + end-date -} - -// Section components below -#let edu( - institution: "", - dates: "", - degree: "", - gpa: "", - location: "", -) = { - generic-two-by-two( - top-left: strong(institution), - top-right: location, - bottom-left: emph(degree), - bottom-right: emph(dates), - ) -} - -#let work( - title: "", - dates: "", - company: "", - location: "", -) = { - generic-two-by-two( - top-left: strong(title), - top-right: dates, - bottom-left: emph(company), - bottom-right: emph(location), - ) -} - -#let project( - role: "", - name: "", - url: "", - dates: "", -) = { - generic-one-by-two( - left: { - if role == "" { - [*#name* #if url != "" and dates != "" [ (#link("https://" + url)[#url])]] - } else { - [*#role*, #name #if url != "" and dates != "" [ (#link("https://" + url)[#url])]] - } - }, - right: { - if dates == "" and url != "" { - link("https://" + url)[#url] - } else { - dates - } - }, - ) -} - -#let certificates( - name: "", - issuer: "", - url: "", - date: "", -) = { - [ - *#name*, #issuer - #if url != "" { - [ (#link("https://" + url)[#url])] - } - #h(1fr) #date - ] -} - -#let extracurriculars( - activity: "", - dates: "", -) = { - generic-one-by-two( - left: strong(activity), - right: dates, - ) -} diff --git a/src/main.typ b/src/main.typ index 3c53e65..15ad7cc 100644 --- a/src/main.typ +++ b/src/main.typ @@ -1,17 +1,24 @@ -#import "lib/main.typ": * +#import "@preview/basic-resume:0.2.3": * -#let info = toml("info.toml") +#let name = "Felix Schröter" +#let location = "Lüneburg, Germany" +#let email = "dev@felschr.com" +#let github = "github.com/felschr" +#let linkedin = "linkedin.com/in/schroeter" +#let personal-site = "felschr.com" #show: resume.with( - author: info.personal.name, - location: info.personal.location, - email: info.personal.email, - github: info.personal.github, - linkedin: info.personal.linkedin, - personal-site: info.personal.website, - accent-color: info.layout.accent_color, - font: info.layout.font, - paper: info.layout.paper, + author: name, + location: location, + email: email, + github: github, + linkedin: linkedin, + personal-site: personal-site, + accent-color: "#26428b", + font: "New Computer Modern", + paper: "a4", + author-position: left, + personal-info-position: left, ) == Work Experience @@ -35,8 +42,8 @@ - Full-Stack Architecture, Development, Infrastructure & DevOps for Cloud-native solutions - Main technologies: C\#, Rust, Nix, Kubernetes, Terraform / OpenTofu, React, MongoDB, GitLab CI, GCP - Adopted Nix for reproducible builds & environments used both locally for development and for CI/CD -- Expanded Observability using Sentry and integrations with Rust, C\#, React & Kubernetes -- Adopted Rust into our tech stack due to its strong type system, excellent tooling, safety & performance +- Expanded Observability using Sentry and integrations with Rust, C\#, React & Google Kubernetes Engine (GKE) +- Adopted Rust as core part of our tech stack due to its strong type system, excellent tooling, safety & performance - Established reference architecture using Rust, Google Cloud Run, MongoDB Atlas, Nix & GitLab CI with scalability and evolution from monolith to microservices in mind #work( @@ -58,7 +65,7 @@ - Main technologies: C\#, ASP.NET Core, TypeScript, Service Fabric, Cosmos DB, Azure, AWS - Created a microservice-based backend with ASP.NET Core & Azure Cosmos DB - Implemented frontends in React & Angular for different projects -- Built serverless backends for various client projects with AWS Lambda & Serverless framework +- Built serverless backends for various client projects with AWS Lambda, DynamoDB & Serverless framework - Migrated Windows containers to Linux containers to improve performance - Migrated from Azure Service Fabric to Kubernetes for container orchestration @@ -86,8 +93,7 @@ dates: dates-helper(start-date: "May 2024", end-date: "Present"), degree: "Master of Science in Computer Science", ) -- Current GPA: 4.0 / 4.0 (14 credits) -- Relevant Courses: Data Structures and Algorithms, Software Architecture for Big Data, Network Systems +- Relevant Coursework: Data Structures and Algorithms, Software Architecture for Big Data, Network Systems #edu( institution: "Berufsbildende Schulen I Lüneburg", @@ -104,7 +110,7 @@ url: "codeberg.org/felschr/nixos-config", ) - Maintaining my personal & work computers as well as a homelab via a declarative NixOS configuration -- I self-host various services for single sign-on (SSO), home automation, git forge, build server & more +- I self-host various services for single sign-On (SSO), home automation, git forge, build server & more #project( name: "Pheno-Inspect Plant Analyzer Web", @@ -112,7 +118,7 @@ url: "youtu.be/JMkj8vP0eJw", ) - Client project associated with upsquared GmbH -- Developed web-based frontend for Digital Phenotyping platform powered by Computer Vision +- Developed a web-based frontend for Pheno-Inspect's Digital Phenotyping platform powered by Computer Vision - Large drone images can be rendered & annotated efficiently with pixel-perfect accuracy - Main technologies: Next.js, Redux, MUI, fp-ts, OpenLayers, Rust (WASM), WebGL @@ -144,7 +150,7 @@ dates: dates-helper(start-date: "Nov 2018", end-date: "Aug 2019"), // url: "web.archive.org/web/20191021030141/https://www.letzte-werbung.de/melder", ) -- Allows users to report companies that send mail advertising despite "No advertising" sticker on mailbox +- Allows users to report companies that send mail advertising despite a "No advertising please" sticker on the mailbox - Main technologies: TypeScript, Node.js, React, AWS Lambda, Serverless framework, DynamoDB #project( @@ -198,7 +204,7 @@ - *Industry Knowledge*: Software Architecture, Cloud-native Architecture, DevOps, Infrastructure as Code (IaC), Reproducibility, Scalability, Functional Programming, Open Source Development - *Programming Languages*: Rust, Nix, TypeScript, C\#, HCL, Bash, Nushell -- *Backend*: Podman, gRPC, MongoDB, OpenAPI, GraphQL, buf, tokio, tonic, prost, axum, ASP.NET Core +- *Backend*: Podman, Docker, gRPC, MongoDB, OpenAPI, GraphQL, buf, tokio, tonic, prost, axum, ASP.NET Core - *Frontend*: React, Next.js, Redux, emotion, MUI, storybook, webpack, fp-ts - *Infrastructure & DevOps*: Kubernetes, OpenTofu, GitLab CI, Linux, direnv, treefmt, git-hooks.nix - *Cloud Providers*: Google Cloud Platform (GCP), Firebase, Amazon Web Services (AWS), Azure