17 Commits

Author SHA1 Message Date
Sean O'Connor
61258bf16e style: Adjust resume LaTeX formatting and update GitHub Actions release workflow.
Some checks failed
Compile LaTeX Documents / build-public (push) Successful in 2m58s
Compile LaTeX Documents / build-private (push) Failing after 27s
2026-02-04 00:41:38 -05:00
Sean O'Connor
066d84c5b8 feat: add detailed professional experience entries, reorder resume sections, and refine existing content. 2026-02-04 00:33:40 -05:00
Sean O'Connor
59f172bd0b Refactor: Replaced individual build scripts with a Makefile and helper script for managing local and Docker builds, alongside updates to resume and CV content sections. 2026-02-04 00:16:34 -05:00
e54a0e36e6 fix: switch to akkuman/gitea-release-action for gitea compatibility 2025-12-01 00:45:42 -05:00
b055ed9d3d fix: switch to svenstaro/upload-release-action for gitea compatibility 2025-12-01 00:25:07 -05:00
ede400fd97 debug: list files and use explicit artifact paths for gitea release 2025-12-01 00:15:05 -05:00
8aeb6a4745 fix: downgrade upload-artifact to v3 for gitea compatibility 2025-11-30 19:31:50 -05:00
7749d8c332 fix: use glob pattern for release artifacts 2025-11-30 18:50:35 -05:00
0549f77c4d docs: add gitea release urls 2025-11-30 18:49:33 -05:00
7bebaea133 fix: install nodejs for action compatibility 2025-11-30 18:37:26 -05:00
5f77e4e68c fix: switch to ncipollo/release-action for gitea compatibility 2025-11-30 18:36:31 -05:00
8f0ff2df68 refactor: use container job strategy for gitea compatibility 2025-11-30 18:32:06 -05:00
de9dfe2d7f Update README.md 2025-11-30 17:48:21 -05:00
dd9c4c09ee fix: correct typo in resume.tex itemize environment 2025-11-30 17:18:41 -05:00
eed1e8714b fix: update github actions runner and dependencies 2025-11-30 17:16:08 -05:00
7397a0177f Update build-local 2025-11-30 16:08:05 -05:00
d0813ce1c6 Enhance CV and resume with new project details and LaTeX package adjustments
- Added current honors thesis project to CV, focusing on platform effectiveness in HRI research
- Updated resume to correct formatting of beenvoice project description
- Modified LaTeX hyperref package options for improved link visibility
2025-10-08 10:35:12 -04:00
17 changed files with 340 additions and 369 deletions

View File

@@ -12,9 +12,13 @@ permissions:
jobs: jobs:
build-public: build-public:
runs-on: ubuntu-24.04 runs-on: ubuntu-latest
container: ghcr.io/xu-cheng/texlive-alpine:latest
steps: steps:
- uses: actions/checkout@v3 - name: Install system dependencies
run: apk add --no-cache git gettext bash nodejs
- uses: actions/checkout@v4
- name: Create public info file - name: Create public info file
env: env:
@@ -40,7 +44,7 @@ jobs:
mv personal_info.tex.tmp personal_info.tex mv personal_info.tex.tmp personal_info.tex
- name: Cache TeX Live - name: Cache TeX Live
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: | path: |
/tmp/texlive /tmp/texlive
@@ -52,56 +56,55 @@ jobs:
- name: Create TeX Live directory - name: Create TeX Live directory
run: mkdir -p /tmp/texlive run: mkdir -p /tmp/texlive
- name: Set up TeX Live - name: Compile LaTeX
uses: xu-cheng/latex-action@v3 run: |
with: latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex
root_file: | latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode cv.tex
resume.tex
cv.tex - name: List generated PDFs
latexmk_use_xelatex: false run: ls -la *.pdf
# Create/update latest release
- name: Upload Public PDFs as Release - name: Upload Public PDFs as Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
files: | files: |
resume.pdf resume.pdf
cv.pdf cv.pdf
name: Latest PDFs
tag_name: latest tag_name: latest
name: Latest PDFs
body: | body: |
Latest version of resume and CV (public version) Latest compiled resume and CV (public versions)
This release is automatically updated with each push to main. For versioned releases, see the numbered releases. Built from commit ${{ github.sha }}
prerelease: false prerelease: false
draft: false draft: false
fail_on_unmatched_files: true
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Create a numbered release for version history # Create a numbered release for version history
- name: Create Numbered Release - name: Create Numbered Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
files: | files: |
resume.pdf resume.pdf
cv.pdf cv.pdf
name: Release ${{ github.run_number }}
tag_name: release-${{ github.run_number }} tag_name: release-${{ github.run_number }}
name: Release ${{ github.run_number }}
body: | body: |
Version ${{ github.run_number }} of resume and CV (public version) Automated release #${{ github.run_number }}
Built from commit ${{ github.sha }}
prerelease: false prerelease: false
draft: false draft: false
fail_on_unmatched_files: true
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-private: build-private:
runs-on: ubuntu-24.04 runs-on: ubuntu-latest
container: ghcr.io/xu-cheng/texlive-alpine:latest
if: github.actor == github.repository_owner if: github.actor == github.repository_owner
steps: steps:
- uses: actions/checkout@v3 - name: Install system dependencies
run: apk add --no-cache git gettext bash nodejs
- uses: actions/checkout@v4
- name: Create private info file - name: Create private info file
env: env:
@@ -133,7 +136,7 @@ jobs:
mv personal_info.tex.tmp personal_info.tex mv personal_info.tex.tmp personal_info.tex
- name: Cache TeX Live - name: Cache TeX Live
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: | path: |
/tmp/texlive /tmp/texlive
@@ -145,13 +148,13 @@ jobs:
- name: Create TeX Live directory - name: Create TeX Live directory
run: mkdir -p /tmp/texlive run: mkdir -p /tmp/texlive
- name: Set up TeX Live - name: Compile LaTeX
uses: xu-cheng/latex-action@v3 run: |
with: latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex
root_file: | latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode cv.tex
resume.tex
cv.tex - name: List generated PDFs
latexmk_use_xelatex: false run: ls -la *.pdf
- name: Upload Private PDFs - name: Upload Private PDFs
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

