') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - sparkflash-dev/spark: Flash OS images to SD cards & USB drives — zero telemetry, zero ads, fully offline. Fork of balenaEtcher. · GitHub
Skip to content

Latest commit

History

231 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Spark

The privacy-first USB flasher. Zero telemetry. Zero ads. Fully offline.

Latest ReleaseDownloadsLicensePlatformLanguages

Download · Features · CLI · Build · Roadmap


What is Spark?

Spark is a cross-platform OS image flasher built for sysadmins and power users who flash drives daily. Forked from balenaEtcher with every line of telemetry, analytics, and marketing removed. No network requests, no tracking, no ads — just a fast, reliable tool that works offline.

Why Spark over Etcher or Rufus?

balenaEtcherRufusSpark
Cross-platformLinux/Win/MacWindows onlyLinux/Win/Mac
TelemetrySentry + Mixpanel + GANoneNone
Marketing webviews64% of windowNoneNone
Works offlineHangs on startupYesYes
CLI modeNoNoYes
Windows ISO supportNoYesYes
Multi-boot USBNoNoYes
Drive backup/cloneNoNoYes
Queue mode (batch)NoNoYes
Persistent storageNoNoYes
Plugin systemNoNoYes
Post-flash scriptsNoNoYes
SHA256 verificationNoNoAuto-detect
Drag & dropNoNoYes
Keyboard shortcutsNoNo12 shortcuts
Localization3 languages40+15 languages

Features

Flash

  • Flash .img.iso.gz.xz.bz2.zst.zip.dmg.raw and more
  • Multi-target — write to multiple drives simultaneously
  • Queue mode — flash same image to drives sequentially (insert next, auto-flash)
  • Multi-boot — put multiple ISOs on one USB with GRUB boot menu
  • Byte-by-byte verification after every flash
  • SHA256/MD5 checksum — auto-detects sidecar files
  • Drive backup/clone — create .img backups with gzip/zstd compression
  • Resume interrupted writes — checkpoint recovery
  • Persistent storage — casper-rw/overlay for Ubuntu, Fedora, Debian, Kali
  • Windows ISO — auto-detect version, recommend MBR/GPT and boot mode
  • Network flash — flash directly from HTTP/HTTPS URL with resume

Experience

  • Modern dark UI — deep navy theme, Inter font, glow effects
  • 15 languages — EN, ZH, RU, JA, KO, DE, FR, ES, IT, PT, AR, TR, PL, HI, VI
  • 12 keyboard shortcuts — Ctrl+O, Ctrl+D, Ctrl+Enter, F5, and more
  • Drag & drop with visual feedback
  • High contrast themes — dark and light for accessibility
  • Screen reader support — ARIA labels, focus trap, reduced motion
  • Flash history — dashboard with stats and CSV export
  • Image library — bookmark ISOs with tags and search
  • Native notifications — completion alerts with action buttons
  • System tray — progress tooltip during flash
  • Taskbar progress — OS-level progress indicator
  • Plugin system — community extensions for custom workflows
  • Post-flash scripts — inject SSH keys, set hostname, WiFi config
  • Portable mode — run from USB, no installation needed

Security

Spark takes security seriously. No data ever leaves your machine.

  • Zero telemetry — no analytics, no crash reports, no phone-home
  • Content Security Policy — strict CSP prevents XSS
  • Context isolation — renderer cannot access Node.js APIs
  • Sandbox enforcement — all renderer processes sandboxed
  • IPC validation — all Electron IPC channels validated
  • Input sanitization — path traversal, SSRF, shell injection prevention
  • Privilege escalation — OS-native elevation (pkexec/osascript/UAC)
  • Telemetry audit — CI pipeline scans for tracking patterns on every push

Install

Windows

  1. Download Spark Setup.exe from Releases
  2. Run the installer
  3. Launch Spark from the Start Menu

Windows may show a SmartScreen warning — click More info -> Run anyway.

Linux

# Debian / Ubuntu
sudo apt install ./spark_3.4.0_amd64.deb
# Portable (any distro)
unzip Spark-linux-x64-3.4.0.zip -d spark &&cd spark && ./spark

macOS

  1. Download .dmg from Releases
  2. Drag Spark to Applications
  3. First launch: right-click -> Open (or run xattr -cr /Applications/Spark.app)

Apple Silicon (M1/M2/M3/M4) is supported. If SD cards aren't detected, install Rosetta: softwareupdate --install-rosetta

All downloads ->


CLI

Spark includes a headless CLI for scripting, CI/CD, and server environments.

