6 Commits

Author SHA1 Message Date
Sean O'Connor
5b99a95078 refactor: Replace softprops/action-gh-release with ncipollo/release-action for GitHub release creation.
Some checks failed
Compile LaTeX Documents / build-public (push) Failing after 36s
Compile LaTeX Documents / build-private (push) Failing after 27s
2026-02-04 10:13:29 -05:00
Sean O'Connor
fa5d42251d chore: Explicitly pass GITHUB_TOKEN to release actions. 2026-02-04 10:04:27 -05:00
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
16 changed files with 315 additions and 360 deletions

View File

@@ -64,30 +64,36 @@ jobs:
- name: List generated PDFs - name: List generated PDFs
run: ls -la *.pdf run: ls -la *.pdf
# Create/update latest release
- name: Upload Public PDFs as Release - name: Upload Public PDFs as Release
uses: svenstaro/upload-release-action@v2 uses: ncipollo/release-action@v1
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} artifacts: "resume.pdf,cv.pdf"
file: "*.pdf"
tag: latest tag: latest
overwrite: true name: Latest PDFs
file_glob: true
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 }}
token: ${{ secrets.GITHUB_TOKEN }}
allowUpdates: true
removeArtifacts: true
replacesArtifacts: true
# Create a numbered release for version history # Create a numbered release for version history
- name: Create Numbered Release - name: Create Numbered Release
uses: svenstaro/upload-release-action@v2 uses: ncipollo/release-action@v1
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} artifacts: "resume.pdf,cv.pdf"
file: "*.pdf"
tag: release-${{ github.run_number }} tag: release-${{ github.run_number }}
overwrite: true name: Release ${{ github.run_number }}
file_glob: true
body: | body: |
Version ${{ github.run_number }} of resume and CV (public version) Automated release #${{ github.run_number }}
Built from commit ${{ github.sha }}
token: ${{ secrets.GITHUB_TOKEN }}
draft: false
prerelease: false
build-private: build-private:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -150,7 +156,7 @@ jobs:
run: ls -la *.pdf run: ls -la *.pdf
- name: Upload Private PDFs - name: Upload Private PDFs
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: private-documents name: private-documents
path: | path: |

39
.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
personal_info.tex
# macOS system files
.DS_Store .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,7 +9,7 @@ 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
@@ -39,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
``` ```
@@ -51,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,124 +0,0 @@
#!/bin/bash
# Check if building specific CV variant
CV_VARIANT=""
if [ "$1" = "cv-upenn" ]; then
CV_VARIANT="cv-upenn"
echo "Building UPenn-optimized CV..."
fi
# 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 specific CV variant if requested
if [ "$CV_VARIANT" = "cv-upenn" ]; then
build_local cv-upenn.tex
mv cv-upenn.pdf output/cv-upenn.pdf
echo "UPenn CV build complete! Generated: output/cv-upenn.pdf"
else
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/
fi

31
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,12 +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 Currently developing honors thesis evaluating platform effectiveness and impact on interdisciplinary HRI research accessibility \item Designed comprehensive data logging system capturing interaction timelines, robot states, and experimental conditions with microsecond precision for reproducibility analysis
\item Conducted literature review identifying key challenges in WoZ methodology reproducibility, informing platform design decisions and feature prioritization \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}
@@ -95,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
@@ -216,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 \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}}
\vspace{0.3em}
\href{mailto:\personalEmail}{\personalEmail}%
\ifx\personalSchoolEmail\empty\else
\ \textbullet\ \href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
\fi
\ \textbullet\ \href{https://\personalWebsite}{\personalWebsite}%
\ifx\personalPhone\empty\else%
\ \textbullet\ \personalPhone%
\fi
\end{center} \end{center}
\vspace{0.5em} \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}%
\ifx\personalSchoolEmail\empty\else
\\\href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
\fi
\\\href{https://\personalWebsite}{\personalWebsite}%
\ifx\personalPhone\empty\else
\\\personalPhone%
\fi
\end{minipage}%
\hfill%
\begin{minipage}[t]{0.33\textwidth}
\raggedleft
\ifx\personalHomeAddressLineOne\empty\else
\personalHomeAddressLineOne\\%
\personalHomeAddressLineTwo%
\fi
\end{minipage}
\vspace{1em}

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