Skip to content
Open Source / Rust + wgpu

Solarxy

A real-time 3D model viewer and visual debugger, in Rust.

An open-source desktop app with PBR rendering, split viewports, and inspection overlays, plus a terminal validator that runs the same checks in CI. I designed the product, set the roadmap, and directed the build, with AI as the engineering team and years in 3D pipelines as the judgment that kept it honest.

Solarxy showing a 3D model in a shaded pane next to its UV layout in a split viewport.
Role
Creator, product and direction
Timeline
Nov 2025 to present
Status
v0.6.0, active
License
MIT
Platforms
macOS, Linux, Windows
At a glance
Role
Solo creator: BA, product, direction
Timeline
Nov 2025 to present
Status
v0.6.0, actively developed
License
MIT, open source
Platforms
macOS, Linux, Windows
Stack
Rust 2024, wgpu, egui, ratatui

Solarxy renders OBJ, STL, PLY, and glTF with a full PBR pipeline and a debugger's toolkit, then validates the same assets from the terminal so broken geometry never ships. One Rust codebase, three platforms, MIT licensed.

  • One tool across the whole asset path: open and inspect locally, then gate the same checks in CI.
  • Real-time PBR plus a debugger's overlays (UV overlap, texel density, overdraw, normals, validation) in one native window.
  • Spatially-anchored review notes that persist beside the model and survive re-exports.
  • Native installs on macOS, Linux, and Windows from a clean, six-crate Rust workspace of roughly 33,000 lines.
The problem

Why Solarxy

Anyone who has worked with 3D assets knows the friction. You receive or create a model and you need to check it. Are the normals right. Are the UVs present. Is the geometry clean. Is the silhouette correct. Over the years I built a lot of small visual checkers to answer those questions: shader overrides, normal checks, curvature views, written as MaxScript inside 3ds Max.

A model framed by its bounding box while being inspected in Solarxy.
Inspecting an asset before trusting it.

The problem is that those tools are locked inside the DCC, and not a cheap one. Every time I moved from 3ds Max to Houdini to Blender I rebuilt the same checkers from scratch in a different scripting language. I am still dragging ten-year-old MaxScripts onto every new machine. I wanted one tool that works the same regardless of which software made the model: a standalone viewer that renders it properly and tells me what is wrong with it. No DCC-specific scripting, no heavy suite to open for a quick look.

So I started building it. Solarxy is the tool I always wanted on the desk between receiving an asset and trusting it.

Own the inspection niche, not the modeling one.

Most 3D tools want to be everything. Solarxy was scoped, deliberately, around a single unglamorous question that technical artists and pipeline engineers ask dozens of times a day: is this asset actually correct?

It answers in two ways from one codebase. A real-time GUI viewer with PBR rendering and inspection overlays, and a terminal mode that emits machine-readable validation for CI. The positioning came out of a deep research pass, told explicitly not to benchmark against Blender, but against the lightweight tools artists actually reach for.

That produced a clean wedge. The existing options each do one half. Solarxy does both halves, viewing and validating, and adds the part none of them have: first-class CI integration.

F3D

fast viewer, CLI

  • viewview: yes
  • validatevalidate: no
  • multi-formatmulti-format: yes
  • CI-nativeCI-native: no

Marmoset Toolbag

paid seat, rendering

  • viewview: yes
  • validatevalidate: no
  • multi-formatmulti-format: no
  • CI-nativeCI-native: no

Khronos glTF Validator

validate only, glTF

  • viewview: no
  • validatevalidate: yes
  • multi-formatmulti-format: no
  • CI-nativeCI-native: partial

Solarxy

viewer plus analyzer, Rust, MIT

  • viewview: yes
  • validatevalidate: yes
  • multi-formatmulti-format: yes
  • CI-nativeCI-native: yes
Columnsviewvalidatemulti-formatCI-native

The positioning was a deliberate choice: do both halves, integrate with CI, and stay out of the modeling fight.

My role

What I built

Solarxy is not my day job; it is a personal project, built on nights and weekends. I find it valuable to switch sides from time to time and feel what it is like to be on every end of product development. In my day job I work with great teams. Here I am a team of one: I define the specs, shape the roadmap, direct the build, test it, deploy it, break things, fix them, ship. The full loop.

