Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add Hetzner Cloud spawn system - #4

Merged
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn
Feb 7, 2026
Merged

Add Hetzner Cloud spawn system#4
louisgv merged 1 commit into
mainfrom
hetzner-cloud-spawn

Conversation

@louisgv

Copy link
Copy Markdown
Collaborator

Summary

  • Adds hetzner/ directory parallel to sprite/ that provisions Hetzner Cloud servers with Claude Code + OpenRouter via REST API (no hcloud CLI dependency)
  • hetzner/lib/common.sh — shared functions for Hetzner API calls, SSH key management, server lifecycle, cloud-init, plus provider-agnostic OAuth/logging helpers
  • hetzner/claude.sh — mirrors sprite/claude.sh phase-by-phase (token → SSH key → create server → cloud-init → Claude Code → OpenRouter → interactive session)
  • README extended with Hetzner usage section and environment variables

Test plan

  • Set HCLOUD_TOKEN and run hetzner/claude.sh interactively
  • Confirm server appears in Hetzner console
  • Confirm SSH connects and cloud-init completes
  • Confirm Claude Code launches with OpenRouter API key
  • Destroy server afterward to avoid charges

🤖 Generated with Claude Code

Parallel to the existing sprite/ directory, adds hetzner/ scripts that
provision Hetzner Cloud servers with Claude Code + OpenRouter using
curl-based API calls (no hcloud CLI dependency).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@louisgv
louisgv merged commit bd30565 into mainFeb 7, 2026
@louisgv
louisgv deleted the hetzner-cloud-spawn branch February 7, 2026 15:25
louisgv pushed a commit that referenced this pull request Feb 8, 2026
Migrated aws-lightsail, e2b, gcp, lambda, and modal libraries to use
the shared library pattern established in earlier refactoring rounds.
Changes:
- Added shared/common.sh sourcing block (local-first, remote-fallback)
- Added bash safety flags (set -eo pipefail) to all 5 libraries
- Removed duplicate provider-agnostic functions:
- Logging (log_info, log_warn, log_error)
- Input handling (safe_read)
- OAuth flow (try_oauth_flow, get_openrouter_api_key_oauth)
- SSH helpers (generate_ssh_key_if_missing, etc.)
- Retained cloud-specific functions:
- API wrappers and CLI integration
- Server provisioning and lifecycle management
- Cloud-specific validation and configuration
Impact:
- Net reduction: 460 lines (-545 added +85)
- Eliminates code duplication across 5 providers
- Improves consistency and maintainability
- All libraries now follow the same architectural pattern
Task: #3 (score 56 - highest priority)
Also addresses Task #4 (bash safety flags)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
louisgv pushed a commit that referenced this pull request Feb 8, 2026
improve.sh:
- Cloud Scouts get 2 slots, Agent Scout gets 1 (and only if justified)
- Agent discovery requires evidence: 1000+ GH stars, 50+ HN points,
100+ Reddit upvotes — at least 2 of these
- New Issue Responder role checks gh issues for user requests
- Agents must be searched on HN Algolia API, Reddit, GitHub before adding
- Priority order: fill gaps > new clouds > new agents > issue triage
CLAUDE.md:
- Reordered: clouds are priority #2, agents are #3 with strict gate
- Added community buzz requirements with specific thresholds
- Added GitHub issue response as #4
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@louisgv