diff --git a/src/assets/bash.svg b/src/assets/bash.svg index b3f3125..70c69fa 100644 --- a/src/assets/bash.svg +++ b/src/assets/bash.svg @@ -1,9 +1,14 @@ - + + - - - - + + + + + + + + - + \ No newline at end of file diff --git a/src/assets/css.svg b/src/assets/css.svg index c59d4da..ff5b6ce 100644 --- a/src/assets/css.svg +++ b/src/assets/css.svg @@ -1,6 +1 @@ - - CSS Logo - A purple square with rounded corners and the letters CSS inside in white - - - + \ No newline at end of file diff --git a/src/assets/elm.svg b/src/assets/elm.svg index 7d669f0..b875576 100644 --- a/src/assets/elm.svg +++ b/src/assets/elm.svg @@ -1,39 +1 @@ - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/assets/email.svg b/src/assets/email.svg index af49583..6fde1f6 100644 --- a/src/assets/email.svg +++ b/src/assets/email.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/gitlab.svg b/src/assets/gitlab.svg index 1aa6876..8591437 100644 --- a/src/assets/gitlab.svg +++ b/src/assets/gitlab.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/html.svg b/src/assets/html.svg index c62fabb..c2dda3a 100644 --- a/src/assets/html.svg +++ b/src/assets/html.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/javascript.svg b/src/assets/javascript.svg index 9650ca7..7975261 100644 --- a/src/assets/javascript.svg +++ b/src/assets/javascript.svg @@ -1,4 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/js.png b/src/assets/js.png new file mode 100644 index 0000000..7b5ffab Binary files /dev/null and b/src/assets/js.png differ diff --git a/src/assets/markdown.svg b/src/assets/markdown.svg new file mode 100644 index 0000000..8b385e3 --- /dev/null +++ b/src/assets/markdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/md.svg b/src/assets/md.svg new file mode 100644 index 0000000..0d0a31f --- /dev/null +++ b/src/assets/md.svg @@ -0,0 +1 @@ + diff --git a/src/assets/nix.svg b/src/assets/nix.svg index 2a065bc..fb26b80 100644 --- a/src/assets/nix.svg +++ b/src/assets/nix.svg @@ -1,187 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/assets/phone.svg b/src/assets/phone.svg index eb6c8c8..becff8c 100644 --- a/src/assets/phone.svg +++ b/src/assets/phone.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/typescript.svg b/src/assets/typescript.svg new file mode 100644 index 0000000..e1db5f1 --- /dev/null +++ b/src/assets/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/resume.pdf b/src/resume.pdf index cd828db..4cb054f 100644 Binary files a/src/resume.pdf and b/src/resume.pdf differ diff --git a/src/resume.typ b/src/resume.typ index cef202d..753e370 100644 --- a/src/resume.typ +++ b/src/resume.typ @@ -2,11 +2,12 @@ #set page( paper: "a6", - margin: (x: 0.5cm, y: 0.5cm), + margin: (x: 0.8cm, y: 0.8cm), ) #set text( font: "MonaspiceNe NF", - size: 5pt + size: 4pt, + fill: bodyColour ) #set par( justify: true, @@ -15,7 +16,7 @@ #chunk(( align(center)[ - #text(size: 10pt, weight: "bold")[NICK HIEBERT] + #text(size: 10pt, weight: "bold", fill: textDarkOrange)[NICK HIEBERT] ], align(center)[ #grid( @@ -43,7 +44,7 @@ ) ], divider("ABOUT ME"), - text("I am a former student of Human Nutritional Science at the University of Manitoba, and nutrition is my foremost passion. However, I have acquired a diverse range of skills and interests over the years that I pursue with persistence and enthusiasm. I discovered a love for programming when I switched from Windows to NixOS, an operating system that must be configured with the purely functional programming language, Nix. I have since taught myself Elm and Typst, and am currently working to gain proficiency with Haskell."), + text("I am a former student of the University of Manitoba, having studied Human Nutritional Science. Nutrition is my foremost passion, though I have acquired a diverse range of skills and interests over the years that I pursue with persistence and enthusiasm. I discovered a love for programming when I switched from Windows to NixOS, an operating system that must be configured with the purely functional programming language, Nix. I have since taught myself Elm and Typst, and am currently working to gain proficiency with Haskell."), divider("EXPERIENCE"), job( company: "upRootNutrition", @@ -51,9 +52,9 @@ dates: "2018 - Present", location: "Winnipeg, MB", details: ( - "Develop evidence-based content related to nutrition science.", - "Conduct in-depth investigations into nutrition science for clients.", - "Mentor clients on research methodologies and interpretation." + "Developed evidence-based content related to nutrition science.", + "Conducted in-depth investigations into nutrition science for clients.", + "Mentored clients on research methodologies and interpretation." ) ), divider("PROJECTS"), @@ -61,37 +62,69 @@ title: "upRootNutrition", entry: "https://source.uprootnutrition.com/upRootNutrition/website", lines: "35,650", + position: "Lead Developer", + date: "2024 - Present", lang: ( "assets/elm.svg", - "assets/javascript.svg", + "assets/typescript.svg", "assets/html.svg", "assets/css.svg", - "assets/nix.svg" + "assets/nix.svg", + "assets/markdown.svg" ), - description: "upRootNutrition is an open source project created by Nick Hiebert, designed to elevate the quality of nutrition science communication in online discourse. By applying more rigorous systems of reasoning, such as formal logic and semantic analysis, upRootNutrition aims to cut through the misinformation and sophistry that are endemic on social media." + description: "Developed upRootNutrition as the frontend for my online platform, primarily written in the Elm programming language, but also features Javascript, CSS, and HTML. modular configuration for pages, styling, and data handling. Organized records and helper functions for blog posts, debates, services, and donations. Designed reusable components like Markdown parsing, responsive elements, centralized style management. The project also makes use of Nix Devshells to create a declarative and reproducible development environment." ), project( title: "NixOS Dotfiles", entry: "https://source.uprootnutrition.com/upRootNutrition/dotfiles", lines: "20,903", + position: "Lead Developer", + date: "2022 - Present", lang: ( "assets/nix.svg", "assets/bash.svg", - "assets/css.svg",) + "assets/css.svg", + "assets/markdown.svg", + ), + description: "Developed a modular, multi-system NixOS configuration using flakes. Designed helper functions to streamline system and user setups, which makes adding and removing systems trivial. There are structured and expandable modules for machines, services, theming, user profiles, as well as declarative home management with Home Manager. Secrets are securely managed via sops-nix and a hardware dongle for private keys. Included in the flake are also project templates for quick bootstrapping in languages like Haskell and Elm." ), project( title: "This Resume", entry: "https://source.uprootnutrition.com/upRootNutrition/resume", + position: "Lead Developer", + date: "2025 - Present", lang: ( "assets/typst.png", - "assets/nix.svg") + "assets/nix.svg" + ), + description: "Developed a customizable resume template using Typst, a modern markup-based typesetting system with some functional programming features and encourages immutable state. The project features modular components for sections like education, work experience, and projects, with flexible styling options. The project is built with a Nix devshell for a reproducible development environment.", ), project( title: "Homelab", entry: "https://source.uprootnutrition.com/upRootNutrition/dotfiles/src/branch/main/modules/nixos/services", lines: "35,650", + position: "Lead Developer", + date: "2023 - Present", lang: ( - "assets/nix.svg",) + "assets/nix.svg", + ), + description: [ + Developed a NixOS-based homelab for managing and hosting multiple services, such as + #link("https://github.com/dani-garcia/vaultwarden", text(fill: linkColour)[Vaultwarden]), + #link("https://codeberg.org/forgejo/forgejo", text(fill: linkColour)[Forgejo]), + #link("https://github.com/nextcloud/server", text(fill: linkColour)[Nextcloud]), + #link("https://github.com/jellyfin/jellyfin", text(fill: linkColour)[Jellyfin]), + #link("https://github.com/searxng/searxng", text(fill: linkColour)[SearXNG]), + #link("https://github.com/ollama/ollama", text(fill: linkColour)[Ollama]), as well as the + #link("https://uprootnutrition.com/", text(fill: linkColour)[upRootNutrition website]). The Nix configuration features automated SSL certification generation for HTTPS, and hosts services to the internet from the Caddy webserver for reverse proxy. Currently the homelab is a Ryzen 5 system with 32GB of ram and 12TB of NAS storage. + ] + ), + divider("PUBLICATIONS"), + pub( + author: "Moore, Jeff M., et al.", + doi: "doi.org/10.1093/cdn/nzac043", + entry: "https://doi.org/10.1093/cdn/nzac043", + title: "‘Evidence for a Lean Mass Hyperresponder Phenotype Is Lacking with Increases in LDL Cholesterol of Clinical Significance in All Categories of Response to A-Restricted Diet’. Current Developments in Nutrition, vol. 6, no. 5, May 2022, p. nzac043." ), divider("EDUCATION"), list(( diff --git a/src/template.typ b/src/template.typ index 961f763..1a23503 100644 --- a/src/template.typ +++ b/src/template.typ @@ -1,6 +1,19 @@ +#let textLightGrey = rgb("#D4D4D4") +#let textDarkGrey = rgb("#7E7E7E") +#let textLightOrange = rgb("#CC6600") +#let textDarkOrange = rgb("#783C00") +#let textDeepDarkOrange = rgb("#3C1E00") +#let backgroundLightGrey = rgb("#282828") +#let backgroundDarkGrey = rgb("#1E1E1E") +#let backgroundDeepDarkGrey = rgb("#141414") +#let shadow = rgb("#0A0A0A") +#let barGreen = rgb("#006600") +#let barRed = rgb("#660000") +#let debugColour = rgb("#E31C79") + #let chunk(content) = { stack( - spacing: 1.5em, + spacing: 1em, ..content ) } @@ -12,29 +25,47 @@ ) } +#let titlesize = 5pt + +#let titleColour = textDarkOrange +#let subTitleColour = textDeepDarkOrange +#let bodyColour = backgroundLightGrey +#let linkColour = textLightOrange + #let contact(prefix: "", entry: "", display: "", icon: "") = { let url = prefix + entry grid( columns: (auto, auto), gutter: 0.2em, image(icon, height: 1em), - link(url)[#display] + link(url)[#text(fill: textLightOrange)[#display]] ) } #let divider(title) = { - pad(y: 0.5em)[ - #grid( - columns: (1fr, auto, 1fr), - column-gutter: 1em, - align: (horizon, horizon, horizon), - line(length: 100%, stroke: 0.5pt), - text(size: 8pt, weight: "bold")[#title], - line(length: 100%, stroke: 0.5pt) - ) - ] -} - + pad(y: 0.2em)[ + #grid( + columns: (1fr, auto, 1fr), + column-gutter: 1em, + align: (horizon, horizon, horizon), + curve( + stroke: (paint: gradient.linear(textLightOrange, textDarkOrange), thickness: 0.5pt), + curve.move((0%, 0%)), + curve.line((40%, 0%)), + // curve.cubic((44%, 2%), (48%, -2%), (55%, 0%)), + curve.line((100%, 0%)) + ), + text(size: 9pt, weight: "bold")[#title], + curve( + stroke: (paint: gradient.linear(textDarkOrange, textLightOrange), thickness: 0.5pt), + curve.move((100%, 0%)), + curve.line((60%, 0%)), + // curve.cubic((55%, -2%) (52%, 2%), (45%, 0%)), + curve.line((0%, 0%)) + ) + ) + ] + } #let job( company: "", title: "", @@ -45,14 +76,14 @@ block(spacing: 0.75em)[ #stack( spacing: 0.75em, + [#text(weight: "bold", size: titlesize, fill: titleColour)[#company]], [ #grid( columns: (1fr, auto), - align(left)[#text(weight: "bold")[#company, #location]], - align(right)[#text(style: "italic")[#title]] + align(left)[#text(style: "italic", fill: textLightOrange)[#title]], + align(right)[#text(fill: textLightOrange)[#dates]] ) ], - [#dates], [ #pad(left: 1.5em)[ #list(details.map(detail => [• #detail])) @@ -64,8 +95,10 @@ #let project( title: "", + position: "", entry: "", lines: "", + date: "", description: "", lang: (), ) = { @@ -74,15 +107,23 @@ spacing: 0.75em, [#grid( columns: (1fr, auto), - link(entry)[#text(weight: "bold")[#title]], + align: (bottom, bottom), + link(entry)[#text(weight: "bold", size: titlesize, fill: titleColour)[#title]], box(grid( columns: (auto,) * lang.len(), align: (right,) * lang.len(), gutter: 2pt, - ..lang.map(icon => image(icon, height: 1.5em)) + ..lang.map(icon => image(icon, height: 2em)) ) ), )], + [#grid( + columns: (1fr, auto), + align: (bottom + left, bottom + right), + [#text(style: "italic", fill: textLightOrange)[#position]], + [#text(style: "italic", fill: textLightOrange)[#date]] + ) + ], [#text()[#description]] ) ] @@ -96,13 +137,36 @@ block(spacing: 0.75em)[ #stack( spacing: 0.75em, + [ + #text(weight: "bold",size: titlesize, fill: titleColour)[#institute] + ], [ #grid( columns: (1fr, auto), - text(weight: "bold")[#institute], - text(style: "italic")[#cert, #year] + text(fill: textLightOrange)[#cert], + text(style: "italic", fill: textLightOrange)[#year] ) ] ) ] } + +#let pub( + author: "", + entry: "", + doi: "", + title: "" +) = { + block(spacing: 0.75em)[ + #stack( + spacing: 0.75em, + [ + #text(weight: "bold",size: titlesize, fill: titleColour)[#author] + #text(style: "italic", fill: backgroundLightGrey)[#title] + ], + [ + #link(entry)[#text(fill: textLightOrange)[#doi]] + ] + ) + ] +}