The product thinking came before the first line of Rust. I ran a proper needs assessment, weighed current state against future state, and built personas from research across open-source communities and my own years in 3D pipelines. That fed a deliberate, milestone-by-milestone roadmap to the current release.

The build itself was AI-first, and I want to be honest about what that means. AI did most of the typing; I owned the judgment. Years in computer graphics are what let me tell, within seconds, when an implementation was wrong, and the work that mattered most was the planning going in and the testing coming out. How that played out, role by role, is the next section.

0

Public releases

v0.1.0 to v0.6.0 in about six months

0

Commits

first light in November 2025

0

Rust crates

acyclic graph, GPU-free core

0

Validation checks

one report across viewer, terminal, and CI

0

Inspection modes

shaded through overdraw, one key each

0

Platforms

macOS, Linux, Windows

The method

AI as the team

The interesting part of an AI-first build is not that code got written. It is how the role the AI played shifted across the project. Early on it was a graphics engineer. Then a Rust architect tearing apart a god-object. Then, as the product matured, a product manager and a business analyst deciding who it was even for. My job was to bring the domain judgment, write precise session briefs, review every change, and test on three operating systems.

01wgpu, WGSL, PBR

Graphics Engineer

The first and longest-running role: turning a render loop into a real PBR pipeline and an inspection toolkit.

  • Designed the multi-pass pipeline: shadow, main, floor, wireframe, grid, normals.
  • Specced procedural IBL, SSAO from a G-buffer, and ACES tone mapping.
  • Built the UV debug modes and the on-model inspection overlays.
02idioms, scalability

Rust Architect

When the state file became a god-object, the role shifted to structure: decomposition, traits, and a clean workspace.

  • Split one State struct into focused render, scene, post, debug, and input pieces.
  • Planned the workspace extraction into six crates with clean boundaries.
  • Swapped panics for proper error propagation and added unit-test coverage.
03roadmaps, prioritization

Product Manager

Once the engine was real, the question became sequencing: what ships in which milestone, and why.

  • Wrote milestone specs with P0, P1, P2 priorities and acceptance criteria.
  • Framed the 0.5 to 0.6 arc as Studio Adoption, one adoption test per feature.
  • Flagged scope risks early and deferred features too complex for their release.
04personas, SWOT, Kano

Business Analyst

The role that decided who Solarxy was even for, and which competitors it should ignore.

  • Built six personas, three anti-personas, and a feature-priority matrix.
  • Ran SWOT, Kano, and competitive analysis against the lightweight field.
  • Defined the wedge: own the inspection niche, do not fight Blender.
05docs, wiki, release notes

Technical Writer

Documentation treated as a product surface, including a manual that ships inside the binary.

  • Designed the in-app docs TUI: About, View, Analyze, Formats, Preferences.
  • Wrote a multi-page wiki: architecture, CLI, validation reference, tutorials.
  • Kept release notes and the README in sync across ten versions.
06CI, cargo-dist, packaging

Release Engineer

The unglamorous role that makes a project installable: gates, signing channels, and package managers.

  • Flagged the missing CI gate, no fmt, clippy, or test on main.
  • Repaired cargo-dist and the release-candidate path.
  • Bootstrapped the Homebrew and winget distribution channels.
The product

A viewer and a debugger

Pretty PBR is only half the story. The real value is what happens when you peel an asset apart.

A detailed model rendered with physically-based shading in Solarxy.
Real-time PBR: Cook-Torrance shading, IBL, SSAO, and bloom.
01 / 06

Real-time PBR rendering

A Cook-Torrance pipeline with image-based lighting, shadow mapping, SSAO, bloom, and selectable tone mapping. Drop in an HDRI and metallic surfaces start reacting to the environment. It is a real renderer that happens to fit in a small native app.

Split viewport with the shaded model in one pane and its UV layout in another.
Split viewports: per-pane cameras and inspection modes.
02 / 06

Split viewports

Divide the window into up to five layouts, each pane with its own camera and inspection mode. Study the UV islands on one side while you orbit the shaded model on the other. It is the view I always wanted when reviewing assets and never had in one lightweight tool.

