diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a2454ef --- /dev/null +++ b/LICENSE @@ -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. diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..ee8276d --- /dev/null +++ b/flake.lock @@ -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 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..837bec2 --- /dev/null +++ b/flake.nix @@ -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/ + ''; + }; + + }; +} diff --git a/resume.nix b/resume.nix new file mode 100644 index 0000000..1396289 --- /dev/null +++ b/resume.nix @@ -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."; + }; + }; +}