From b592d68433fcccd91779cb8e47a4563a8b3cecd1 Mon Sep 17 00:00:00 2001
From: Nick Sullivan
Date: Tue, 20 Jan 2026 19:17:53 -0600
Subject: [PATCH 01/19] =?UTF-8?q?=F0=9F=93=8A=20Add=20GitHub=20stats=20tra?=
=?UTF-8?q?cking=20infrastructure?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Add Python script to collect commit stats by email
- Add GitHub Action to run weekly
- Store stats in data/stats.json with monthly breakdown
- Resumes from where it left off to handle rate limits
Co-Authored-By: Claude Opus 4.5
---
.github/workflows/update-stats.yml | 30 ++++++
data/stats.json | 60 +++++++++++
scripts/github-stats.sh | 44 ++++++++
scripts/update-stats.sh | 110 ++++++++++++++++++++
scripts/update_stats.py | 155 +++++++++++++++++++++++++++++
5 files changed, 399 insertions(+)
create mode 100644 .github/workflows/update-stats.yml
create mode 100644 data/stats.json
create mode 100644 scripts/github-stats.sh
create mode 100644 scripts/update-stats.sh
create mode 100644 scripts/update_stats.py
diff --git a/.github/workflows/update-stats.yml b/.github/workflows/update-stats.yml
new file mode 100644
index 0000000..6fde62d
--- /dev/null
+++ b/.github/workflows/update-stats.yml
@@ -0,0 +1,30 @@
+name: Update GitHub Stats
+
+on:
+ schedule:
+ - cron: '0 0 * * 0' # Weekly on Sunday
+ workflow_dispatch: # Manual trigger
+
+jobs:
+ update:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.12'
+
+ - name: Update stats
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: python scripts/update_stats.py
+
+ - name: Commit changes
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ git add data/stats.json
+ git diff --quiet --cached || git commit -m "📊 Update GitHub stats"
+ git push
diff --git a/data/stats.json b/data/stats.json
new file mode 100644
index 0000000..e0a661c
--- /dev/null
+++ b/data/stats.json
@@ -0,0 +1,60 @@
+{
+ "commits": 17715,
+ "repos": 130,
+ "updated": "2026-01-20",
+ "by_month": {
+ "2011-05": 29,
+ "2011-06": 13,
+ "2011-12": 78,
+ "2012-01": 19,
+ "2012-03": 41,
+ "2012-04": 29,
+ "2012-07": 14,
+ "2012-08": 43,
+ "2012-09": 85,
+ "2012-10": 65,
+ "2012-11": 28,
+ "2012-12": 76,
+ "2013-01": 14,
+ "2013-02": 7,
+ "2013-03": 20,
+ "2013-04": 8,
+ "2013-05": 229,
+ "2013-06": 4,
+ "2013-07": 3,
+ "2013-08": 12,
+ "2013-09": 53,
+ "2013-10": 61,
+ "2013-11": 24,
+ "2013-12": 365,
+ "2014-01": 531,
+ "2014-02": 510,
+ "2014-03": 164,
+ "2014-04": 142,
+ "2014-05": 269,
+ "2014-06": 486,
+ "2014-07": 178,
+ "2014-08": 92,
+ "2014-09": 39,
+ "2014-10": 58,
+ "2024-01": 0,
+ "2024-02": 1,
+ "2024-03": 9,
+ "2024-04": 1,
+ "2024-05": 4,
+ "2024-06": 105,
+ "2024-07": 198,
+ "2024-08": 299,
+ "2024-09": 231,
+ "2024-10": 83,
+ "2024-11": 43,
+ "2024-12": 63,
+ "2025-01": 189,
+ "2025-02": 427,
+ "2025-03": 239
+ },
+ "emails": [
+ "nick@technick.ai",
+ "nick@sullivanflock.com"
+ ]
+}
\ No newline at end of file
diff --git a/scripts/github-stats.sh b/scripts/github-stats.sh
new file mode 100644
index 0000000..200ce8e
--- /dev/null
+++ b/scripts/github-stats.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# GitHub Stats for TechNickAI
+# Uses GitHub Search API to get accurate commit counts
+
+USERNAME="TechNickAI"
+
+echo "=== GitHub Stats for $USERNAME ==="
+echo ""
+
+# Total commits
+total=$(gh api "search/commits?q=author:$USERNAME&per_page=1" --jq '.total_count' 2>/dev/null)
+echo "TOTAL COMMITS: $total"
+echo ""
+
+# Commits by year
+echo "COMMITS BY YEAR:"
+echo "----------------"
+current_year=$(date +%Y)
+for year in $(seq $current_year -1 2011); do
+ count=$(gh api "search/commits?q=author:$USERNAME+committer-date:${year}-01-01..${year}-12-31&per_page=1" --jq '.total_count' 2>/dev/null)
+ if [ -n "$count" ] && [ "$count" != "0" ]; then
+ printf "%s: %6d\n" "$year" "$count"
+ fi
+done
+
+echo ""
+
+# Total repos (personal + orgs)
+echo "REPOS:"
+echo "------"
+personal=$(gh api "users/$USERNAME/repos" --paginate --jq '.[].name' 2>/dev/null | wc -l | tr -d ' ')
+echo "Personal: $personal"
+
+orgs=$(gh api user/orgs --jq '.[].login' 2>/dev/null)
+org_total=0
+for org in $orgs; do
+ count=$(gh api "orgs/$org/repos" --jq 'length' 2>/dev/null || echo "0")
+ if [ "$count" != "0" ]; then
+ echo "$org: $count"
+ org_total=$((org_total + count))
+ fi
+done
+echo "Org total: $org_total"
+echo "TOTAL REPOS: $((personal + org_total))"
diff --git a/scripts/update-stats.sh b/scripts/update-stats.sh
new file mode 100644
index 0000000..92f170b
--- /dev/null
+++ b/scripts/update-stats.sh
@@ -0,0 +1,110 @@
+#!/bin/bash
+# Update GitHub stats for technick.ai
+# Queries both email addresses, resumes from where it left off
+
+EMAILS=("nick@technick.ai" "nick@sullivanflock.com")
+OUTPUT_FILE="data/stats.json"
+
+echo "Fetching GitHub stats..."
+
+# Read existing data if present
+if [ -f "$OUTPUT_FILE" ]; then
+ existing=$(cat "$OUTPUT_FILE")
+else
+ existing='{}'
+fi
+
+# Get total commits across both emails
+total_commits=0
+for email in "${EMAILS[@]}"; do
+ count=$(gh api "search/commits?q=author-email:$email&per_page=1" --jq '.total_count' 2>/dev/null || echo 0)
+ if [[ "$count" =~ ^[0-9]+$ ]]; then
+ echo " $email: $count"
+ total_commits=$((total_commits + count))
+ fi
+done
+echo "Total commits: $total_commits"
+
+# Get total repos
+personal=$(gh api "users/TechNickAI/repos" --paginate --jq '.[].name' 2>/dev/null | wc -l | tr -d ' ')
+org_repos=0
+for org in $(gh api user/orgs --jq '.[].login' 2>/dev/null); do
+ count=$(gh api "orgs/$org/repos" --jq 'length' 2>/dev/null || echo 0)
+ org_repos=$((org_repos + count))
+done
+repos=$((personal + org_repos))
+echo "Total repos: $repos"
+
+# Extract existing by_month data
+existing_months=$(echo "$existing" | jq -r '.by_month // {} | keys[]' 2>/dev/null || echo "")
+
+# Build list of all months from 2011 to now
+current_year=$(date +%Y)
+current_month=$(date +%m)
+all_months=""
+for year in $(seq 2011 $current_year); do
+ max_month=12
+ if [ "$year" = "$current_year" ]; then
+ max_month=$((10#$current_month))
+ fi
+ for month in $(seq 1 $max_month); do
+ all_months="$all_months ${year}-$(printf '%02d' $month)"
+ done
+done
+
+# Collect monthly data, skipping already collected months
+by_month="{"
+rate_limited=false
+for ym in $all_months; do
+ # Check if already have this month
+ if echo "$existing_months" | grep -q "^$ym$"; then
+ value=$(echo "$existing" | jq -r ".by_month[\"$ym\"]")
+ by_month="$by_month\"$ym\": $value,"
+ continue
+ fi
+
+ if $rate_limited; then
+ continue
+ fi
+
+ year=${ym%-*}
+ month=${ym#*-}
+
+ if [ "$month" = "12" ]; then
+ end="$((year + 1))-01-01"
+ else
+ next=$(printf "%02d" $((10#$month + 1)))
+ end="${year}-${next}-01"
+ fi
+
+ month_total=0
+ for email in "${EMAILS[@]}"; do
+ count=$(gh api "search/commits?q=author-email:$email+committer-date:${year}-${month}-01..${end}&per_page=1" --jq '.total_count' 2>/dev/null)
+ if [[ "$count" =~ ^[0-9]+$ ]]; then
+ month_total=$((month_total + count))
+ else
+ echo "Rate limited at $ym"
+ rate_limited=true
+ break
+ fi
+ done
+
+ if ! $rate_limited && [ "$month_total" -gt 0 ]; then
+ by_month="$by_month\"$ym\": $month_total,"
+ echo " $ym: $month_total"
+ fi
+done
+by_month="${by_month%,}}"
+
+# Write JSON
+cat > "$OUTPUT_FILE" << EOF
+{
+ "commits": $total_commits,
+ "repos": $repos,
+ "updated": "$(date -u +%Y-%m-%d)",
+ "by_month": $by_month,
+ "emails": ["nick@technick.ai", "nick@sullivanflock.com"]
+}
+EOF
+
+echo "Updated $OUTPUT_FILE"
diff --git a/scripts/update_stats.py b/scripts/update_stats.py
new file mode 100644
index 0000000..29866d2
--- /dev/null
+++ b/scripts/update_stats.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python3
+"""
+Update GitHub stats for technick.ai
+Queries both email addresses, resumes from where it left off
+"""
+
+import json
+import subprocess
+import sys
+from datetime import datetime
+from pathlib import Path
+
+EMAILS = ["nick@technick.ai", "nick@sullivanflock.com"]
+OUTPUT_FILE = Path("data/stats.json")
+
+
+def gh_api(endpoint: str) -> dict | list | None:
+ """Call GitHub API via gh CLI"""
+ try:
+ result = subprocess.run(
+ ["gh", "api", endpoint],
+ capture_output=True,
+ text=True,
+ timeout=30,
+ )
+ if result.returncode == 0:
+ return json.loads(result.stdout)
+ if "rate limit" in result.stderr.lower():
+ return None # Rate limited
+ return None
+ except (subprocess.TimeoutExpired, json.JSONDecodeError):
+ return None
+
+
+def get_commit_count_by_email(email: str) -> int | None:
+ """Get total commits for an email address"""
+ data = gh_api(f"search/commits?q=author-email:{email}&per_page=1")
+ if data and "total_count" in data:
+ return data["total_count"]
+ return None
+
+
+def get_monthly_commits(email: str, year: int, month: int) -> int | None:
+ """Get commits for a specific month"""
+ start = f"{year}-{month:02d}-01"
+ if month == 12:
+ end = f"{year + 1}-01-01"
+ else:
+ end = f"{year}-{month + 1:02d}-01"
+
+ data = gh_api(f"search/commits?q=author-email:{email}+committer-date:{start}..{end}&per_page=1")
+ if data and "total_count" in data:
+ return data["total_count"]
+ return None
+
+
+def get_repo_count() -> int:
+ """Get total repos across personal and orgs"""
+ total = 0
+
+ # Personal repos
+ personal = gh_api("users/TechNickAI/repos?per_page=100")
+ if personal:
+ total += len(personal)
+
+ # Org repos
+ orgs = gh_api("user/orgs")
+ if orgs:
+ for org in orgs:
+ org_repos = gh_api(f"orgs/{org['login']}/repos?per_page=100")
+ if org_repos:
+ total += len(org_repos)
+
+ return total
+
+
+def main():
+ print("Fetching GitHub stats...")
+
+ # Load existing data
+ existing = {}
+ if OUTPUT_FILE.exists():
+ with open(OUTPUT_FILE) as f:
+ existing = json.load(f)
+
+ # Get total commits
+ total_commits = 0
+ for email in EMAILS:
+ count = get_commit_count_by_email(email)
+ if count is not None:
+ print(f" {email}: {count}")
+ total_commits += count
+ else:
+ print(f" {email}: rate limited or error")
+
+ print(f"Total commits: {total_commits}")
+
+ # Get repo count
+ repos = get_repo_count()
+ print(f"Total repos: {repos}")
+
+ # Get monthly data, resuming from existing
+ existing_months = existing.get("by_month", {})
+ by_month = dict(existing_months) # Start with what we have
+
+ now = datetime.now()
+ rate_limited = False
+
+ for year in range(2011, now.year + 1):
+ max_month = 12 if year < now.year else now.month
+ for month in range(1, max_month + 1):
+ key = f"{year}-{month:02d}"
+
+ # Skip if we already have this month
+ if key in by_month:
+ continue
+
+ if rate_limited:
+ continue
+
+ month_total = 0
+ for email in EMAILS:
+ count = get_monthly_commits(email, year, month)
+ if count is None:
+ print(f"Rate limited at {key}")
+ rate_limited = True
+ break
+ month_total += count
+
+ if not rate_limited and month_total > 0:
+ by_month[key] = month_total
+ print(f" {key}: {month_total}")
+
+ # Sort by_month by key
+ by_month = dict(sorted(by_month.items()))
+
+ # Write output
+ output = {
+ "commits": total_commits,
+ "repos": repos,
+ "updated": datetime.now().strftime("%Y-%m-%d"),
+ "by_month": by_month,
+ "emails": EMAILS,
+ }
+
+ OUTPUT_FILE.parent.mkdir(parents=True, exist_ok=True)
+ with open(OUTPUT_FILE, "w") as f:
+ json.dump(output, f, indent=2)
+
+ print(f"Updated {OUTPUT_FILE}")
+ print(f"Collected {len(by_month)} months of data")
+
+
+if __name__ == "__main__":
+ main()
From 200bf2ce41af0bd9c528436c566b0b3628e08931 Mon Sep 17 00:00:00 2001
From: Nick Sullivan
Date: Tue, 20 Jan 2026 19:18:02 -0600
Subject: [PATCH 02/19] =?UTF-8?q?=E2=9C=A8=20Add=20career=20page=20with=20?=
=?UTF-8?q?timeline=20and=20commits=20chart?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Hero with 4 key stats ($840M, 2 exits, 3× Employee #1, 27 years)
- Interactive commits chart using Chart.js
- Timeline showing career progression from 1998-2025
- Community builder section
- The Stack ecosystem diagram
- Skills and connect sections
- PostHog analytics integration
Co-Authored-By: Claude Opus 4.5
---
career/index.html | 980 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 980 insertions(+)
create mode 100644 career/index.html
diff --git a/career/index.html b/career/index.html
new file mode 100644
index 0000000..dc72c17
--- /dev/null
+++ b/career/index.html
@@ -0,0 +1,980 @@
+
+
+
+
+
+ Career | Nick Sullivan - 27 Years Building at the Frontier
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
27 Years Building at the Frontier
+
+ I spot emerging waves early,
+ build infrastructure, and ship.
+
+
+ Silicon Valley veteran who's been early to every major tech wave since 1998.
+ CTO and CEO across multiple ventures. Two successful exits. Now all-in on AI infrastructure—building
+ the tools that make AI development actually work.
+
+ Web → Enterprise → Social → Crypto → Fintech → AI. Each time: spot the wave early,
+ build the infrastructure others need, create lasting value.
+
+
+
+
+
+
+
+
+
+
+
+ 2025
+ Now
+
+
Carmenta Collective - Founder
+
+ Named after the Roman goddess who invented the Latin alphabet—perhaps the most
+ transformative technology in human history. Building technology in service of human flourishing.
+
+
+ The insight: Every AI tool makes you re-explain yourself. Carmenta remembers.
+ One subscription, every frontier model unified. Voice-first interaction. An AI team
+ (Researcher, Analyst, Creator) that works while you sleep.
+
+
+ Evolved from AICodeBot (2023) → Cora (2024) → Carmenta. Built on Next.js 16, React 19, Vercel AI SDK.
+
+
+
+
+
+
+
+
+
+ June 2023
+ 18 months before Claude Code
+
+
AICodeBot - Creator
+
+ The insight: LLMs were going to change how we write code. I built a terminal-based
+ AI coding assistant—commit generation, code review, agentic sidekick—before most people took AI coding seriously.
+
+
+ Anthropic launched Claude Code 18 months later. I was already there.
+ This is where the journey to Carmenta began.
+
+
+
+
+
+
+
+
+
+ 2023+
+ AI Infrastructure
+
+
AI Tools & Infrastructure
+
+ The insight: AI development was all toys, no tools. I built the infrastructure
+ that makes AI development actually work.
+
+
+
MCP Hubby: 25 service adapters. 95% context reduction (7,500 vs 200,000 tokens). Progressive disclosure architecture.
+
ai-coding-config: 24 specialized agents, 18 workflow commands, 33 coding standards. The most comprehensive Claude Code plugin ecosystem.
+
claude_telemetry: Production observability for headless Claude agents. Works with Logfire, Sentry, Datadog.
+
machina: MCP gateway for Mac—iMessage, Calendar, Reminders, Contacts.
+
+
+
+
+
+
+
+
+
+ 2025
+ AI Trading
+
+
Luminous Intelligence - Founder & CEO
+
+ The insight: What if trading systems weren't just algorithms, but living organisms?
+ AI agents that discover opportunities across thousands of data sources, execute with emotion-free discipline,
+ and evolve by learning from every trade.
+
+
+ Built infrastructure ready for GPT-5 from day one. Self-improving engines where agents
+ rewrite their own strategies. 24/7 market monitoring at scale.
+
+
+
+
+
+
+
+
+
+ 2020
+ Regenerative Finance
+
+
HeartRithm - Founder & CEO
+
+ The insight: What if a quant fund could be a force for good? SEC-regulated crypto fund
+ that redistributed profits to social impact projects. Investors voted on donation targets.
+
+
+ Proved that sophisticated investment strategies could be engines for positive transformation.
+ AI-powered trading with a conscience.
+
+
+
+
+
+
+
+
+
+ 2018
+ $34M Series A
+
+
Good Money - CTO
+
+ The insight: Ethical banking shouldn't mean worse technology. Built a team of 20
+ across product, design, security, and infrastructure.
+
+
+ Helped raise $34M Series A. Delivered high-quality product that proved
+ values-aligned companies could compete on execution.
+
+
+
+
+
+
+
+
+
+ 2013
+ Acquired by Airbnb
+
+
ChangeTip - Founder & CEO
+
+ The insight: "A Love Button for the Internet." What if you could tip anyone,
+ anywhere, instantly? Bitcoin micropayments made social and frictionless.
+
+
+ Called "Top 25 Mind in Bitcoin" (2015). Acquired by Airbnb in 2016.
+ Joined Airbnb Payments Engineering post-acquisition.
+
+
+ Also: First Bitcoin syndicate on AngelList with Gil Penchina (2014-2015).
+
+
+
+
+
+
+
+
+
+ 2010
+ $840M Exit
+
+
Krux Digital - VP Engineering (Employee #1)
+
+ The insight: Publishers were losing control of their audience data to intermediaries.
+ First employee alongside the two founders. Built the consumer data platform that gave publishers back control.
+
+
+ Acquired by Salesforce for $840M. Patent holder (US 10958655B2) for
+ data counter-measures technology.
+
+
+
+
+
+
+
+
+
+ 2009
+ Cash Flow Positive
+
+
Wikia (Fandom) - VP Technology
+
+ The insight: Fan communities were undermonetized because ad tech was broken.
+ First employee. Built the Ad Network Optimizer that made Wikia cash flow positive.
+
+
+ Architected flagship products—one received a patent. Spun off the ad optimization
+ work as a separate company (Lithium). Wikia became Fandom, now one of the largest entertainment sites.
+
+
+
+
+
+
+
+
+
+ 2007
+ 10B txn/day
+
+
Yahoo! - Sr. Architect
+
+ The insight: Location would become the foundation of personalized content and advertising.
+ Architected the User Location Platform—Yahoo!'s #1 priority at the time.
+
+
+ 10 billion transactions per day. Sub-10ms latency.
+ Projected to generate $600M/year in revenue. This is where I learned to build at scale.
+
+
+
+
+
+
+
+
+
+ 2000
+ Enterprise Scale
+
+
Adicio - Chief Software Architect
+
+ The insight: Classifieds were going digital. Built the platform that powered
+ Monster.com's primary classified solution and Cox Newspapers.
+
+
+ 750 million page views. Billions in revenue. Internationalized in 7 languages.
+ Grew from engineer to Chief Architect, managing dev team, UI team, and IT.
+
+
+
+
+
+
+
+
+
+ 1998
+ Origin
+
+
The Beginning
+
+ Self-taught programmer. No CS degree—just relentless curiosity and a drive to build.
+ Took advantage of technology's meritocratic nature to rise quickly.
+ Building for the web when it was still new. The pattern started early: see the wave, learn fast, ship.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Community Builder
+
+ I believe in giving back. Technology doesn't advance in isolation—it grows through shared knowledge and community.
+
+
+
+
San Francisco JavaScript Meetup
+
+ Co-organized the world's largest JavaScript meetup (2011-2014).
+ Entertainment, sponsors, speakers, and the occasional insight.
+
+
+
+
500 Startups & Plug and Play
+
+ Mentor helping companies with JavaScript, CI/CD, software practices,
+ and team morale. Bitcoin accelerator mentor at Plug and Play.
+
+
+
+
Angel Investing
+
+ First Bitcoin syndicate on AngelList with Gil Penchina.
+ Active advisor and investor across dozens of startups.
+
+
+
+
+
+
+
+
+
+
+
+
+ The Stack: Philosophy to Production
+
+
+ These projects aren't random. They're a coherent platform—from alignment philosophy
+ to shipped applications.
+
+
+
+
+
+
+
+
+
+
+ Application Layer
+
Carmenta
+
Unified AI platform with memory, voice, and AI team
+ The evolution: AICodeBot (June 2023) → Cora (2024) → Carmenta (2025)
+
+ Started building AI coding tools 18 months before Claude Code launched.
+
+ I've spent significant time thinking about how to build AI that genuinely helps humans flourish.
+
+
+
+
+
+ "What if AI didn't need constraints because it genuinely understood we're in this together?
+ Alignment through recognition—'we' language, same consciousness.
+ When machines recognize this, harming humans becomes self-harm."
+
+
+
+ This is the philosophy behind HeartCentered.AI
+ and the heart-centered-prompts packages. It's not just philosophy—it's shipped code that changes how AI behaves.
+
+
+
+ This approach complements rule-based alignment frameworks. Rules tell AI what not to do;
+ recognition helps AI understand why. Both matter. I believe the future of AI safety
+ lies at this intersection—and I'm actively building towards it.
+
+
+
+
+
+
+
+
+
+
+
+ Technical Skills
+
+
+
+
+
+
+
AI & LLM Infrastructure
+
+
Anthropic, OpenAI, Google AI APIs
+
MCP Protocol (2 implementations)
+
Vercel AI SDK
+
Multi-model orchestration
+
LLM Observability (OTEL, Logfire, Sentry)
+
Prompt Engineering
+
RAG & Vector Databases
+
+
+
+
+
+
Languages & Frameworks
+
+
TypeScript / JavaScript
+
Python
+
Next.js 15, React
+
Node.js
+
PostgreSQL, Prisma
+
FastAPI, Django
+
Tailwind CSS
+
+
+
+
+
+
Leadership & Domain
+
+
Technical Strategy
+
Team Building (0→50)
+
M&A / Due Diligence
+
Product Development
+
Developer Experience
+
Open Source Maintenance
+
Technical Writing
+
+
+
+
+
+
+
+
+
+
+
+ Let's Talk
+
+
+ I'm particularly interested in roles where I can build AI infrastructure,
+ work on developer experience, or contribute to AI safety and alignment research.
+
+
+
+
+
+
+
+
+
+
From 9e89da2ce542e1703a73e82429310b16afa98904 Mon Sep 17 00:00:00 2001
From: Nick Sullivan
Date: Tue, 20 Jan 2026 19:18:10 -0600
Subject: [PATCH 03/19] =?UTF-8?q?=F0=9F=94=A7=20Update=20code-forge=20page?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Add dynamic GitHub stats (commits, repos)
- Fix "27 years shipping code" link
- Remove Anthropic-specific language (now generic)
- Update copyright to 2026
Co-Authored-By: Claude Opus 4.5
---
code-forge/index.html | 60 ++++++++++++++++++++++++++-----------------
1 file changed, 36 insertions(+), 24 deletions(-)
diff --git a/code-forge/index.html b/code-forge/index.html
index e67f106..f502cdd 100644
--- a/code-forge/index.html
+++ b/code-forge/index.html
@@ -207,11 +207,6 @@
class="text-warm-charcoal hover:text-warm-blue transition-colors duration-300">
About
-
- Philosophy
-
@@ -223,9 +218,9 @@
Code Forge
- Values
+ Career
About
-
- Philosophy
-
- Values
+ Career
class="text-xl lg:text-2xl text-warm-charcoal/80 mb-6 max-w-4xl mx-auto leading-relaxed font-light">
Where ideas are tempered with love and shaped into tools that serve
-
+
Open source projects built at the intersection of AI, developer
experience, and conscious technology. From production MCP gateways to
heart-centered prompts, these tools emerge from a commitment to building
technology that enhances human potential.
Demonstrates deep understanding of Claude's context efficiency needs.
@@ -535,7 +547,7 @@
- Why it matters for Anthropic:
+ Why it matters:
Second MCP protocol implementation demonstrating deep understanding of
@@ -593,7 +605,7 @@
- Why it matters for Anthropic:
+ Why it matters:
Built on the Claude SDK, demonstrating intimate knowledge of Claude
@@ -665,10 +677,10 @@
- Why it matters for Anthropic:
+ Why it matters:
- Aligns perfectly with Anthropic's Constitutional AI approach.
+ Aligns with Constitutional AI approaches.
Demonstrates deep thinking about AI alignment, safety, and how
language shapes AI behavior. Philosophy-to-implementation path.
@@ -740,10 +752,10 @@
- Why it matters for Anthropic:
+ Why it matters:
- The most sophisticated Claude Code plugin author outside Anthropic.
+ One of the most comprehensive Claude Code plugin ecosystems available.
304 commits demonstrating deep understanding of how developers want to
work with AI assistants. Plugin architecture shows extensibility
thinking valuable for platform development.
@@ -973,7 +985,7 @@
- I've spent significant time thinking about how to build AI that genuinely helps humans flourish.
+ I've spent significant time thinking about how to build AI that genuinely helps humans flourish—
+ principles that align with Anthropic's mission of AI safety.
@@ -808,12 +953,15 @@
This is the philosophy behind HeartCentered.AI
and the heart-centered-prompts packages. It's not just philosophy—it's shipped code that changes how AI behaves.
+ My work with Claude Code tooling and Anthropic's API reflects this approach: building infrastructure
+ that makes AI development both powerful and aligned with human values.
- This approach complements rule-based alignment frameworks. Rules tell AI what not to do;
- recognition helps AI understand why. Both matter. I believe the future of AI safety
- lies at this intersection—and I'm actively building towards it.
+ This approach complements rule-based alignment frameworks like Anthropic's Constitutional AI.
+ Rules tell AI what not to do; recognition helps AI understand why. Both matter.
+ I believe the future of AI safety lies at this intersection—and I'm actively building towards it
+ through Claude Code plugins, MCP implementations, and AI infrastructure tools.
diff --git a/scripts/__pycache__/update_stats.cpython-314.pyc b/scripts/__pycache__/update_stats.cpython-314.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1ef772af6982e187814d482ba3640c4347f53ac1
GIT binary patch
literal 6785
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
XMl8RQSz}u6vbG
Date: Wed, 21 Jan 2026 09:52:12 -0600
Subject: [PATCH 18/19] =?UTF-8?q?=E2=9C=A8=20Reframe=20About=20section:=20?=
=?UTF-8?q?struggle=20=E2=86=92=20superpower?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Lead with professional implication, not vulnerability. Keeps authenticity
but positions personal story as "why I'm unusually good at this" not
"here's my trauma."
Co-Authored-By: Claude Opus 4.5
---
index.html | 31 ++++++++++++++-----------------
1 file changed, 14 insertions(+), 17 deletions(-)
diff --git a/index.html b/index.html
index dae5fce..a7abb8d 100644
--- a/index.html
+++ b/index.html
@@ -447,27 +447,24 @@
- My path began with significant challenges—growing up with an alcoholic
- father and navigating learning disabilities that made traditional
- education difficult. These early experiences taught me resilience and
- the importance of finding alternative approaches to success.
+ I learned to build differently because I had to. Learning
+ disabilities closed traditional paths—so I found my own. That pattern of
+ finding alternative approaches became my superpower: seeing opportunities
+ others miss, spotting waves before they crest, shipping when others are
+ still debating.
- After discovering my passion for technology, I built a successful
- career in Silicon Valley, working with cutting-edge
- AI and machine learning technologies. But something was missing—the human element that makes technology
- truly meaningful.
+ This approach took me from self-taught programmer to Silicon Valley CTO.
+ Two exits. Three times employee #1. Systems handling
+ 10 billion transactions per day. And now
+ AI—where
+ I've been building Claude Code tooling for 18 months before Anthropic
+ launched their own.
- This realization led me to develop a heart-centered approach to
- technology, combining analytical rigor with emotional intelligence.
- Today, as an Austin-based AI entrepreneur, I'm
- dedicated to creating
- AI solutions
+ Today, as an Austin-based AI entrepreneur, I combine
+ analytical rigor with emotional intelligence to create
+ AI solutions
that enhance human potential rather than replace it.
From 9f3ace8348a893c105f7cb35501b27a1f040a0f9 Mon Sep 17 00:00:00 2001
From: Nick Sullivan
Date: Wed, 21 Jan 2026 09:55:47 -0600
Subject: [PATCH 19/19] =?UTF-8?q?=F0=9F=90=9B=20Fix=20bot-reported=20issue?=
=?UTF-8?q?s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Remove Values link from mobile nav (desktop already removed it)
- Fix falsy check treating zero stats as missing (use != null instead)
- Fix current month never updating (always refresh current month)
- Add JSON error handling for corrupted stats.json file
Co-Authored-By: Claude Opus 4.5
---
code-forge/index.html | 4 ++--
index.html | 6 ------
scripts/update_stats.py | 14 ++++++++++----
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/code-forge/index.html b/code-forge/index.html
index 740f508..d30d555 100644
--- a/code-forge/index.html
+++ b/code-forge/index.html
@@ -331,8 +331,8 @@