Back to Articles

Building Desktop Wrappers for CLI Tools: Inside SiteOne Crawler GUI's Architecture

[ View on GitHub ]

Building Desktop Wrappers for CLI Tools: Inside SiteOne Crawler GUI’s Architecture

Hook

Most desktop app wrappers around CLI tools either dumb down the interface for beginners or overwhelm casual users with complexity. SiteOne Crawler GUI solves this with synchronized dual forms—one for each audience—that generate the same command-line arguments behind the scenes.

Context

Website auditing for SEO, security, accessibility, and performance typically requires either expensive SaaS subscriptions or comfort with command-line tools. The SiteOne Crawler CLI offers comprehensive website analysis as an open-source tool, but asking marketing teams or QA engineers to construct command-line arguments with dozens of flags creates adoption friction. Desktop GUI wrappers bridge this gap, yet most either expose every option in an overwhelming single form or hide advanced features entirely, forcing power users back to the terminal. SiteOne Crawler GUI takes a different approach: it’s explicitly designed as an Electron-based desktop wrapper that makes the CLI accessible to non-technical users while preserving every advanced configuration option for developers. The architecture reveals pragmatic decisions about embedding CLI tools as submodules, managing child processes, and presenting dual interfaces that stay synchronized.

Technical Insight

Bidirectional Sync

CLI Arguments

CLI Arguments

Spawn Child Process

Real-time Progress

Progress Updates

Generate Files

Open Reports

User Interface

Svelte + TypeScript

Basic Form

Advanced Form

Electron Main Process

SiteOne Crawler CLI

Git Submodule

Output Folder

Reports Viewer

HTML/JSON/TXT

System architecture — auto-generated

The architecture centers on Electron as the desktop framework, with Svelte and TypeScript handling the UI layer. The critical design decision is embedding the actual SiteOne Crawler CLI as a Git submodule rather than bundling it as a compiled binary or calling an external installation. During setup, developers run git submodule update --init --recursive to pull the crawler into src/siteone-crawler, making it part of the application bundle.

When users configure a crawl and click start, the GUI appears to construct command-line arguments and invoke the crawler as a subprocess. This delegation strategy keeps the GUI code focused on interface concerns while leveraging the CLI’s crawling logic. The form components generate command-line parameters from UI inputs and parse output for progress updates.

The dual-form synchronization is the most interesting UX architecture decision. A basic form exposes essential options (URL, max pages, depth, output format) with constrained value ranges appropriate for casual users. An advanced form presents every CLI flag without validation limits. The README states these forms are synchronized, so changing settings in the basic form updates the corresponding field in advanced settings. This bidirectional sync means power users can start with basic settings, flip to advanced mode, and tweak parameters outside the UI’s suggested ranges—then flip back without losing context.

Output handling follows a desktop-first philosophy. All generated content—HTML reports, JSON exports, offline website copies, sitemaps—writes to a SiteOne-Crawler folder on the user’s desktop. This predictable location makes results immediately discoverable without file picker dialogs. When crawling completes, the Results tab displays buttons to open HTML reports in the default browser or reveal folders in the file explorer.

The tech stack reflects modern Electron development: Vite provides fast bundling with hot module replacement during development, Tailwind CSS with daisyUI components handles styling, and TypeScript adds type annotations. The README notes that to create builds, developers must remove npm run typecheck && from the build script in package.json, indicating that the type checking step was not fully resolved in early versions.

Cross-platform builds expose a constraint of the Electron ecosystem: platform-specific installers must compile on the target OS. The build scripts (build:win-x64, build:mac-arm64, etc.) can’t cross-compile from a single CI runner, complicating release workflows. The developer must maintain access to Windows, macOS Intel, macOS ARM, and Linux environments to generate the full suite of installers—or accept slower CI pipelines with multiple platform-specific jobs.

Gotcha

The developer’s transparency about technical debt is refreshing but critical to understand before forking or contributing. The README explicitly states that code structure is “not optimal,” component separation is poor, and state management between components is not ideal. This emerged from rapid development across “several evenings” prioritizing functionality over architecture. The README notes that developers must remove the typecheck step from the build script to successfully create builds, suggesting type checking issues remain unresolved in the current version.

This architectural debt may block collaborative development. The maintainer requests that contributors open issues before submitting PRs and states that new features will only be accepted after significant refactoring. If you’re evaluating this project as a foundation for custom tooling, budget time for restructuring before adding features.

The platform-specific build requirement creates friction for maintainers releasing updates. Unlike pure web applications that deploy once, each release demands compiling five separate installers (Windows x64, macOS x64, macOS ARM64, Linux x64, Linux ARM64) on their respective operating systems. Without cross-compilation support, this multiplies release overhead compared to single-platform tools.

Verdict

Use SiteOne Crawler GUI if you need comprehensive website crawling and analysis (SEO, security, accessibility, performance) across multiple sites and your team includes non-technical stakeholders who benefit from a desktop interface over terminal commands. It’s particularly valuable for consultants running client audits, QA teams doing regular site checks, or DevOps engineers who want crawl reports without constructing CLI arguments. The dual-form approach appears to accommodate both casual and power users, and the desktop-first output handling (everything lands in a predictable folder on your desktop) works well for local workflows. Skip it if you’re already comfortable with command-line tools—use the underlying SiteOne Crawler CLI directly for scripting and CI/CD integration without the Electron overhead. Also skip if you need production-ready code for forking—the acknowledged technical debt and build script workarounds mean you’ll likely spend time refactoring before building custom features. Finally, avoid this if you require web-based deployment or team collaboration features; this is strictly a single-user desktop application.

// ADD TO YOUR README
[![Featured on Starlog](https://starlog.is/api/badge/automation/janreges-siteone-crawler-gui.svg)](https://starlog.is/api/badge-click/automation/janreges-siteone-crawler-gui)