feat: add files
This commit is contained in:
21
LICENSE
Normal file
21
LICENSE
Normal 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
27
flake.lock
generated
Normal 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
283
flake.nix
Normal 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
153
resume.nix
Normal 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 company’s 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 company’s 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, Rubik’s Cube.";
|
||||
};
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user