41
.gitignore vendored
View File

@@ -1,38 +1,19 @@
# LaTeX build files # Ignore build artifacts
build/
output/
# LaTeX temporary files
*.aux *.aux
*.lof
*.log *.log
*.lot
*.fls
*.out *.out
*.toc *.fls
*.fmt *.fdb_latexmk
*.fot *.synctex.gz
*.cb
*.cb2
.*.lb
*.pdf
*.dvi
*.xdv
*-converted-to.*
.pdf
*.bbl *.bbl
*.blg *.blg
*.synctex.gz
*.fdb_latexmk
# GitHub Secrets # Personal information
.secrets .secrets
# Private information # OS files
personal_info_private.tex .DS_Store
personal_info.tex
# macOS system files
.DS_Store
.AppleDouble
.LSOverride
# Editor files
.vscode/
.idea/

View File

@@ -7,11 +7,10 @@ ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
texlive-full \ texlive-full \
latexmk \ latexmk \
make \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
WORKDIR /workspace WORKDIR /workspace
COPY . . # Default command runs make
CMD ["make", "all"]
# For build
CMD ["latexmk", "-pdf", "-file-line-error", "-halt-on-error", "-interaction=nonstopmode", "resume.tex", "cv.tex"]

94
Makefile Normal file
View File

@@ -0,0 +1,94 @@
# Resume & CV Makefile
# Builds both public and private versions of resume and CV
# Variables
LATEX = latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode
DOCKER_IMAGE = resume-builder
OUTPUT_DIR = output
BUILD_DIR = build
SCRIPTS_DIR = scripts
# Export BUILD_DIR for scripts
export BUILD_DIR
# Targets
.PHONY: all clean docker-build docker public private resume cv help
all: public private
help:
@echo "Resume & CV Build System"
@echo ""
@echo "Targets:"
@echo " make all - Build both public and private versions (default)"
@echo " make public - Build public versions only"
@echo " make private - Build private versions only"
@echo " make resume - Build resume only (both versions)"
@echo " make cv - Build CV only (both versions)"
@echo " make docker - Build using Docker (if LaTeX not installed)"
@echo " make clean - Remove build artifacts"
@echo ""
@echo "Files will be generated in $(OUTPUT_DIR)/"
@echo "Build artifacts will be in $(BUILD_DIR)/"
# Create directories
$(OUTPUT_DIR):
@mkdir -p $(OUTPUT_DIR)
$(BUILD_DIR):
@mkdir -p $(BUILD_DIR)
# Build public versions
public: $(OUTPUT_DIR) $(BUILD_DIR)
@echo "Building public versions..."
@$(SCRIPTS_DIR)/generate-personal-info.sh public
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) resume.tex
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) cv.tex
@cp $(BUILD_DIR)/resume.pdf $(OUTPUT_DIR)/resume-public.pdf
@cp $(BUILD_DIR)/cv.pdf $(OUTPUT_DIR)/cv-public.pdf
@echo "Public versions built successfully!"
# Build private versions
private: $(OUTPUT_DIR) $(BUILD_DIR)
@echo "Building private versions..."
@$(SCRIPTS_DIR)/generate-personal-info.sh private
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) resume.tex
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) cv.tex
@cp $(BUILD_DIR)/resume.pdf $(OUTPUT_DIR)/resume-private.pdf
@cp $(BUILD_DIR)/cv.pdf $(OUTPUT_DIR)/cv-private.pdf
@echo "Private versions built successfully!"
# Build resume only
resume: $(OUTPUT_DIR) $(BUILD_DIR)
@echo "Building resume..."
@$(SCRIPTS_DIR)/generate-personal-info.sh public
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) resume.tex
@cp $(BUILD_DIR)/resume.pdf $(OUTPUT_DIR)/resume-public.pdf
@$(SCRIPTS_DIR)/generate-personal-info.sh private
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) resume.tex
@cp $(BUILD_DIR)/resume.pdf $(OUTPUT_DIR)/resume-private.pdf
@echo "Resume built successfully!"
# Build CV only
cv: $(OUTPUT_DIR) $(BUILD_DIR)
@echo "Building CV..."
@$(SCRIPTS_DIR)/generate-personal-info.sh public
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) cv.tex
@cp $(BUILD_DIR)/cv.pdf $(OUTPUT_DIR)/cv-public.pdf
@$(SCRIPTS_DIR)/generate-personal-info.sh private
@TEXINPUTS=".:$(BUILD_DIR):" $(LATEX) -output-directory=$(BUILD_DIR) cv.tex
@cp $(BUILD_DIR)/cv.pdf $(OUTPUT_DIR)/cv-private.pdf
@echo "CV built successfully!"
# Docker build
docker-build:
@docker build -t $(DOCKER_IMAGE) .
docker: docker-build
@echo "Building with Docker..."
@docker run --rm -v "$(PWD):/workspace" $(DOCKER_IMAGE)
# Clean build artifacts
clean:
@rm -rf $(BUILD_DIR) $(OUTPUT_DIR)
@echo "Cleaned all build artifacts"

View File

