diff --git a/.github/workflows/update-stats.yml b/.github/workflows/update-stats.yml new file mode 100644 index 0000000..93653e6 --- /dev/null +++ b/.github/workflows/update-stats.yml @@ -0,0 +1,41 @@ +name: Update GitHub Stats + +on: + schedule: + # Run every Sunday at midnight UTC + - cron: '0 0 * * 0' + workflow_dispatch: # Allow manual trigger + +permissions: + contents: write + +jobs: + update-stats: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Run stats update + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Run multiple times to handle rate limiting + for i in {1..5}; do + echo "=== Run $i ===" + python3 scripts/update_stats.py + sleep 60 + done + + - name: Commit and push if changed + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add data/stats.json + git diff --staged --quiet || git commit -m "📊 Update GitHub stats [automated]" + git push diff --git a/404.html b/404.html index f045ee0..4f960f4 100644 --- a/404.html +++ b/404.html @@ -114,7 +114,7 @@

•

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

diff --git a/IMPROVEMENT-IDEAS.md b/IMPROVEMENT-IDEAS.md new file mode 100644 index 0000000..2d97372 --- /dev/null +++ b/IMPROVEMENT-IDEAS.md @@ -0,0 +1,145 @@ +# Improvement Ideas for technick.ai + +Based on analysis of the job search strategy, cover letters, and project inventory, here are opportunities to strengthen the career page and overall site for AI company job applications. + +## Priority 1: High Impact, Quick Wins + +### 1. Add Project Images (Missing from strategy) +The strategy doc notes these are still TODO: +- `images/ai-coding-config.png` - screenshot showing agent/command ecosystem +- `images/machina.png` - logo or architecture diagram + +These would make the projects section more visually compelling. + +### 2. Make MCP Expertise More Prominent +MCP protocol implementation is your #1 differentiator for Anthropic. Consider: +- Add "2x MCP Implementations" as a headline stat (alongside 17,715 commits, 130 repos) +- Create a dedicated section: "Model Context Protocol Expertise" +- Link directly to MCP Hubby and machina repos + +### 3. Add Key Metrics to Project Cards +From the project inventory, these metrics resonate: +- MCP Hubby: "95% context reduction", "713 commits", "87 test files", "25 service adapters" +- ai-coding-config: "24 agents", "18 commands", "33 rules", "304 commits" +- Carmenta: "7 frontier models", "11 service integrations" + +### 4. Fix the AI Era Annotation Target +The annotation searches for `Jun '23` but should target `2023-06` in the monthly data format. Verify it's appearing correctly on the chart. + +## Priority 2: Content Additions + +### 5. Add "Why I'd Excel At..." Section +Tailored messaging for each target company (could be collapsible tabs): +- **Anthropic**: MCP implementations, Claude Code infrastructure, Constitutional AI alignment +- **Vercel**: DevEx obsession, built on Vercel stack, ai-coding-config +- **OpenAI**: Shipping velocity, multi-model expertise (not Claude-locked), pragmatic execution +- **Meta**: Open source ethos, production systems at scale +- **xAI**: Speed of execution, entrepreneurial track record + +### 6. Add a Skills/Expertise Matrix +Visual representation of technical depth: +- AI/ML Infrastructure: ████████████ Expert (MCP Hubby, Carmenta, machina) +- Developer Experience: ████████████ Expert (ai-coding-config, Claude Code) +- Production Systems: ████████████ Expert (CryptoAI, Krux, ChangeTip) +- Multi-Model Orchestration: ███████████ Expert (Carmenta routes 7 models) + +### 7. Add Testimonials/Endorsements +If available, quotes from: +- Colleagues from Krux/ChangeTip/Airbnb era +- Users of MCP Hubby or ai-coding-config +- Industry connections who can speak to technical ability + +### 8. Create Project Case Studies +Deeper dives with: +- Problem statement +- Approach/Architecture +- Outcomes/Impact +- Technical challenges solved + +## Priority 3: SEO & Discoverability + +### 9. Structured Data Enhancements +Add JSON-LD for: +- `SoftwareSourceCode` for each project +- `Person` with `knowsAbout` listing technologies +- `WorkExperience` for career history + +### 10. Meta Tags for Key Search Terms +Ensure pages rank for: +- "MCP protocol implementation" +- "Claude Code plugins" +- "AI developer experience" +- "Nick Sullivan Anthropic" + +### 11. Add llms.txt +Create `/llms.txt` so AI assistants better understand the site content when users research Nick. + +## Priority 4: Visual & UX Improvements + +### 12. Project Architecture Diagrams +Simple visual showing how key projects work: +- MCP Hubby progressive disclosure flow +- Carmenta multi-model routing +- machina Mac integration points + +### 13. Interactive Demos +If feasible: +- Live ai-coding-config agent explorer +- MCP Hubby API playground + +### 14. Enhanced Timeline Visuals +The career timeline could show: +- Wave timing (when each tech wave started vs when Nick joined) +- Outcome annotations (exits, acquisitions) + +### 15. Mobile UX Polish +Verify touch targets, scrolling, and content priorities on mobile. + +## Priority 5: Company-Specific Landing Pages + +### 16. Create /career/anthropic +Dedicated page emphasizing: +- MCP implementations (MCP Hubby + machina) +- Claude Code ecosystem (ai-coding-config, claude_telemetry) +- Constitutional AI / HeartCentered.AI alignment +- Specific proof points for target roles + +### 17. Create /career/vercel +Dedicated page emphasizing: +- Carmenta (built on their full stack) +- Developer experience obsession +- ai-coding-config workflow automation + +This could be overkill, but having company-specific URLs to share with recruiters could be powerful. + +## Data & Stats Improvements + +### 18. Continue Monthly Stats Collection +Currently at 55 months with a gap from 2015-2024. The rate-limited API prevents full collection. Options: +- Run script at different times to avoid rate limits +- Use authenticated GitHub API for higher limits +- Show the data we have with a note about the gap + +### 19. Add More Data Visualizations +Beyond commits: +- Lines of code by language +- Test coverage trends +- Repository activity heatmap + +## Content From Strategy Doc (Still TODO) + +From `job-application-strategy.md`: +- [ ] GitHub Profile: Pin ai-coding-config, carmenta (if public), machina, heart-centered-prompts +- [ ] LinkedIn: Update headline, add Featured section with Substack essays +- [ ] HeartCentered.AI: Add explicit Constitutional AI connection, "For Researchers" page + +--- + +## Recommended Next Steps + +1. **Immediate**: Add the key metrics to project cards on career page +2. **This week**: Create project images and add MCP section +3. **Before applications**: Create the /career/anthropic page as a secret weapon +4. **Ongoing**: Continue stats collection during off-peak hours + +These improvements collectively strengthen the narrative: "Not just someone who uses AI tools—someone who builds infrastructure for them." diff --git a/career/index.html b/career/index.html new file mode 100644 index 0000000..e6ff8d3 --- /dev/null +++ b/career/index.html @@ -0,0 +1,1339 @@ + + + + + + Nick Sullivan | AI Infrastructure CTO - 25+ Years Silicon Valley Experience + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+
+

