feat: add files

This commit is contained in:
Max Koon
2025-08-06 10:50:11 -04:00
parent c5cbf7307e
commit edb28680e6
4 changed files with 484 additions and 0 deletions

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Max Koon
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

27
flake.lock generated Normal file
View File

@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1752687322,
"narHash": "sha256-RKwfXA4OZROjBTQAl9WOZQFm7L8Bo93FQwSJpAiSRvo=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "6e987485eb2c77e5dcc5af4e3c70843711ef9251",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

283
flake.nix Normal file
View File

@@ -0,0 +1,283 @@
{
description = "A very basic flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
};
outputs = { self, nixpkgs }:
let
resume = import ./resume.nix;
vspace = "-8pt";
escapeLatex = s: builtins.replaceStrings
[ "\\" "{" "}" "$" "&" "%" "#" "_" "~" "^" ]
[ "\\textbackslash{}" "\\{" "\\}" "\\$" "\\&" "\\%" "\\#" "\\_" "\\textasciitilde{}" "\\textasciicircum{}" ]
s;
mkPersonal = personal:
''
\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}r}
\textbf{\href{https://${personal.website}}{\Large ${personal.name}}} & \href{https://${personal.website}}{${personal.website}}\\
\href{mailto:${personal.email}}{${personal.email}} & \href{https://${personal.github}}{${personal.github}}\\
\end{tabular*}
'';
mkItem = item:
''
\item\small{
{${item}}
}
'';
mkSectionChild = child:
''
\vspace{-2pt}\item
\begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
\textbf{${child.heading}} & ${child.location} \\
\textit{\small\parbox[t]{0.7\textwidth}{${(builtins.head child.children).subheading}}} & \textit{\small ${(builtins.head child.children).dates}} \\
\end{tabular*}\vspace{${vspace}}
\begin{itemize}
${builtins.concatStringsSep "\n" (map mkItem (builtins.head child.children).items)}
\end{itemize}\vspace{${vspace}}
${if builtins.length child.children > 1
then builtins.concatStringsSep "\n" (map (child: ''
\begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
\textit{\small ${child.subheading}} & \textit{\small ${child.dates}} \\
\end{tabular*}\vspace{${vspace}}
\begin{itemize}
${builtins.concatStringsSep "\n" (map mkItem child.items)}
\end{itemize}\vspace{${vspace}}
'') (builtins.tail child.children))
else ""}
'';
mkSection = section:
''
\section{${section.label}}
\begin{itemize}[leftmargin=*]
${builtins.concatStringsSep "\n" (map mkSectionChild section.children)}
\end{itemize}
'';
mkEducation = edu:
mkSection {
label = "Education";
children = map (item: {
heading = item.school;
location = item.location;
children = [
{
subheading = item.degree;
dates = item.dates;
items = [
(nixpkgs.lib.strings.concatStrings ["Involvement: " (builtins.concatStringsSep ", " item.organizations)])
];
}
];
}
) edu;
};
mkExperience = experience:
mkSection {
label = "Experience";
children = map (item: {
heading = item.company;
location = item.location;
children = map (role: {
subheading = role.title;
dates = role.dates;
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex role.work)));
}) item.roles;
}
) experience;
};
mkProjects = projects:
mkSection {
label = "Projects";
children = map (item: {
heading = item.name;
location = item.link;
children = [
{
subheading = item.subtext;
dates = item.dates;
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex item.description)));
}
];
}
) projects;
};
mkLeadership = leadership:
mkSection {
label = "Leadership Experience";
children = map (item: {
heading = item.name;
location = item.location;
children = [
{
subheading = item.role;
dates = item.dates;
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex item.description)));
}
];
}
) leadership;
};
mkAwards = awards:
mkSection {
label = "Honors and Awards";
children = map (item: {
heading = item.name;
location = item.location;
children = [
{
subheading = item.award;
dates = item.dates;
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex item.description)));
}
];
}
) awards;
};
mkSkills = skills:
''
\section{Skills and Interests}
\begin{itemize}[leftmargin=*]
${builtins.concatStringsSep "\n" (nixpkgs.lib.mapAttrsToList (key: val: ''
\item\small{
{\textbf{${key}} \vspace{-2pt}}
}{${val}}\vspace{-4pt}
'') skills)}
\end{itemize}
'';
texContent = ''
%-------------------------
% Resume in LateX
% Author : Max Koon
% License : MIT
%------------------------
\documentclass[letterpaper,11pt]{article}
\usepackage{latexsym}
\usepackage[empty]{fullpage}
\usepackage{titlesec}
\usepackage{marvosym}
\usepackage[usenames,dvipsnames]{color}
\usepackage{verbatim}
\usepackage{enumitem}
\usepackage[hidelinks]{hyperref}
\usepackage{fancyhdr}
\usepackage[english]{babel}
\usepackage{tabularx}
\input{glyphtounicode}
\usepackage{bookmark}
\pagestyle{fancy}
\fancyhf{} % Clear all header and footer fields
\fancyfoot{}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
% Adjust margins
\addtolength{\oddsidemargin}{-0.5in}
\addtolength{\evensidemargin}{-0.5in}
\addtolength{\textwidth}{1in}
\addtolength{\topmargin}{-.5in}
\addtolength{\textheight}{1.0in}
\urlstyle{same}
\raggedbottom
\raggedright
\setlength{\tabcolsep}{0in}
% Sections formatting
\titleformat{\section}{
\vspace{-4pt}\scshape\raggedright\large
}{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]
% Ensure that generate PDF is machine readable/ATS parsable
\pdfgentounicode=1
%-------------------------
\newcommand{\resumeSubItem}[2]{
}
\renewcommand{\labelitemii}{$\circ$}
%-------------------------------------------
%%%%%% CV STARTS HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
${mkPersonal resume.personal}
${if resume.education.enabled
then mkEducation resume.education.content
else ""}
${if resume.experience.enabled
then mkExperience resume.experience.content
else ""}
${if resume.projects.enabled
then mkProjects resume.projects.content
else ""}
${if resume.leadership.enabled
then mkLeadership resume.leadership.content
else ""}
${if resume.awards.enabled
then mkAwards resume.awards.content
else ""}
${if resume.skills.enabled
then mkSkills resume.skills.content
else ""}
%-------------------------------------------
\end{document}
'';
in {
defaultPackage.aarch64-linux =
with import nixpkgs { system = "aarch64-linux"; };
stdenv.mkDerivation {
name = "resume";
src = self;
nativeBuildInputs = [
texliveFull
];
buildPhase = ''
cat > resume.tex << 'EOF'
${texContent}
EOF
pdflatex resume.tex
'';
installPhase = ''
mkdir -p $out
cp resume.pdf $out/
'';
};
};
}

