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. +

+ + +
+
+
$840M
+
Krux → Salesforce
+
+
+
2
+
Exits (Salesforce, Airbnb)
+
+
+
3×
+
Employee #1
+
+
+
27
+
Years Shipping Code
+
+
+ + +
+ +
+ Nick Sullivan +
+
+
+
+ + +
+
+
+

Commits Over Time

+

Cumulative commits across all repositories

+
+
+ +
+
+
+ + +
+
+
+

+ The Pattern: Early to Every Wave +

+

+ 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

+
+ carmenta.ai → +
+
+ +
↑
+ + +
+
+
+ Infrastructure Layer +

MCP Hubby + machina

+

95% context reduction • 25 service adapters • Mac system integration

+
+ mcphubby.ai → +
+
+ +
↑
+ + +
+
+
+ Developer Experience Layer +

ai-coding-config + claude_telemetry

+

24 agents • 18 commands • 33 coding standards • Production observability

+
+ GitHub → +
+
+ +
↑
+ + +
+
+
+ Philosophy Layer +

HeartCentered AI + heart-centered-prompts

+

"We" language alignment • Recognition over rules • Philosophy → shipped code

+
+ heartcentered.ai → +
+
+
+ + +
+

+ The evolution: AICodeBot (June 2023) → Cora (2024) → Carmenta (2025) +
+ Started building AI coding tools 18 months before Claude Code launched. +

+
+
+ + +
+
+ + +
+
+
+
+

+ On AI Alignment +

+

+ 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. +

+ + + +
+

Based in Austin, TX. Open to remote roles.

+

+ technick.ai · + Code Forge · + Substack +

+
+
+
+
+
+ + +
+
+
+
+ TechNickAI +
+

+ 27 years building at the frontier. Now all-in on AI. +

+
+

+ © 2026 Nick Sullivan. Austin, TX. +

+
+
+
+
+ + + + 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.

+

+ The technical portfolio behind 27 years shipping code. +

+ + +
+
+
17,000+
+
GitHub Commits
+
+
+
130+
+
Repositories
+
+
@@ -402,7 +414,7 @@

- Why it matters for Anthropic: + Why it matters:

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 @@

- © 2025 Nick Sullivan. Built with 💙 and a commitment to tools that serve. + © 2026 Nick Sullivan. Built with 💙 and a commitment to tools that serve.

From 9e341ed234f1c300fb704fa691039f88bb04742c Mon Sep 17 00:00:00 2001 From: Nick Sullivan Date: Tue, 20 Jan 2026 19:18:17 -0600 Subject: [PATCH 04/19] =?UTF-8?q?=F0=9F=94=A7=20Fix=20index.html=20SEO=20a?= =?UTF-8?q?nd=20schema=20issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix alumniOf schema (was invalid string, now workLocation) - Update copyright to 2026 Co-Authored-By: Claude Opus 4.5 --- index.html | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index 505e94e..d07b97e 100644 --- a/index.html +++ b/index.html @@ -108,7 +108,10 @@ "Startup Leadership", "Technology Entrepreneurship" ], - "alumniOf": "Silicon Valley", + "workLocation": { + "@type": "Place", + "name": "Austin, Texas" + }, "worksFor": { "@type": "Organization", "name": "TechNickAI" @@ -248,9 +251,9 @@ >Code Forge ValuesCareer Code Forge + Career

- © 2025 Nick Sullivan. Built with 💙 and a commitment to conscious + © 2026 Nick Sullivan. Built with 💙 and a commitment to conscious technology.

From 227d29b018c0174808062740117a7df1784a8e95 Mon Sep 17 00:00:00 2001 From: Nick Sullivan Date: Tue, 20 Jan 2026 19:18:25 -0600 Subject: [PATCH 05/19] =?UTF-8?q?=F0=9F=90=9B=20Fix=20LinkedIn=20URL=20in?= =?UTF-8?q?=20404=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Corrected LinkedIn URL to match other pages Co-Authored-By: Claude Opus 4.5 --- 404.html | 2 +- data/stats.json | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/404.html b/404.html index f045ee0..52f8093 100644 --- a/404.html +++ b/404.html @@ -114,7 +114,7 @@

• Date: Tue, 20 Jan 2026 19:27:07 -0600 Subject: [PATCH 06/19] =?UTF-8?q?=F0=9F=93=8A=20Enhance=20commits=20chart?= =?UTF-8?q?=20with=20monthly=20data=20and=20AI=20era=20annotation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add chartjs-plugin-annotation for visual markers - Change title to "GitHub Commits (2011-Present)" for clarity - Add note explaining career started 1998, chart is GitHub-only - Use monthly data when available for finer granularity - Add "AI Era Begins" annotation at June 2023 - Fix 404 copyright to 2026 - Update stats to 55 months of data Co-Authored-By: Claude Opus 4.5 --- 404.html | 2 +- career/index.html | 64 +++++++++++++++++++++++++++++++++++++---------- data/stats.json | 6 ++++- 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/404.html b/404.html index 52f8093..4f960f4 100644 --- a/404.html +++ b/404.html @@ -131,7 +131,7 @@

- © 2025 TechNickAI. Built with + © 2026 TechNickAI. Built with ♥ from a place of universal love.

diff --git a/career/index.html b/career/index.html index dc72c17..e198fed 100644 --- a/career/index.html +++ b/career/index.html @@ -82,8 +82,9 @@ - + + - + + + + + + + @@ -263,21 +383,40 @@
+ +
+
-
+
-

27 Years Building at the Frontier

+

25+ Years Building at the Frontier

- I spot emerging waves early,
- build infrastructure, and ship. + Nick Sullivan - Silicon Valley CTO who spots waves early,
+ builds AI infrastructure, and ships.

- Silicon Valley veteran who's been early to every major tech wave since 1998. + Nick Sullivan: 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. + Claude Code tooling and MCP implementations that make AI development actually work.

@@ -295,7 +434,7 @@

Employee #1

-
27
+
25+
Years Shipping Code
@@ -317,7 +456,12 @@

Nick Sullivan @@ -713,7 +857,7 @@

Carmenta

Unified AI platform with memory, voice, and AI team

- carmenta.ai → + carmenta.ai → @@ -727,7 +871,7 @@

Carmenta

MCP Hubby + machina

95% context reduction • 25 service adapters • Mac system integration

- mcphubby.ai → + mcphubby.ai → @@ -741,7 +885,7 @@

MCP Hubby + machina

ai-coding-config + claude_telemetry

24 agents • 18 commands • 33 coding standards • Production observability

- GitHub → + GitHub → @@ -755,7 +899,7 @@

ai-coding-config + claude_telemetry

HeartCentered AI + heart-centered-prompts

"We" language alignment • Recognition over rules • Philosophy → shipped code

- heartcentered.ai → + heartcentered.ai → @@ -777,7 +921,7 @@

HeartCentered AI + heart-centered-promp @@ -785,16 +929,17 @@

HeartCentered AI + heart-centered-promp - +

- On AI Alignment + On AI Alignment and Safety

- 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.

@@ -834,12 +982,13 @@

AI & LLM Infrastructure

    -
  • Anthropic, OpenAI, Google AI APIs
  • -
  • MCP Protocol (2 implementations)
  • +
  • Anthropic Claude API & Claude Code tooling
  • +
  • OpenAI, Google AI APIs
  • +
  • MCP Protocol (2 production implementations)
  • Vercel AI SDK
  • Multi-model orchestration
  • LLM Observability (OTEL, Logfire, Sentry)
  • -
  • Prompt Engineering
  • +
  • Prompt Engineering & AI Safety
  • RAG & Vector Databases
@@ -896,12 +1045,14 @@

LinkedIn GitHub @@ -912,7 +1063,7 @@

technick.ai · Code Forge · - Substack + Substack

@@ -928,7 +1079,7 @@

TechNickAI

- 27 years building at the frontier. Now all-in on AI. + 25+ years building at the frontier. Now all-in on AI.

diff --git a/code-forge/index.html b/code-forge/index.html index f502cdd..740f508 100644 --- a/code-forge/index.html +++ b/code-forge/index.html @@ -323,7 +323,7 @@

technology that enhances human potential.

- The technical portfolio behind 27 years shipping code. + The technical portfolio behind 25+ years shipping code.

diff --git a/index.html b/index.html index d07b97e..dae5fce 100644 --- a/index.html +++ b/index.html @@ -481,6 +481,32 @@

+ +
+
+
+
+ 25+ Years Building at the Frontier +
+

+ Web → Enterprise → Social → Crypto → AI +

+

+ $840M exit with Krux. ChangeTip acquired by Airbnb. Three times employee #1. + Now shipping AI infrastructure 18 months ahead of the industry. +

+ + View Full Career Timeline + + + + +
+
+
+
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 @@

fetch('../data/stats.json') .then(r => r.json()) .then(data => { - commits = data.commits ? data.commits.toLocaleString() : '17,000+'; - repos = data.repos ? data.repos.toLocaleString() : '130+'; + commits = (data.commits != null) ? data.commits.toLocaleString() : '17,000+'; + repos = (data.repos != null) ? data.repos.toLocaleString() : '130+'; }) .catch(() => {}) "> diff --git a/index.html b/index.html index a7abb8d..4e4f012 100644 --- a/index.html +++ b/index.html @@ -333,12 +333,6 @@ class="block py-3 px-4 text-warm-charcoal hover:bg-warm-blue/5 hover:text-warm-blue rounded-lg transition-colors duration-200" >Career - Values