Skip to content

Commit d65ba8e

Browse files
Add Furrow project to portfolio
1 parent 74681df commit d65ba8e

6 files changed

Lines changed: 67 additions & 4 deletions

File tree

public/images/furrow-arch.jpg

1.41 MB
Loading

public/images/furrow.png

702 KB
Loading

src/components/ProjectModal.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useEffect } from 'react';
22

3-
const ProjectModal = ({ project, onClose }) => {
3+
const ProjectModal = ({ projectId, project, onClose }) => {
44
useEffect(() => {
55
const handleEsc = (event) => {
66
if (event.key === 'Escape') {
@@ -19,18 +19,20 @@ const ProjectModal = ({ project, onClose }) => {
1919

2020
if (!project) return null;
2121

22+
const isFurrow = projectId === 'furrow';
23+
2224
return (
2325
<div className="modal" role="dialog" aria-modal="true">
2426
<div className="modal-overlay" onClick={onClose} />
25-
<div className="modal-content glass">
27+
<div className={`modal-content glass${isFurrow ? ' modal-content-wide' : ''}`}>
2628
<div className="modal-header">
2729
<h2>{project.title}</h2>
2830
<button className="close-button" onClick={onClose} aria-label="Close">
2931
×
3032
</button>
3133
</div>
3234
<div className="modal-body">
33-
<div className="modal-image">
35+
<div className={`modal-image${isFurrow ? ' modal-image-wide' : ''}`}>
3436
<img src={project.image} alt={project.title} />
3537
</div>
3638
{project.description ? (

src/components/Projects.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const Projects = ({ data }) => {
5252
</div>
5353
{activeProject ? (
5454
<ProjectModal
55+
projectId={activeProjectId}
5556
project={activeProject}
5657
onClose={() => setActiveProjectId(null)}
5758
/>

src/data/portfolio.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ export const portfolioData = {
4040
projects: {
4141
title: 'Projects',
4242
cards: [
43+
{
44+
id: 'furrow',
45+
title: 'Furrow',
46+
summary: 'Built a voice-first farm assistant over iMessage and SMS for logging operations, checking compliance, and sending proactive daily briefings.',
47+
image: '/images/furrow.png',
48+
imageAlt: 'Furrow',
49+
tags: ['FastAPI', 'React', 'PostgreSQL', 'OpenAI', 'Sendblue', 'Bitcamp 2026']
50+
},
4351
{
4452
id: 'remember-me',
4553
title: 'Remember Me',
@@ -106,6 +114,34 @@ export const portfolioData = {
106114
}
107115
],
108116
modalData: {
117+
furrow: {
118+
title: 'Furrow',
119+
image: '/images/furrow-arch.jpg',
120+
description: '',
121+
tags: [
122+
'Python',
123+
'FastAPI',
124+
'React',
125+
'PostgreSQL',
126+
'SQLAlchemy',
127+
'OpenAI',
128+
'Groq Whisper',
129+
'Gemini',
130+
'Exa',
131+
'Sendblue',
132+
'Docker',
133+
'Bitcamp 2026'
134+
],
135+
highlights: [
136+
'Built a voice-first farm operations assistant delivered over iMessage and SMS that converts messy voice notes, photos, and text messages into structured farm logs and conversational action items.',
137+
'Implemented a three-tier routing system that uses fast-path chat handling for simple requests, specialist pipelines for tasks like vision and calendar actions, and a full agentic runtime for complex multi-step workflows.',
138+
'Added chemical safety compliance checks for REI and PHI constraints, helping farmers log applications and immediately receive reminder-ready follow-up actions.',
139+
'Developed proactive daily briefings that aggregate weather impact, commodity price movement, budget burn, soil sensor signals, and recommended next actions into concise farmer updates.',
140+
'Integrated real-time research and external tools across Exa, Sendblue, Gmail, Google Calendar, and multimodal LLM providers to support market research, communication, and farm operations automation.'
141+
],
142+
link: 'https://devpost.com/software/furrow',
143+
linkText: 'View on Devpost'
144+
},
109145
'route-vlm': {
110146
title: 'RouteVLM: Cost-Aware Routing for Multimodal LLMs',
111147
image: '/images/RouteVLM.png',

src/styles/components.css

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,11 @@
309309
padding: 28px;
310310
}
311311

312+
.modal-content-wide {
313+
width: min(1120px, 96vw);
314+
max-height: 94vh;
315+
}
316+
312317
.modal-header {
313318
display: flex;
314319
align-items: center;
@@ -327,9 +332,28 @@
327332
cursor: pointer;
328333
}
329334

335+
.modal-image {
336+
display: flex;
337+
justify-content: center;
338+
margin-bottom: 18px;
339+
}
340+
341+
.modal-image-wide {
342+
margin-bottom: 22px;
343+
}
344+
330345
.modal-image img {
346+
width: auto;
347+
max-width: 100%;
348+
max-height: 360px;
349+
object-fit: contain;
331350
border-radius: var(--radius-md);
332-
margin-bottom: 18px;
351+
}
352+
353+
.modal-image-wide img {
354+
width: 100%;
355+
max-width: 1040px;
356+
max-height: 560px;
333357
}
334358

335359
.modal-description {

0 commit comments

Comments
 (0)