Compare commits

...

9 Commits

Author SHA1 Message Date
Eric Wagoner
7c3f9213b4 Formatting and date tweaks 2026-01-06 09:24:39 -05:00
Eric Wagoner
c52dc603e1 Update resume with expanded role history and tech details
- Add detailed progression through Infinity Interactive roles (2016-present)
- Add Elasticsearch to database skills
- Update infrastructure certifications (AWS, Atlassian)
- Update cloud platforms (GitHub, Google Cloud)
- Refine job titles for clarity

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-05 21:49:03 -05:00
Eric Wagoner
87707aa61c Add resume page and publish "I Thought I Had 15 Minutes" post
- Add standalone resume at /resume with professional two-column layout
- Publish blog post about automating standup prep
- Update post draft status to false

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-05 19:43:12 -05:00
Eric Wagoner
047905c51e Add weeknotes for December 28, 2025–January 3, 2026
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-04 00:37:36 -05:00
Eric Wagoner
f4ba98acb5 Fix post date to January 1, 2026
Update the cake post date from December 30, 2025 to January 1, 2026
since it was written and published today. Also renamed the folder to
match the correct date.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-01 14:25:19 -05:00
Eric Wagoner
fb2803ea69 Update cake post to use figure shortcodes with centered captions
Convert all images in the Yule log post to use Hugo's figure shortcode,
which provides centered, italicized captions below each image. The
existing CSS styling already handles the visual presentation with
drop shadows and proper spacing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-01 14:19:23 -05:00
Eric Wagoner
98607f936d Add new blog post: Either Way, There'll Be Cake
A story about making a gluten-free Yule log cake for second Christmas
with the family, complete with sugared cranberries, meringue mushrooms,
and a cake that split into sections but came together anyway.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-01 13:58:41 -05:00
Eric Wagoner
70847b14fb Add custom 404 error page
- Create custom 404 page matching blog layout and Eric's voice
- Includes helpful navigation links to home, tags, weeknotes, search
- References blog migrations since 2001 in a characteristically honest way
- Server-side nginx config added to blog.kestrelsnest.social.d/custom_errors.conf

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-29 11:36:02 -05:00
Eric Wagoner
84e54b08de Add weeknotes system with first entry
- Add weeknotes landing page with auto-listing of all entries
- Create first weeknote: December 20–27, 2025
- Add Weeknotes to secondary menu alongside Now/Then/Future
- Create custom layout to display all weeknotes chronologically
- Update weeknotes command to use date ranges and current time
- Credit Genehack for weeknotes inspiration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-27 11:06:20 -05:00
19 changed files with 543 additions and 13 deletions

View File

@@ -39,8 +39,8 @@ After gathering responses, create the weeknotes post:
2. **Generate frontmatter**:
```yaml
---
title: "Weeknotes: [Date in 'January 2, 2006' format]"
date: [ISO 8601 datetime with -05:00 timezone]
title: "Weeknotes: [Start date][End date], [Year]" (e.g., "December 2027, 2025")
date: [ISO 8601 datetime with -05:00 timezone, set to current time to avoid future-date issues]
draft: false
tags:
- weeknotes
@@ -77,8 +77,8 @@ If he wants to preview, run `hugo server -D` in the blog directory.
```markdown
---
title: "Weeknotes: December 27, 2025"
date: 2025-12-27T12:00:00-05:00
title: "Weeknotes: December 2027, 2025"
date: 2025-12-27T10:45:00-05:00
draft: false
tags:
- weeknotes

View File

@@ -6,9 +6,16 @@
"Bash(cat:*)",
"Read(//Users/ericwagoner/Downloads/**)",
"Bash(mysql:*)",
"Read(//Users/ericwagoner/Sites/ericwagoner.com/**)"
"Read(//Users/ericwagoner/Sites/ericwagoner.com/**)",
"Bash(curl:*)",
"Bash(ssh:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(./deploy)",
"Bash(mkdir:*)",
"Bash(chmod:*)"
],
"deny": [],
"ask": []
}
}
}

View File

