Update content for graduation, BU master's, and thesis
- Graduate from Bucknell May 2026, starting MS CompE at Boston University - Add honors thesis to publications with abstract and PDF - Update Dean's List to 7 semesters (Spring 2026) - Fix GPA display: Engineering GPA 3.92 / Overall 3.67 - Fix breadcrumb hidden under navbar (pt-16 on content wrapper) - Fix Research Interests card extra top padding - Update research interests blurb to grad-school voice - Save dev server config to .claude/launch.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": "0.0.1",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "personal-website",
|
||||
"runtimeExecutable": "bun",
|
||||
"runtimeArgs": ["run", "dev"],
|
||||
"port": 3000
|
||||
}
|
||||
]
|
||||
}
|
||||
+14
-1
@@ -1,5 +1,18 @@
|
||||
@inproceedings{OConnor2025,
|
||||
@mastersthesis{OConnor2026Thesis,
|
||||
title = {A Web-Based Wizard-of-Oz Platform for Collaborative and Reproducible Human-Robot Interaction Research},
|
||||
author = {Sean O'Connor},
|
||||
year = {2026},
|
||||
school = {Bucknell University},
|
||||
address = {Lewisburg, PA},
|
||||
note = {Bachelor's Honors Thesis},
|
||||
url = {https://soconnor.dev/api/publications/honors-thesis.pdf},
|
||||
paperUrl = {/api/publications/honors-thesis.pdf},
|
||||
abstract = {The Wizard-of-Oz (WoZ) technique is widely used in Human-Robot Interaction (HRI) research, but two persistent problems limit its effectiveness: existing tools impose technical barriers that exclude non-engineering domain experts (the Accessibility Problem), and the fragmented landscape of robot-specific implementations makes interaction scripts difficult to port across platforms (the Reproducibility Problem — concerning execution consistency and portability, not third-party replication). Through a literature review, I identified three design principles to address both: a hierarchical specification model, an event-driven execution model, and a plugin architecture that decouples experiment logic from robot-specific implementations. I realized these principles in HRIStudio, an open-source, web-based platform providing a visual experiment designer, a guided wizard execution interface, automated timestamped logging with deviation tracking, and role-based access control. I evaluated HRIStudio in a pilot between-subjects study (N=6) against Choregraphe, the standard programming tool for the NAO robot. HRIStudio wizards achieved higher design fidelity, execution reliability, and perceived usability across all six sessions; the only unprompted specification deviation in the dataset occurred in the Choregraphe condition. While the pilot scale precludes inferential claims, the directional evidence across all measures supports the position that a tool built to realize the identified design principles can have significant impact on accessibility and reproducibility in WoZ-based HRI research.},
|
||||
slidesUrl = {/api/publications/OConnor2026Thesis.pdf}
|
||||
}
|
||||
|
||||
@inproceedings{OConnor2025,
|
||||
title = {Collaborative and Reproducible HRI Research Through a Web-Based Wizard-of-Oz Platform},
|
||||
author = {Sean O'Connor and L. Felipe Perrone},
|
||||
year = {2025},
|
||||
booktitle = {2025 34th IEEE International Conference on Robot and Human Interactive Communication (RO-MAN)},
|
||||
|
||||
Binary file not shown.
Binary file not shown.
+11
-12
@@ -7,9 +7,13 @@ import { Sidebar } from "~/components/Sidebar";
|
||||
import { BreadcrumbWrapper } from "~/components/BreadcrumbWrapper";
|
||||
import { BreadcrumbProvider } from "~/context/BreadcrumbContext";
|
||||
|
||||
import { inter, playfair } from "~/lib/fonts";
|
||||
import { playfair } from "~/lib/fonts";
|
||||
import { description, name } from "~/lib/data";
|
||||
import "~/styles/globals.css";
|
||||
import { Inter } from "next/font/google";
|
||||
import { cn } from "~/lib/utils";
|
||||
|
||||
const inter = Inter({subsets:['latin'],variable:'--font-sans'});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: `${name[0]?.first} ${name[0]?.last}`,
|
||||
@@ -21,18 +25,13 @@ export default function RootLayout({ children }: React.PropsWithChildren) {
|
||||
return (
|
||||
<html
|
||||
lang="en"
|
||||
className={`${inter.variable} ${playfair.variable}`}
|
||||
className={cn(inter.variable, playfair.variable, "font-sans", inter.variable)}
|
||||
suppressHydrationWarning
|
||||
>
|
||||
<body
|
||||
className="relative flex min-h-screen flex-col bg-background font-sans text-foreground"
|
||||
className="flex min-h-screen flex-col bg-background font-sans text-foreground"
|
||||
suppressHydrationWarning
|
||||
>
|
||||
{/* Background Elements */}
|
||||
<div className="pointer-events-none fixed inset-0 -z-10 flex items-center justify-center overflow-hidden">
|
||||
<div className="absolute inset-0 bg-[linear-gradient(to_right,#80808012_1px,transparent_1px),linear-gradient(to_bottom,#80808012_1px,transparent_1px)] bg-[size:24px_24px] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_50%,#000_70%,transparent_100%)]"></div>
|
||||
<div className="animate-blob h-[800px] w-[800px] rounded-full bg-neutral-400/40 blur-3xl dark:bg-neutral-500/30"></div>
|
||||
</div>
|
||||
|
||||
{env.NEXT_PUBLIC_UMAMI_WEBSITE_ID && (
|
||||
<Script
|
||||
@@ -47,11 +46,11 @@ export default function RootLayout({ children }: React.PropsWithChildren) {
|
||||
|
||||
<BreadcrumbProvider>
|
||||
<Navigation />
|
||||
<div className="flex flex-1 flex-col pt-24 lg:flex-row">
|
||||
<div className="flex flex-1 flex-col pt-16 lg:flex-row">
|
||||
<Sidebar />
|
||||
<div className="min-w-0 flex-1 lg:pl-96">
|
||||
<div className="mx-auto max-w-screen-xl px-6 sm:px-8 lg:pl-0 lg:pr-8">
|
||||
<main className="pb-8 pt-4">
|
||||
<div className="min-w-0 flex-1 lg:pl-80">
|
||||
<div className="mx-auto max-w-screen-xl px-4 sm:px-6 lg:pl-0 lg:pr-6">
|
||||
<main className="p-4 pb-6 pt-6 sm:p-6 sm:pb-8 sm:pt-8">
|
||||
<BreadcrumbWrapper />
|
||||
{children}
|
||||
</main>
|
||||
|
||||
+47
-48
@@ -22,7 +22,7 @@ import {
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
} from "~/components/ui/card";
|
||||
import { awards, education, experiences, researchInterests } from "~/lib/data";
|
||||
import { awards, educationList, experiences, researchInterests } from "~/lib/data";
|
||||
|
||||
export default function HomePage() {
|
||||
const researchExperience = experiences.filter(
|
||||
@@ -47,9 +47,10 @@ export default function HomePage() {
|
||||
Sean O'Connor
|
||||
</h1>
|
||||
<p className="animate-fade-in-up-delay-2 text-xl text-muted-foreground">
|
||||
Computer Science and Engineering student passionate about
|
||||
human-robot interaction and developing technologies that make robots
|
||||
better collaborators with humans.
|
||||
Computer Science and Engineering graduate pursuing a Master's
|
||||
at Boston University. Research interests in human-robot interaction
|
||||
and developing technologies that make robots better collaborators
|
||||
with humans.
|
||||
</p>
|
||||
<div className="animate-fade-in-up-delay-3 flex flex-wrap gap-4 text-sm text-muted-foreground">
|
||||
<div className="flex items-center gap-1">
|
||||
@@ -58,23 +59,13 @@ export default function HomePage() {
|
||||
sean@soconnor.dev
|
||||
</a>
|
||||
</div>
|
||||
<div className="flex items-center gap-1">
|
||||
<Mail className="h-4 w-4" />
|
||||
<a
|
||||
href="mailto:sso005@bucknell.edu"
|
||||
className="hover:text-primary"
|
||||
>
|
||||
sso005@bucknell.edu
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-1">
|
||||
<GraduationCap className="h-4 w-4" />
|
||||
Bucknell University
|
||||
Boston University
|
||||
</div>
|
||||
<div className="flex items-center gap-1">
|
||||
<MapPin className="h-4 w-4" />
|
||||
Lewisburg, PA
|
||||
Boston, MA
|
||||
</div>
|
||||
</div>
|
||||
<div className="animate-fade-in-up-delay-4 flex gap-3">
|
||||
@@ -99,7 +90,7 @@ export default function HomePage() {
|
||||
<h2 className="text-2xl font-bold">Research Interests</h2>
|
||||
<div className="animate-fade-in-up-delay-1">
|
||||
<Card className="card-hover">
|
||||
<CardContent className="pt-6">
|
||||
<CardContent>
|
||||
<p className="leading-relaxed text-muted-foreground">
|
||||
{researchInterests}
|
||||
</p>
|
||||
@@ -111,37 +102,45 @@ export default function HomePage() {
|
||||
{/* Education */}
|
||||
<section className="animate-fade-in-up space-y-6">
|
||||
<h2 className="text-2xl font-bold">Education</h2>
|
||||
<div className="animate-fade-in-up-delay-1">
|
||||
<Card className="card-hover">
|
||||
<CardHeader className="pb-3">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<CardTitle className="mb-1">
|
||||
{education.institution}
|
||||
</CardTitle>
|
||||
<CardDescription>{education.location}</CardDescription>
|
||||
</div>
|
||||
<School className="h-5 w-5 text-muted-foreground" />
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-3 pt-0">
|
||||
<div>
|
||||
<p className="font-medium">{education.degree}</p>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
Expected {education.expectedGraduation}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Badge variant="secondary">
|
||||
Engineering GPA: {education.gpa}
|
||||
</Badge>
|
||||
<Badge variant="outline">
|
||||
Dean's List: {education.deansListSemesters.length}{" "}
|
||||
semesters
|
||||
</Badge>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
<div className="space-y-4">
|
||||
{educationList.map((edu, index) => (
|
||||
<div key={index} className={`animate-fade-in-up-delay-${index + 1}`}>
|
||||
<Card className="card-hover">
|
||||
<CardHeader className="pb-3">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<CardTitle className="mb-1">{edu.institution}</CardTitle>
|
||||
<CardDescription>{edu.location}</CardDescription>
|
||||
</div>
|
||||
<School className="h-5 w-5 text-muted-foreground" />
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-3 pt-0">
|
||||
<div>
|
||||
<p className="font-medium">{edu.degree}</p>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{edu.graduated ? "" : "Expected "}{edu.expectedGraduation}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{edu.engineeringGpa ? (
|
||||
<>
|
||||
<Badge variant="secondary">Eng. GPA: {edu.engineeringGpa}</Badge>
|
||||
<Badge variant="outline">Overall GPA: {edu.gpa}</Badge>
|
||||
</>
|
||||
) : (
|
||||
<Badge variant="secondary">GPA: {edu.gpa}</Badge>
|
||||
)}
|
||||
{edu.deansListSemesters.length > 0 && (
|
||||
<Badge variant="outline">
|
||||
Dean's List: {edu.deansListSemesters.length} semesters
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import { SiGithub } from "@icons-pack/react-simple-icons";
|
||||
|
||||
interface BrandIconProps {
|
||||
className?: string;
|
||||
size?: number;
|
||||
}
|
||||
|
||||
export function GithubIcon({ className, size = 24 }: BrandIconProps) {
|
||||
return (
|
||||
<SiGithub
|
||||
className={className}
|
||||
size={size}
|
||||
color="currentColor"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export function LinkedInIcon({ className, size = 24 }: BrandIconProps) {
|
||||
return (
|
||||
<svg
|
||||
className={className}
|
||||
width={size}
|
||||
height={size}
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.159 4.267 4.97v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,9 @@
|
||||
import { Github, Linkedin, Mail, School, GraduationCap } from "lucide-react";
|
||||
import { Mail, School, GraduationCap } from "lucide-react";
|
||||
import { SiGithub } from "@icons-pack/react-simple-icons";
|
||||
import { LinkedInIcon } from "~/components/BrandIcons";
|
||||
|
||||
const Github = SiGithub;
|
||||
const Linkedin = LinkedInIcon;
|
||||
|
||||
// TypeScript interfaces
|
||||
export interface Project {
|
||||
@@ -41,7 +46,9 @@ export interface Education {
|
||||
location: string;
|
||||
degree: string;
|
||||
expectedGraduation: string;
|
||||
graduated?: boolean;
|
||||
gpa: string;
|
||||
engineeringGpa?: string;
|
||||
deansListSemesters: string[];
|
||||
}
|
||||
|
||||
@@ -64,7 +71,7 @@ export const description =
|
||||
"Computer Science and Engineering graduate pursuing a Master's at Boston University. Research interests in human-robot interaction and developing technologies that make robots better collaborators with humans.";
|
||||
|
||||
export const researchInterests =
|
||||
"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 the intersection of human-robot interaction and research infrastructure. At Bucknell, I developed HRIStudio—a web-based platform that addresses the accessibility and reproducibility challenges endemic to Wizard-of-Oz HRI studies—resulting in two first-author publications at IEEE RO-MAN and a completed honors thesis. Continuing at Boston University, I'm interested in how principled software architecture and rigorous experimental methodology can accelerate our understanding of human-robot trust, collaboration, and the design of social robots that work reliably outside the lab.";
|
||||
|
||||
export const education: Education = {
|
||||
institution: "Boston University",
|
||||
@@ -75,6 +82,27 @@ export const education: Education = {
|
||||
deansListSemesters: [],
|
||||
};
|
||||
|
||||
export const educationList = [
|
||||
{
|
||||
institution: "Boston University",
|
||||
location: "Boston, MA",
|
||||
degree: "Master of Science in Computer Engineering",
|
||||
expectedGraduation: "May 2027",
|
||||
gpa: "TBD",
|
||||
deansListSemesters: [],
|
||||
},
|
||||
{
|
||||
institution: "Bucknell University",
|
||||
location: "Lewisburg, PA",
|
||||
degree: "Bachelor of Science in Computer Science and Engineering, Honors",
|
||||
expectedGraduation: "May 2026",
|
||||
graduated: true,
|
||||
gpa: "3.67",
|
||||
engineeringGpa: "3.92",
|
||||
deansListSemesters: ["Fall 2022", "Fall 2023", "Spring 2024", "Fall 2024", "Spring 2025", "Fall 2025", "Spring 2026"],
|
||||
},
|
||||
];
|
||||
|
||||
export const location = [
|
||||
{
|
||||
icon: School,
|
||||
@@ -163,9 +191,9 @@ export const experiences: Experience[] = [
|
||||
location: "Lewisburg, PA",
|
||||
period: "Sep 2025 – May 2026",
|
||||
description: [
|
||||
"200-page solo thesis for Bachelor of Science in Computer Science and Engineering with Honors",
|
||||
"Honors thesis for Bachelor of Science in Computer Science and Engineering with Honors",
|
||||
"Extended two published IEEE RO-MAN papers into comprehensive research for degree honors",
|
||||
"Advisor: Prof. Jeremy Perrone",
|
||||
"Advisor: Prof. L. Felipe Perrone",
|
||||
],
|
||||
type: "research",
|
||||
},
|
||||
@@ -219,19 +247,6 @@ export const experiences: Experience[] = [
|
||||
],
|
||||
type: "teaching",
|
||||
},
|
||||
{
|
||||
title: "Teaching Assistant - Software Engineering & Design",
|
||||
organization: "Computer Science Department, Bucknell University",
|
||||
location: "Lewisburg, PA",
|
||||
period: "Jan 2024 - Present",
|
||||
description: [
|
||||
"Mentor 150+ students in software engineering principles, design patterns, and collaborative development practices",
|
||||
"Developed automated testing frameworks with personalized feedback, improving learning outcomes while streamlining assessment processes",
|
||||
"Created supplementary materials connecting theoretical concepts to real-world applications, drawing from industry experience",
|
||||
"Hold regular office hours and code review sessions, fostering deep understanding of software architecture principles",
|
||||
],
|
||||
type: "teaching",
|
||||
},
|
||||
{
|
||||
title: "Computer Science Tutor",
|
||||
organization: "Engineering Study Spot, Bucknell University",
|
||||
@@ -331,10 +346,10 @@ export const experiences: Experience[] = [
|
||||
|
||||
export const awards: Award[] = [
|
||||
{
|
||||
title: "Dean's List (5 semesters)",
|
||||
title: "Dean's List (7 semesters)",
|
||||
organization: "Bucknell University",
|
||||
year: 2024,
|
||||
description: "Fall 2022, Fall 2023, Spring 2024, Fall 2024, Spring 2025",
|
||||
year: 2026,
|
||||
description: "Fall 2022, Fall 2023, Spring 2024, Fall 2024, Spring 2025, Fall 2025, Spring 2026",
|
||||
},
|
||||
{
|
||||
title: "AIChE Mid-Atlantic Chem-E-Car Competition",
|
||||
Reference in New Issue
Block a user