TRACE Boardviewer release notes
What changed in each release of TRACE Boardviewer, newest first. Downloads and SHA-256 checksums are on the GitHub releases page; the exact format support is in docs/SUPPORT.md.
TRACE Boardviewer 1.3.1
Windows x64, macOS Apple silicon and Linux x86-64 packages carry the same application features; macOS and Linux remain experimental. ### New
- Native Allegro BRD databases now import components, values, packages, pin labels, nets, pad positions and dimensions, and board outlines. Selected 16.2, 16.4, 16.5, 16.6 and 17.2 layouts have real-file checks; other 16.0–17.5 layouts use synthetic fixtures. Unsupported keyed records and layer semantics fail explicitly. Bodies remain estimated; curves use chords, custom pads use extents, and tracks, copper fills and vias are omitted.
- Jet3/Jet4 BV database and BV2 text boardviews import Layout, Pin and Nail tables with explicit units, pin identities, nets, sides, test points and outlines. Selected Jet4 and BV2 exports were independently checked. Jet3 uses synthetic validation. Physical bodies and pads are estimated; encrypted database pages, overflow rows, multiple outline groups and unknown schemas remain unsupported.
- Native Unisoft F2B version 6/8 archives import component references, pin labels, positions, nets and placed-pin sides, with counted object references and dictionaries checked through EOF. Bodies and pads are estimated; tracks, vias, native outlines, BOM values and annotations are omitted. Other archive or payload layouts fail with an export suggestion.
- Placed Mentor Boardstation Neutral exports import declared units, absolute pin positions, literal net names, component origins and explicit sides. Missing pad/outline geometry is disclosed; unvalidated board transforms are refused.
- Tebo-ict v3.0 BOARD / BOARD_XY pairs open from either entry file. Explicit Ref.Pin connections and matching node sets preserve electrical identity, inch positions, access sides and the outline. Bodies, pad sizes and tester availability are not established by this format.
- Fabmaster FARC ASCII jobs and FAZ ZIP packages import pin positions, identities, nets, sides, placements, test vias and straight board outlines. Section counts and electrical membership are cross-checked. Routing and tester settings are omitted; pad sizes are estimated.
- Readers for IPC-2581 revisions B/C, HyperLynx, Fabmaster FATF, EasyEDA Standard/Pro PCB, IPC-D-356 and CSV/TSV pin lists, plus Altium SchDoc schematics. EasyEDA Pro and SchDoc have selected real-file checks; IPC-2581 and IPC-D-356 were validated with open tool-written exports. HyperLynx, Fabmaster, EasyEDA Standard and pin lists remain draft with synthetic fixtures only. [The support table](docs/SUPPORT.md) gives the status and limits of each reader.
- ODB++ product models from tgz, tar.gz, tar, tar.Z and ZIP archives, including a nested model archive. Components, pins, nets, pads, package bodies and the board profile are read. Validation used open tool-written exports; vendor-written models remain unverified.
- Open a single board and its companions directly from a ZIP, by Open, drag and drop or the command line. Extraction stays in memory. Multiple boards, encrypted or split archives, unsafe paths and damaged entries are refused. The generic ZIP container is draft, validated with synthetic fixtures.
- Offline English text recognition for scanned PDFs. Recognized words carry confidence marks and are searchable; only exact board references or net names with at least 60% confidence become links. Progress and Cancel are available, completed pages stay recognized for the session, and no OCR data is downloaded or uploaded.
- Import progress for GenCAD and KiCad, Cancel for every format, and a watchdog for readers that stop making progress.
- Settings > Network lists permitted features and hosts and shows a bounded, clearable request log without query values, response bodies, credentials or file contents.
- Unresolved notes remain visible in a list with Copy and Delete rather than disappearing when a reader no longer finds their target.
- A small support heart and optional reminders at startup and once per hour. They wait for imports and other dialogs and can be dismissed with Not now, Escape or a click outside. Retry stays keyboard-accessible and announces progress while support verification is pending. A provider-confirmed Stripe or Ko-fi payment hides both for one calendar year, including offline use. Verification is optional; it sends only a random support code to the receipt service. Key entry also has an explicit Skip button. Damaged or unreadable local receipt storage is reported without replacing it; after storage is repaired, Try again repeats preparation. The Stripe page remains available if a local support reference cannot be prepared.
- Local format diagnostic reports from Help, with counts, sizes, detection and structural facts. File names, content, coordinates and keys are excluded. Optional structural detail and a local repeat-detection code are off by default. The user reviews and saves or copies the report; nothing is uploaded automatically. A separate format-request issue form accepts this report.
- In-app bug reports: describe an issue, optionally include a minimal technical summary, and inspect the exact preview before explicitly sending it to a separate receiver. You can edit or cancel before sending; draft saving is optional, and drafts and retry records stay on the device and expire after seven days. Failed or uncertain reports are never resent automatically; retry is manual and uses the same report. No GitHub account or attachments are needed. A local helper flags some paths and credential-like text, but cannot catch everything and changes text only when you explicitly choose removal.
- FZ/CAE also accepts zero-delimited and PC6-tagged containers and a bounded compressed outer envelope. Complete framing selects plaintext before RC6, so coincidental zlib bytes in ciphertext do not misclassify a file. Exact stream boundaries, checksums and size limits remain mandatory. Renamed AppleDouble files receive a macOS metadata explanation instead of an encryption-key request.
- TVW compact pin groups now resolve each group's physical layer, including components spanning both sides. Empty layer slots retain source indices; additional probe registries, net/reference/test-point layouts and zero-sized aperture definitions preserve their explicit physical records. Unknown or inconsistent layers remain explicit rejections.
- GenCAD accepts the fixed length-checked storage-page wrapper, equivalent repeated definitions, equivalent components on both sides and completed empty CHANGES repetitions, while rejecting geometry conflicts and foreign suffixes.
- ASC opens either exact outline name, format.asc or @format.asc, with its same-directory pin/nail companions. Pin/nail entry files prefer the ordinary outline and use the alternate when absent. Unselected companions neither consume the import budget nor block the chosen set; saved-note identity follows that set.
- Honhan BDV adds encoded nails-first exports with a disclosed estimated outline. Landrex adds extended Pins1 records with first-pin indices checked against explicit owners and strict terminal DOS EOF/NUL padding. TOPTEST BRD2 retains signed and empty nets; BRDOUT .gr is included in the chooser. BVR variants retain optional outline metadata and positioned pinless components without inventing electrical connections. Fabmaster TEXT outline annotations use their own field types.
- Fixed extensionless companion entries, including BOARD and BOARD_XY, can be opened directly or from a ZIP. The native chooser has an all-files choice in all eight languages; only declared same-directory roles are read, with combined byte limits.
- Native PADS SDB, exact BRD_V1.0 encoded headers and VS2 assembly lists receive precise recognition and bounded content-free diagnostics. They remain unreadable. Native PADS conversion failed in the tested KiCad builds; obtain a matching PADS Layout ASCII export instead. CAST CST reads only documented component-layer mappings and refuses unverified planes.
- FZ/CAE open automatically with published default format keys. Session-only overrides remain available for other variants. Container framing, declared sizes and both checksums are validated, and diagnostics use the same rules as import. Outlines are unavailable and physical pad dimensions remain unverified.
- Selected Honhan BDV exports now accept shortened headers, UTF-16 text, radius columns, wrapped/blank/comma-separated probe lists and spaced net names. Nonzero outline radii are disclosed as straight segments.
- Selected Landrex/TestLink BRD exports accept extra signed header fields and test points without nets. Samsung CAD includes N_VIA test points under their net and correct side. These checks establish the selected export families, not every dialect.
- TVW reads full component tables, physical pad positions and pin UID links, including test points, reordered pins and selected metadata variants. Layer types determine sides. Unsupported layer/header layouts fail explicitly; outlines and copper traces are absent and custom pads use bounding boxes.
- Notes use component reference and pin number instead of reader output order. Existing notes convert once and retain a backup. Ambiguous or unnamed targets are disclosed; indistinguishable targets cannot receive a misleading note. Notes from older BDV or ASC files with shortened component or test-point headers stay unresolved when their original identities cannot be established safely. Their original data and positional backups remain; a note that RC2 already keyed to the wrong target cannot be identified and repaired automatically.
- The Linux guide explains where the sandbox consent choice is stored and how to reset it without removing other settings or notes.
- Shared part classification makes the canvas, inspector, search and icons agree. IC/PMIC, connectors, test points, resistor arrays, oscillators, ferrite beads, LEDs, switches, jumpers and mechanical parts receive consistent labels.
- One shared board index reduces repeated lookup work. Search and schematic comparison run in a background worker with a fallback if that worker stops; results from an earlier query cannot be selected while a newer query is pending.
- Readers detect content by certainty rather than registration order. Equally certain matches fail with both format names in all eight languages. Open-dialog filters include all registered extensions.
- The support table distinguishes selected real exports, files written by open tools and synthetic validation. BVRAW_FORMAT_3 includes selected real exports and open-tool cross-checks; IPC-2581, IPC-D-356 and ODB++ disclose their open-tool validation scope.
- KiCad copper layers are read by number and type, so renamed KiCad 5 layers open. Selected KiCad 9 teardrop records with a missing opening parenthesis are recovered with a counted note.
- Altium PcbDoc ignores and reports unsupported non-copper/inner-layer objects instead of rejecting an otherwise readable board. Hole-only pads retain their drill size; multiline ASCII text and selected record layouts open.
- Fit sheet uses the schematic paper frame and handles outlying notes without shrinking the page unnecessarily.
- The inspector retains a selected part's schematic counterpart after Show in schematic or schematic selection.
- Unnumbered BVR pads receive distinct synthetic numbers and cannot collide with numbered pads.
- More ground aliases, case variants and hierarchy-qualified names are recognized.
- Crafted GenCAD and KiCad/EAGLE schematic inputs no longer trigger excessive outline or connectivity work. Non-finite/out-of-range schematic geometry fails explicitly, duplicate EAGLE symbol pin names produce a warning, and quoted error text stays bounded.
- All main-process network requests pass through one audited HTTPS allow-list with size/time limits, no redirects, cookies or credentials, and feature-specific opt-in controls.
- The Windows download omits an unused native canvas component and update metadata. The AppImage documentation reflects its static runtime, which needs no libfuse2.
- Shared board scenes and ordered rendering layers preserve selection, measurement and camera behavior. Seeded synthetic benchmarks, load-aware reports, fuzz/property tests and bounded diagnostics exercise large and malformed inputs.
- Shared value parsing, net classification, board fingerprints and a net graph support future tools. Photo/thermal registration, probe ranking, rail/tree/fan/shared-path analysis, short-suspect ranking and drop-location modules are foundations; their interfaces are not exposed in this release.
- Local readings contracts, storage, JSON/CSV packs, comparison, reference capture, meter decoders, a simulated meter and licensed OpenBoardData import are present as foundations. The dedicated readings interface is not exposed.
- Library contracts, bounded sniffing, knowledge rules and synthetic generators are present; the Library browser and device catalogue are not exposed.
- Eight translation catalogs use feature namespaces with key/placeholder/plural parity and a lint gate for new untranslated interface text. Existing untranslated workspace text remains documented.
- Windows x64 packages are unsigned. The macOS Apple silicon and Linux x86-64 packages are experimental and unsigned. Native acceptance run 37974058845 reported issues for macOS and Linux; investigation is ongoing.
- Files are limited to 64 MiB. Generic ZIPs allow one board, 4,096 entries and 64 MiB of selected unpacked board/companion data, with expansion and CRC checks.
- ODB++ does not draw copper, drills, mask or silkscreen; complex pad shapes use bounding rectangles.
- OCR is English only, with a 40-megapixel and two-minute limit per page.
- XZZ requires a user-supplied session key and is not claimed as supported. Other encrypted variants without usable key material may remain unreadable, while the app stays usable and key entry can be skipped.
- A payment made without the application-generated support code still needs a separate verified recovery process. Deleting the local receipt removes local reminder suppression; no supporter identity is stored in the application.
TRACE Boardviewer 1.3.1-rc.2
Testing prerelease preceding stable 1.3.1; macOS and Linux packages were experimental.
TRACE Boardviewer 1.3.0
- Linux (experimental): a .deb and an AppImage for x86-64 (
config/electron-builder.linux.yml), built, smoke-tested and scanned for private names and paths by the newlinuxjob of the release workflow on Ubuntu 24.04 and attached to the draft release with their SHA256 files. The builds are unsigned and have not been tried on a desktop Linux machine yet. The .deb installs an AppArmor profile so that Chromium's sandbox stays on under Ubuntu's user-namespace restriction; the AppImage uses the static AppImage runtime (no libfuse2 needed). - Desktop shell on Linux: the window icon comes from the PNG; a process started without the Chromium sandbox (the AppImage on Ubuntu 23.10 and newer) asks before it opens a window, with Quit as the default and "Do not ask again" as an option; the profile directory is fixed at
$XDG_CONFIG_HOME/trace-boardviewer(~/.config/trace-boardviewer);file://arguments from desktop launchers open the board. - Tests: static Linux packaging and workflow checks, a packaged Linux smoke test with objective sandbox evidence, and the
W-fin-lifecycle-01desktop check no longer assumes Windows path rules for documents on other systems. - Docs:
docs/LINUX.md(packages, sandbox, data location, what is tested and what is not, troubleshooting), a Linux section and download button in the README, a Linux entry indocs/SUPPORT.md, a Linux note inSECURITY.mdand Linux choices in the bug report form. The README'sapp.asarsentence now says that the integrity check is available on Windows and macOS only: Electron does not offer it on Linux. - Parsers and search read long runs in linear time (code scanning findings): decimal numbers (GenCAD/text reader, BDV family, s-expressions, EAGLE and legacy KiCad schematics, SVG lengths, typed calibration distance), KiCad bus labels with runs of
~{slash}(exponential before), XZZ name fields, the IPC-2581 prolog, PDF token edge punctuation in search and cross-probe, legacy KiCad AR records, BRD2 section headings, the GenCAD guard of the recognizers, EAGLE sheet descriptions and the typed distance unit. Each replacement was compared with the previous pattern on millions of generated inputs with no difference; every place has a timing test that fails against the old code. - Code scanning: the support table escapes backslashes in cells before pipes; two tests that replaced a text with itself now check the change; the Electron smoke helper passes its argument as data; the preload host check uses a pattern test.
- Dependencies: advisories fixed by updates and a
global-agent@<4override (pnpm-workspace.yaml);cfbmoved to devDependencies, so it is no longer part of the packaged app.
TRACE Boardviewer 1.2.0
- Support notice: a short, skippable notice ("TRACE is free and stays free") appears once on every start, over the ready UI and never blocking a board load; "Not now" has the initial focus (Enter, Esc or a click outside skip it), there is no "don't show again", and its two buttons open the Stripe and Ko-fi pages in the system browser. Copy in all eight languages.
- The renderer sends only an id ('stripe', 'kofi' or 'bug') over the new IPC channel
trace:open-support-link(window.traceDesktop.openSupportLink); the URLs are constants inelectron/main.cjs, any other id or type is rejected andshell.openExternalis never called for it. CSP, sandbox and context isolation are unchanged. - Tests: desktop checks for the id allow-list (exact URLs, prototype names, URLs and non-strings rejected) and the preload surface, vitest for the once-per-launch claim, the request flow, the web fallback, the copy in all eight catalogs and the dialog markup.
- Bug reporting: a Report a bug button in the top bar and in the support notice opens the GitHub bug report form in the system browser (the third fixed id, bug, of the same main-process allow-list); the notice thanks testers and asks them to report bugs, in all eight languages; the repository gets an issue form that asks not to attach proprietary files.
- Update notification (decided scope: a notification, not a self-installer): at start TRACE can ask the GitHub releases API once whether a newer stable release exists and, if so, shows a small dismissible strip under the top bar ("TRACE 1.2.1 is available." with a Download button) that opens the release page in the system browser; the check also runs on demand from Settings ("Check now", with a polite status line). TRACE never downloads, unpacks or runs anything, because the Windows build is an unsigned portable EXE (electron-updater cannot update portable builds) and the macOS build is unsigned (macOS auto-update needs a signed app); silently replacing unsigned executables would also be a supply-chain risk. While the repository is private the API answers 404 and the check is silently "unavailable".
- The request is made by the main process only (Electron
net.fetch), never by the renderer (the CSPconnect-src 'self'is unchanged): one HTTPS GET to the fixed releases/latest URL, only theAccept, a fixedAccept-Language: en(the system language stays private),User-Agent: TRACE-Boardviewer/<version>andX-GitHub-Api-Version: 2022-11-28headers, no cookies or credentials, no referrer, no redirect followed, 8 s timeout, at most 256 KiB read. Nothing about the user, the machine or any file is sent. Only a tag of the exact formv<major>.<minor>.<patch>(no leading zeros) is offered; a tag with a pre-release suffix such as-rc1counts as nothing newer, like a draft or a pre-release; versions compare numerically (1.10.0 is newer than 1.9.0, and a release is newer than its own pre-release), and every failure is the same bare "unavailable" with no error text or response content passed on. - Rate limits: GitHub allows 60 unauthenticated requests per hour per address, shared with every other GitHub client behind the same connection, so the main process spends at most one request per 30 s and, after a 403 or 429, waits as long as the answer asks (
retry-after, elsex-ratelimit-reset; between one minute and one hour). Until then the start-up check and Check now get the last answer again without a request, and asks that overlap share one request. The renderer contract is unchanged. - One repository slug (
electron/repository.json:trace-boardviewer/trace-boardviewer) builds the API URL, the release page, the bug report link of the main process and the web fallback of the browser-only mode. Because redirects are refused by design, renaming the repository would break the check of every shipped build (see RELEASING.md). - Two privileged IPC channels behind the trusted-sender check, both reading no renderer argument:
trace:check-for-updates(returns{ status: 'available', version },{ status: 'current' }or{ status: 'unavailable' }; the validated tag stays in the main process) andtrace:open-update-page(openshttps://github.com/trace-boardviewer/trace-boardviewer/releases/tag/<that tag>; text from the response such ashtml_url,nameorbodyis never used; rejects with "No update available." before a successful check).window.traceDesktop.checkForUpdatesandopenUpdatePageare optional members: an older preload, or the browser-only dev mode, shows no switch, no button and no strip. - New setting
updateCheck(Settings: "Check for updates when TRACE starts", on by default, with a hint that it makes one request to github.com, sends nothing about the user or their files and never installs anything). Profiles saved before this release get it switched on; a damaged stored value falls back to on without resetting the other settings. One check per launch, taken at start only (switching the setting on later does not start a request; Check now does), and the strip waits until the support notice is closed. Automated UI scripts can setwindow.__TRACE_UPDATE_CHECK__ = 'off'before the page starts to make no request at all. - Copy for the switch, the hint, Check now, the status lines, Download and Dismiss (plus one failure line for a download page that could not be opened) in all eight languages. README: the privacy sentence now names the optional update check as the only network request.
- Tests: updates.cjs with an injected fetch (newer, same, older, 1.10.0 vs 1.9.0, draft, pre-release, malformed and suffixed tags, non-200, bad JSON, oversize and endless bodies, timeouts, redirects and foreign hosts, exact request headers, no credentials), the two handlers (forged sender, ignored arguments, rejection before any check, exactly the tag URL after an "available" check, never
openExternalotherwise), the setting's default and validation, and vitest for the pure module, the strip and Settings markup in all eight languages, the start-up ordering and the catalogs. Mutation checks (URL taken from the response, redirects followed, relaxed tag pattern, text comparison, renderer-supplied tag, no size limit, pre-releases offered, no default for the setting) are all caught. - Boardview and design formats validated with real open-design files: the five Raspberry Pi Pico BVRAW_FORMAT_3 boardviews written by kicad-boardview now open (empty PIN_NAME / PIN_NET values are read as empty instead of rejecting the file; three files cross-checked pad by pad against their
.kicad_pcb); KiCad PCB and EAGLE board XML are validated with real boards (KiCad 9 demo, SparkFun RedBoard and its production panel, Antmicro Jetson Nano baseboard, Pico designs) together with their KiCad / EAGLE schematics and board cross-probe (all nets of six board/schematic pairs match by exact name). Fixes: a 28 MB KiCad board is streamed instead of refused by the expression limit (W-open-kicad-01), outline corners 20 nm apart close the contour (W-open-kicad-02), second pads of the same number and unnumbered pads no longer collide with real pad numbers (W-open-kicad-03/04), PWR_FLAG,{slash}escapes and hidden power pins no longer name or merge nets (W-open-sch-01/02/03), sheet-qualified and automatic KiCad net names cross-probe by exact name (W-open-cross-01/02). Landrex BRD, FZ/CAE and XZZ omit a component without pins instead of rejecting the file, XZZUNCONNECTED<n>is "no net", and a draft Samsung CAD reader (synthetic fixtures only) replaces the recognizer.docs/SUPPORT.mdnames the validated families and the remaining gaps. - Tests prove the portable builder patch by the byte-exact digest of the patched template instead of the pnpm directory name, which differs between Windows and Linux installs (W-fix3-qa-01).
- Boardview adapters registered behind a byte-based dispatcher: Landrex/TestLink BRD, TOPTEST BRD2, Honhan BDV, BVR, ASC trio, FZ/CAE, XZZ, CAST CST, KiCad PCB, EAGLE board XML and Altium PcbDoc (draft: synthetic fixtures only), plus explained recognition of unsupported families. See
docs/SUPPORT.md. - Technician workspace: Board/Schematic/Documents tabs, split view, unified search, PDF viewer (offline pdf.js), image viewer with explicit calibration, structured KiCad/EAGLE schematics with connectivity and board cross-probe, durable per-board workspace manifests, pin notes with measurements, project export of selected files.
- Native persistence rebuilt on a queued atomic store: writes after the quit intent are rejected while accepted writes are drained; exact-size bounded reads; coalesced external-open requests; entry-independent identity for multi-file boards.
- Phase-1 closure: per-board view (camera and side) persistence, alias editing (Link and aliases), explicit net-only ambiguity candidates, schematic attach no longer shares transferable buffers (B42), stale browser chooser can no longer replace a newer board (B43), export honours the quit intent and short writes (B44, B45), the PDF viewer keeps the reading position on remount (B46).
- Local phase-1 continuation (Windows): the document camera keeps its fit mode (
fit: width | page | none) across remounts, search hits and restarts instead of freezing a manual zoom (W-win-viewers-01, W-fin-crossprobe-02); the PDF row status follows the pdf.js session, so a rejected PDF shows an error instead of a Ready chip (I06); a rejected FZ/XZZ key is forgotten (W-win-import-02); native writes retry a rename blocked by another handle and reads no longer collide with writes of the same file (W-win-lifecycle-01), the window close andapp.quit()ask the renderer to write its pending state first (W-fin-lifecycle-02, W-fin-documents-01), NTFS alternate-data-stream paths are refused (W-fin-lifecycle-01); the workshop layout stays usable at 960×640 (side panels start collapsed on the document views below 1120 px, the document strip wraps and keeps Attach visible; W-win-viewers-02/03); schematic candidate banners are an overlay that no longer shifts the sheet under the pointer (W-fin-crossprobe-01); the board canvas repaints after a lost 2D context (GPU process restart; W-fix2-portable-02), component hit-testing uses the real outline (B17), pad picking prefers the pad under the pointer (B23), the measurement dash is clipped to the viewport (P03) and offscreen pad paths are no longer rebuilt on zoom (P04). Docs: portable temp footprint and local packaging prerequisites. - Portable Windows wrapper (pnpm patch of electron-builder's
portable.nsi,patches/app-builder-lib@26.15.3.patch): two launches started within a few milliseconds of each other no longer share one NSIS plug-in folder (measured on real Windows: 8 of 40 such starts lost one launch before the patch, independent of the extraction-folder setting); the wrapper now serializes that initialization through%TEMP%\trace-boardviewer-portable-init.lock(a 0-byte file that stays in%TEMP%) and retries the removal of its extraction folder (40 retries of 250 ms plus the removal attempts themselves: measured about 10 s after the app's processes ended with a file still held, and 20.3 s in total when the lock itself is held) while a child process of the app still holds a file (measured: 3 of 20 same-profile second launches left%TEMP%\ns<letter><hex>.tmp\appbehind before the patch). The app itself (ASAR) is unchanged. - Portable Windows build: every launch now extracts into its own private temporary folder (
build.portable.unpackDirName: true), so closing or starting one instance no longer deletes another running instance's runtime and overlapping launches no longer lose each other (W-win-build-01, W-fin-build-01). Guarded by a static builder-semantics test, a real-Windows two-instance check that runs against the exact uploaded EXE, and a control build of the old shared-folder layout that the check must detect. A launch that is killed or crashes can leave its folder in%TEMP%. - macOS (experimental): an unsigned Apple-silicon zip (ad-hoc signed, not notarized;
config/electron-builder.mac.yml,scripts/mac-smoke.cjs, static checks,docs/MAC_VALIDATION.md) is built, smoke-tested and scanned for private names and paths by themacjob of the release workflow on a GitHub macOS runner, and attached to the draft release next to the Windows EXE with its SHA256 file. A downloaded copy needs the quarantine flag removed once (xattr -dr com.apple.quarantine "/Applications/TRACE Boardviewer.app"). Validated natively on an Apple M3 (docs/MAC_LOCAL_REPORT_arm64_2026-10-06.md); Intel Macs and a universal build are not packaged. - Release workflow: a version with a prerelease suffix (for example
1.3.0-rc.1) is created as a GitHub prerelease, so the in-app update check, which only reads the latest stable release, never sees a suffixed tag. - Desktop shell: a renderer that crashed or was killed is reported in a dialog and the page is loaded again (the start-up state is reset, an external open that arrives meanwhile waits for the new renderer); a renderer that stops responding offers Wait or Close window; a window whose page never paints is shown after 4 s instead of staying invisible while it holds the single-instance lock, and a second launch shows a not-yet-visible window before focusing it;
--board <path>with a space works when handed to a running instance (Chromium moves the switch in front of the path); a start-up file that cannot be opened no longer blocks the recent boards: the renderer gets the error and the last board follows; aconfig.jsonthat is damaged or was written by another version is kept asconfig.json.bak-<timestamp>before the first write; the session policy (permissions, no downloads) is installed once instead of per window (H1-01, H1-02, H1-03, H1-05, H1-06, H1-08). The two dialogs have texts in all eight languages. - Packaging: the Electron fuses are flipped in the Windows and macOS binaries (
build.electronFusesinpackage.json,config/electron-builder.mac.yml): noELECTRON_RUN_AS_NODE, noNODE_OPTIONS, application code only fromapp.asarwith the embedded integrity check, cookie encryption;file://keeps its privileges (the UI and pdf.js load over it) and--inspectstays available because every Playwright launch of a packaged build (pnpm qa:packaged,scripts/mac-smoke.cjs) attaches through it (H1-07).
TRACE Boardviewer 1.1.0
- Interface localization in Hungarian, English, German, French, Italian, Slovak, Polish and Ukrainian, with an instant language switch in Settings.
- A fresh profile follows the system language; profiles saved before this release keep their Hungarian interface, settings, recent boards and notes. One damaged stored setting no longer resets the other valid settings.
- Importer errors and warnings, native file dialogs and messages, numbers and dates follow the selected language. Board data, net names, notes and
mmunits are never translated. - Translation catalogs in
electron/locales/shared by the interface and the desktop shell, with automated checks for key, placeholder, plural and native/web consistency. - Long translated measurement instructions stay clear of board-side controls in small windows, with room for translated pin-table headings.
- Faster interaction on dense nets through reduced redraw work and geometry processing.
- A complete portable Windows x64 application in one EXE.
- Recent boards are saved only after successful parsing. Startup restoration skips invalid legacy recent files and tries the remaining entries.
- A newer file-open request supersedes older loading work, preventing stale board payloads and error dialogs from replacing the current board. Cancelling a newer file chooser also suppresses an older pending delivery.
- Closing during startup no longer shows a misleading interface-loading error.
- Public development documentation, MIT license, bundled dependency notices and Windows build/draft-release automation.
- Portable QA configuration without developer-specific paths or a bundled private board.
TRACE Boardviewer 1.0.0
- Initial GENCAD 1.4 desktop viewer with component and pin search, net highlighting, top/bottom views, pan, zoom and rotation.
- Workshop and Focus layouts, dark/light/system themes, distance measurement and local component notes.
- Local recent-board restoration and isolated native file/persistence APIs.
Found a problem in a release? Please use the bug report form and do not attach proprietary board files.