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