Skip to content

Commit 9d4c505

Browse files
Codestzclaude
andcommitted
feat(experience): promote to Senior on Recurly post + MilestoneCard component
Updates the existing Recurly project page to reflect the May 2026 promotion to Senior Software Engineer, and ships a new reusable MDX component used to celebrate it visually. Recurly post (src/content/projects/recurly.mdx): - Title and H1 changed to "Senior Software Engineer at Recurly" - Description mentions the May 2026 promotion - Role bullet updated with the promotion note - Adds a <MilestoneCard kind="promotion" .../> right after the intro paragraph showing the role transition (II -> Senior) with highlights New MilestoneCard component (src/components/mdx/MilestoneCard/): - Slim Neo-Brutalist card for career milestones - kind supports: promotion, award, launch, talk, milestone - Optional from/to transition row (strikethrough -> bold) ideal for promotions, optional date chip in the header, optional highlights list, optional subtitle - Registered in src/components/mdx/index.ts and mdx-components.tsx Also approves sharp and unrs-resolver via pnpm-workspace.yaml allowBuilds so pnpm 11's deps-status check stops failing the pre-commit hook on this branch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent ec1d95c commit 9d4c505

7 files changed

Lines changed: 154 additions & 14 deletions

File tree

mdx-components.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
Callout,
1111
ProcessFlow,
1212
StatBlock,
13+
MilestoneCard,
1314
} from '@/components/mdx';
1415
import { Mermaid } from '@/components/mdx/Mermaid';
1516

@@ -32,6 +33,7 @@ export const mdxComponents: MDXComponents = {
3233
Callout,
3334
ProcessFlow,
3435
StatBlock,
36+
MilestoneCard,
3537
// Headings
3638
h1: ({ children }) => (
3739
<h1 className="mb-4 sm:mb-6 mt-6 sm:mt-8 font-heading text-3xl sm:text-4xl font-bold uppercase text-foreground">

pnpm-workspace.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
packages:
22
- '.'
33

4-
ignoredBuiltDependencies:
5-
- sharp
6-
- unrs-resolver
4+
allowBuilds:
5+
sharp: true
6+
unrs-resolver: true
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
'use client';
2+
3+
import { ArrowRight, Award, Calendar, Mic, Rocket, Sparkles, TrendingUp } from 'lucide-react';
4+
import { cn } from '@/lib/utils';
5+
import type { MilestoneCardProps, MilestoneKind } from './MilestoneCard.types';
6+
7+
const kindConfig: Record<MilestoneKind, { label: string; Icon: typeof TrendingUp }> = {
8+
promotion: { label: 'Promotion', Icon: TrendingUp },
9+
award: { label: 'Award', Icon: Award },
10+
launch: { label: 'Launch', Icon: Rocket },
11+
talk: { label: 'Talk', Icon: Mic },
12+
milestone: { label: 'Milestone', Icon: Sparkles },
13+
};
14+
15+
/**
16+
* MilestoneCard Component - Career milestone callout
17+
* Neo-Brutalist visual for a single career event: promotion, award, launch, talk.
18+
* Optional FROM → TO transition row makes it especially fit for promotions.
19+
* Slim layout: header strip + title row + optional transition + optional highlights.
20+
*/
21+
export function MilestoneCard({
22+
title,
23+
subtitle,
24+
kind = 'milestone',
25+
date,
26+
from,
27+
to,
28+
highlights,
29+
className,
30+
}: MilestoneCardProps) {
31+
const { label, Icon } = kindConfig[kind];
32+
33+
return (
34+
<div
35+
className={cn(
36+
'my-8 overflow-hidden rounded-none border-[4px] border-foreground bg-bg-elevated shadow-[8px_8px_0px_0px] shadow-black',
37+
className
38+
)}
39+
>
40+
<div className="flex items-center gap-2 border-b-[4px] border-foreground bg-secondary px-4 py-2">
41+
<Icon size={14} className="text-secondary-text" strokeWidth={3} />
42+
<span className="font-mono text-[10px] font-bold uppercase tracking-widest text-secondary-text">
43+
{label}
44+
</span>
45+
{date && (
46+
<span className="ml-auto inline-flex items-center gap-1 font-mono text-[10px] font-bold uppercase tracking-widest text-secondary-text">
47+
<Calendar size={11} strokeWidth={3} />
48+
{date}
49+
</span>
50+
)}
51+
</div>
52+
53+
<div className="p-4 sm:p-5">
54+
<h3 className="font-heading text-lg sm:text-xl font-bold uppercase tracking-tight text-foreground leading-tight">
55+
{title}
56+
</h3>
57+
{subtitle && (
58+
<p className="mt-1 font-mono text-xs uppercase tracking-wider text-muted">{subtitle}</p>
59+
)}
60+
61+
{(from || to) && (
62+
<div className="mt-4 flex flex-wrap items-center gap-2 font-mono text-xs sm:text-sm">
63+
<span className="text-foreground/60 line-through decoration-[2px] decoration-red-500">
64+
{from ?? '—'}
65+
</span>
66+
<ArrowRight size={14} className="text-foreground" strokeWidth={3} />
67+
<span className="font-bold text-foreground">{to ?? '—'}</span>
68+
</div>
69+
)}
70+
71+
{highlights && highlights.length > 0 && (
72+
<ul className="mt-4 space-y-1 font-mono text-xs sm:text-sm">
73+
{highlights.map((item, idx) => (
74+
<li key={idx} className="flex items-start gap-2 text-foreground/90">
75+
<span className="mt-1 inline-block h-1.5 w-1.5 flex-shrink-0 bg-secondary" />
76+
<span className="leading-relaxed">{item}</span>
77+
</li>
78+
))}
79+
</ul>
80+
)}
81+
</div>
82+
</div>
83+
);
84+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export type MilestoneKind = 'promotion' | 'award' | 'launch' | 'talk' | 'milestone';
2+
3+
export interface MilestoneCardProps {
4+
title: string;
5+
subtitle?: string;
6+
kind?: MilestoneKind;
7+
date?: string;
8+
from?: string;
9+
to?: string;
10+
highlights?: string[];
11+
className?: string;
12+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { MilestoneCard } from './MilestoneCard';
2+
export type { MilestoneCardProps, MilestoneKind } from './MilestoneCard.types';

src/components/mdx/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@ export { ProcessFlow } from './ProcessFlow';
2020
export type { ProcessFlowProps, ProcessStep } from './ProcessFlow';
2121
export { StatBlock } from './StatBlock';
2222
export type { StatBlockProps, Stat } from './StatBlock';
23+
export { MilestoneCard } from './MilestoneCard';
24+
export type { MilestoneCardProps, MilestoneKind } from './MilestoneCard';

src/content/projects/recurly.mdx

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,39 @@
11
---
2-
title: "Software Engineer II at Recurly"
3-
description: "Building Recurly Commerce, a subscription management platform integrated with Shopify for recurring revenue businesses"
4-
publishedAt: "2025-07-01"
2+
title: 'Senior Software Engineer at Recurly'
3+
description: 'Building Recurly Commerce, a subscription management platform integrated with Shopify for recurring revenue businesses. Promoted to Senior Software Engineer in May 2026.'
4+
publishedAt: '2025-07-01'
55
current: true
6-
category: "current"
7-
tags: ["shopify", "subscriptions", "saas", "ecommerce", "fullstack"]
6+
category: 'current'
7+
tags: ['shopify', 'subscriptions', 'saas', 'ecommerce', 'fullstack']
88
featured: true
99
type: 'experience'
10-
author: "Esteban Estrada"
11-
thumbnail: "/images/projects/recurly.jpg"
10+
author: 'Esteban Estrada'
11+
thumbnail: '/images/projects/recurly.jpg'
1212
---
1313

14-
# Software Engineer II at Recurly
14+
# Senior Software Engineer at Recurly
1515

16-
Currently working at Recurly as a Software Engineer II, focused on building and enhancing **Recurly Commerce**, a subscription management platform that helps Shopify merchants manage recurring revenue through subscriptions, memberships, and subscription boxes.
16+
Currently working at Recurly as a **Senior Software Engineer**, focused on building and enhancing **Recurly Commerce**, a subscription management platform that helps Shopify merchants manage recurring revenue through subscriptions, memberships, and subscription boxes.
17+
18+
<MilestoneCard
19+
kind="promotion"
20+
title="Promoted to Senior Software Engineer"
21+
subtitle="Recurly · Recurly Commerce"
22+
date="May 2026"
23+
from="Software Engineer II"
24+
to="Senior Software Engineer"
25+
highlights={[
26+
'Owning end-to-end delivery on Shopify checkout and customer-portal features',
27+
'Driving architectural decisions across the subscription lifecycle layer',
28+
'Mentoring teammates and raising the floor on review quality',
29+
]}
30+
/>
1731

1832
## Experience Overview
1933

2034
- **Company**: Recurly
21-
- **Role**: Software Engineer II
22-
- **Timeline**: July 2025 - Present (8 months)
35+
- **Role**: Senior Software Engineer _(promoted from Software Engineer II, May 2026)_
36+
- **Timeline**: July 2025 - Present
2337
- **Location**: Medellín, Antioquia, Colombia
2438
- **Product**: Recurly Commerce (Shopify Subscription Platform)
2539
- **Tech Stack**: Full-stack web development, Shopify API, Payment Processing
@@ -39,41 +53,47 @@ The platform integrates directly into Shopify's native checkout experience and p
3953
## Key Responsibilities
4054

4155
### Shopify Integration Development
56+
4257
- Building and maintaining Shopify app extensions (checkout and customer account integrations)
4358
- Developing seamless integration between Recurly Commerce and Shopify's native checkout
4459
- Implementing webhook handlers for Shopify events (orders, products, customers)
4560
- Ensuring compliance with Shopify API rate limits and best practices
4661
- Working with Shopify's GraphQL Admin API for store data access
4762

4863
### Subscription Management Features
64+
4965
- Developing subscription lifecycle management (create, pause, skip, cancel)
5066
- Building bundle configuration systems (gift boxes, fixed bundles, customizable options)
5167
- Implementing pricing models (subscribe and save, tiered pricing, usage-based)
5268
- Creating trial period functionality and promotional pricing
5369
- Developing subscription modification flows (swaps, add-ons, upgrades/downgrades)
5470

5571
### Customer Portal Development
72+
5673
- Building low-code customer portal for subscription self-service
5774
- Implementing skip and swap functionality for subscription flexibility
5875
- Creating gift subscription management features
5976
- Developing subscription preference controls
6077
- Ensuring mobile-responsive portal experience
6178

6279
### Payment Processing & Billing
80+
6381
- Working with payment processing pipelines for recurring billing
6482
- Implementing retry logic for failed payments
6583
- Developing dunning management for recovering failed charges
6684
- Creating invoice generation and management systems
6785
- Handling proration calculations for subscription changes
6886

6987
### Analytics & Reporting
88+
7089
- Building analytics dashboards for merchant insights
7190
- Implementing metrics tracking (MRR, churn rate, LTV)
7291
- Creating executive reporting features
7392
- Developing data export capabilities
7493
- Integrating with third-party analytics platforms (Klaviyo, Fivetran)
7594

7695
### Churn Reduction Features
96+
7797
- Developing retention tools (pause subscriptions, incentives)
7898
- Building cancellation flow optimizations
7999
- Implementing win-back campaigns and offers
@@ -83,39 +103,47 @@ The platform integrates directly into Shopify's native checkout experience and p
83103
## Key Challenges & Solutions
84104

85105
### Challenge 1: Shopify API Rate Limiting
106+
86107
**Problem**: High-volume operations (bulk imports, sync operations) hitting Shopify API rate limits.
87108

88109
**Solution**:
110+
89111
- Implemented request queuing with exponential backoff
90112
- Built batch processing for bulk operations
91113
- Added caching layer for frequently accessed data
92114
- Created monitoring and alerting for rate limit proximity
93115
- Optimized API calls to use bulk operations where possible
94116

95117
### Challenge 2: Subscription State Synchronization
118+
96119
**Problem**: Keeping subscription state consistent between Recurly Commerce and Shopify (orders, inventory, customer data).
97120

98121
**Solution**:
122+
99123
- Implemented event-driven architecture with webhooks
100124
- Built idempotent webhook handlers to prevent duplicate processing
101125
- Created conflict resolution strategies for out-of-sync states
102126
- Added sync status tracking and manual reconciliation tools
103127
- Implemented retry mechanisms with dead letter queues
104128

105129
### Challenge 3: Complex Pricing Calculations
130+
106131
**Problem**: Handling various pricing models (tiered pricing, promotions, trials, proration) with correct tax calculations.
107132

108133
**Solution**:
134+
109135
- Built comprehensive pricing engine with rule-based calculations
110136
- Implemented preview functionality for subscription changes
111137
- Created extensive test coverage for pricing scenarios
112138
- Integrated with Shopify's tax calculation APIs
113139
- Documented pricing logic for support team reference
114140

115141
### Challenge 4: Checkout Extension Performance
142+
116143
**Problem**: Checkout extensions need to load fast to not impact conversion rates.
117144

118145
**Solution**:
146+
119147
- Optimized bundle size for checkout extensions
120148
- Implemented lazy loading for non-critical features
121149
- Added performance monitoring and alerting
@@ -125,6 +153,7 @@ The platform integrates directly into Shopify's native checkout experience and p
125153
## Skills Developed
126154

127155
**Technical Skills**:
156+
128157
- Shopify app development and ecosystem
129158
- Subscription billing system architecture
130159
- Payment processing and PCI compliance
@@ -133,20 +162,23 @@ The platform integrates directly into Shopify's native checkout experience and p
133162
- Multi-tenant SaaS architecture
134163

135164
**Domain Knowledge**:
165+
136166
- Subscription business models and metrics (MRR, churn, LTV)
137167
- E-commerce best practices
138168
- Recurring payment processing
139169
- Merchant onboarding flows
140170
- Customer retention strategies
141171

142172
**Tools & Platforms**:
173+
143174
- Shopify Admin API (GraphQL & REST)
144175
- Shopify App Extensions
145176
- Third-party integrations (Klaviyo, Postscript, Gorgias)
146177
- Payment gateway integrations
147178
- Analytics platforms
148179

149180
**Soft Skills**:
181+
150182
- Working on a product used by thousands of merchants
151183
- Balancing merchant needs with platform scalability
152184
- Cross-functional collaboration with product, design, and support teams
@@ -156,18 +188,21 @@ The platform integrates directly into Shopify's native checkout experience and p
156188
## Impact & Results
157189

158190
### Platform Performance
191+
159192
- Maintaining high availability for subscription processing (critical for recurring revenue)
160193
- Fast checkout extension load times to prevent conversion drop-off
161194
- Reliable webhook processing for real-time sync
162195
- Scalable architecture handling thousands of subscription operations daily
163196

164197
### Merchant Experience
198+
165199
- Simplified subscription setup process for new merchants
166200
- Intuitive admin interface for managing subscriptions
167201
- Comprehensive analytics for business insights
168202
- Flexible subscription options to match various business models
169203

170204
### Customer Experience
205+
171206
- Seamless Shopify-native checkout experience
172207
- Easy-to-use customer portal for subscription management
173208
- Reliable subscription deliveries and billing
@@ -176,20 +211,23 @@ The platform integrates directly into Shopify's native checkout experience and p
176211
## Technical Highlights
177212

178213
**Shopify Integration Architecture**:
214+
179215
- OAuth 2.0 authentication for merchant stores
180216
- Webhook subscriptions for real-time updates
181217
- App extensions embedded in Shopify admin and checkout
182218
- Theme app extensions for storefront integration
183219
- Metafield management for subscription data
184220

185221
**Subscription Engine**:
222+
186223
- Recurring billing scheduler with timezone handling
187224
- Subscription lifecycle state machine
188225
- Flexible pricing rule engine
189226
- Inventory allocation for upcoming orders
190227
- Automated notification system
191228

192229
**Third-Party Integrations**:
230+
193231
- Klaviyo for email marketing automation
194232
- Postscript for SMS notifications
195233
- Gorgias for customer support context

0 commit comments

Comments
 (0)