Stephen M AbbottandClaude Opus 4.8 098a4aa366 Brand assets, link previews, iOS icon, supporter profiles, node --status
Branding & sharing:
- Generated brand mark (cycle arrow around a coin) rendered by a committed,
  reproducible script: favicon.svg/.ico + 16/32/48, apple-touch-icon (180px,
  opaque as iOS requires), 192/512 + maskable PWA icons, 1200x630 OG card
- index.html is now templated so og:image/og:url are absolute (scrapers
  ignore relative URLs); SPARECYCLES_PUBLIC_URL overrides behind a proxy
- site.webmanifest + apple-mobile-web-app-* meta so "Add to Home Screen"
  picks up the icon and name; theme-color per colour scheme
- Assets also served from / (favicon.ico, apple-touch-icon.png, ...) and
  answer HEAD, which link scrapers and uptime checks use
- Static JS/CSS are cache-busted by mtime so a deploy can't leave visitors
  running stale JS against a new API

Supporters & profiles:
- Supporter count is now a button opening a modal listing supporters, their
  node status, and their contribution to that project
- New GET /api/projects/<slug>/supporters and GET /api/accounts/<name>
- Public profile pages at #/u/<name>: submitted apps, donation totals,
  projects supported. Usernames link there from the supporters modal, the
  donor leaderboard, and project bylines. Node names/tokens stay private.

Node visibility:
- node_connector.py --status shows detected runners, pool-side online state,
  served queues and recent jobs; read-only, safe beside a running connector
- New GET /api/nodes/me backs it; Connect page documents backgrounding the
  connector and tailing its log on macOS/Linux/Windows

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 23:55:08 -07:00

♻️ SpareCycles

Some devs have tokens and no ideas. Some have ideas and no tokens.

SpareCycles is a marketplace of vibe-coding projects and a pool of donated AI compute. Project owners get a queue and an OpenAI-compatible endpoint backed by volunteers. Donors point their idle AI subscriptions / API keys at projects they believe in and get credited as AI Donors on the project page — GoFundMe, but the currency is tokens.

Read VISION.md for the full vetting: what's strong, what's hard (trust, ToS, privacy, cold start), and how the design answers it.

   idea-rich, token-poor                        token-rich, idea-poor
 ┌──────────────────────┐                     ┌──────────────────────┐
 │ Hermes / OpenClaw /  │  /v1/chat/…  ┌────┐ │  node_connector.py   │
 │ aider / curl / any   ├─────────────►│    │◄┤  polls for work      │
 │ OpenAI-style client  │◄─────────────┤pool│─┤  runs claude/codex/  │
 └──────────────────────┘   answer     │    │ │  gemini/API runners  │
 ┌──────────────────────┐              │    │ │  KEYS STAY LOCAL     │
 │ project batch queue  ├─────────────►│    │ └──────────────────────┘
 │ (web UI, public feed)│              └────┘   credited as AI Donor
 └──────────────────────┘             FastAPI+SQLite, one process

Run the server

pip install -r server/requirements.txt
uvicorn server.main:app --port 8377

Open http://localhost:8377 — create an account (you get an API key plus five one-time recovery codes, shown once, stored hashed), create a project (you get an inference key for its realtime endpoint), and browse the marketplace.

Lost your account key? Two ways back in, both of which invalidate the old key: trade a recovery code on the Account page (POST /api/recover), or run python connector/node_connector.py --recover on any machine with a paired node — possession of a paired node proves account ownership.

Connect a node (become a donor)

On any machine that has an AI CLI (claude, codex, gemini, grok, cursor-agent), a metered provider key in the environment (ANTHROPIC_API_KEY, OPENAI_API_KEY, XAI_API_KEY), or a local model server — Ollama (:11434) and LM Studio (:1234) are auto-detected and your installed models are advertised to the pool by name:

  1. Web UI → Account → Generate pairing code
  2. python connector/node_connector.py --server http://localhost:8377 --code XXXX-XXXX
    
  3. Support projects in the marketplace. Your node serves only queues you opted into, and every completed job credits you on the project page.

The connector is stdlib-only Python — nothing to install. It re-runs with no arguments after the first pairing (~/.sparecycles/node.json holds the node token; never your provider keys). A built-in echo runner (--runners echo) lets you test the full loop without spending a token.

Once it's running in the background, check on it any time — read-only, so it is safe alongside a polling connector:

python connector/node_connector.py --status

It prints the runners this machine can serve, whether the pool sees your node as online, which queues it serves, and its last few jobs.

Use the pool from your tools

Any OpenAI-compatible client works — set the base URL and use the project's inference key:

from openai import OpenAI
client = OpenAI(base_url="http://localhost:8377/v1", api_key="sci_...")
r = client.chat.completions.create(
    model="default",  # or override the project's model preference
    messages=[{"role": "user", "content": "Plan the refactor of miner.py"}],
)
print(r.choices[0].message.content)

Jobs carry the project's model preference + fallback, temperature, and max_tokens; nodes only claim jobs whose model they declared they can serve. CLI runners apply what their CLI supports; the direct-API runners honor temperature/max_tokens exactly.

Safety model (short version)

  • Keys never leave the node. The server stores only salted-hash credentials it issued itself; provider keys live in node env vars.
  • Everything is public by default. Job prompts and outputs are visible on the project page — sunlight is the anti-abuse mechanism. Never submit secrets.
  • Nodes opt in per project. Nothing is served that you didn't choose.
  • CLI runners execute in an empty scratch dir with agentic turns capped; API runners have no tool access at all.
  • Donation-only. No payments, no token resale. Node operators are responsible for their own provider terms; metered API keys (or, soon, local models via ollama) are the recommended way to donate.

Repo map

Path What
server/ FastAPI app + SQLite (server.main:app)
web/ zero-build vanilla JS UI served at /, plus generated brand assets
connector/node_connector.py the node agent (stdlib only)
tools/generate_brand_assets.py regenerates favicons, app icons & the link-preview card
VISION.md the vetted vision & roadmap

Brand assets (favicon, iOS home-screen icon, OG link-preview card) are generated — edit tools/generate_brand_assets.py and re-run it (pip install pillow) rather than hand-editing the PNGs. Link previews need an absolute URL: the server derives it from the request, or set SPARECYCLES_PUBLIC_URL=https://your.domain when behind a proxy or tunnel.

Roadmap highlights (see VISION.md): karma credits, GitHub issue jobs that open PRs, pledge scheduling, trusted-donor tiers, ollama runner.

Languages
Python 61.7%
JavaScript 29.5%
CSS 4.4%
Shell 2%
HTML 1.8%
Other 0.6%