-->
Company: Archer Affiliates (NYC-based Startup)
Role: Lead Frontend Engineer
Project Type: Complete Platform Redesign & Chrome Extension
Market: Amazon Affiliates Marketing
Archer Affiliates is an Amazon affiliates platform that helps marketers manage and optimize their affiliate campaigns. I joined as lead frontend engineer to tackle a critical challenge: the platform was out of sync, off-brand, and inconsistent, a patchwork of pages built without cohesive design or user experience strategy.
The transformation required redesigning the entire platform page by page while maintaining backward compatibility, as old and new pages had to coexist during the multi-month migration. This challenge led to innovative solutions like compatibility components (“SidebarCompat”) that bridged legacy and modern codebases.
Business Impact
Technical Leadership
Team Building
Problems Identified:
Visual Inconsistency
UX Fragmentation
Technical Debt
Business Impact:
Challenge: Can’t take platform offline for complete rewrite. New and old pages must coexist during multi-month transition.
Constraints:
Solution: Page-by-Page Migration with Compatibility Layer
archer-platform/
├── components/
│ ├── modern/ # New design system
│ │ ├── Sidebar/
│ │ ├── Header/
│ │ ├── Button/
│ │ └── ...
│ ├── compat/ # Compatibility components
│ │ ├── SidebarCompat/ # Works with legacy pages
│ │ ├── HeaderCompat/ # Bridges old/new
│ │ └── ...
│ └── legacy/ # Original components (deprecated)
│ └── ...
├── pages/
│ ├── dashboard/ # ✅ Redesigned
│ ├── campaigns/ # ✅ Redesigned
│ ├── analytics/ # 🚧 In progress
│ └── settings/ # ⏳ Legacy (pending)
Compatibility Component Pattern:
// SidebarCompat: Works with both legacy and modern routing
interface SidebarCompatProps {
mode?: "legacy" | "modern";
routes: Route[];
onNavigate?: (path: string) => void; // For legacy callback-based nav
}
export function SidebarCompat({
mode = "modern",
routes,
onNavigate,
}: SidebarCompatProps) {
const router = useRouter(); // Modern Next.js routing
const handleNavigation = (path: string) => {
if (mode === "legacy" && onNavigate) {
onNavigate(path); // Call legacy callback
} else {
router.push(path); // Use modern routing
}
};
return <Sidebar routes={routes} onNavigate={handleNavigation} />;
}
Migration Process:
Design System Establishment
Page Prioritization
Incremental Rollout
Legacy Cleanup
Result:
Advantages:
Customization:
// Custom Archer theme
const archerTheme = createTheme({
palette: {
primary: {
main: "#1A73E8", // Archer blue
},
secondary: {
main: "#34A853", // Success green
},
},
typography: {
fontFamily: '"Inter", "Helvetica", "Arial", sans-serif',
h1: {
fontSize: "2.5rem",
fontWeight: 600,
},
// ... custom typography scale
},
components: {
MuiButton: {
styleOverrides: {
root: {
borderRadius: 8,
textTransform: "none",
fontWeight: 500,
},
},
},
// ... custom component overrides
},
});
@archer/ui (NPM package)
├── components/
│ ├── Button/
│ ├── Card/
│ ├── DataTable/
│ ├── Sidebar/
│ ├── Header/
│ ├── Modal/
│ ├── Form/
│ │ ├── TextInput/
│ │ ├── Select/
│ │ ├── DatePicker/
│ │ └── ...
│ └── ...
├── theme/
│ ├── theme.ts
│ ├── colors.ts
│ └── typography.ts
└── index.ts
Key Components Built:
Support requests scattered across:
Result: Lost tickets, slow response times, frustrated users.
Implementation:
1. Custom Intercom SDK
// @archer/intercom (NPM package)
export class ArcherIntercom {
private intercom: IntercomClient;
initialize(appId: string, userHash?: string) {
// Initialize Intercom widget
}
openTicket(metadata?: TicketMetadata) {
// Open support widget with context
}
updateUser(userData: UserData) {
// Sync user data to Intercom
}
trackEvent(eventName: string, metadata?: object) {
// Track user actions for support context
}
}
2. Integration Points
Contact Forms
Help & Support Pages
In-App Support Widget
3. Admin Panel
Ticket Dashboard
Ticket Detail View
Analytics
Result:
Initially hired as frontend engineer, but backend became bottleneck for feature shipping.
Backend Team Challenges:
What I Did:
1. FastAPI Email Integration
# Email service endpoints
from fastapi import APIRouter, Depends
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
router = APIRouter()
@router.post("/emails/send")
async def send_email(
recipient: str,
template_id: str,
dynamic_data: dict,
current_user: User = Depends(get_current_user)
):
# Send templated email via SendGrid
message = Mail(
from_email='[email protected]',
to_emails=recipient
)
message.template_id = template_id
message.dynamic_template_data = dynamic_data
sg = SendGridAPIClient(settings.SENDGRID_API_KEY)
response = sg.send(message)
return {"status": "sent", "message_id": response.message_id}
2. SendGrid Template Management
3. API Development While Backend Focused Elsewhere
Skills Acquired:
Result:
Requirement: Build Chrome extension for Archer with:
Problem: Chrome extensions are separate codebases by default. How to avoid duplicating UI and logic?
Architecture:
archer-monorepo/
├── packages/
│ ├── @archer/ui/ # Shared design system
│ │ ├── components/
│ │ ├── theme/
│ │ └── package.json
│ ├── @archer/intercom/ # Shared Intercom SDK
│ │ ├── sdk/
│ │ ├── types/
│ │ └── package.json
│ └── @archer/shared-logic/ # Shared business logic
│ ├── utils/
│ ├── hooks/
│ └── package.json
├── apps/
│ ├── web/ # Next.js web platform
│ │ ├── package.json # Depends on @archer/*
│ │ └── ...
│ └── extension/ # Plasmo Chrome extension
│ ├── package.json # Depends on @archer/*
│ └── ...
Package Dependencies:
// apps/web/package.json
{
"dependencies": {
"@archer/ui": "workspace:*",
"@archer/intercom": "workspace:*",
"@archer/shared-logic": "workspace:*"
}
}
// apps/extension/package.json
{
"dependencies": {
"@archer/ui": "workspace:*",
"@archer/intercom": "workspace:*",
"@archer/shared-logic": "workspace:*"
}
}
Advantages:
Same Components, Different Contexts:
// Shared Button component used in both web and extension
import { Button } from "@archer/ui";
// Web platform usage
function DashboardPage() {
return <Button onClick={handleClick}>View Campaign</Button>;
}
// Chrome extension usage
function ExtensionPopup() {
return <Button onClick={handleClick}>View Campaign</Button>;
}
Intercom Integration:
// Shared Intercom SDK works in both contexts
import { ArcherIntercom } from "@archer/intercom";
// Initialize in web
useEffect(() => {
ArcherIntercom.initialize(INTERCOM_APP_ID, userHash);
}, []);
// Initialize in extension (same API)
useEffect(() => {
ArcherIntercom.initialize(INTERCOM_APP_ID, userHash);
}, []);
Core Functionality:
Technical Implementation:
Result:
Context: Archer needed to scale. CEO trusted my technical judgment and network.
My Approach:
Hires Through My Network:
2 Engineers
1 QA Engineer
1 Project Manager
Retention Rate: 75% (3/4 still employed after 1+ year)
Why This Worked:
Impact:
Lesson: Major redesigns don’t require “big bang” rewrites.
Page-by-page migration with compatibility layer:
Compat components pattern:
Lesson: Extracting shared code into packages prevents duplication and ensures consistency.
Benefits:
When to extract:
Lesson: Frontend engineers can unblock themselves by learning backend.
My path:
Impact:
Lesson: Personal referrals have higher success rate than cold hiring.
Why 75% retention:
Risk:
Lesson: Investment in design system pays off quickly at scale.
Material UI choice:
Custom vs Framework:
Frontend: Next.js + React + TypeScript + Material UI
Backend: FastAPI (Python)
Email: SendGrid (transactional emails)
Support: Intercom (custom SDK)
Chrome Extension: Plasmo + React
Code Sharing: NPM packages (@archer/ui, @archer/intercom)
Architecture: Monorepo with shared packages
Migration Strategy: Page-by-page with compatibility layer
Archer Affiliates demonstrated that redesigning a legacy platform doesn’t require shutting down for months. By architecting a backward-compatible migration strategy with compatibility components like “SidebarCompat,” old and new pages coexisted peacefully during the multi-month transformation.
The 50% sales increase following the redesign validated that consistent UI/UX directly impacts business metrics. Users no longer faced a confusing patchwork of styles, they experienced a cohesive, professional platform.
Extracting the design system and Intercom SDK into shared NPM packages enabled building the Chrome extension with zero code duplication. The result: exact same UX across web platform and extension, shipped in weeks instead of months.
Expanding from frontend to full-stack (FastAPI + SendGrid integration) demonstrated the value of versatility. When backend became a bottleneck, I unblocked myself by learning the stack and building APIs directly.
Building the hiring pipeline through personal network, recruiting 4 team members with 75% retention after 1+ year, showed that trusted referrals outperform cold hiring. The CEO’s trust extended to offering a Product Manager role, validation that technical leadership includes team building, not just code.
The transformation from “out of sync, out of brand, out of shape” to a cohesive, high-performing platform earning 50% more revenue proves that frontend engineering impact extends far beyond pixels on screen.
Send me an email or message me on LinkedIn if you're looking for someone who builds without BS.