Compare commits
5 commits
e2ff82b759
...
3514071ef3
| Author | SHA1 | Date | |
|---|---|---|---|
| 3514071ef3 | |||
| 08348908f5 | |||
| 22b73648d5 | |||
| 8f783151ef | |||
| 7934af3ad8 |
4 changed files with 377 additions and 28 deletions
13
flake.nix
13
flake.nix
|
|
@ -20,6 +20,7 @@
|
||||||
system:
|
system:
|
||||||
let
|
let
|
||||||
pkgs = import inputs.nixpkgs { inherit system; };
|
pkgs = import inputs.nixpkgs { inherit system; };
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
|
||||||
typixLib = inputs.typix.lib.${system};
|
typixLib = inputs.typix.lib.${system};
|
||||||
|
|
||||||
|
|
@ -34,12 +35,20 @@
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
src = typixLib.cleanTypstSource ./.;
|
src = lib.fileset.toSource {
|
||||||
|
root = ./.;
|
||||||
|
fileset = lib.fileset.unions [
|
||||||
|
(lib.fileset.fromSource (typixLib.cleanTypstSource ./.))
|
||||||
|
./src/info.toml
|
||||||
|
];
|
||||||
|
};
|
||||||
commonArgs = {
|
commonArgs = {
|
||||||
typstSource = "src/main.typ";
|
typstSource = "src/main.typ";
|
||||||
typstOutput = "out/main.pdf";
|
typstOutput = "out/main.pdf";
|
||||||
|
|
||||||
fontPaths = [ ];
|
fontPaths = [
|
||||||
|
"${pkgs.work-sans}/share/fonts/opentype"
|
||||||
|
];
|
||||||
|
|
||||||
virtualPaths = [ ];
|
virtualPaths = [ ];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
13
src/info.toml
Normal file
13
src/info.toml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
[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"
|
||||||
333
src/lib/main.typ
Normal file
333
src/lib/main.typ
Normal file
|
|
@ -0,0 +1,333 @@
|
||||||
|
#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,
|
||||||
|
)
|
||||||
|
}
|
||||||
46
src/main.typ
46
src/main.typ
|
|
@ -1,24 +1,17 @@
|
||||||
#import "@preview/basic-resume:0.2.3": *
|
#import "lib/main.typ": *
|
||||||
|
|
||||||
#let name = "Felix Schröter"
|
#let info = toml("info.toml")
|
||||||
#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(
|
#show: resume.with(
|
||||||
author: name,
|
author: info.personal.name,
|
||||||
location: location,
|
location: info.personal.location,
|
||||||
email: email,
|
email: info.personal.email,
|
||||||
github: github,
|
github: info.personal.github,
|
||||||
linkedin: linkedin,
|
linkedin: info.personal.linkedin,
|
||||||
personal-site: personal-site,
|
personal-site: info.personal.website,
|
||||||
accent-color: "#26428b",
|
accent-color: info.layout.accent_color,
|
||||||
font: "New Computer Modern",
|
font: info.layout.font,
|
||||||
paper: "a4",
|
paper: info.layout.paper,
|
||||||
author-position: left,
|
|
||||||
personal-info-position: left,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
== Work Experience
|
== Work Experience
|
||||||
|
|
@ -42,8 +35,8 @@
|
||||||
- Full-Stack Architecture, Development, Infrastructure & DevOps for Cloud-native solutions
|
- Full-Stack Architecture, Development, Infrastructure & DevOps for Cloud-native solutions
|
||||||
- Main technologies: C\#, Rust, Nix, Kubernetes, Terraform / OpenTofu, React, MongoDB, GitLab CI, GCP
|
- 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
|
- 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 & Google Kubernetes Engine (GKE)
|
- Expanded Observability using Sentry and integrations with Rust, C\#, React & Kubernetes
|
||||||
- Adopted Rust as core part of our tech stack due to its strong type system, excellent tooling, safety & performance
|
- Adopted Rust into 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
|
- Established reference architecture using Rust, Google Cloud Run, MongoDB Atlas, Nix & GitLab CI with scalability and evolution from monolith to microservices in mind
|
||||||
|
|
||||||
#work(
|
#work(
|
||||||
|
|
@ -65,7 +58,7 @@
|
||||||
- Main technologies: C\#, ASP.NET Core, TypeScript, Service Fabric, Cosmos DB, Azure, AWS
|
- 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
|
- Created a microservice-based backend with ASP.NET Core & Azure Cosmos DB
|
||||||
- Implemented frontends in React & Angular for different projects
|
- Implemented frontends in React & Angular for different projects
|
||||||
- Built serverless backends for various client projects with AWS Lambda, DynamoDB & Serverless framework
|
- Built serverless backends for various client projects with AWS Lambda & Serverless framework
|
||||||
- Migrated Windows containers to Linux containers to improve performance
|
- Migrated Windows containers to Linux containers to improve performance
|
||||||
- Migrated from Azure Service Fabric to Kubernetes for container orchestration
|
- Migrated from Azure Service Fabric to Kubernetes for container orchestration
|
||||||
|
|
||||||
|
|
@ -93,7 +86,8 @@
|
||||||
dates: dates-helper(start-date: "May 2024", end-date: "Present"),
|
dates: dates-helper(start-date: "May 2024", end-date: "Present"),
|
||||||
degree: "Master of Science in Computer Science",
|
degree: "Master of Science in Computer Science",
|
||||||
)
|
)
|
||||||
- Relevant Coursework: Data Structures and Algorithms, Software Architecture for Big Data, Network Systems
|
- Current GPA: 4.0 / 4.0 (14 credits)
|
||||||
|
- Relevant Courses: Data Structures and Algorithms, Software Architecture for Big Data, Network Systems
|
||||||
|
|
||||||
#edu(
|
#edu(
|
||||||
institution: "Berufsbildende Schulen I Lüneburg",
|
institution: "Berufsbildende Schulen I Lüneburg",
|
||||||
|
|
@ -110,7 +104,7 @@
|
||||||
url: "codeberg.org/felschr/nixos-config",
|
url: "codeberg.org/felschr/nixos-config",
|
||||||
)
|
)
|
||||||
- Maintaining my personal & work computers as well as a homelab via a declarative NixOS configuration
|
- 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(
|
#project(
|
||||||
name: "Pheno-Inspect Plant Analyzer Web",
|
name: "Pheno-Inspect Plant Analyzer Web",
|
||||||
|
|
@ -118,7 +112,7 @@
|
||||||
url: "youtu.be/JMkj8vP0eJw",
|
url: "youtu.be/JMkj8vP0eJw",
|
||||||
)
|
)
|
||||||
- Client project associated with upsquared GmbH
|
- Client project associated with upsquared GmbH
|
||||||
- Developed a web-based frontend for Pheno-Inspect's Digital Phenotyping platform powered by Computer Vision
|
- Developed web-based frontend for Digital Phenotyping platform powered by Computer Vision
|
||||||
- Large drone images can be rendered & annotated efficiently with pixel-perfect accuracy
|
- Large drone images can be rendered & annotated efficiently with pixel-perfect accuracy
|
||||||
- Main technologies: Next.js, Redux, MUI, fp-ts, OpenLayers, Rust (WASM), WebGL
|
- Main technologies: Next.js, Redux, MUI, fp-ts, OpenLayers, Rust (WASM), WebGL
|
||||||
|
|
||||||
|
|
@ -150,7 +144,7 @@
|
||||||
dates: dates-helper(start-date: "Nov 2018", end-date: "Aug 2019"),
|
dates: dates-helper(start-date: "Nov 2018", end-date: "Aug 2019"),
|
||||||
// url: "web.archive.org/web/20191021030141/https://www.letzte-werbung.de/melder",
|
// url: "web.archive.org/web/20191021030141/https://www.letzte-werbung.de/melder",
|
||||||
)
|
)
|
||||||
- Allows users to report companies that send mail advertising despite a "No advertising please" sticker on the mailbox
|
- Allows users to report companies that send mail advertising despite "No advertising" sticker on mailbox
|
||||||
- Main technologies: TypeScript, Node.js, React, AWS Lambda, Serverless framework, DynamoDB
|
- Main technologies: TypeScript, Node.js, React, AWS Lambda, Serverless framework, DynamoDB
|
||||||
|
|
||||||
#project(
|
#project(
|
||||||
|
|
@ -204,7 +198,7 @@
|
||||||
|
|
||||||
- *Industry Knowledge*: Software Architecture, Cloud-native Architecture, DevOps, Infrastructure as Code (IaC), Reproducibility, Scalability, Functional Programming, Open Source Development
|
- *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
|
- *Programming Languages*: Rust, Nix, TypeScript, C\#, HCL, Bash, Nushell
|
||||||
- *Backend*: Podman, Docker, gRPC, MongoDB, OpenAPI, GraphQL, buf, tokio, tonic, prost, axum, ASP.NET Core
|
- *Backend*: Podman, gRPC, MongoDB, OpenAPI, GraphQL, buf, tokio, tonic, prost, axum, ASP.NET Core
|
||||||
- *Frontend*: React, Next.js, Redux, emotion, MUI, storybook, webpack, fp-ts
|
- *Frontend*: React, Next.js, Redux, emotion, MUI, storybook, webpack, fp-ts
|
||||||
- *Infrastructure & DevOps*: Kubernetes, OpenTofu, GitLab CI, Linux, direnv, treefmt, git-hooks.nix
|
- *Infrastructure & DevOps*: Kubernetes, OpenTofu, GitLab CI, Linux, direnv, treefmt, git-hooks.nix
|
||||||
- *Cloud Providers*: Google Cloud Platform (GCP), Firebase, Amazon Web Services (AWS), Azure
|
- *Cloud Providers*: Google Cloud Platform (GCP), Firebase, Amazon Web Services (AWS), Azure
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue