2
Dev SelfStart
Vladimir Mandic edited this page 2026-06-06 08:53:29 +02:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Where to Start Contributing

New to SD.Next and not sure where to jump in? Click the button below — it fetches open issues from GitHub, then uses Chrome's on-device AI (Gemini Nano) to surface the best first tasks. No data leaves your browser.


Find my best starting point

This feature uses Gemini Nano, Chrome's on-device AI. A one-time download (~1.5 GB) is required — it runs entirely on your device.

Download model & find my starting point
Chrome's built-in AI isn't available in your browser. This feature requires Chrome 138+ with Gemini Nano. You can still read the contribution areas below manually.

Contribution Areas

Area Skills Difficulty
Documentation & Wiki Writing, Markdown Beginner
Localization Non-English fluency Beginner
User Themes CSS, web design BeginnerIntermediate
Scripts & Extensions Python, SD pipelines Intermediate
UI Development JavaScript, HTML, CSS Intermediate
AI Coding Tools Python, LLMs Intermediate
Core Modules Python, deep learning IntermediateAdvanced
Backend & Platform Support Python, CUDA/ROCm/OpenVINO Advanced

Ready to dive in? Start with Dev Getting Started for the fork and PR workflow.

<script> (function () { const GITHUB_API = 'https://api.github.com/repos/vladmandic/sdnext/issues?state=open&per_page=30&sort=updated'; const AREAS_TEXT = ` SD.Next Contribution Areas: 1. Documentation & Wiki — Skills: Writing, Markdown. No coding required. Difficulty: Beginner. 2. Localization — Skills: Fluency in a non-English language. No coding required. Difficulty: Beginner. 3. User Themes — Skills: CSS, basic web design. Difficulty: BeginnerIntermediate. 4. Scripts & Extensions — Skills: Python, SD pipeline basics. Difficulty: Intermediate. 5. UI Development — Skills: JavaScript/TypeScript, HTML, CSS. Difficulty: Intermediate. 6. AI Coding Tools — Skills: Python, LLM/AI tooling experience. Difficulty: Intermediate. 7. Core Modules — Skills: Python, deep learning basics. Difficulty: IntermediateAdvanced. 8. Backend & Platform Support — Skills: Python, CUDA/ROCm/OpenVINO. Difficulty: Advanced. `; const btn = document.getElementById('ai-summary-btn'); const downloadBox = document.getElementById('ai-download-box'); const downloadBtn = document.getElementById('ai-download-btn'); const status = document.getElementById('ai-status'); const progressBar = document.getElementById('ai-progress-bar'); const progressFill = document.getElementById('ai-progress-fill'); const output = document.getElementById('ai-output'); const unavailable = document.getElementById('ai-unavailable'); function setStatus(msg) { status.style.display = msg ? 'block' : 'none'; status.textContent = msg; } async function fetchIssues() { const res = await fetch(GITHUB_API, { headers: { 'Accept': 'application/vnd.github+json' } }); if (!res.ok) throw new Error(`GitHub API error: ${res.status}`); const items = await res.json(); return items.filter(i => !i.pull_request); } async function summarize(avail) { setStatus('Fetching open issues from GitHub…'); let issues = []; try { issues = await fetchIssues(); } catch (err) { setStatus('Could not fetch issues — using contribution areas only.'); } const issuesText = issues.length ? '\nOpen GitHub Issues (use the exact #NUMBER when referencing):\n' + issues.map(i => `Issue #${i.number}: ${i.title}`).join('\n') : ''; const options = { type: 'key-points', format: 'plain-text', length: 'medium', outputLanguage: 'en', sharedContext: 'You are helping a new open-source contributor find their first task in SD.Next, ' + 'a Stable Diffusion image generation platform written in Python. ' + 'Recommend 2-3 specific starting points by pairing a contribution area with a real open issue. ' + 'You MUST cite each issue using its exact number in the format #NUMBER (e.g. #4859). ' + 'Only reference issues that appear in the list provided.', }; if (avail === 'downloadable') { progressBar.style.display = 'block'; options.monitor = (m) => { m.addEventListener('downloadprogress', (e) => { const pct = Math.round(e.loaded * 100); progressFill.style.width = `${pct}%`; setStatus(`Downloading Gemini Nano… ${pct}%`); }); }; } else { setStatus('Thinking…'); } const summarizer = await Summarizer.create(options); progressBar.style.display = 'none'; setStatus('Generating…'); output.style.display = 'block'; output.textContent = ''; const stream = summarizer.summarizeStreaming(AREAS_TEXT + issuesText); let fullText = ''; for await (const chunk of stream) { fullText += chunk; output.textContent = fullText; } const escaped = fullText .replace(/&/g, '&').replace(//g, '>') .replace(/#(\d+)/g, '#$1'); const items = escaped.split('\n') .filter(l => l.trim().startsWith('*')) .map(l => { const text = l.replace(/^\s*\*\s*/, ''); return text.replace(/^([^:]+):/, '$1:'); }); output.innerHTML = items.length ? '
    ' + items.map(i => `
  • ${i}
  • `).join('') + '
' : escaped; setStatus(''); summarizer.destroy(); } async function init() { if (!('Summarizer' in window)) { unavailable.style.display = 'block'; return; } const avail = await Summarizer.availability(); if (avail === 'unavailable') { unavailable.style.display = 'block'; return; } if (avail === 'downloadable') { downloadBox.style.display = 'block'; downloadBtn.addEventListener('click', async () => { downloadBtn.disabled = true; downloadBox.querySelector('p').textContent = 'Downloading — this may take a few minutes…'; try { await summarize('downloadable'); } catch (err) { unavailable.innerHTML = `Error: ${err.message}`; unavailable.style.display = 'block'; } }); return; } // available — show main button btn.style.display = 'inline-block'; btn.addEventListener('click', async () => { btn.disabled = true; btn.style.opacity = '0.6'; try { await summarize('available'); } catch (err) { unavailable.innerHTML = `Error: ${err.message}`; unavailable.style.display = 'block'; } }); } init(); })(); </script>