Changelog
Current Version: 1.7.0
Last Updated: 2026-08-10
2026-08-10 - Version 1.7.0
New Features
- Export images toolbar menu — new toolbar button with dropdown menu (PNG / SVG export), icons styled to match existing toolbar
- Export PNG with custom size — dialog lets you set width or height in px; the other dimension updates proportionally; exports the current canvas content as a transparent-background PNG
- Export SVG as ZIP — every loaded Gerber layer is converted to its own SVG file (named after the uploaded Gerber file +
.svg) and packed into one ZIP; ZIP is namedSVG_<original-zip-name>.zip, orGerber-Images.zipwhen loaded as loose files; all layers are exported regardless of visibility - Coordinate-aligned SVG output — SVG export re-serializes the parsed ImageTree directly (shared path-generation logic with the canvas renderer) instead of snapshotting the canvas: each layer's
viewBoxmaps to Gerber logical coordinates, so per-layer SVGs can be exactly overlaid and edited in external tools; output is deterministic (independent of canvas flip/zoom/visibility) and includes an<?xml?>declaration. Renderer split intorenderer/index.ts(LeaferJS) +renderer/svg.ts(pure SVG serialization, no DOM dependency)
Improvements
- Export menu also closes the measure/grid dropdowns when opened (and vice versa), keeping toolbar dropdowns mutually exclusive
Bug Fixes
- PNG export no longer distorted — dialog's default size and aspect-ratio lock now use the visible content bounds (measured after a temporary fit-view) instead of the canvas viewport size. The Leafer export API scales X and Y independently (
scaleX = w/contentW,scaleY = h/contentH), so a viewport-ratio lock caused the image to stretch; locking to the content ratio produces a distortion-free export sized exactly to the content's maximum bounds (no extra padding) - PNG export no longer has blank space on the right — the export now measures the merged world bounds of visible layers only and passes them explicitly via the
screenshotoption. Root cause: Leafer only excludesvisible === 0(numeric) layers from render bounds, while this app hides layers withvisible = false(boolean) — those hidden layers still contributed their width to the export area, producing a wide transparent band. NewgetVisibleContentBounds()merges onlygroup.visiblelayers, so the exported width matches the requested resolution, the height scales proportionally, and hidden layers are excluded - Export PNG dialog inputs restyled — the width/height number fields now use the same control style as the toolbar zoom scale input (border input + inline
pxsuffix + custom up/down stepper buttons, native spinner hidden), keeping toolbar and dialog UI consistent
2026-06-29 - Version 1.6.0
New Features
- Step & Repeat (SR) support in single-pass parser — Gerber RS-274X
%SR…%commands now properly replicate graphics across panelized arrays. Supports both integer format (e.g.I1734292= 17.34292mm) and EasyEDA decimal-point format (e.g.I17.34292). Handles D03 flashes, D01 path segments, and G36/G37 region mode inside SR blocks. - Excellon drill file detection fix — files starting with
;TYPE=PLATEDcomment header beforeM48are correctly routed to the legacy parser instead of being silently dropped.
Bug Fixes
- Fix single-pass parser ignoring Step & Repeat (
%SR) commands — parser now correctly accumulates graphics inside SR blocks and replicates them across the specified grid
2026-06-06 - Version 1.5.0
Breaking Changes
- New single-pass parser is now the default — replaces the legacy two-pass (lexer → AST → plotter) pipeline. 5x parsing faster, lower memory, identically matched output validated against all 50+ test boards. Fall back to
?parser=legacyif needed.
Bug Fixes
- Fix rectangle-tool D01 paths rendering as stroked wires instead of filled polygons —
finalizePathnow delegates toplotRectPathfor rectangle tools, matching legacy plotter behavior - Fix tool-change path flush — D handler now compares the new tool code (
String(d)) against segment tool code instead of the previous tool, preventing stale segments from being flushed at the wrong time - Fix D03 standalone (
D03*) not creating shapes — removed overly-stricthasX && hasYguard - Fix D03 flash not updating position —
prevX/prevYnow set to flash coordinates, matching legacy location-store_previousPointupdate - Fix pure tool-change commands (
G54D10*) entering D01/D02 draw branches throughdefaultGraphic - Fix region mode (G36/G37) D02 creating spurious line segments when
regionSegmentswas empty - Fix large files (>10MB) being silently filtered — increased size limit to 100MB
- Fix progress bar delay — show immediately on file load, before ZIP decompression
2026-06-06 - Version 1.4.0
Bug Fixes
- Fix oblong/obround pad rendering — SVG arc sweep direction for capsule pads corrected
- Fix 45°/135° diagonal capsule pad rendering — aperture macro vector line Y-offset sign inverted, connecting rectangle was zero-area
- Fix canvas flip sync — origin crosshair and grid overlay X positions now mirror correctly; replace CSS scaleX(-1) with contentFlipGroup.scaleX for coherent Leafer coordinate system
- Fix flip + drag pan direction — manual pan handling with negated X delta when content group is flipped
- Fix ZIP import with non-Gerber files — expanded skip extension list, added 10MB file size cap
- Fix large Gerber file parsing freeze — batch syntax matching by command (
*/%delimiter) instead of per-token, O(n²) → O(n)
Improvements
- Zoom max increased from 200× to 999.99× (20000% → 99999%)
2026-05-28 - Version 1.3.2
Bug Fixes
- Fix holes in Gerber region (G36/G37) rendering — split fill paths into separate Path elements instead of merging, fix floating-point comparison for full-circle arc splitting
- Fix aperture macro vector line offset direction causing round rectangle rendering artifacts (protruding corner bumps)
2026-05-24 - Version 1.3.1
New Features
- "Open Example Files" button on welcome screen — loads a sample PCB project (color-easy-duino) with one click
2026-05-23 - Version 1.3.0
New Features
- 8 new languages: Dutch, Italian, Polish, Swedish, Romanian, Malay, Tagalog, Lithuanian
- Chinese split into 3 regional variants: Simplified (简体中文), Cantonese (廣東話), Traditional (繁體中文)
- Language dropdown sorted by visitor volume with vertical scrollbar
- Three Chinese variants grouped together in language dropdown
2026-05-22 - Version 1.2.0
New Features
- Precision measurement tools — single and continuous modes, real-time preview during drag, distance/angle/dx/dy readout in mil or mm
- Status bar cursor coordinate display — real-time X/Y position in current unit
- Origin crosshair lines — perpendicular guides at the Gerber origin point, track during pan/drag
- Customizable grid overlay — none / lines / dots / crosshair modes, alignment to Gerber origin or bounding box
- Grid auto-hides when zoomed out beyond useful spacing
- Real-time cross-probe cursor with continuous coordinate tracking across all canvas layers
- Unit toggle between mil and mm — measurement values and grid spacing update in real time
- Canvas flip / mirror view toggle for inspecting board from different perspectives
- Zoom percentage manual input with arithmetic expression support (e.g.
2*50→ 100%) - Auto-detect Gerber file units (mm / inches) on first file parse
Improvements
- Layer panel refactored to flex layout: header with title/filters/All toggle is always visible, layer list scrolls independently
- Language switching now performs full page reload — URL always matches the served language HTML
- Simplified language initialization — URL path is the single source of truth
Bug Fixes
- Fixed language mismatch when opening root URL with a stored language preference
- Fixed language setting not persisting correctly across page loads
2026-05-20 - Version 1.1.1
New Features
- Layer color customization with custom color picker popup at mouse position
- Eyedropper tool (EyeDropper API) for picking colors from screen
- Fixed header area in layer panel (title + filters + All toggle always visible)
Improvements
- Switched from Pickr library to custom lightweight color picker popup
- Added EyeDropper API support for screen color sampling
- Right panel refactored to flex layout: header always visible, layer list scrolls independently
- ZIP file name displayed in toolbar when loading from archive
- All Layers eye icon enlarged for consistency
2026-05-19 - Version 1.1.0
New Features
- Added 20-language internationalization with full UI translations
- Added PCB logo and favicon across all pages
- Added language dropdown with globe icon in toolbar
Improvements
- Redesigned static pages with dark theme matching the main app
- Replaced text toolbar buttons with SVG icons
- Changed URL language routing from hash (#/en) to clean path (/en)
- Replaced Simple.css with custom dark theme template
- Fixed dropdown highlight not updating on language switch
- Fixed frontmatter rendering in static pages
- Optimized layout for all screen sizes
New Features
- Added SEO meta tags for better search engine indexing
- Added Baidu site verification
- Added visitor counter
- Improved about dialog with contact information
- Added Chinese/English language support
Improvements
- Enhanced JSON-LD structured data
- Added robots.txt and sitemap.xml
- Optimized rendering performance
2026-05-14 - Version 1.0.0
Initial Release
- Gerber RS-274X file parsing and rendering
- Excellon drill file support
- Multi-layer overlay display
- ZIP batch import
- Drag and drop upload
- Smart layer type detection
- Dark theme UI
- Zoom, pan, and fit controls
- Responsive design
This changelog tracks major updates to Online Gerber Viewer.