A mosaic of Solarxy inspection modes shown side by side.
Seven inspection modes, one key each.
03 / 06

Seven inspection modes

One keypress strips the model down to a single kind of information: shaded, material ID, UV map, texel-density heat map, depth, overdraw, and ambient-occlusion preview. The textures come off and the geometry tells the truth.

The same model shown in shaded, wireframe, and ghosted view modes.
Surface overrides for clean geometry reads.
04 / 06

Clay and chrome overrides

Instantly swap to clay, dark chrome, or a matte silhouette. With reflections and textures gone, shadow falloff and surface curvature become the only information left, the way a sculptor reads a form.

A model shown with a UV checker texture revealing distortion.
UV checker for texel density and seam inspection.
05 / 06

UV and texel-density checks

A built-in checker texture and a texel-density heat map surface stretched UVs, seams, and uneven resolution before they turn into texturing problems downstream.

A model with its surface normals drawn to reveal geometry issues.
Geometry made visible: normals and the validation overlay.
06 / 06

Validation overlay

Toggle a color-coded overlay that highlights flipped normals, non-manifold edges, degenerate triangles, missing UVs, and over-budget meshes right on the model. Nine checks feed one report that the viewer, the terminal, and CI all share.

New in v0.6.0

Review, right on the model

The biggest addition in v0.6.0, and the one that took the longest to build, is a way to leave feedback directly on the model. Most asset review still happens as screenshots with red circles drawn on them, separated from the asset and stale a few rounds later. Solarxy makes the note part of the model.

Press Shift+R, click anywhere on the surface, and type. Pick a category (info, warning, question, or change) and the note sticks to the exact spot you clicked, showing up as a colored pin on the model and as a row in a filterable Review Panel.

Saving writes a small .solarxy-review.json file next to the model, meant to live in version control beside the asset. A teammate opens the same model and the notes load on their own. Because a note is anchored to a precise triangle, a small re-export drops it back in the right place; if the geometry is rebuilt from scratch, Solarxy notices via a per-mesh fingerprint, dims the affected notes instead of losing them, and offers a one-click re-anchor.

Two deliberate choices: your name is attached only if you opt in, never pulled from your machine or your Git config, and the notes file is plain text, so two people editing it is just a normal merge.

Categorized review markers placed on the surface of a 3D model in Solarxy.
Anchored review markers, placed directly on the model.
The Solarxy Review Panel listing annotations grouped by status.
The Review Panel: filter, search, reply, and resolve.
Under the hood

How it works

Solarxy is a six-crate Rust workspace, roughly 33,000 lines, with an acyclic dependency graph. The GPU-free core sits at the foundation, with no graphics or UI dependencies, so the command-line tool links the analyzer and validates assets headless, without ever pulling in a graphics stack.

solarxy-app~13.5k

The desktop GUI: the winit and egui shell, the dockable workspace, sidebar, menu, input routing, and the viewport.

GPU / UI
solarxy-cli~1.5k

The terminal companion: the clap CLI, the ratatui analyze TUI, batch runs, and the self-updater.

CPU only
solarxy-renderer~9.7k

All wgpu state: pipelines, WGSL shaders, IBL, SSAO, bloom, shadows, composite, and the per-frame draw.

GPU / UI
solarxy-formats~1k

OBJ, STL, PLY, and glTF loaders into one shared raw-model representation.

CPU only
solarxy-validate~1.4k

Batch validation and the CI adapters, with a stable library API for integrators.

CPU only
solarxy-core~6k

Pure CPU types: geometry, validation logic, preferences, report shapes, and the review sidecar.

CPU only

Nine checks, one report