@@ -9,14 +9,18 @@ A LaTeX-based resume and CV generator with automated builds for both public and
This project demonstrates professional DevOps practices while providing a beautiful LaTeX resume: This project demonstrates professional DevOps practices while providing a beautiful LaTeX resume:
- Automated builds via GitHub Actions for continuous deployment - Automated builds via GitHub Actions for continuous deployment
- Secure handling of sensitive information through environment variables - Secure handling of sensitive information through environment variables
- Containerized local development with Docker - Makefile-based build system for easy local development
- Clean separation of content and styling - Clean separation of content and styling
## Latest PDFs ## Latest PDFs
The most recent public versions are always available at: The most recent public versions are always available at:
- Resume: `https://github.com/USERNAME/resume-cv/releases/download/latest/resume.pdf` - Resume: `https://github.com/soconnor0919/resume-cv/releases/download/latest/resume.pdf`
- CV: `https://github.com/USERNAME/resume-cv/releases/download/latest/cv.pdf` - CV: `https://github.com/soconnor0919/resume-cv/releases/download/latest/cv.pdf`
If mirroring to Gitea:
- Resume: `https://git.soconnor.dev/soconnor/resume-cv/releases/download/latest/resume.pdf`
- CV: `https://git.soconnor.dev/soconnor/resume-cv/releases/download/latest/cv.pdf`
Replace `USERNAME` with your GitHub username after forking. Replace `USERNAME` with your GitHub username after forking.
@@ -35,10 +39,13 @@ Replace `USERNAME` with your GitHub username after forking.
│ ├── skills.tex │ ├── skills.tex
│ ├── coursework.tex │ ├── coursework.tex
│ └── publications.tex │ └── publications.tex
├── scripts/ # Build helper scripts
│ └── generate-personal-info.sh
├── build/ # Build artifacts (git-ignored)
├── output/ # Final PDFs (git-ignored)
├── .secrets # Personal information (git-ignored) ├── .secrets # Personal information (git-ignored)
├── build-local.sh # Local build script ├── Makefile # Build system
├── build-docker.sh # Docker build script ├── Dockerfile # Docker build environment
├── generate-standalone-cv.sh # Generate standalone CV PDF
└── subfiles/ └── subfiles/
└── refs.bib # BibTeX references └── refs.bib # BibTeX references
``` ```
@@ -47,10 +54,44 @@ Replace `USERNAME` with your GitHub username after forking.
1. Fork this repository 1. Fork this repository
2. Copy `.secrets-template` to `.secrets` and fill in your personal information 2. Copy `.secrets-template` to `.secrets` and fill in your personal information
3. Run `./build-local.sh` to generate both public and private versions 3. Run `make` to generate both public and private versions
- Public version omits sensitive information like phone and address - Public version omits sensitive information like phone and address
- Private version includes all personal details from `.secrets` - Private version includes all personal details from `.secrets`
- The script automatically generates and cleans up temporary files
## Building
### Using Make (Recommended)
```bash
# Build everything (public and private versions)
make
# Build only public versions
make public
# Build only private versions
make private
# Build only resume
make resume
# Build only CV
make cv
# Clean build artifacts
make clean
# Show all available targets
make help
```
### Using Docker
If you don't have LaTeX installed locally:
```bash
make docker
```
## Modifying Content ## Modifying Content

View File

@@ -1,88 +0,0 @@
#!/bin/bash
# Source secrets if the file exists
if [ -f .secrets ]; then
source .secrets
else
echo "Warning: .secrets file not found. Building public version only."
fi
# Set defaults for missing variables
PERSONAL_NAME=${PERSONAL_NAME:-$(whoami)}
PERSONAL_EMAIL=${PERSONAL_EMAIL:-""}
PERSONAL_WEBSITE=${PERSONAL_WEBSITE:-""}
PERSONAL_SCHOOL_EMAIL=${PERSONAL_SCHOOL_EMAIL:-""}
PERSONAL_PHONE=${PERSONAL_PHONE:-""}
PERSONAL_HOME_ADDRESS_LINE1=${PERSONAL_HOME_ADDRESS_LINE1:-""}
PERSONAL_HOME_ADDRESS_LINE2=${PERSONAL_HOME_ADDRESS_LINE2:-""}
PERSONAL_SCHOOL_ADDRESS_LINE1=${PERSONAL_SCHOOL_ADDRESS_LINE1:-""}
PERSONAL_SCHOOL_ADDRESS_LINE2=${PERSONAL_SCHOOL_ADDRESS_LINE2:-""}
PERSONAL_SCHOOL_ADDRESS_LINE3=${PERSONAL_SCHOOL_ADDRESS_LINE3:-""}
# Function to cleanup
cleanup() {
rm -f *.aux *.log *.out *.fls *.fdb_latexmk *.synctex.gz *.bbl *.blg personal_info.tex
if [ -f personal_info.tex.bak ]; then
mv personal_info.tex.bak personal_info.tex
fi
}
trap cleanup EXIT
mkdir -p output
# Backup current personal_info.tex if it exists
if [ -f personal_info.tex ]; then
cp personal_info.tex personal_info.tex.bak
fi
# Build private version (if secrets are available)
if [ -n "$PERSONAL_PHONE" ] || [ -n "$PERSONAL_HOME_ADDRESS_LINE1" ] || [ -n "$PERSONAL_SCHOOL_ADDRESS_LINE1" ]; then
echo "Building private version..."
cat > personal_info.tex << EOL
% Private version of personal information
\newcommand{\personalName}{$PERSONAL_NAME}
\newcommand{\personalEmail}{$PERSONAL_EMAIL}
\newcommand{\personalPhone}{$PERSONAL_PHONE}
\newcommand{\personalWebsite}{$PERSONAL_WEBSITE}
\newcommand{\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
\newcommand{\personalHomeAddressLineOne}{$PERSONAL_HOME_ADDRESS_LINE1}
\newcommand{\personalHomeAddressLineTwo}{$PERSONAL_HOME_ADDRESS_LINE2}
\newcommand{\personalSchoolAddressLineOne}{$PERSONAL_SCHOOL_ADDRESS_LINE1}
\newcommand{\personalSchoolAddressLineTwo}{$PERSONAL_SCHOOL_ADDRESS_LINE2}
\newcommand{\personalSchoolAddressLineThree}{$PERSONAL_SCHOOL_ADDRESS_LINE3}
EOL
docker build --platform linux/arm64 -t resume-builder .
docker run --platform linux/arm64 --rm \
-v "$(pwd):/workspace" \
-v "$(pwd)/output:/workspace/output" \
resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && mv *.pdf output/"
mv output/resume.pdf output/resume-private.pdf 2>/dev/null || true
mv output/cv.pdf output/cv-private.pdf 2>/dev/null || true
fi
# Build public version
echo "Building public version..."
cat > personal_info.tex << EOL
% Public version of personal information
\newcommand{\personalName}{$PERSONAL_NAME}
\newcommand{\personalEmail}{$PERSONAL_EMAIL}
\newcommand{\personalPhone}{~}
\newcommand{\personalWebsite}{$PERSONAL_WEBSITE}
\newcommand{\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
\newcommand{\personalHomeAddressLineOne}{~}
\newcommand{\personalHomeAddressLineTwo}{~}
\newcommand{\personalSchoolAddressLineOne}{~}
\newcommand{\personalSchoolAddressLineTwo}{~}
\newcommand{\personalSchoolAddressLineThree}{~}
EOL
docker run --platform linux/arm64 --rm \
-v "$(pwd):/workspace" \
-v "$(pwd)/output:/workspace/output" \
resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && mv resume.pdf output/resume-public.pdf && mv cv.pdf output/cv-public.pdf"
echo "Build complete!"
echo "Generated files in output/:"
ls -l output/

View File

@@ -1,110 +0,0 @@
#!/bin/bash
# Source secrets if the file exists
if [ -f .secrets ]; then
source .secrets
else
echo "Warning: .secrets file not found. Building public version only."
fi
# Set defaults for missing variables
PERSONAL_NAME=${PERSONAL_NAME:-$(whoami)}
PERSONAL_EMAIL=${PERSONAL_EMAIL:-""}
PERSONAL_WEBSITE=${PERSONAL_WEBSITE:-""}
PERSONAL_SCHOOL_EMAIL=${PERSONAL_SCHOOL_EMAIL:-""}
PERSONAL_PHONE=${PERSONAL_PHONE:-""}
PERSONAL_HOME_ADDRESS_LINE1=${PERSONAL_HOME_ADDRESS_LINE1:-""}
PERSONAL_HOME_ADDRESS_LINE2=${PERSONAL_HOME_ADDRESS_LINE2:-""}
PERSONAL_SCHOOL_ADDRESS_LINE1=${PERSONAL_SCHOOL_ADDRESS_LINE1:-""}
PERSONAL_SCHOOL_ADDRESS_LINE2=${PERSONAL_SCHOOL_ADDRESS_LINE2:-""}
PERSONAL_SCHOOL_ADDRESS_LINE3=${PERSONAL_SCHOOL_ADDRESS_LINE3:-""}
# Function to cleanup
cleanup() {
rm -f *.aux *.log *.out *.fls *.fdb_latexmk *.synctex.gz *.bbl *.blg personal_info.tex
if [ -f personal_info.tex.bak ]; then
mv personal_info.tex.bak personal_info.tex
fi
}
trap cleanup EXIT
mkdir -p output
# Check if required LaTeX tools are available locally
check_latex_tools() {
command -v latexmk >/dev/null 2>&1 || return 1
command -v pdflatex >/dev/null 2>&1 || return 1
return 0
}
# Function to build using local tools
build_local() {
latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode "$1"
}
# Function to build using Docker
build_docker() {
echo "Local LaTeX tools not found, falling back to Docker..."
./build-docker.sh
exit $?
}
# Backup current personal_info.tex if it exists
if [ -f personal_info.tex ]; then
cp personal_info.tex personal_info.tex.bak
fi
# Check if we can use local tools, otherwise fall back to Docker
if ! check_latex_tools; then
build_docker
fi
# Build private version (if secrets are available)
if [ -n "$PERSONAL_PHONE" ] || [ -n "$PERSONAL_HOME_ADDRESS_LINE1" ] || [ -n "$PERSONAL_SCHOOL_ADDRESS_LINE1" ]; then
echo "Building private version..."
cat > personal_info.tex << EOL
% Private version of personal information
\newcommand{\personalName}{$PERSONAL_NAME}
\newcommand{\personalEmail}{$PERSONAL_EMAIL}
\newcommand{\personalPhone}{$PERSONAL_PHONE}
\newcommand{\personalWebsite}{$PERSONAL_WEBSITE}
\newcommand{\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
\newcommand{\personalHomeAddressLineOne}{$PERSONAL_HOME_ADDRESS_LINE1}
\newcommand{\personalHomeAddressLineTwo}{$PERSONAL_HOME_ADDRESS_LINE2}
\newcommand{\personalSchoolAddressLineOne}{$PERSONAL_SCHOOL_ADDRESS_LINE1}
\newcommand{\personalSchoolAddressLineTwo}{$PERSONAL_SCHOOL_ADDRESS_LINE2}
\newcommand{\personalSchoolAddressLineThree}{$PERSONAL_SCHOOL_ADDRESS_LINE3}
EOL
build_local resume.tex
build_local cv.tex
mv resume.pdf output/resume-private.pdf 2>/dev/null || true
mv cv.pdf output/cv-private.pdf 2>/dev/null || true
fi
# Build public version
echo "Building public version..."
cat > personal_info.tex << EOL
% Public version of personal information
\newcommand{\personalName}{$PERSONAL_NAME}
\newcommand{\personalEmail}{$PERSONAL_EMAIL}
\newcommand{\personalPhone}{~}
\newcommand{\personalWebsite}{$PERSONAL_WEBSITE}
\newcommand{\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
\newcommand{\personalHomeAddressLineOne}{~}
\newcommand{\personalHomeAddressLineTwo}{~}
\newcommand{\personalSchoolAddressLineOne}{~}
\newcommand{\personalSchoolAddressLineTwo}{~}
\newcommand{\personalSchoolAddressLineThree}{~}
EOL
build_local resume.tex
build_local cv.tex
mv resume.pdf output/resume-public.pdf
mv cv.pdf output/cv-public.pdf
echo "Build complete!"
echo "Generated files in output/:"
ls -l output/

30
cv.tex
View File

@@ -3,8 +3,8 @@
% Include common style % Include common style
\input{shared/style/common} \input{shared/style/common}
% Include personal information % Include personal information (check build/ first, then root)
\input{personal_info} \IfFileExists{build/personal_info.tex}{\input{build/personal_info}}{\input{personal_info}}
\begin{document} \begin{document}
@@ -13,7 +13,7 @@
\resumesection{Research Interests} \resumesection{Research Interests}
I'm passionate about human-robot interaction and developing technologies that make robots better collaborators with humans. My work focuses on creating reproducible research methodologies, particularly through Wizard-of-Oz experiments, and building platforms that lower barriers for HRI researchers. I'm especially interested in how we can make robot behaviors more trustworthy and explainable, and how to design effective frameworks for studying human-robot collaboration across different contexts and applications. My research focuses on advancing human-robot interaction through improved experimental methodologies and accessible research tools. I am particularly interested in Wizard-of-Oz experimental frameworks, reproducibility in HRI studies, and developing platforms that democratize access to HRI research across disciplines. My work with HRIStudio addresses critical challenges in experimental reproducibility and cross-platform robot control, enabling researchers without specialized programming expertise to conduct rigorous HRI studies. I am passionate about exploring how we can make robot behaviors more trustworthy and explainable, particularly through transparent experimental design and comprehensive data logging. Looking forward, I aim to investigate how standardized experimental frameworks can advance our understanding of human-robot trust, collaboration dynamics, and the design of intuitive robot interfaces across diverse application domains.
% Education section % Education section
\input{shared/sections/education} \input{shared/sections/education}
@@ -28,11 +28,16 @@ I'm passionate about human-robot interaction and developing technologies that ma
\textbf{Lead Researcher - HRIStudio Platform Development} \hfill \textbf{Jan 2023 Present} \textbf{Lead Researcher - HRIStudio Platform Development} \hfill \textbf{Jan 2023 Present}
\textit{Advisor: Dr. L. Felipe Perrone, Computer Science Department} \textit{Advisor: Dr. L. Felipe Perrone, Computer Science Department}
\textit{Research Commitment: 3.5 credits of individual study (CSCI 278/378) across 6 semesters}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Developing HRIStudio, a novel web-based platform addressing reproducibility challenges in Wizard-of-Oz HRI studies, with two first-author publications at IEEE RO-MAN 2024 and 2025 \item Developing HRIStudio, a novel web-based platform addressing reproducibility challenges in Wizard-of-Oz HRI studies, with two first-author publications at IEEE RO-MAN 2024 and 2025
\item Designed modular architecture enabling cross-platform robot control without specialized programming knowledge, lowering technical barriers for HRI researchers across disciplines \item Architected modular plugin system enabling cross-platform robot control (NAO, Pepper, custom platforms) through JSON-defined interfaces, eliminating need for specialized programming knowledge
\item Implemented comprehensive data logging and playback capabilities for experimental analysis, supporting rigorous scientific methodology in human-robot interaction studies \item Implemented WebSocket-based bidirectional communication protocols for low-latency robot teleoperation with real-time state synchronization
\item Conducted literature review identifying key challenges in WoZ methodology reproducibility, informing platform design decisions and feature prioritization \item Designed comprehensive data logging system capturing interaction timelines, robot states, and experimental conditions with microsecond precision for reproducibility analysis
\item Developed RESTful API leveraging Robot Operating System (ROS) for extensible robot integration across multiple platforms
\item Currently developing honors thesis evaluating platform effectiveness through user studies and analyzing impact on interdisciplinary HRI research accessibility
\item Conducted systematic literature review identifying key challenges in WoZ methodology reproducibility, informing platform design decisions and feature prioritization
\end{itemize} \end{itemize}
\textscbf{Interdisciplinary Research Collaboration} \hfill \textscbf{Bucknell University} \textscbf{Interdisciplinary Research Collaboration} \hfill \textscbf{Bucknell University}
@@ -94,6 +99,15 @@ I'm passionate about human-robot interaction and developing technologies that ma
\resumesection{Selected Projects} \resumesection{Selected Projects}
\textbf{Computer System from Scratch - Nand2Tetris (ECEG 431)} \hfill \textbf{HDL/Assembly/Java}
\begin{itemize}[noitemsep,topsep=2pt]
\item Built complete computer system from NAND gates through operating system, demonstrating comprehensive understanding of computer architecture
\item Designed and simulated all hardware components including logic gates, ALU, RAM, and CPU using hardware description language
\item Developed complete software stack: assembler for machine code translation, virtual machine translator for intermediate code, and compiler for high-level object-oriented language
\item Implemented functional operating system with memory management, I/O handling, and graphics capabilities
\item Technologies: Hardware Description Language (HDL), Assembly, Jack (object-oriented language), Java
\end{itemize}
\textbf{HRIStudio - Web-Based Wizard-of-Oz Platform} \hfill \textbf{TypeScript/React/WebRTC} \textbf{HRIStudio - Web-Based Wizard-of-Oz Platform} \hfill \textbf{TypeScript/React/WebRTC}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Architected full-stack web application for managing HRI experiments with real-time robot control interfaces \item Architected full-stack web application for managing HRI experiments with real-time robot control interfaces
@@ -215,8 +229,8 @@ I'm passionate about human-robot interaction and developing technologies that ma
\resumesection{Honors \& Awards} \resumesection{Honors \& Awards}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Dean's List (5 semesters): Fall 2022, Fall 2023, Spring 2024, Fall 2024, Spring 2025 \item Dean's List (6 semesters): Fall 2022, Fall 2023, Spring 2024, Fall 2024, Spring 2025, Fall 2025
\item Engineering GPA: 3.86/4.0 \item GPA: 3.67/4.0 \textbullet{} Engineering GPA: 3.88/4.0
\item AIChE Mid-Atlantic Chem-E-Car Competition - 2nd Place (2024) \item AIChE Mid-Atlantic Chem-E-Car Competition - 2nd Place (2024)
\end{itemize} \end{itemize}

View File

@@ -3,8 +3,8 @@
% Include common style % Include common style
\input{shared/style/common} \input{shared/style/common}
% Include personal information % Include personal information (check build/ first, then root)
\input{personal_info} \IfFileExists{build/personal_info.tex}{\input{build/personal_info}}{\input{personal_info}}
\begin{document} \begin{document}
@@ -14,71 +14,57 @@
% Education section % Education section
\input{shared/sections/education} \input{shared/sections/education}
\resumesection{Experience} % Publications section (research credibility)
\input{shared/sections/publications-resume}
\resumesection{Professional Experience}
\textscbf{Riverhead Raceway} \hfill \textscbf{Riverhead, NY} \textscbf{Riverhead Raceway} \hfill \textscbf{Riverhead, NY}
\textbf{Software Developer} \hfill \textbf{Oct 2020 Present} \textbf{Software Developer} \hfill \textbf{Oct 2020 Present}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Developed real-time statistics platform serving 1500+ concurrent users and 250k monthly website visits \item Architected and deployed full-stack real-time statistics platform serving 1500+ concurrent users and 250k+ monthly visitors using Next.js, TypeScript, PostgreSQL, and Docker
\item Built payment processing platform handling \$100,000+ in transactions with automated content management \item Engineered scalable backend infrastructure with optimized database queries and WebSocket connections achieving sub-100ms response times for live race data updates across 20+ simultaneous events
\item Modernized infrastructure through containerization and automation for reliable operations \item Designed and implemented RESTful APIs for mobile applications and third-party integrations, processing 10M+ API requests monthly
\item Built automated CI/CD pipelines with GitHub Actions and monitoring systems, maintaining 99.9\% uptime across racing season
\end{itemize} \end{itemize}
\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA} \textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA}
\textbf{Computer Science Researcher - Human-Robot Interaction} \hfill \textbf{Jan 2023 Present} \textbf{Teaching Assistant - Software Engineering \& Engineering Design} \hfill \textbf{Aug 2023 Present}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Led research and authored first-author papers at IEEE RO-MAN 2024 and 2025 conferences \item Mentor 150+ students across software engineering, design patterns, and embedded systems (Arduino, microcontrollers)
\item Developed web-based HRIStudio platform addressing reproducibility challenges in Wizard-of-Oz studies \item Developed automated testing frameworks and grading tools, improving learning outcomes while streamlining assessment processes
\end{itemize} \end{itemize}
\textbf{Computer Science Research Assistant - Chemical Engineering Department} \hfill \textbf{Aug 2023 May 2025} \resumesection{Research Experience}
\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA}
\textbf{Human-Robot Interaction Researcher} \hfill \textbf{Jan 2023 Present}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Built automated data collection tools enabling researchers to focus on analysis over manual gathering \item Published 2 first-author papers at IEEE RO-MAN (2024, 2025) on novel HRI experimental platform enabling reproducible Wizard-of-Oz studies across multiple robot platforms
\end{itemize} \item Architected modular plugin system with WebSocket-based teleoperation and RESTful API integrating ROS for NAO, Pepper, and custom robots
\textbf{Teaching Assistant \& Engineering Tutor} \hfill \textbf{Aug 2023 - Present}
\begin{itemize}[noitemsep,topsep=2pt]
\item Mentored 200+ students across CS, engineering, and physics connecting theory to real-world applications
\item Created automated testing frameworks with personalized feedback streamlining assessment processes
\end{itemize}
\resumesection{Activities}
\textscbf{AIChE Chem-E-Car Competition Team} \hfill \textscbf{Bucknell University}
\textbf{Former President, Electrical and Mechanical Team Lead} \hfill \textbf{Jan 2023 Present}
\begin{itemize}[noitemsep,topsep=2pt]
\item Designed custom microcontroller control system for hydrogen fuel cell regulation using finite state machine architecture
\end{itemize}
\textscbf{Bucknell Coffee Society} \hfill \textscbf{Bucknell University}
\textbf{Co-Founder and Treasurer} \hfill \textbf{Oct 2023 Present}
\begin{itemize}[noitemsep,topsep=2pt]
\item Manage financial operations, budgeting, and event coordination for campus coffee organization
\end{itemize} \end{itemize}
\resumesection{Selected Projects} \resumesection{Selected Projects}
\textbf{beenvoice - Professional Invoicing Application} \hfill \textbf{TypeScript/Next.js} \textbf{Computer System from Scratch - Nand2Tetris} \hfill \textbf{HDL/Assembly/Java}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Built full-stack invoicing app with secure authentication, client management, and invoice generation deployed at beenvoice.vercel.app \item Designed complete computer system from hardware (NAND gates → CPU) through software (assembler → OS), demonstrating full-stack systems understanding critical for robotics applications
\end{itemize} \end{itemize}
\textbf{Formula One Performance Prediction Using Machine Learning} \hfill \textbf{Python/ML} \textbf{Autonomous Vehicle Control - Chem-E-Car Competition} \hfill \textbf{C++/Arduino}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Developed ensemble machine learning models (LightGBM, XGBoost, Random Forest) to predict F1 lap times with high accuracy \item Led 15-member team designing autonomous hydrogen fuel cell vehicle; implemented embedded control system with real-time sensor fusion achieving ±10cm precision at AIChE National Competition (2nd place)
\end{itemize} \end{itemize}
\textbf{HRIStudio Research Platform} \hfill \textbf{Next.js/TypeScript} \textbf{HRIStudio Research Platform} \hfill \textbf{Next.js/TypeScript/ROS}
\begin{itemize}[noitemsep,topsep=2pt] \begin{itemize}[noitemsep,topsep=2pt]
\item Developed web-based platform for Wizard-of-Oz experiments with WebSocket-based robot control and comprehensive data logging \item Full-stack web application for managing HRI experiments with WebSocket robot control and comprehensive data logging
\end{itemize} \end{itemize}
% Shared sections % Technical Skills
\input{shared/sections/coursework} \input{shared/sections/skills-resume}
\input{shared/sections/skills}
\end{document} \end{document}

View File

@@ -0,0 +1,55 @@
#!/bin/bash
# Helper script to generate personal_info.tex files
# Usage: ./generate-personal-info.sh [public|private]
VERSION=$1
BUILD_DIR=${BUILD_DIR:-build}
# Create build directory if it doesn't exist
mkdir -p "$BUILD_DIR"
# Source secrets if available
if [ -f .secrets ]; then
source .secrets
else
PERSONAL_NAME=$(whoami)
PERSONAL_EMAIL=""
PERSONAL_WEBSITE=""
PERSONAL_SCHOOL_EMAIL=""
PERSONAL_PHONE=""
PERSONAL_HOME_ADDRESS_LINE1=""
PERSONAL_HOME_ADDRESS_LINE2=""
PERSONAL_SCHOOL_ADDRESS_LINE1=""
PERSONAL_SCHOOL_ADDRESS_LINE2=""
PERSONAL_SCHOOL_ADDRESS_LINE3=""
fi
if [ "$VERSION" = "public" ]; then
cat > "$BUILD_DIR/personal_info.tex" <<EOL
% Public version of personal information
\\newcommand{\\personalName}{$PERSONAL_NAME}
\\newcommand{\\personalEmail}{$PERSONAL_EMAIL}
\\newcommand{\\personalPhone}{~}
\\newcommand{\\personalWebsite}{$PERSONAL_WEBSITE}
\\newcommand{\\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
\\newcommand{\\personalHomeAddressLineOne}{~}
\\newcommand{\\personalHomeAddressLineTwo}{~}
\\newcommand{\\personalSchoolAddressLineOne}{~}
\\newcommand{\\personalSchoolAddressLineTwo}{~}
\\newcommand{\\personalSchoolAddressLineThree}{~}
EOL
else
cat > "$BUILD_DIR/personal_info.tex" <<EOL
% Private version of personal information
\\newcommand{\\personalName}{$PERSONAL_NAME}
\\newcommand{\\personalEmail}{$PERSONAL_EMAIL}
\\newcommand{\\personalPhone}{$PERSONAL_PHONE}
\\newcommand{\\personalWebsite}{$PERSONAL_WEBSITE}
\\newcommand{\\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
\\newcommand{\\personalHomeAddressLineOne}{$PERSONAL_HOME_ADDRESS_LINE1}
\\newcommand{\\personalHomeAddressLineTwo}{$PERSONAL_HOME_ADDRESS_LINE2}
\\newcommand{\\personalSchoolAddressLineOne}{$PERSONAL_SCHOOL_ADDRESS_LINE1}
\\newcommand{\\personalSchoolAddressLineTwo}{$PERSONAL_SCHOOL_ADDRESS_LINE2}
\\newcommand{\\personalSchoolAddressLineThree}{$PERSONAL_SCHOOL_ADDRESS_LINE3}
EOL
fi

View File

@@ -1,11 +1,11 @@
\resumesection{Relevant Coursework} \resumesection{Relevant Coursework}
\textbf{Artificial Intelligence \& Data Science:} Data Mining, Algorithm Design \& Analysis \textbf{Robotics \& Human-Robot Interaction:} Human-Robot Interaction, Individual Study in HRI (3.5 credits)
\textbf{Systems \& Software Engineering:} Software Engineering \& Design, Computer Systems, Operating Systems Design, Programming Language Design \textbf{Artificial Intelligence \& Machine Learning:} Artificial Intelligence with Neural Nets (in progress), Data Mining, Image Processing \& Analysis (in progress)
\textbf{Research \& Analysis:} Research Methods in Computer Science, Probability \& Statistics, Experimental Design \textbf{Systems \& Embedded:} Operating Systems Design, Computer Systems, Embedded Computer Systems, Real-time Control Systems
\textbf{Mathematics \& Theory:} Linear Algebra, Discrete Mathematics \textbf{Software Engineering:} Software Engineering \& Design, Algorithm Design \& Analysis, Programming Language Design
\textbf{Networks \& Security:} Computer Networks \& Security \textbf{Research Methods:} Research Methods in Computer Science, Probability \& Statistics, Experimental Design

View File

@@ -2,6 +2,6 @@
\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA} \textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA}
\textbf{Bachelor of Science in Computer Science and Engineering} \hfill \textbf{Expected May 2026} \textbf{Bachelor of Science in Computer Science} \hfill \textbf{Expected May 2026}
Engineering GPA: 3.86/4.0 \textbullet{} Dean's List: Fall 2022, Fall 2023, Spring 2024, Fall 2024, Spring 2025 Engineering GPA: 3.88/4.0 \textbullet{} Overall GPA: 3.67/4.0 \textbullet{} Dean's List: Six semesters

View File

@@ -1,38 +1,16 @@
\begin{center} \begin{center}
{\large \textscbf{\personalName}} {\large \textscbf{\personalName}}
\end{center}
\vspace{0.3em}
\vspace{0.5em}
\noindent
\begin{minipage}[t]{0.33\textwidth}
\raggedright
\ifx\personalSchoolAddressLineOne\empty\else
\mbox{}\par\nobreak\vspace{-\baselineskip}
\personalSchoolAddressLineOne\\%
\personalSchoolAddressLineTwo\\%
\personalSchoolAddressLineThree%
\fi
\end{minipage}%
\hfill%
\begin{minipage}[t]{0.33\textwidth}
\centering
\href{mailto:\personalEmail}{\personalEmail}% \href{mailto:\personalEmail}{\personalEmail}%
\ifx\personalSchoolEmail\empty\else \ifx\personalSchoolEmail\empty\else
\\\href{mailto:\personalSchoolEmail}{\personalSchoolEmail}% \ \textbullet\ \href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
\fi \fi
\\\href{https://\personalWebsite}{\personalWebsite}% \ \textbullet\ \href{https://\personalWebsite}{\personalWebsite}%
\ifx\personalPhone\empty\else \ifx\personalPhone\empty\else%
\\\personalPhone% \ \textbullet\ \personalPhone%
\fi \fi
\end{minipage}% \end{center}
\hfill%
\begin{minipage}[t]{0.33\textwidth}
\raggedleft
\ifx\personalHomeAddressLineOne\empty\else
\personalHomeAddressLineOne\\%
\personalHomeAddressLineTwo%
\fi
\end{minipage}
\vspace{1em} \vspace{0.5em}

View File

@@ -0,0 +1,7 @@
\resumesection{Publications}
\textbf{First Author, IEEE International Conference on Robot \& Human Interactive Communication (RO-MAN)}
\begin{itemize}[noitemsep,topsep=2pt]
\item O'Connor, S., et al. "HRIStudio: A Web-Based Platform for Human-Robot Interaction Studies" \textit{IEEE RO-MAN 2025}
\item O'Connor, S., et al. "A Wizard-of-Oz Framework for Reproducible HRI Research" \textit{IEEE RO-MAN 2024}
\end{itemize}

View File

@@ -0,0 +1,9 @@
\resumesection{Technical Skills}
\textbf{Robotics \& AI:} ROS/ROS2, PyTorch, Weights \& Biases, HuggingFace Transformers, OpenCV, Gazebo, NAO/Pepper SDK, Wizard-of-Oz Methodology, Computer Vision
\textbf{Embedded Systems:} C/C++, Arduino, Raspberry Pi, I2C/SPI Protocols, Real-time Control, Finite State Machines, Sensor Integration
\textbf{Software Engineering:} Python, JavaScript/TypeScript, Git/GitHub, Docker, PostgreSQL, Next.js, React, Node.js, REST APIs
\textbf{Research Tools:} MATLAB, R, LaTeX, Statistical Analysis, Experimental Design, Data Visualization, Jupyter

View File

@@ -1,13 +1,15 @@
\resumesection{Technical Skills} \resumesection{Technical Skills}
\textbf{Programming Languages:} Python, C/C++, JavaScript/TypeScript, Java, MATLAB, SQL, Bash, LaTeX \textbf{Robotics \& HRI:} ROS/ROS2, Gazebo, NAO/Pepper SDK, WebSockets, Wizard-of-Oz Methodology, Robot Teleoperation, Computer Vision
\textbf{Robotics \& HRI:} ROS/ROS2, Gazebo, NAO/Pepper SDK, WebSockets, Robot Operating System (ROS) \textbf{Embedded Systems \& Hardware:} Arduino, Raspberry Pi, I2C/SPI Protocols, Sensor Integration, Real-time Control, Finite State Machines
\textbf{Machine Learning \& AI:} PyTorch, TensorFlow, scikit-learn, LightGBM, XGBoost, OpenCV, pandas, numpy, Jupyter \textbf{Machine Learning \& AI:} PyTorch, TensorFlow, scikit-learn, LightGBM, XGBoost, OpenCV, pandas, numpy, Jupyter
\textbf{Research Tools:} Git/GitHub, Docker, Statistical Analysis (R), Experimental Design, Data Visualization \textbf{MLOps \& AI Deployment:} Weights \& Biases (W\&B), HuggingFace Transformers, Experiment Tracking, Model Versioning, Transfer Learning
\textbf{Programming Languages:} Python, C/C++, JavaScript/TypeScript, Java, MATLAB, SQL, Bash, LaTeX
\textbf{Research \& Development:} Git/GitHub, Docker, Experimental Design, Statistical Analysis (R), Data Visualization, Technical Writing
\textbf{Web \& Systems:} React, Node.js, Next.js, REST APIs, PostgreSQL, Linux, Cloud Computing, Distributed Systems \textbf{Web \& Systems:} React, Node.js, Next.js, REST APIs, PostgreSQL, Linux, Cloud Computing, Distributed Systems
\textbf{Hardware/Embedded:} Arduino, Raspberry Pi, I2C/SPI, Sensor Integration, Real-time Systems

View File

@@ -1,7 +1,7 @@
\setlength{\parindent}{0pt} \setlength{\parindent}{0pt}
\setlength{\parskip}{0em} \setlength{\parskip}{0em}
\usepackage{enumitem} \usepackage{enumitem}
\usepackage{hyperref} \usepackage[colorlinks=true,linkcolor=black,urlcolor=black,citecolor=black]{hyperref}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage[letterpaper,left=0.5in,top=0.5in,right=0.5in,bottom=0.5in]{geometry} \usepackage[letterpaper,left=0.5in,top=0.5in,right=0.5in,bottom=0.5in]{geometry}