@@ -1 +1 @@
{}
{"content":{"posts":{"2025-12-30-either-way-therell-be-cake":{}}}}

1
.vscode/ltex.dictionary.en-US.txt vendored Normal file
View File

@@ -0,0 +1 @@
standup

View File

@@ -97,6 +97,11 @@ theme = "m10c"
name = "Future"
url = "/upcoming/"
weight = 3
[[menu.secondary]]
identifier = "weeknotes"
name = "Weeknotes"
url = "/weeknotes/"
weight = 4
[[menu.tertiary]]
identifier = "mytweets"
name = "Local Tweet Archive"

View File

@@ -1,13 +1,13 @@
---
title: I Thought I Had 15 Minutes
date: 2026-01-06T12:00:00-05:00
draft: true
date: 2026-01-06T09:00:00-05:00
draft: false
tags:
- Programming
- Neurodivergence
- Automation
- n8n
lastmod: 2025-12-24T21:23:29.536Z
lastmod: 2026-01-06T14:24:11.833Z
description: I automated the five minutes before standup, and accidentally learned something about how my brain works.
---

View File

@@ -0,0 +1,43 @@
---
title: "Weeknotes: December 2027, 2025"
date: 2025-12-27T10:45:00-05:00
description: Slow, like the world was on pause. Everyone else off celebrating while I hung out in the quiet of home.
draft: false
tags:
- weeknotes
lastmod: 2026-01-06T04:04:15.067Z
---
_Slow, like the world was on pause. Everyone else off celebrating while I hung out in the quiet of home._
## Shipped
Built a pantry inventory app to track dry goods, herbs, and spices. It already proved useful when it reminded me about a bag of self-rising flour I needed to use up.
Also finished a five-video series of fairy-themed foods for CONpossible (this year's theme: "Through the Fairy Ring"). Each one runs about a minute, short promotional pieces that'll also go up on the Random Recipe Project channel.
## Read
Honestly, not much. I've been writing more than reading lately, and I'm making peace with that. Didn't come close to my already modest 2025 reading goal, but the words have been flowing in the other direction.
## Played
Had a great Gloomhaven session on Sunday. We're all nearing retirement for our third round of mercenaries and deep into the main storyline. The end is in sight, which makes every session feel weightier.
## Cooked
The only standalone butcher shop in town closed for good on Christmas Eve. I bought two full racks of spareribs from them as a send-off and smoked them for six hours on Wednesday. First time I'd fired up the smoker in two years. I ordered replacement parts so I can get back to using it regularly. Made a big southern squash casserole to go alongside.
That pantry app earned its keep when it surfaced a bag of self-rising flour, so I made buttermilk biscuits from scratch with sausage gravy. Also picked up some alcoholic eggnog for our morning coffees this week. A little somethin' somethin'.
## Noticed
Last week was bitter cold. This week bounced to nearly 80°F on Christmas Day. Georgia.
## Thinking About
Just starting a new project at work, a simple web app on a limited budget. The kind of thing I could do in my sleep. Times are slow and lean right now, though, and the temptation is to throw everyone and everything at it just to keep people busy. I'm pushing back. We need to know how to do small, lean projects repeatedly and in parallel. That seems to be where the industry is headed.
## What's Next
My kids were both gone this week, and my partner and I don't really celebrate Christmas, so it was genuinely quiet. Next week they'll both be here, including my eldest who's about to start their final semester of college. We'll do what we call "Second Christmas," running through the traditions on time delay. Works better for us.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

View File

@@ -0,0 +1,52 @@
---
title: Either Way, There'll Be Cake
date: 2026-01-01T12:00:00-05:00
draft: false
description: A gluten-free Yule log for second Christmas, held together by willpower and ganache.
preview: ""
tags:
- cooking
- family
- locallygrown
lastmod: 2026-01-01T19:12:22.889Z
---
My kids were home together this week for what we call "second Christmas"—the post-holiday stretch when everyone's schedules finally align. While planning the dinner menu, they made a request: a Yule log cake.
We used to get one every year from Linda Johnson of [Sylvan Falls Mill](https://northeastgeorgia.locallygrown.net/growers/1646), a miller and baker who sold at my farmers market. She made a gluten-free version, which mattered because my eldest is celiac. It was always a special treat, the kind of thing that becomes part of your family's holiday vocabulary without you noticing until it's gone.
With less than two days before dinner and a full menu to prepare, I told them it seemed really intimidating. I'd never made one. But I said I'd try.
I've baked their birthday cakes every single year, all their lives. They describe what they want and I try to make it happen. Some years are triumphs. Some years are laughable catastrophes that we still talk about. But every year there's cake. This felt like the same deal.
{{< figure src="cranberries.jpg" alt="Fresh cranberries and rosemary sprigs coated in sugar, drying on parchment paper." caption="Sugared cranberries and rosemary, made the night before." >}}
I started with a box of King Arthur's gluten-free chocolate cake mix—no shame in a good shortcut—but I needed to turn it into something that could roll without shattering. The technique I borrowed from [Sally's Baking Addiction](https://sallysbakingaddiction.com/buche-de-noel-yule-log/) calls for separating eggs, whipping the whites to stiff peaks, and folding everything together for an airy sponge. I added two extra eggs beyond what the box called for and crossed my fingers.
The cake looked great coming out of the oven. I rolled it while hot in a cocoa-dusted towel, let it cool for three hours, and felt cautiously optimistic.
Then I unrolled it.
The cake had split into sections a few inches wide. It had decided to become a kit.
{{< figure src="disaster.jpg" alt="Unrolled chocolate cake split into several vertical sections, with whipped cream filling visible in the cracks." caption="The kit." >}}
I stood there for a moment, weighing my options. Then I decided to act like nothing was wrong. I spread the whipped cream filling over the pieces, rolled the whole thing back up as tightly as I could manage, wrapped the towel around the outside, and put it in the fridge overnight to think about what it had done.
{{< figure src="mushrooms.jpg" alt="Small meringue mushrooms with piped stems and caps, dusted with cocoa powder, standing on a silicone baking mat." caption="Meringue mushrooms, dusted with cocoa." >}}
The next day, when it came time to cut the diagonal branch piece and assemble it on the board for ganache, the log barely held its shape. I worked fast. The ganache went on, I dragged a fork through it for bark texture, and suddenly it looked like an actual Yule log instead of a chocolate-flavored anxiety dream.
{{< figure src="bark.jpg" alt="Chocolate yule log covered in ganache with fork-dragged bark texture, before decorations, showing the spiral of cake and cream at the cut end." caption="Bark texture achieved. Now it just needs a forest." >}}
The garnishes helped. I'd made sugared cranberries and rosemary the night before—just a simple syrup soak and a tumble in sugar, but they sparkle like little frozen gems. The meringue mushrooms took longer than expected (piping stems and caps separately, baking low and slow, gluing them together with melted chocolate) but they're the detail that makes the whole thing feel like a forest floor instead of just a frosted cake.
{{< figure src="forest-floor.jpg" alt="Close-up of decorated yule log with meringue mushrooms, sugared cranberries, and rosemary sprigs on chocolate ganache bark." caption="The forest floor." >}}
When I brought it to the table, my kids lit up. It held together when sliced—somehow—and they said it reminded them of the Sylvan Falls version while being its own thing. The almond flour base from the market version was different, but this worked.
Linda still sells at another market these days, up in Northeast Georgia. Still using my LocallyGrown software, which makes me unreasonably happy. The web of connections from that market keeps surprising me—people I haven't seen in years, still linked by the tools we built together.
I'd make this again. Maybe it'll be a new tradition. Next time might be a perfect specimen, or I might have to pivot to calling it "a decaying log on the forest floor." Either way, there'll be cake.
{{< figure src="finished.jpg" alt="Overhead view of completed yule log cake decorated with meringue mushrooms, sugared cranberries, and sugared rosemary on a wooden cutting board." caption="Second Christmas, 2025." >}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

View File

@@ -0,0 +1,51 @@
---
title: "Weeknotes: December 28, 2025January 3, 2026"
date: 2026-01-03T12:00:00-05:00
description: Our time-shifted Christmas week was really peaceful. A couple more days before going back to work on Monday, and I'm trying to make the most of it.
draft: false
tags:
- weeknotes
lastmod: 2026-01-06T04:04:40.233Z
---
_Our time-shifted Christmas week was really peaceful. A couple more days before going back to work on Monday, and I'm trying to make the most of it._
## Shipped
Took most of the week off for the holidays with both kids here. Still managed to nearly complete a new client project we'd budgeted the entire month of January for, in about ten hours of work. Our first status call isn't until Tuesday and I've already got something over 90% of the way there. Sometimes things just come together in a near-perfect way, and I live for those moments.
On the other side, I spun down a SaaS product that never really came to fruition. There were many reasons why it didn't succeed, but it was still sad to turn off those lights.
## Read
Nothing this week, but something jumped right to the top of my to-read pile: _Automatic Noodle_ by Annalee Newitz. Deactivated robots come back online in an abandoned ghost kitchen and decide to make their own way doing what they know: hand-pulled noodles for the humans of San Francisco, who are recovering from a devastating war. Robots, food, post-apocalyptic city life? Right up my alley. I might shelve _Service Model_ temporarily so I can devour this one.
## Played
My Gloomhaven group won't be able to meet for a while, but the digital edition was on sale on Xbox for $20, complete edition. I put almost twenty hours into it this week and have only beaten two scenarios in all that time.
I know how to play the game really well, but the UI of the digital edition is beyond frustrating. So many things are undocumented, and I'm still figuring out how to do simple things like see the map while planning my round. My biggest gripe is that there's no undo function, and it's trivially easy to ruin a thought-out plan with one wrong button press. The closest they have is "restart round," which can mean losing half an hour of progress.
## Cooked
We had our Christmas meal this week. The kids chose ham, so I grabbed a big bone-in one on an after-Christmas sale (one of the benefits of Second Christmas) and used the included cherry vanilla cola glaze instead of my usual approach. Not terrible. We're still eating it several days later, but it's mostly gone. I also made baked potatoes, a big fruit salad, and a garlic-ginger stir-fried broccoli that turned out fantastic as a baked potato topper. Oh, and gluten-free cornbread.
The showstopper was the gluten-free yule log cake I largely winged and [documented on the blog](https://blog.kestrelsnest.social/posts/2026-01-01-either-way-therell-be-cake/).
The following night I set up an omelette station for dinner, which reminded me of one of my many college jobs in the campus cafeteria, where I often got to run the omelette station.
## Noticed
Cold and a little rainy, which made for good cozy time inside gaming and cooking.
## Thinking About
I'm on staff for two conventions in the next six weeks. The first is a cakewalk: sole technical troubleshooter for presenters all weekend at a tiki culture convention. I can do that work in my sleep or, as is the case here, with a different rum-based drink in each hand.
The other one is a steampunk-adjacent convention where I serve as costuming track director, and I'm really feeling the crunch on that one.
The five fairy food videos I made for CONpossible have been going live every other day and have been well received. YouTube is inscrutable as ever, but they've netted me several thousand views and a bunch of new subscribers. The con's social media team will be posting their versions in the coming weeks.
## What's Next
My youngest starts back to school Tuesday, beginning the second semester of sophomore year with a new slate of classes. She turns 16 in a month, so I need to start thinking about that. My eldest returns to college this weekend, so there's lots of coordinating to manage over the next few days.

View File

@@ -1,11 +1,10 @@
---
title: Weeknotes
type: weeknotes
aliases:
- /weeknotes/
---
Weeknotes are short, personal reflections on the week—what I shipped, read, played, cooked, noticed, and thought about. They're a way to mark time and notice patterns.
The format comes from the [weeknotes movement](https://indieweb.org/weeknotes), which grew out of the UK digital government community and spread through personal blogs. [Giles Turnbull's guide](https://doingweeknotes.com/) and [Tracy Durnell's reflections](https://tracydurnell.com/2024/07/30/using-personal-weeknotes-as-a-tool-for-attention/) shaped my approach.
Browse all weeknotes: [/tags/weeknotes](/tags/weeknotes/)
The format comes from the [weeknotes movement](https://indieweb.org/weeknotes), which grew out of the UK digital government community and spread through personal blogs. [Giles Turnbull's guide](https://doingweeknotes.com/) and [Tracy Durnell's reflections](https://tracydurnell.com/2024/07/30/using-personal-weeknotes-as-a-tool-for-attention/) shaped my approach. My friend [Genehack](https://genehack.blog/archives/) introduced me to weeknotes and inspired me to start my own after he'd been doing them for well over a year.

24
layouts/404.html Normal file
View File

@@ -0,0 +1,24 @@
{{ define "main" }}
<article class="post">
<header class="post-header">
<h1 class="post-title">404: Page Not Found</h1>
</header>
<div class="post-content">
<p>Well, this is awkward.</p>
<p>The page you're looking for isn't here. Maybe it never was, or maybe it got lost in one of the many migrations this blog has been through since 2001.</p>
<p>Here are some places you might want to try:</p>
<ul>
<li><a href="/">Home</a> — Recent posts</li>
<li><a href="/tags/">Tags</a> — Browse by topic</li>
<li><a href="/weeknotes/">Weeknotes</a> — Weekly updates</li>
<li><a href="/search/">Search</a> — Find what you're looking for</li>
</ul>
<p>Or just <a href="mailto:eric@ericwagoner.com?subject=Broken link on blog">let me know</a> if you think something should be here.</p>
</div>
</article>
{{ end }}

View File

@@ -0,0 +1,24 @@
{{ define "main" }}
<article class="post">
<header class="post-header">
<h1 class="post-title">{{ .Title }}</h1>
</header>
<div class="post-content">
{{ .Content }}
</div>
<h2>All Weeknotes</h2>
<ul class="posts-list">
{{ range (where .Site.RegularPages "Params.tags" "intersect" (slice "weeknotes")).ByDate.Reverse }}
<li class="posts-list-item">
<a class="posts-list-item-title" href="{{ .Permalink }}">{{ .Title }}</a>
<span class="posts-list-item-description">
{{ partial "icon.html" (dict "ctx" $ "name" "calendar") }}
{{ .PublishDate.Format "Jan 2, 2006" }}
</span>
</li>
{{ end }}
</ul>
</article>
{{ end }}

324
static/resume/index.html Normal file
View File

@@ -0,0 +1,324 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Eric Wagoner - Resume</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-size: 11pt;
line-height: 1.5;
color: #333;
background: #f5f5f5;
}
.page {
width: 8.5in;
min-height: 11in;
margin: 0 auto;
background: white;
display: grid;
grid-template-columns: 2.4in 1fr;
box-shadow: 0 0 20px rgba(0,0,0,0.1);
}
.sidebar {
background: #1a365d;
color: white;
padding: 0.5in 0.3in;
}
.sidebar h1 {
font-size: 24pt;
font-weight: 600;
margin-bottom: 0.1in;
line-height: 1.2;
}
.sidebar .tagline {
font-size: 9pt;
opacity: 0.85;
margin-bottom: 0.35in;
line-height: 1.4;
}
.sidebar h2 {
font-size: 10pt;
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 0.12in;
padding-bottom: 0.06in;
border-bottom: 1px solid rgba(255,255,255,0.3);
}
.sidebar section {
margin-bottom: 0.3in;
}
.sidebar p, .sidebar li {
font-size: 9pt;
opacity: 0.9;
}
.sidebar ul {
list-style: none;
}
.sidebar li {
margin-bottom: 0.04in;
}
.contact-item {
margin-bottom: 0.08in;
font-size: 9pt;
}
.main {
padding: 0.4in 0.4in 0.4in 0.35in;
}
.main h2 {
font-size: 12pt;
text-transform: uppercase;
letter-spacing: 1px;
color: #1a365d;
margin-bottom: 0.12in;
padding-bottom: 0.06in;
border-bottom: 2px solid #1a365d;
}
.main section {
margin-bottom: 0.25in;
}
.summary {
font-size: 10pt;
line-height: 1.5;
color: #444;
}
.job {
margin-bottom: 0.2in;
}
.job-header {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 0.04in;
}
.job-title {
font-weight: 600;
font-size: 11pt;
}
.job-dates {
font-size: 9pt;
color: #666;
}
.job-company {
font-size: 10pt;
color: #555;
margin-bottom: 0.08in;
}
.job ul {
margin-left: 0.15in;
font-size: 9.5pt;
}
.job li {
margin-bottom: 0.04in;
}
.early-exp {
font-size: 9.5pt;
color: #444;
}
.early-exp p {
margin-bottom: 0.06in;
}
.recognition li, .education p {
font-size: 9.5pt;
margin-bottom: 0.04in;
}
.ai-statement {
font-size: 9.5pt;
line-height: 1.5;
}
.ai-statement p {
margin-bottom: 0.1in;
}
@media print {
body { background: white; }
.page { box-shadow: none; }
}
</style>
</head>
<body>
<div class="page">
<aside class="sidebar">
<h1>Eric Wagoner</h1>
<p class="tagline">VP of Technology<br>Full-Stack Developer<br>Agricultural Technology Innovator</p>
<section>
<h2>Contact</h2>
<div class="contact-item">Athens, GA</div>
<div class="contact-item">eric@ericwagoner.com</div>
<div class="contact-item">linkedin.com/in/wagonereric</div>
<div class="contact-item">ericwagoner.com</div>
</section>
<section>
<h2>Languages & Frameworks</h2>
<ul>
<li>JavaScript/TypeScript</li>
<li>Node.js, Python, Java</li>
<li>Ruby, React, SvelteKit</li>
</ul>
</section>
<section>
<h2>Databases</h2>
<ul>
<li>MySQL, PostgreSQL</li>
<li>Elasticsearch</li>
<li>Database architecture</li>
<li>Migration strategies</li>
<li>Query optimization</li>
</ul>
</section>
<section>
<h2>Infrastructure</h2>
<ul>
<li>AWS, Atlassian (certified)</li>
<li>Docker, Linux</li>
<li>CI/CD pipelines</li>
<li>Github, Google Cloud</li>
</ul>
</section>
<section>
<h2>Practices</h2>
<ul>
<li>Test-driven development</li>
<li>Automated testing</li>
<li>Agile methodologies</li>
<li>System architecture</li>
<li>Legacy modernization</li>
</ul>
</section>
<section>
<h2>Education</h2>
<p>B.S. Astrophysics with Honors</p>
<p style="font-size: 8pt; opacity: 0.8;">New Mexico Tech, 1994</p>
<p style="margin-top: 0.1in; font-size: 8pt;">Sigma Pi Sigma Honor Society</p>
</section>
</aside>
<main class="main">
<section>
<h2>Professional Summary</h2>
<p class="summary">Technology leader with 30+ years building mission-critical software systems for biotech and research environments. Currently VP of Technology at Infinity Interactive, where I've designed web platforms for LIMS supporting genome engineering workflows, built software for liquid handling robotics used in NGS, PCR, and nucleic acid extraction, and served as senior technical advisor to biotech engineering teams. Scientific background (BS in Astrophysics, early career processing astronomical data at NRAO) provides foundation for working in research-driven, data-intensive environments. Equally skilled at designing greenfield applications and modernizing legacy systems; most recently completed a solo migration of a 19-year production platform to modern architecture with zero data loss.</p>
</section>
<section>
<h2>Professional Experience</h2>
<div class="job">
<div class="job-header">
<span class="job-title">VP of Technology</span>
<span class="job-dates">Jun 2023 Present</span>
</div>
<div class="job-header">
<span class="job-title">Manager of Software Delivery</span>
<span class="job-dates">Aug 2021 Jun 2023</span>
</div>
<div class="job-header">
<span class="job-title">Team Lead</span>
<span class="job-dates">May 2017 Aug 2021</span>
</div>
<div class="job-header">
<span class="job-title">Sr. Developer</span>
<span class="job-dates">Jan 2016 May 2017</span>
</div>
<div class="job-company">Infinity Interactive, Remote</div>
<ul>
<li>Lead technical strategy and delivery for a distributed team serving clients in biotech, healthcare, finance, and legal sectors</li>
<li>Designed and built web platforms for laboratory information management systems (LIMS) supporting genome engineering workflows: sample tracking interfaces, protocol management, and research data pipelines</li>
<li>Built software interfaces for liquid handling robotics platforms used in NGS library prep, PCR setup, and nucleic acid extraction: touchscreen UIs, protocol execution engines, and instrument integration layers</li>
<li>Developed data-intensive applications requiring high accuracy: tax filing systems, legal research portals, document management platforms</li>
<li>Selected and deployed optimal technology stacks for each engagement, balancing performance, team capabilities, and maintainability</li>
</ul>
</div>
<div class="job">
<div class="job-header">
<span class="job-title">Founder & Solo Developer</span>
<span class="job-dates">Jan 2005 Present</span>
</div>
<div class="job-company">LocallyGrown.net, Athens, GA</div>
<ul>
<li>Built and maintain a production platform serving hundreds of markets; processed over $16 million in transactions requiring financial accuracy and data integrity</li>
<li>Designed multi-tenant architecture with shared database supporting cross-market inventory synchronization</li>
<li>Completed a 6-month solo migration from legacy Rails to modern SvelteKit: 23 data models, comprehensive test coverage, zero data loss</li>
<li>Manage full lifecycle as sole developer: architecture, development, database administration, operations, support</li>
</ul>
</div>
<div class="job">
<div class="job-header">
<span class="job-title">Head of Testing / "Utility Infielder" Senior Dev</span>
<span class="job-dates">Jul 1997 Oct 2015</span>
</div>
<div class="job-company">Partner Software, Athens, GA</div>
<ul>
<li>Joined months after founding; grew with the company through every phase of the startup lifecycle</li>
<li>Developed web-based system configuration tools and workflow management systems for enterprise networks</li>
<li>Built an extensible data-to-PDF reporting system using XSL/FOP and later iText</li>
</ul>
</div>
</section>
<section>
<h2>Earlier Experience</h2>
<div class="early-exp">
<p><strong>Socorro Electric Cooperative</strong>, Engineering Technician (19941997): Managed GIS systems, oversaw enterprise software conversions.</p>
<p><strong>National Radio Astronomy Observatory</strong>, Student Employee (19921994): Developed scientific data processing tools in UNIX/Solaris; converted raw radio telescope data from India into a searchable graphical sky map with spatial indexing.</p>
</div>
</section>
<section>
<h2>Recognition</h2>
<ul class="recognition">
<li><strong>Barbara Petit Pollinator Award</strong> (Georgia Organics, 2015) Recognized for creating "a national model for connecting growers to consumers."</li>
<li><strong>Alec Little Environmental Award</strong> (UGA Odum School of Ecology, 2012) Honored for environmental responsibility and sustainable agriculture work.</li>
</ul>
</section>
<section>
<h2>Statement on the Use of AI</h2>
<div class="ai-statement">
<p>I use AI-assisted development tools extensively, and I've been deliberate about how.</p>
<p>The hype around AI makes it trivial to abdicate responsibility. Developers generate prodigious amounts of unmaintainable code that technically works for the happy path, call it productivity, and move on. I find that approach corrosive to the craft.</p>
<p>What I embrace is assistive AI: tools that amplify the skills I've spent forty years developing. They remove mechanical friction (transcription, syntax lookup, boilerplate) so I can focus on architecture, problem-solving, and building software that serves real humans. The thinking is mine. The decisions are mine. The responsibility is mine.</p>
<p>I name my AI coding agents after people who inspire me: George Washington Carver, Ray Eames, Ada Lovelace. The tools don't have personalities, but the names remind me who the work is for. They're lenses that focus intent, not collaborators with agency.</p>
<p>I've written extensively about this philosophy and regularly teach other developers how a more thoughtful approach can work, whether they've given in to abdication or been revulsed by it.</p>
</div>
</section>
</main>
</div>
</body>
</html>