# Flash an image
spark flash --image ubuntu-24.04.iso --drive /dev/sdb --verify
# List available drives
spark list
# Verify a flashed drive
spark verify ubuntu-24.04.iso /dev/sdb
# Backup a drive
spark backup /dev/sdb -o backup.img.gz -c gzip
# Queue mode — flash to multiple drives sequentially
spark queue --image ubuntu-24.04.iso --verify
# Show system info
spark info

Keyboard shortcuts

ShortcutAction
Ctrl+O / Cmd+OOpen image file
Ctrl+D / Cmd+DSelect drive
Ctrl+Enter / Cmd+EnterStart flash
Ctrl+Shift+V / Cmd+Shift+VToggle verification
Ctrl+Shift+T / Cmd+Shift+TToggle dark/light theme
Ctrl+, / Cmd+,Open settings
Ctrl+= / Cmd+=Zoom in
Ctrl+- / Cmd+-Zoom out
Ctrl+0 / Cmd+0Reset zoom
F5Refresh drive list
EscapeClose dialog / cancel
Ctrl+Q / Cmd+QQuit

Build from source

Requirements: Node.js >= 20, npm, git

git clone https://github.com/sparkflash-dev/spark.git
cd spark
npm install
CommandDescription
npm startDev mode with live reload
npm testRun test suite (Mocha + Chai)
npx electron-forge makeBuild installer for current platform
npx electron-forge make --targets @electron-forge/maker-zipPortable ZIP

After pulling changes, run rm -rf .webpack before npm start to clear the cache.


Architecture

lib/
├── cli/ # CLI (spark flash, spark list, spark backup, spark queue)
├── gui/
│ └── app/
│ ├── i18n/ # 15 locale files
│ ├── utils/ # 90+ utility modules
│ ├── components/ # React UI components
│ └── reducers/ # Redux state management
└── shared/ # Shared between GUI and CLI
tests/
└── gui/
└── utils/ # 60+ test files (Mocha + Chai)

Stack: Electron 37 + React 17 + Redux 4 + styled-components + etcher-sdk 10

Processes: Main (spark.ts) | Renderer (React) | Sidecar (spark-util WebSocket)


Roadmap

Phase 1: Core (v2.x) — Done

  • Remove ALL telemetry, analytics, marketing webviews
  • Complete rebrand (logo, colors, strings, bundle ID)
  • Modern dark UI with Inter font
  • Keyboard shortcuts and drag & drop
  • zstd image support

Phase 2: Reliability (v3.0) — Done

  • SHA256/MD5 checksum auto-verification
  • Human-readable error messages with suggestions
  • Cancel confirmation dialog
  • Fix Ubuntu 24.04 .deb install
  • Fix requestMetadata race condition

Phase 3: Power features (v3.1-3.2) — Done

  • CLI mode (spark flash, spark list, spark verify)
  • 15 languages (EN, ZH, RU, JA, KO, DE, FR, ES, IT, PT, AR, TR, PL, HI, VI)
  • Windows ISO detection with partition and boot mode guidance
  • Persistent storage for Linux live USBs
  • Bad sector surface scan
  • Flash queue and history
  • Drive health analysis
  • Secure IPC, CSP, sandbox enforcement
  • 100+ unit tests

Phase 4: Pro features (v3.3-3.4) — Done

  • Multi-boot USB (Ventoy-style, GRUB menu)
  • Drive backup/clone with compression
  • Queue mode for batch flashing
  • Image library with bookmarks and tags
  • Post-flash scripts (SSH keys, hostname, WiFi)
  • Plugin system with manifest validation
  • Network flash from URL with resume
  • Portable mode
  • Accessibility (ARIA, high contrast, reduced motion, focus trap)
  • Theme manager (dark/light)
  • Parallel verification, direct I/O, write resume
  • GitHub Actions CI with telemetry audit

Phase 5: Polish (v4.0) — Next

  • Bundle size reduction (target < 100 MB)
  • Native Windows ISO flashing (full MBR/GPT write, not just detection)
  • Silent background auto-updates from GitHub Releases
  • File system formatting (FAT32, NTFS, ext4, exFAT)
  • Drive-to-drive cloning UI
  • Image download integration (fetch popular ISOs in-app)
  • Accessibility audit (WCAG 2.1 AA compliance)
  • Electron 38+ upgrade
  • macOS notarization and code signing
  • Snap / Flatpak / AppImage packaging
  • Community plugin repository

Contributing

Contributions welcome — bug fixes, translations, tests, features.

git checkout -b fix/my-bug-fix
npm test# must pass
npx tsc --noEmit # must pass

See CONTRIBUTING.md for the full guide.


License

Apache 2.0

Original work (c) 2016-2023 Balena Ltd Modifications (c) 2024-2026 Spark contributors


About

Flash OS images to SD cards & USB drives — zero telemetry, zero ads, fully offline. Fork of balenaEtcher.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages