diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 32195f6..48ed428 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,17 +1,30 @@ -name: Build LaTeX document -on: [push] +name: Build Typst document +on: [push, workflow_dispatch] + +permissions: + contents: write + jobs: - build_latex: + build_typst_documents: runs-on: ubuntu-latest steps: - - name: Set up Git repository - uses: actions/checkout@v4 - - name: Compile LaTeX document - uses: xu-cheng/latex-action@v3 + - name: Checkout + uses: actions/checkout@v3 + - name: Typst + uses: lvignoli/typst-action@main with: - root_file: cv.tex + source_file: cv.typ - name: Upload PDF file uses: actions/upload-artifact@v4 with: - name: PDF + name: CV.pdf path: cv.pdf + - name: Get current date + id: date + run: echo "DATE=$(date +%Y-%m-%d-%H:%M)" >> $GITHUB_ENV + - name: Release + uses: softprops/action-gh-release@v1 + if: github.ref_type == 'tag' + with: + name: "${{ github.ref_name }} — ${{ env.DATE }}" + files: cv.pdf diff --git a/README.md b/README.md index 8b25c81..bd8da63 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # CV -CV written in LaTeX, compiled using github action. +CV written in Typst, compiled using github action. diff --git a/cv.pdf b/cv.pdf index 3cb7aff..dc75015 100644 Binary files a/cv.pdf and b/cv.pdf differ diff --git a/cv.tex b/cv.tex deleted file mode 100644 index 50c6f15..0000000 --- a/cv.tex +++ /dev/null @@ -1,181 +0,0 @@ -\documentclass[11pt,letterpaper]{article} -\usepackage[letterpaper,margin=0.5in]{geometry} -\usepackage[utf8]{inputenc} -\usepackage{mdwlist} -\usepackage[default]{lato} -\usepackage[T1]{fontenc} -\usepackage{textcomp} -\usepackage{fontawesome} -\usepackage{enumitem} - - -\DeclareFontFamily{U}{fontawesomeOne}{} -\DeclareFontShape{U}{fontawesomeOne}{m}{n} -{<-> FontAwesome--fontawesomeone}{} -\DeclareRobustCommand\FAone{\fontencoding{U}\fontfamily{fontawesomeOne}\selectfont} -\pagestyle{empty} -\setlength{\tabcolsep}{0em} - -% indentsection style, used for sections that aren't already in lists -% that need indentation to the level of all text in the document -\newenvironment{indentsection}[1]% -{\begin{list}{}% -{\setlength{\leftmargin}{#1}}% - \item[] -} -{\end{list}} - -% opposite of above; bump a section back toward the left margin -\newenvironment{unindentsection}[1]% -{\begin{list}{}% -{\setlength{\leftmargin}{-0.5#1}}% -\item[]% -} -{\end{list}} - -% format two pieces of text, one left aligned and one right aligned -\newcommand{\headerrow}[2] -{\begin{tabular*}{\linewidth}{l@{\extracolsep{\fill}}r} -#1 & -#2 \\ -\end{tabular*}} - - -% and the actual content starts here -\begin{document} - -\begin{center} - {\LARGE \textbf{Rob Hand}}\\ - London, United Kingdom - \vspace{0.05cm} - \\ - \raisebox{-0.2\height} {\Large \faPhoneSquare} \ \ +44 7402 232095 \hfill\raisebox{-0.2\height}{\Large \faEnvelopeSquare} \ \ rob.h.1988@gmail.com \hfill \raisebox{-0.2\height}{\Large \faGithubSquare} \ \ github.com/Sinon \hfill \raisebox{-0.2\height}{\Large \faLinkedinSquare} \ \ linkedin.com/in/robhand -\end{center} - -\hrule -\vspace{-1em} -\subsection*{\Large Experience} - -\renewcommand\labelitemi{} -\renewcommand\labelitemii{$\bullet$} -\begin{itemize}[leftmargin=1em] - \parskip=0.1em - - \item - \headerrow - {\textbf{Marks \& Spencer}} - {\textbf{London, UK}} - \headerrow - {\emph{Staff Software Engineer}} - {\emph{June 2023 -- Present}} - \begin{itemize*} - \item Led the design and implementation of tooling for managing multi-channel marketing campaigns on M\&S. - \item Delivered a program of work to modernise the services our team was responsible for. - Leading to increased stability and fewer bugs escaping to user-facing environments. - \item Rebuilding our content personalisation service to work within a GraphQL Federated system design. - \end{itemize*} - {\emph{\textbf{Technology:} aiohttp, Kafka, GraphQL, FastAPI, Azure, MongoDB, Terraform}} - - \item - \headerrow - {\textbf{Globality}} - {\textbf{London, UK}} - \headerrow - {\emph{Engineering Manager / Tech Lead}} - {\emph{March 2022 -- May 2023}} - \begin{itemize*} - \item Leading a team of 7 engineers. - Responsible for their mentorship, growth, performance evaluation and job satisfaction. - \item Delivered various complex projects on time and to a high quality. - \item Led continuous process improvement, optimising for impact \& delivery. - To this end I successfully moved the team to a Kanban based system which improved project delivery time \& quality. - \item Collaborated with the engineering leadership group to deliver department-wide process improvements. - \end{itemize*} - - \headerrow - {\emph{Staff Software Engineer / Tech Lead}} - {\emph{March 2021 -- March 2022}} - \begin{itemize*} - \item Drove the implementation and adoption of improved error reporting and observability tooling across the organization, - which reduced notification times from days to minutes and enabled engineers to pro-actively resolve errors. - \item Led the architectural design and implementation of a feature to bulk export - all supporting documentation for a given project, - turning a manual process that could take a user hours into a simple \& delightful experience. - \end{itemize*} - \headerrow - {\emph{Senior Software Engineer II}} - {\emph{October 2019 -- March 2021}} - \begin{itemize*} - \item Founding engineer on the first Globality engineering team based in London. - Worked closely with my manager to help define the culture and values of the London engineering department. - Many of the improvements we enacted were adopted in the wider engineering department. - \item Led the architectural design and rebuild of our user facing reporting feature. - \end{itemize*} - {\emph{\textbf{Technology:} Flask (microcosm), FastAPI, SNS/SQS, RDS, Kubernetes, Helm, Docker, SQLAlchemy, PostgreSQL}} - \item - \headerrow - {\textbf{eporta (acquired by Shopify)}} - {\textbf{London, UK}} - \headerrow - {\emph{Senior Software Engineer}} - {\emph{December 2017 -- October 2019}} - \begin{itemize*} - \item Designed and implemented a PoC image recognition tool for - categorizing the type and style of furniture present in a given photo. - \item Led the rebuilding of the onboarding flow, to allow an easier sign-up process. - \item Led a complete rebuild \& redesign of the entire quoting and ordering flow on the site. - \item Prototyped, user-tested and implemented a new project management tool so that - interior designers could manage more of their project on platform. - \end{itemize*} - {\emph{\textbf{Technology:} Django, Django Rest Framework, PostgreSQL, Kinesis, Redshift, Docker}} - - \item - \headerrow - {\textbf{Tictrac}} - {\textbf{London, UK}} - \headerrow - {\emph{Tech Lead}} - {\emph{January 2013 -- December 2017}} - \begin{itemize*} - \item Technical lead for the backend team. Responsible for - mentoring, running 360 reviews and performance reviews for two Junior developers - along with curating the technical backlog for the team. - \item Project Lead \& Technical Designer for many of the features implemented for - white-labelled health and wellness platform. - \end{itemize*} - {\emph{\textbf{Technology:} Django, Django Rest Framework, PostgreSQL, Docker, Kubernetes}} -\end{itemize} - -\hrule -\vspace{-1em} -\subsection*{\Large Skills} - -\hyphenpenalty=1000 -\begin{itemize}[leftmargin=1em,noitemsep] - \item \textbf{Languages:} - Python, Typescript/Javascript, SQL, \LaTeX, Rust - \item \textbf{Software:} - Flask, Django, FastAPI, AWS (Lambda, RDS, Redshift, S3, SQS, SNS, Kinesis), GraphQL, Node, TDD - \item \textbf{Management:} - Line-management, Cross-functional communication, Project management, Agile, Kanban, JIRA -\end{itemize} - -\hrule -\vspace{-1em} -\subsection*{\Large Education} - -\begin{itemize}[leftmargin=1em] - \parskip=0.1em - - \item - \headerrow - {\textbf{Dublin City University}} - {\textbf{Dublin, Ireland}} - \headerrow - {\emph{BSc Computer Applications (Software Engineering)}} - {\emph{2006 -- 2011 }} - - -\end{itemize} -\end{document} - diff --git a/cv.typ b/cv.typ new file mode 100644 index 0000000..23d2eec --- /dev/null +++ b/cv.typ @@ -0,0 +1,284 @@ +#import "@preview/scienceicons:0.0.6": orcid-icon + +#let resume( + author: "", + author-position: left, + personal-info-position: left, + pronouns: "", + location: "", + email: "", + github: "", + linkedin: "", + phone: "", + personal-site: "", + orcid: "", + accent-color: "#000000", + font: "New Computer Modern", + paper: "us-letter", + body, +) = { + + // Sets document metadata + set document(author: author, title: author) + + // Document-wide formatting, including font and margins + set text( + // LaTeX style font + font: font, + size: 9.5pt, + lang: "en", + ligatures: false + ) + + // Reccomended to have 0.5in margin on all sides + set page( + margin: (0.5in), + paper: paper, + ) + + // Link styles + show link: underline + + + // Small caps for section titles + show heading.where(level: 2): it => [ + #pad(top: 0pt, bottom: -10pt, [#smallcaps(it.body)]) + #line(length: 100%, stroke: 1pt) + ] + + // Accent Color Styling + show heading: set text( + fill: rgb(accent-color), + ) + + show link: set text( + fill: rgb(accent-color), + ) + + // Name will be aligned left, bold and big + show heading.where(level: 1): it => [ + #set align(author-position) + #set text( + weight: 700, + size: 20pt, + ) + #pad(it.body) + ] + + // Level 1 Heading + [= #(author)] + + // Personal Info Helper + let contact-item(value, prefix: "", link-type: "") = { + if value != "" { + if link-type != "" { + link(link-type + value)[#(prefix + value)] + } else { + value + } + } + } + + // Personal Info + pad( + top: 0.25em, + align(personal-info-position)[ + #{ + let items = ( + contact-item(pronouns), + contact-item(phone), + contact-item(location), + contact-item(email, link-type: "mailto:"), + contact-item(github, link-type: "https://"), + contact-item(linkedin, link-type: "https://"), + contact-item(personal-site, link-type: "https://"), + ) + items.filter(x => x != none).join(" | ") + } + ], + ) + + // Main body. + set par(justify: true) + + body +} + +// Generic two by two component for resume +#let generic-two-by-two( + top-left: "", + top-right: "", + bottom-left: "", + bottom-right: "", +) = { + [ + #top-left #h(1fr) #top-right \ + #bottom-left #h(1fr) #bottom-right + ] +} + +// Generic one by two component for resume +#let generic-one-by-two( + left: "", + right: "", +) = { + [ + #left #h(1fr) #right + ] +} + +// Cannot just use normal --- ligature becuase ligatures are disabled for good reasons +#let dates-helper( + start-date: "", + end-date: "", +) = { + start-date + " " + $dash.em$ + " " + end-date +} + +// Section components below +#let edu( + institution: "", + dates: "", + degree: "", + gpa: "", + location: "", +) = { + generic-two-by-two( + top-left: strong(institution), + top-right: location, + bottom-left: emph(degree), + bottom-right: emph(dates), + ) +} + +#let work( + title: "", + dates: "", + company: "", + location: "", +) = { + generic-two-by-two( + top-left: strong(title), + top-right: dates, + bottom-left: company, + bottom-right: emph(location), + ) +} + + +#let name = "Rob Hand" +#let location = "London, UK" +#let email = "rob.h.1988@gmail.com" +#let github = "github.com/sinon" +#let linkedin = "linkedin.com/in/robhand" +#let personal-site = "sinon.github.io/" + +#let override = { + set text( + // LaTeX style font + size: 8pt, + lang: "en", + // Disable ligatures so ATS systems do not get confused when parsing fonts. + ligatures: false + ) +} + +#show: resume.with( + author: name, + location: location, + email: email, + github: github, + linkedin: linkedin, + personal-site: personal-site, + accent-color: "#26428b", + font: "New Computer Modern", + paper: "a4", + author-position: left, + personal-info-position: left, +) + + + +== Work Experience + +#work( + title: "Staff Software Engineer", + location: "London, UK", + company: "Marks & Spencer", + dates: dates-helper(start-date: "June 2023", end-date: "Present"), +) +- Led the design and implementation of tooling for managing multi-channel personalised marketing campaigns on M&S. +- Delivered a program of work to modernise the services our team was responsible for. Leading to increased stability and fewer bugs escaping to user-facing environments. +- Rebuilding our content personalisation service to work within a GraphQL Federated system design. + +_*Technology:*_ Python, aiohttp, FastAPI, Azure, PostgreSQL, GraphQL, MongoDB, Docker + + +#work( + title: "Engineering Manager / Tech Lead", + location: "London, UK", + company: "Globality Inc.", + dates: dates-helper(start-date: "Feb 2022", end-date: "May 2023"), +) +- Leading a team of 7 engineers. Responsible for their mentorship, growth, performance evaluation and job satisfaction. +- Delivered various complex projects on time and to a high quality. +- Led continuous process improvement, optimising for impact & delivery for example moved the team to a Kanban based system which improved project delivery time & quality. +- Collaborated with the engineering leadership group to deliver department-wide process improvements. + +_*Technology:*_ Flask (microcosm), FastAPI, AWS, SNS/SQS, RDS, Kubernetes, Helm, Docker, SQLAlchemy, PostgreSQL + +#work( + title: "Staff Software Engineer / Tech Lead", + location: "London, UK", + company: "Globality Inc.", + dates: dates-helper(start-date: "Feb 2021", end-date: "Feb 2022"), +) +- Drove the implementation and adoption of improved error reporting and observability tooling across the organization, which reduced notification times from days to minutes and enabled engineers to pro-actively resolve errors. +- Led the architectural design and implementation of a feature to bulk export all supporting documentation for a given project, turning a manual process that could take a user hours into a simple & delightful experience. + +#work( + title: "Senior Software Engineer II", + location: "London, UK", + company: "Globality Inc.", + dates: dates-helper(start-date: "Oct 2019", end-date: "Feb 2021"), +) +- Founding engineer on the first Globality engineering team based in London. Worked closely with my manager to help define the culture and values of the London engineering department. Many of the improvements we enacted were adopted in the wider engineering department. +- Led the architectural design and rebuild of our user facing reporting feature. + +#work( + title: "Senior Software Engineer", + location: "London, UK", + company: "eporta (acquired by Shopify)", + dates: dates-helper(start-date: "Dec 2017", end-date: "Oct 2019"), +) +- Designed and implemented a PoC image recognition tool for categorizing the type and style of furniture present in a given photo, to automate an expensive manual process. +- Led the rebuilding of the onboarding flow, to allow an easier sign-up process. +- Led a complete rebuild & redesign of the entire quoting and ordering flow on the site. +- Prototyped, user-tested and implemented a new project management tool so that interior designers could manage more of their project on platform. + +*_Technology:_* Django, AWS, Django Rest Framework, PostgreSQL, Kinesis, Redshift, Docker + +#work( + title: "Senior Software Engineer - BE Team Lead", + location: "London, UK", + company: "Tictrac", + dates: dates-helper(start-date: "Aug 2012", end-date: "Oct 2019"), +) +- Technical lead for the backend team. Responsible for mentoring, running 360 reviews and performance reviews for two Junior developers along with curating the technical backlog for the team. +- Project Lead & Technical Designer for many of the features implemented for Tictrac's white-labelled health and wellness platform. + +*_Technology:_* Python, AWS, Django, Django Rest Framework, PostgreSQL, Docker, Kubernetes + + +== Skills +- *Programming Languages*: Python, Rust, Typescript/Javascript, HTML/CSS, Bash +- *Technologies*: Django, FastAPI, Flask, Django Rest Framework, PostgreSQL, Kubernetes, Git, Docker, AWS, Azure, Github Actions, GraphQL + +== Education + +#edu( + institution: "Dublin City University", + location: "Dublin, Republic of Ireland", + dates: dates-helper(start-date: "2006", end-date: "2011"), + degree: "Bachelor's of Science, Computer Applications (Software Engineering)", +) diff --git a/justfile b/justfile new file mode 100644 index 0000000..12d05ec --- /dev/null +++ b/justfile @@ -0,0 +1,3 @@ + +cv: + typst compile cv.typ cv.pdf \ No newline at end of file