Nine checks share one report. That single report drives three surfaces: a color-coded overlay in the viewer, a four-tab terminal report, and a CI adapter that speaks SARIF, JUnit, and TAP.

  • normal_mismatchErrorPer-vertex normal count does not match the vertex count.
  • flipped_normalsWarningAveraged vertex normals point against the winding direction.
  • non_manifold_edgesError / WarningEdges shared by three or more triangles, or open boundary edges.
  • triangle_budgetWarning / ErrorTriangle count over the category budget, past a tolerance band.
  • degenerate_trianglesWarningNear-zero-area triangles.
  • material_refsErrorA material index points past the material list.
  • uv_presenceWarningMissing or mismatched UVs (OBJ and glTF).
  • index_bufferErrorEmpty index buffer, or a count not divisible by three.
  • allow_open_meshModifierOff by default; suppresses the boundary-edge warning.

The render pipeline

Each viewport pane runs a ten-stage render pipeline every frame. The review markers are painted on at the very end so they never z-fight the post-processing.

Linting for geometry

The same checks, in your pipeline

The same nine checks that light up the viewer also run with no window at all. From a terminal, solarxy-cli opens a model into a four-tab report, or validates a whole folder and returns a simple pass or fail, the way a unit test does. It speaks SARIF, JUnit, and TAP, so the result lands next to the rest of your checks in GitHub, GitLab, or Jenkins. Linting, for geometry.

Terminalbash
solarxy-cli --mode analyze \
    --paths "assets/**/*.glb" \
    --config solarxy.toml \
    --adapter github-actions \
    --adapter-format sarif \
    --output report.sarif
The Solarxy analyze report shown in a terminal, overview tab.
The analyze report, in a terminal.
The Solarxy analyze report validation tab listing geometry issues.
Validation findings, ready for CI.
Who it is for

Six people the roadmap answers to

Before a single 0.4.0 issue was written, the research produced six personas and three anti-personas. Every milestone since has been pressure-tested against them; when a tempting idea served no one on the list, that was usually the signal to cut it.

M

Maya

Senior Technical Artist

Primary

Pain today
Long review queues, no standalone UV inspector, opening a heavy DCC just to check one model.
With Solarxy
Sub-second loads, UV, texel, and validation overlays, and spatial review notes to hand back to artists.
D

Daniel

Asset Pipeline Engineer

Primary

Pain today
Visual checks cannot be scripted, and no lightweight tool emits machine-readable validation.
With Solarxy
A CLI with a GitHub Actions adapter that emits SARIF straight into the pull request, in a 30-second setup.
L

Lena

Indie Game Developer

Primary

Pain today
No fast way to debug a rendering glitch or to learn UV mapping by sight.
With Solarxy
A tight visual loop: UV debug, a material inspector, and PBR isolated from engine noise.
R

Raj

3D Printing Hobbyist

Secondary

Pain today
Non-manifold edges and flipped normals quietly ruin prints and waste filament.
With Solarxy
The validation overlay flags geometry problems before the model ever reaches the slicer.
A

Alex

Rust Dev and OSS Contributor

Secondary

Pain today
Many graphics projects are impossible to build or test without a GPU and a tangled codebase.
With Solarxy
Core tests run without a GPU, six clean crates, and CI runs fmt, clippy, and test on every PR.
P

Prof. Chen

Computer-Graphics Educator

Secondary

Pain today
No free, lightweight, cross-platform tool for live visual teaching.
With Solarxy
Free and cross-platform, with UV and texel visuals that make abstract ideas concrete.
North-star metric

Weekly active inspections

Unique models loaded per week. Real utility, not vanity. Stars and downloads are leading indicators; this is the one that means the tool is genuinely in someone's daily loop.

not follower countsnot feature countnot competitor parity
Act Ipre-0.3

Build the foundation

Get the renderer, formats, and inspection core solid and quiet. No launch, no noise, just a tool worth showing.

Act II0.3 to 0.4

The screenshot moment

Inspection overlays and the split viewport make a single image that explains the whole product.

Act III0.5 to 0.6

Pipeline adoption

The review system, configurable validation, and a 30-second CI setup turn individual interest into recurring team use.

The build log

From first light to the 1.0 line

Ten public releases across six months, then two planned milestones to 1.0. The spine fills as you scroll, solid where it shipped, hollow where it is still planned.

22
33
53
110
69
NovDecJanFebMarAprMay

287 commits across six months. A foundation laid quietly through late 2025, a January and February pause to rethink scope, then a relentless cadence to v0.6.0.