153
resume.nix Normal file
View File

@@ -0,0 +1,153 @@
{
personal = {
name = "Max Koon";
email = "max@koonindustries.com";
website = "max.koon.us";
github = "github.com/k2on";
};
education = {
enabled = true;
content = [
{
school = "Clemson University";
location = "Clemson, SC";
degree = "Bachelor of Science in Computer Science and Minor in Chinese";
dates = "Aug 2022 -- May 2026";
organizations = [
"Chi Psi Fraternity (Chaplain)"
"Campus Outreach (Student Leader)"
"Clemson Build (Co-Founder)"
"Chinese Language Club"
];
}
];
};
experience = {
enabled = true;
content = [
{
company = "RISMedia";
location = "Norwalk, CT";
roles = [
{
title = "Backend Engineer Intern";
dates = "Jun 2022 -- Aug 2025";
work = ''
Developed an internal PHP Laravel application for managing magazine subscribers. Developed a feature to detect duplicate subscribers, reducing unnecessary shipping by $5k+. Automated data entry from an external database, saving 10 hours a week.
Rewrote a 10 year old survey app into a modern Laravel application, giving editorial staff direct access. Created an interface for bulk question entry, which saved the company a month worth of time every year.
Developed a Wordpress plugin that automates the creation of 60+ pages, saving the company 2 weeks of time every year.
'';
}
];
}
{
company = "Elemental Cognition";
location = "Westport, CT";
roles = [
{
title = "Software Development Engineer in Test Intern";
dates = "Jun 2021 -- Aug 2022";
work = ''
Developed end-to-end Robot tests in Scala, to test the companys Vue application.
Worked on automating the running of the tests to run in the companies CI/CD pipeline, which standardized the testing environment and would test for regressions in every commit of the codebase.
'';
}
{
title = "Quality Assurance Intern";
dates = "Jun 2020 -- Aug 2020";
work = ''
Worked on the Quality Assurance team to test the companys mobile application for regressions.
Worked with TestFlight to test multiple versions the iOS builds.
'';
}
];
}
];
};
projects = {
enabled = true;
content = [
{
name = "Homelab";
link = "";
dates = "May 2025";
subtext = "Kubernetes in my bedroom";
description = ''
Built personal Kubernetes homelab on NixOS with declarative infrastructure configuration. (K3S, Longhorn, Cloudflare Tunnels)
Implemented GitOps workflow using FluxCD for automated service deployments.
Integrated SAML SSO for unified authentication across deployed services.
'';
}
{
name = "Fraternity Uber";
link = "github.com/k2on/elytrarides";
dates = "Feb 2023";
subtext = "Uber, but for getting to fraternity parties";
description = ''
Built a ride-sharing web app that replaced phone-based coordination with real-time driver tracking and ETA updates. (TypeScript, React, Next.js, Tailwind)
Increased driver safety through an iOS/Android app that automated reservation management, eliminating manual tracking while driving. (TypeScript, React Native, Expo)
Reduced average passenger wait times via intelligent driver-rider matching with real-time WebSocket updates. (Rust, GraphQL, PostgreSQL, Redis)
'';
}
{
name = "AtTheLib.com";
link = "github.com/k2on/atthelib.com";
dates = "Nov 2023";
subtext = "Easily find your friends AtTheLib";
description = ''
Built a web app that generates shareable links with library location previews using Open Graph image metadata.
Used by over hundreds of students every month.
'';
}
];
};
leadership = {
enabled = false;
content = [
{
name = "Chi Psi Fraternity";
location = "Clemson, SC";
dates = "Apr 2024 -- Present";
role = "Chaplain";
description = ''
Holds a weekly Bible study for the 62 members of the fraternity.
'';
}
{
name = "Clemson Build";
location = "Clemson, SC";
dates = "Apr 2023 -- Present";
role = "Co-founder";
description = ''
Co-founded Clemson build, a student lead club focused on connecting builders together.
Lead a weekly standup, which encouraged every member to present what they did last week, and what they are doing this week, in order to promote engagement across all the members.
'';
}
];
};
awards = {
enabled = false;
content = [
{
name = "'Hack for the People' Prize Winner";
location = "Clemson, SC";
dates = "Feb 2023";
award = "CUHackit Hackathon";
description = ''
Wrote the backend for CUFries, a website that combined all the different dining hall menus into a single screen to allow students to save time during their busy schedules.
'';
}
];
};
skills = {
enabled = true;
content = {
"Languages" = "Proficient in Chinese";
"Computer Skills" = "Typescript, Javascript, Rust, React, PHP, Python, proficient in Java, Go, C, C++, Lisp, Microsoft Office.";
"Interests" = "Bitcoin, Vim, Rubiks Cube.";
};
};
}