feat: 2025-03-25

This commit is contained in:
Nick 2025-03-25 15:34:39 -05:00
parent 6d13bed2f9
commit bfb20a43c2
21 changed files with 103 additions and 86 deletions

0
.envrc Normal file → Executable file
View file

0
.gitignore vendored Normal file → Executable file
View file

0
src/assets/bash.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

0
src/assets/css.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 778 B

After

Width:  |  Height:  |  Size: 778 B

Before After
Before After

0
src/assets/elm.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 519 B

After

Width:  |  Height:  |  Size: 519 B

Before After
Before After

0
src/assets/email.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 625 B

After

Width:  |  Height:  |  Size: 625 B

Before After
Before After

0
src/assets/forgejo.svg Normal file → Executable file
View file

0
src/assets/gitlab.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 888 B

After

Width:  |  Height:  |  Size: 888 B

Before After
Before After

0
src/assets/html.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 607 B

After

Width:  |  Height:  |  Size: 607 B

Before After
Before After

0
src/assets/javascript.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

0
src/assets/js.png Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

0
src/assets/markdown.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 381 B

After

Width:  |  Height:  |  Size: 381 B

Before After
Before After

0
src/assets/md.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

0
src/assets/nix.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 934 B

After

Width:  |  Height:  |  Size: 934 B

Before After
Before After

0
src/assets/phone.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 620 B

After

Width:  |  Height:  |  Size: 620 B

Before After
Before After

0
src/assets/typescript.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 943 B

After

Width:  |  Height:  |  Size: 943 B

Before After
Before After

0
src/assets/typst.png Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before After
Before After

BIN
src/assets/uproot.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
src/resume.pdf Normal file → Executable file

Binary file not shown.

50
src/resume.typ Normal file → Executable file
View file

@ -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 Ive 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, Ive 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"),

121
src/template.typ Normal file → Executable file
View file

@ -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]]
)
],
[
#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]],
{
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))
))
}
)
),
)],
[#grid(
])
if position != none or date != none {
elements.push(
grid(
columns: (1fr, auto),
align: (bottom + left, bottom + right),
[#text(style: "italic", fill: textLightOrange)[#position]],
[#text(style: "italic", fill: textLightOrange)[#date]]
if position != none [#text(style: "italic", fill: textLightOrange)[#position]],
if date != none [#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: "",