ShippedPlanned
  1. originNov 2025

    Genesis

    The first wgpu render lifecycle and the first WGSL shaders. The engine, before anyone was watching.

    Rust + wgpufirst render pass
  2. v0.1.0Mar 2026

    First Light

    The first public tag: a Rust and wgpu engine with OBJ loading, Cook-Torrance PBR, an in-viewport HUD, and the analyze TUI.

    Cook-Torrance PBROBJ loadinganalyze TUI
  3. v0.2.0Apr 2026

    Interactivity

    Grid and gizmo, bounding box, turntable, bloom, background presets, settings persistence, and side-by-side compare, then a built-in docs TUI.

    turntablebloomin-app docs
  4. v0.3.0Apr 2026

    Feature Baseline

    Four operation modes, per-material PBR, procedural and HDRI image-based lighting, environment reflections, SSAO, and ACES tone mapping.

    per-material PBRIBLSSAO
  5. v0.4.0Apr 2026

    Inspection Intelligence

    The pivot from viewer to debugger: egui, split viewports, the inspection modes, the validation overlay, and the workspace split into crates.

    eguisplit viewportworkspace extraction
  6. v0.5.0Apr 2026

    Two Binaries

    GUI and CLI split into separate binaries, native installers, a Preferences dialog, and grouped sidebar controls.

    GUI + CLInative installers
  7. v0.6.0May 2026

    Studio Adoption

    Spatially-anchored review notes, dockable panels, a Material Inspector, overdraw and AO modes, configurable validation, CI adapters, and Homebrew plus winget.

    review systemdockable panelsCI adapters
  8. 0.7.0Target Sept 2026

    Web Reach

    Eliminate install friction: a browser build (WASM and WebGPU), a VS Code extension, glTF animation, and 3D-to-UV selection sync.

    browser buildVS Code extensionglTF animation
  9. 0.8.0Target Oct 2026

    Trust and Polish

    Graduate to a signed professional desktop app: notarization, Trusted Signing, file associations, a GUI auto-updater, and an SBOM.

    notarizationauto-updaterSBOM
  10. 1.0.0The horizon

    The 1.0 line

    Signed, web-reachable, and CI-native, with a stable solarxy-core on crates.io and a community around it.

    1.0
Engineering

Challenges and learnings

01

Review markers that fought the renderer

My first marker pipeline was a WGSL signed-distance shader, and it z-fought with bloom, SSAO, and tone mapping. I re-painted the markers as an egui overlay drawn after the composite. The readability win was immediate, and I got text rendering and one-call clipping for free. The lesson: move UI affordances out of the HDR path when readability beats physical correctness.

02

GPU uniforms laid out by hand

The GPU uniform buffers are hand-laid #[repr(C)] structs with explicit 16-byte alignment and compile-time size assertions, so a shader can safely read a prefix of a uniform. Encoding the invariant in an assertion means a future field addition fails loudly at compile time instead of quietly corrupting a frame.

03

The integrated-GPU bug

For a while Solarxy was quietly running on the integrated GPU instead of the dedicated one, because the adapter was requested with the default power preference. It took a while to catch across machines and backends (Metal, DirectX 12, Vulkan), and it was a good reminder that the slow, subtle bugs are the expensive ones.

04

Rust and AI, honestly

I used Claude as a reviewed pair-programmer and found that Rust plays unusually well with AI tooling: the strict compiler, borrow checking, and Clippy are guardrails that keep both the human and the model honest. It struggled with ordering render passes and made the occasional rookie mistake, but it never got to fall down the unsafe-memory rabbit hole that C++ allows.

Built with

The stack

Rust for the strict compiler and toolchain, wgpu for one rendering codebase across Vulkan, Metal, and DirectX 12, and WGSL shaders with no cross-compilation.

Rust 2024wgpu 27WGSLegui 0.33egui_dockratatuiclaptobjstl_ioply-rsgltfcgmathimagetracingcargo-dist
Field notes

The long version of this story, the why, the rendering core, and what AI-first development actually took, lives on the blog in two parts.

Open source, and yours to break.

Solarxy is free and MIT licensed. Throw your worst model files at it and tell me what breaks.