diff --git a/.envrc b/.envrc old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/src/assets/bash.svg b/src/assets/bash.svg old mode 100644 new mode 100755 diff --git a/src/assets/css.svg b/src/assets/css.svg old mode 100644 new mode 100755 diff --git a/src/assets/elm.svg b/src/assets/elm.svg old mode 100644 new mode 100755 diff --git a/src/assets/email.svg b/src/assets/email.svg old mode 100644 new mode 100755 diff --git a/src/assets/forgejo.svg b/src/assets/forgejo.svg old mode 100644 new mode 100755 diff --git a/src/assets/gitlab.svg b/src/assets/gitlab.svg old mode 100644 new mode 100755 diff --git a/src/assets/html.svg b/src/assets/html.svg old mode 100644 new mode 100755 diff --git a/src/assets/javascript.svg b/src/assets/javascript.svg old mode 100644 new mode 100755 diff --git a/src/assets/js.png b/src/assets/js.png old mode 100644 new mode 100755 diff --git a/src/assets/markdown.svg b/src/assets/markdown.svg old mode 100644 new mode 100755 diff --git a/src/assets/md.svg b/src/assets/md.svg old mode 100644 new mode 100755 diff --git a/src/assets/nix.svg b/src/assets/nix.svg old mode 100644 new mode 100755 diff --git a/src/assets/phone.svg b/src/assets/phone.svg old mode 100644 new mode 100755 diff --git a/src/assets/typescript.svg b/src/assets/typescript.svg old mode 100644 new mode 100755 diff --git a/src/assets/typst.png b/src/assets/typst.png old mode 100644 new mode 100755 diff --git a/src/assets/uproot.jpg b/src/assets/uproot.jpg new file mode 100644 index 0000000..77c82dd Binary files /dev/null and b/src/assets/uproot.jpg differ diff --git a/src/resume.pdf b/src/resume.pdf old mode 100644 new mode 100755 index fc59fcf..9446d1a Binary files a/src/resume.pdf and b/src/resume.pdf differ diff --git a/src/resume.typ b/src/resume.typ old mode 100644 new mode 100755 index 753e370..c9d6e4e --- a/src/resume.typ +++ b/src/resume.typ @@ -44,21 +44,25 @@ ) ], divider("ABOUT ME"), - 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."), + text()[I studied Human Nutritional Science at the #cite("https://umanitoba.ca/", "University of Manitoba"). Nutrition is my foremost passion, but I’ve also acquired a diverse range of skills and interests over the years that I pursue with persistence and enthusiasm. My interest in programming began after switching from Windows to #cite("https://nixos.org", "NixOS"), which requires configuration in Nix, a purely functional programming language. Since then, I’ve taught myself #cite("https://elm-lang.org/", "Elm") and #cite("https://typst.app/", "Typst") and am now learning #cite("https://www.haskell.org/", "Haskell") for the development of the #cite("https://uprootnutrition.com/nutridex", "nutriDex") app.], divider("EXPERIENCE"), job( - company: "upRootNutrition", - title: "Content Creator, Programmer", - dates: "2018 - Present", - location: "Winnipeg, MB", + title: "upRootNutrition", + position: "Content Creator, Programmer", + date: "2018 - Present", + lang: ( + "assets/uproot.jpg", + ), details: ( - "Developed evidence-based content related to nutrition science.", - "Conducted in-depth investigations into nutrition science for clients.", - "Mentored clients on research methodologies and interpretation." + "Developed evidence-based content related to health and nutrition sciences.", + "Conducted in-depth investigations into nutrition-related research questions for clients.", + "Mentored clients on nutrition science research methodologies and interpretation.", + [Managed a 2000+ member #cite("https://discord.gg/eeYQ2wJknS", "Discord") community for engagement and knowledge-sharing.], + [Curated and maintained a 2000+ reference nutrition literature #cite("https://obsidian.md", "Obsidian") vault.] ) ), divider("PROJECTS"), - project( + job( title: "upRootNutrition", entry: "https://source.uprootnutrition.com/upRootNutrition/website", lines: "35,650", @@ -72,9 +76,9 @@ "assets/nix.svg", "assets/markdown.svg" ), - 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." + description: [Developed the frontend for my online platform, #cite("https://upRootNutrition.com", "upRootNutrition"), primarily written in the Elm programming language, but also features JavaScript, CSS, and HTML. The project features modular configuration for pages, styling, and data handling. Records, helper functions, and Markdown parsing are organized to make adding new content trivially easy. The project also makes use of a #cite("https://github.com/numtide/devshell", "Devshell") and #cite("https://github.com/direnv/direnv", "Direnv") to create a declarative and reproducible development environment.] ), - project( + job( title: "NixOS Dotfiles", entry: "https://source.uprootnutrition.com/upRootNutrition/dotfiles", lines: "20,903", @@ -86,9 +90,9 @@ "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." + description: [Built a modular, multi-system NixOS configuration using #cite("https://nixos.wiki/wiki/Flakes", "Flakes") and #cite("https://nixos.wiki/wiki/Home_Manager", "Home Manager"), and designed many records and helper functions to streamline system and user setups. There are structured and expandable modules for machines, services, theming, and user profiles. Secrets are securely managed via #cite("https://github.com/Mic92/sops-nix", "sops-nix") and a hardware dongle for private keys. Flake #cite("https://nixos-unified.org/templates.html", "Templates") are used for quick bootstrapping in languages like Haskell and Elm.] ), - project( + job( title: "This Resume", entry: "https://source.uprootnutrition.com/upRootNutrition/resume", position: "Lead Developer", @@ -97,9 +101,9 @@ "assets/typst.png", "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.", + 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.", ), - project( + job( title: "Homelab", entry: "https://source.uprootnutrition.com/upRootNutrition/dotfiles/src/branch/main/modules/nixos/services", lines: "35,650", @@ -109,14 +113,14 @@ "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. + Developed and built a custom, NixOS-based homelab for managing and hosting multiple services, such as + #cite("https://github.com/dani-garcia/vaultwarden", "Vaultwarden"), + #cite("https://codeberg.org/forgejo/forgejo", "Forgejo"), + #cite("https://github.com/nextcloud/server", "Nextcloud"), + #cite("https://github.com/jellyfin/jellyfin", "Jellyfin"), + #cite("https://github.com/searxng/searxng", "SearXNG"), + #cite("https://github.com/ollama/ollama", "Ollama"), as well as the + #cite("https://uprootnutrition.com/", "upRootNutrition") website. The configuration features automated SSL certificate generation for HTTPS, and hosts services to the internet via reverse proxy with the #cite("https://caddyserver.com/", "Caddy") webserver. Currently, the homelab is a Ryzen 5 system with 32GB of RAM and 8TB of NAS storage. ] ), divider("PUBLICATIONS"), diff --git a/src/template.typ b/src/template.typ old mode 100644 new mode 100755 index fcaf6fa..1188774 --- a/src/template.typ +++ b/src/template.typ @@ -25,13 +25,17 @@ ) } -#let titlesize = 5pt +#let titlesize = 5.5pt #let titleColour = textDarkOrange #let subTitleColour = textDeepDarkOrange #let bodyColour = backgroundLightGrey #let linkColour = textLightOrange +#let cite(url, content) = { + link(url)[#text(fill: linkColour)[#content]] +} + #let contact(prefix: "", entry: "", display: "", icon: "") = { let url = prefix + entry grid( @@ -49,85 +53,94 @@ column-gutter: 1em, align: (horizon, horizon, horizon), curve( - stroke: (paint: gradient.linear(textLightOrange, textDarkOrange), thickness: 0.5pt), + stroke: (paint: gradient.linear(textLightOrange, textDarkOrange), thickness: 0.60pt), curve.move((0%, 0%)), + // curve.cubic((25%, 1.5%), (50%, -0.75%), (50%, 0%)), + // curve.cubic((50%, 0.75%), (75%, -0.75%), (100%, 0%)), curve.line((40%, 0%)), - // curve.cubic((44%, 2%), (48%, -2%), (55%, 0%)), curve.line((100%, 0%)) ), - text(size: 9pt, weight: "bold", fill: titleColour)[#title], + text(size: 7pt, weight: "bold", fill: titleColour)[#title], curve( - stroke: (paint: gradient.linear(textDarkOrange, textLightOrange), thickness: 0.5pt), + stroke: (paint: gradient.linear(textDarkOrange, textLightOrange), thickness: 0.60pt), curve.move((100%, 0%)), + // curve.cubic((75%, 1.5%), (50%, -0.75%), (50%, 0%)), + // curve.cubic((50%, 0.75%), (25%, -0.75%), (0%, 0%)), curve.line((60%, 0%)), - // curve.cubic((55%, -2%) (52%, 2%), (45%, 0%)), curve.line((0%, 0%)) ) ) ] } -#let job( - company: "", - title: "", - dates: "", - location: "", - details: () -) = { - block(spacing: 0.75em)[ - #stack( - spacing: 0.75em, - [#text(weight: "bold", size: titlesize, fill: titleColour)[#company]], - [ + + #let job( + title: none, + position: none, + entry: none, + lines: none, + date: none, + description: none, + lang: none, + details: none, + ) = { + if title != none { + let elements = () + + elements.push([ #grid( columns: (1fr, auto), - align(left)[#text(style: "italic", fill: textLightOrange)[#title]], - align(right)[#text(fill: textLightOrange)[#dates]] + align: (bottom, bottom), + { + if entry != none { + link(entry)[#text(weight: "bold", size: titlesize, fill: titleColour)[#title]] + } else { + text(weight: "bold", size: titlesize, fill: titleColour)[#title] + } + }, + if lang != none { + box(grid( + columns: (auto,) * lang.len(), + align: (right,) * lang.len(), + gutter: 2pt, + ..lang.map(icon => image(icon, height: 2em)) + )) + } ) - ], - [ - #pad(left: 1.5em)[ - #list(details.map(detail => [• #detail])) - ] - ] - ) - ] -} + ]) -#let project( - title: "", - position: "", - entry: "", - lines: "", - date: "", - description: "", - lang: (), -) = { - block(spacing: 0.75em)[ - #stack( - spacing: 0.75em, - [#grid( - columns: (1fr, auto), - 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: 2em)) + if position != none or date != none { + elements.push( + grid( + columns: (1fr, auto), + align: (bottom + left, bottom + right), + if position != none [#text(style: "italic", fill: textLightOrange)[#position]], + if date != none [#text(style: "italic", fill: textLightOrange)[#date]] + ) ) - ), - )], - [#grid( - columns: (1fr, auto), - align: (bottom + left, bottom + right), - [#text(style: "italic", fill: textLightOrange)[#position]], - [#text(style: "italic", fill: textLightOrange)[#date]] - ) - ], - [#text()[#description]] - ) - ] -} + } + + if description != none { + elements.push([#text()[#description]]) + } + + if details != none { + elements.push( + pad(left: 1.5em)[ + #list(details.map(detail => [• #detail])) + ] + ) + } + + if elements.len() > 0 { + block(spacing: 0.75em)[ + #stack( + spacing: 0.75em, + ..elements + ) + ] + } + } + } #let edu( institute: "",