β οΈ DEVELOPMENT STATUS: This project is currently under active development. Features are being implemented and bugs are being fixed. Please report any issues you encounter on the Issues page.
A powerful web-based tool for creating custom Stream Deck icons with gradient backgrounds. Generate professional-looking icons by combining FontAwesome SVG graphics with customizable gradient overlays, all exportable as PNG files in multiple sizes.
- β 549+ FontAwesome Icons - Browse and search through a comprehensive icon library
- β Lazy Loading - Optimized icon picker with IntersectionObserver for fast performance
- β Real-time Search - Debounced search with instant filtering
- β SVG Caching - Intelligent caching system for 90% faster loading
- β Linear & Radial Gradients - Switch between gradient types with visual toggle
- β Multi-stop Gradients - Add, remove, and position unlimited color stops
- β Interactive Gradient Bar - Drag color stops directly on the preview bar
- β Color Mode Toggle - Switch between RGB and HSL color modes
- β Visual Slider Controls - Draggable knobs for angle and position adjustments
- β Stop Indicators - Visual color swatches showing all gradient stops
- β Gradient Randomizer - Generate random gradients instantly
- β Base Color Selection - Choose a base color for gradient generation
- β Preset Styles - Choose from Smooth, Glossy, Vibrant, and Subtle gradient styles
- β Color-Aware Generation - Create grayscale or same-hue gradients based on base color
- β Multiple Sizes - Export at 72x72, 144x144, or 256x256 pixels
- β Batch Export - Export all three sizes simultaneously
- β Copy to Clipboard - Quick copy for immediate use
- β File System Access API - Choose custom save locations
- β Adjustable Corner Radius - Customize border rounding (0-28px)
- β Preset Management - Save, load, and delete gradient presets
- β State Persistence - LocalStorage saves your settings between sessions
- β Keyboard Shortcuts - Full keyboard navigation support
- β Real-time Preview - Instant canvas updates with zoom controls (1x, 4x, 8x)
- β Fully Accessible - WCAG-compliant with ARIA labels and semantic HTML
- β Responsive Design - Optimized for desktop, tablet, and mobile devices
- β Dark Theme - Modern dark morphism gradient background
Visit the live demo: Stream Deck Icon Generator (update with your actual URL)
- Clone the repository:
git clone https://github.com/SyntaxSidekick/Stream-Deck-Icon-Generator.git
cd Stream-Deck-Icon-Generator- Serve the application using any static file server:
Using npx (recommended):
npx serve .Using Python:
# Python 3
python -m http.server 8000
# Python 2
python -m SimpleHTTPServer 8000Using Node.js http-server:
npm install -g http-server
http-server- Open your browser and navigate to:
http://localhost:3000
(Port may vary depending on your server)
-
Select an Icon
- Click on one of the preset framework icons (React, Angular, Vue, Python, etc.)
- Or click the "+" button to open the full icon picker
- Search for icons by name (e.g., "github", "twitter", "gaming")
- Click an icon to select it
-
Customize the Gradient
- Choose Base Color: Select a base color using the color picker
- Apply Preset Style: Click Smooth, Glossy, Vibrant, or Subtle to generate a gradient based on your base color
- Switch Gradient Type: Toggle between Linear and Radial gradients
- Adjust Angle: For linear gradients, drag the angle slider (0-360Β°)
- Modify Color Stops:
- Click on a stop indicator to make it active
- Use the color picker to change the active stop's color
- Drag the position slider to reposition the stop (0-100%)
- Click "+" to add a new stop
- Click "β" to remove the active stop (minimum 2 stops required)
- Toggle Color Mode: Switch between RGB and HSL modes
- Randomize: Click "Randomize" for instant random gradients
-
Adjust Icon Settings
- Set icon color using the color picker (default: white)
- Adjust icon size using the slider (20-80%)
- Fine-tune vertical offset with the slider (-30% to +30%)
-
Export Your Icon
- Choose export size (72, 144, or 256 pixels)
- Set corner radius (0-28px)
- Enter a custom filename
- Click "Export PNG" or "Export All Sizes"
- Alternatively, use "Copy" to copy directly to clipboard
-
Basic Randomization:
- Click "Randomize" button to generate a completely random gradient
- Random type (linear or radial), angle, number of stops, and colors
-
Base Color Gradients:
- Select a base color using the "Base Color" picker
- Click a preset style button (Smooth, Glossy, Vibrant, or Subtle)
- For grayscale colors (black, white, gray), generates smooth grayscale gradients
- For vibrant colors, generates same-hue gradients with varying lightness and saturation
- Smooth: 2-stop simple gradients
- Glossy: 3-4 stops with highlights for a glossy effect
- Vibrant: High saturation color bursts
- Subtle: Low saturation, gentle transitions
-
Manual Control:
- Click any gradient stop indicator to select it
- Use the visible color picker to change the stop color to any value
- Drag the position slider or the stop itself on the gradient bar
- Add or remove stops as needed for complete control
-
Save a Preset:
- Configure your desired gradient
- Click the save button (πΎ) next to the preset dropdown
- Enter a name for your preset
-
Load a Preset:
- Select a preset from the dropdown menu
- The gradient will automatically apply
-
Delete a Preset:
- Select the preset you want to delete
- Click the delete button (ποΈ)
The application currently includes 549+ FontAwesome icons, but you can easily add your own custom SVG files:
-
Add SVG Files:
- Place your SVG files in
public/icons/fontawesome/directory - Use lowercase names with hyphens (e.g.,
my-custom-icon.svg) - Ensure SVGs have a
viewBoxattribute for proper scaling
- Place your SVG files in
-
Update the Icon Index:
Option A: PowerShell (Windows)
Get-ChildItem public/icons/fontawesome/*.svg | Select-Object -ExpandProperty BaseName | Sort-Object | ConvertTo-Json | Set-Content public/icons/fontawesome/index.json
Option B: Bash (macOS/Linux)
ls public/icons/fontawesome/*.svg | sed 's|.*/||;s|\.svg$||' | sort | jq -R -s -c 'split("\n")[:-1]' > public/icons/fontawesome/index.json
Option C: Node.js (Cross-platform)
const fs = require('fs'); const path = require('path'); const iconDir = './public/icons/fontawesome'; const icons = fs.readdirSync(iconDir) .filter(f => f.endsWith('.svg')) .map(f => path.basename(f, '.svg')) .sort(); fs.writeFileSync( path.join(iconDir, 'index.json'), JSON.stringify(icons, null, 2) );
-
Rebuild (if using build process):
npm run build
-
Refresh the Application:
- Reload the page
- Your custom icons will appear in the icon picker
- They are searchable by filename
SVG Tips:
- Keep file sizes small (< 10KB recommended)
- Use single-color SVGs for best results with the color picker
- Remove unnecessary metadata and comments
- Ensure proper
viewBoxfor consistent scaling - Use kebab-case naming (lowercase with hyphens)
| Shortcut | Action |
|---|---|
Ctrl + I |
Open icon picker |
Ctrl + E |
Export current icon |
Ctrl + R |
Randomize gradient |
β / β |
Adjust active value by Β±1 |
Shift + β / β |
Adjust active value by Β±10 |
+ / - |
Increase/decrease active value |
Esc |
Close icon picker |
- Vanilla JavaScript (ES6 Modules) - No framework dependencies
- HTML5 Canvas API - Real-time icon rendering
- CSS3 - Modern styling with gradients and animations
- IntersectionObserver API - Efficient lazy loading of icons
- File System Access API - Custom save file locations
- LocalStorage API - State and preset persistence
- Clipboard API - Copy to clipboard functionality
- Git - Version control
- npx serve - Local development server
streamdeck-icon-generator/
βββ index.html # Main HTML file
βββ README.md # This file
βββ .gitignore # Git ignore patterns
β
βββ public/
β βββ icons/
β β βββ fontawesome/ # FontAwesome SVG icons
β β βββ index.json # Icon index for lazy loading
β β βββ *.svg # 549 SVG icon files
β βββ presets/ # User-saved gradient presets
β
βββ src/
β βββ js/
β β βββ app.js # Main entry point
β β βββ state.js # Application state management
β β βββ ui.js # UI controls and canvas rendering
β β βββ icons.js # Icon picker with lazy loading
β β βββ gradient.js # Gradient controls and randomization
β β βββ export.js # PNG export functionality
β β βββ storage.js # LocalStorage persistence
β β βββ presets.js # Preset management
β β βββ keyboard.js # Keyboard shortcuts
β β
β βββ styles/
β βββ base.css # Core styles and layout
β βββ modal.css # Icon picker modal styles
β
βββ assets/
βββ ui/ # Additional UI assets (if any)
| Browser | Minimum Version | Notes |
|---|---|---|
| Chrome | 86+ | Full support including File System Access API |
| Edge | 86+ | Full support including File System Access API |
| Firefox | 78+ | File System Access API falls back to download |
| Safari | 14+ | File System Access API falls back to download |
| Mobile Safari | 14+ | Limited File System Access API support |
| Chrome Android | 86+ | Limited File System Access API support |
Note: File System Access API is not fully supported in Firefox and Safari. The app gracefully falls back to standard download behavior.
- SVG Caching: Loaded SVG icons are cached in a Map for instant re-use
- Lazy Loading: Icons are only loaded when scrolled into view (100px margin)
- Debounced Search: Search filtering is debounced to 200ms
- Auto-Save: Settings are auto-saved with 500ms debounce
- Optimized Rendering: Canvas updates only when necessary
- Semantic HTML: Proper use of
<header>,<main>,<section>,<fieldset>, and<legend> - ARIA Labels: Comprehensive ARIA labels and roles for screen readers
- Keyboard Navigation: Full keyboard support with focus management
- Skip Navigation: Skip-to-content link for screen reader users
- Touch-Friendly: Minimum 44px touch targets on mobile
- Focus Indicators: Clear focus states for all interactive elements
- Live Regions: ARIA live regions for dynamic content updates
- Color Contrast: WCAG-compliant color contrast ratios
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Use vanilla JavaScript (no dependencies)
- Follow ES6 module patterns
- Maintain accessibility standards
- Test on multiple browsers and devices
- Update documentation for new features
This project is open source and available under the MIT License.
- FontAwesome - Icon library provider
- Stream Deck - Inspiration for icon dimensions and use case
If you encounter any issues or have questions:
- Check Existing Issues: Browse the Issues page to see if your problem has been reported
- Report a Bug: Open a new issue with:
- Clear description of the problem
- Steps to reproduce
- Expected vs actual behavior
- Browser version and OS
- Screenshots if applicable
- Feature Requests: Suggest new features or improvements via GitHub Issues
- Questions: Ask questions in the Discussions section
Current Known Issues:
- Some gradient presets may not save correctly
- File System Access API limited in Firefox/Safari (falls back to download)
- Mobile touch interactions need refinement
Your feedback helps improve this tool for everyone!
Future enhancements under consideration:
- Custom SVG upload support
- Text overlay options
- Pattern/texture backgrounds
- Gradient animation presets
- Icon effect filters (shadow, glow, blur)
- Template library
- Bulk icon generation
- Plugin system for custom generators
Made with β€οΈ for the Stream Deck community