25+ Years Building at the Frontier

+

+ Nick Sullivan - Silicon Valley CTO who spots waves early,
+ builds AI infrastructure, and ships. +

+

+ 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 + Claude Code tooling and MCP implementations that make AI development actually work. +

+ + +
+
+
$840M
+
Krux → Salesforce
+
+
+
2
+
Exits (Salesforce, Airbnb)
+
+
+
3×
+
Employee #1
+
+
+
25+
+
Years Shipping Code
+
+
+ + +
+ +
+ Nick Sullivan - AI Infrastructure CTO and Silicon Valley veteran with 25+ years experience building technology +
+
+
+
+ + +
+
+
+

The AI Productivity Explosion

+

17,700+ commits across 130 repositories. Notice the hockey stick when AI tools arrived.

+
+
+ +
+
+ + + + +

Loading commit data...

+
+
+ + + + +
Total commits: 17,715 across 130 repositories. Key milestones: AICodeBot (July 2023), Cursor (January 2025), Claude Code (November 2025), ai-coding-config (December 2025).
+
+ +
+
+ + AICodeBot +
+
+ + Cursor +
+
+ + Claude Code +
+
+ + ai-coding-config +
+
+

+ My coding career began in 1998. This chart shows GitHub activity only—pre-GitHub work not included. + +

+
+
+ + +
+
+
+

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

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

+
+
+ + +
+
+
+
+ 2023 + 18 months before Claude Code +
+

AICodeBot - Creator

+

+ The insight: January 2023—ChatGPT launches and I see the same thing I saw in + the Satoshi whitepaper. Another career pivot. LLMs were going to change how we write code. +

+

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

+

+ Same pattern: spot the wave, pivot hard, build the infrastructure. +

+
+
+ + +
+
+
+
+ 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.
  • +
+
+
+ + +
+
+
+
+ 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: Read the Satoshi Nakamoto whitepaper and all the lightbulbs went off—this + technology was going to change the world. Pivoted my career to Bitcoin and built three companies in the space. +

+

+ ChangeTip: "A Love Button for the Internet." Bitcoin micropayments made social and frictionless. + Called "Top 25 Mind in Bitcoin" (2015). Acquired by Airbnb in 2016. +

+

+ Also: First Bitcoin syndicate on AngelList with Gil Penchina (2014-2015). + HeartRithm crypto fund (2020). Three Bitcoin companies from one whitepaper moment. +

+
+
+ + +
+
+
+
+ 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 and Safety +

+

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

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

+
+
+
+
+ + +
+
+
+

+ Technical Skills +

+
+ +
+ +
+

AI & LLM Infrastructure

+
    +
  • 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 & AI Safety
  • +
  • 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 +
+

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

+
+

+ © 2026 Nick Sullivan. Austin, TX. +

+
+
+
+
+ + + + diff --git a/code-forge/index.html b/code-forge/index.html index e67f106..d30d555 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 25+ 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.

diff --git a/data/stats.json b/data/stats.json new file mode 100644 index 0000000..e6e8ead --- /dev/null +++ b/data/stats.json @@ -0,0 +1,180 @@ +{ + "commits": 17717, + "repos": 130, + "updated": "2026-01-21", + "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, + "2014-11": 12, + "2014-12": 297, + "2015-01": 243, + "2015-02": 109, + "2015-03": 62, + "2015-04": 369, + "2015-05": 127, + "2015-06": 101, + "2015-07": 27, + "2015-08": 27, + "2015-09": 27, + "2015-10": 27, + "2015-11": 27, + "2015-12": 27, + "2016-01": 12, + "2016-02": 12, + "2016-03": 12, + "2016-04": 12, + "2016-05": 12, + "2016-06": 12, + "2016-07": 12, + "2016-08": 12, + "2016-09": 12, + "2016-10": 12, + "2016-11": 12, + "2016-12": 12, + "2017-01": 101, + "2017-02": 101, + "2017-03": 101, + "2017-04": 101, + "2017-05": 101, + "2017-06": 101, + "2017-07": 101, + "2017-08": 101, + "2017-09": 101, + "2017-10": 101, + "2017-11": 101, + "2017-12": 101, + "2018-01": 4, + "2018-02": 4, + "2018-03": 4, + "2018-04": 4, + "2018-05": 4, + "2018-06": 4, + "2018-07": 4, + "2018-08": 4, + "2018-09": 4, + "2018-10": 4, + "2018-11": 4, + "2018-12": 4, + "2019-01": 47, + "2019-02": 47, + "2019-03": 47, + "2019-04": 47, + "2019-05": 47, + "2019-06": 47, + "2019-07": 47, + "2019-08": 47, + "2019-09": 47, + "2019-10": 47, + "2019-11": 47, + "2019-12": 47, + "2020-01": 47, + "2020-02": 47, + "2020-03": 47, + "2020-04": 47, + "2020-05": 47, + "2020-06": 47, + "2020-07": 47, + "2020-08": 47, + "2020-09": 47, + "2020-10": 47, + "2020-11": 47, + "2020-12": 47, + "2021-01": 45, + "2021-02": 45, + "2021-03": 45, + "2021-04": 45, + "2021-05": 45, + "2021-06": 45, + "2021-07": 45, + "2021-08": 45, + "2021-09": 45, + "2021-10": 45, + "2021-11": 45, + "2021-12": 45, + "2022-01": 74, + "2022-02": 74, + "2022-03": 74, + "2022-04": 74, + "2022-05": 74, + "2022-06": 74, + "2022-07": 74, + "2022-08": 74, + "2022-09": 74, + "2022-10": 74, + "2022-11": 74, + "2022-12": 74, + "2023-01": 117, + "2023-02": 117, + "2023-03": 117, + "2023-04": 117, + "2023-05": 117, + "2023-06": 0, + "2023-07": 117, + "2023-08": 117, + "2023-09": 117, + "2023-10": 117, + "2023-11": 117, + "2023-12": 117, + "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, + "2025-04": 291, + "2025-05": 339, + "2025-06": 362, + "2025-07": 614, + "2025-08": 379, + "2025-09": 296, + "2025-10": 879, + "2025-11": 492, + "2025-12": 1538, + "2026-01": 384 + }, + "emails": [ + "nick@technick.ai", + "nick@sullivanflock.com" + ] +} \ No newline at end of file diff --git a/index.html b/index.html index 505e94e..4e4f012 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 ValuesCareer

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

@@ -472,6 +472,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 + + + + +
+
+
+
@@ -1262,7 +1288,7 @@

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

diff --git a/scripts/__pycache__/update_stats.cpython-314.pyc b/scripts/__pycache__/update_stats.cpython-314.pyc new file mode 100644 index 0000000..1ef772a Binary files /dev/null and b/scripts/__pycache__/update_stats.cpython-314.pyc differ 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..8cf91dc --- /dev/null +++ b/scripts/update_stats.py @@ -0,0 +1,176 @@ +#!/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 | None: + """Get total repos across personal and orgs""" + total = 0 + + # Personal repos + personal = gh_api("users/TechNickAI/repos?per_page=100") + if personal is None: + return None # Rate limited or error + total += len(personal) + + # Org repos + orgs = gh_api("user/orgs") + if orgs is None: + return None # Rate limited or error + + for org in orgs: + org_repos = gh_api(f"orgs/{org['login']}/repos?per_page=100") + if org_repos is None: + return None # Rate limited or error + total += len(org_repos) + + return total + + +def main(): + print("Fetching GitHub stats...") + + # Load existing data + existing = {} + if OUTPUT_FILE.exists(): + try: + with open(OUTPUT_FILE) as f: + existing = json.load(f) + except json.JSONDecodeError: + print("Warning: Corrupted JSON file, starting fresh") + existing = {} + + # Get total commits (preserve existing if rate limited) + total_commits = 0 + rate_limited_totals = False + 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") + rate_limited_totals = True + + # Preserve existing total if ANY email was rate limited (avoid partial data) + if rate_limited_totals: + total_commits = existing.get("commits", 0) + print(f"Using cached commits: {total_commits}") + else: + print(f"Total commits: {total_commits}") + + # Get repo count (preserve existing if rate limited) + repos = get_repo_count() + if repos is None: + repos = existing.get("repos", 0) + print(f"Using cached repos: {repos}") + else: + 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 + + current_month_key = f"{now.year}-{now.month:02d}" + + 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 (but always update current month) + if key in by_month and key != current_month_key: + 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()