Free, open-source native macOS viewer for 3D files — glTF/GLB, FBX, OBJ, USD/USDZ, STL, DAE, PLY. Drop a file, look at it. SwiftUI + SceneKit, no telemetry, MIT licensed.
See the codeDrop a 3D file. Look at it.
A tiny, native macOS viewer for glTF, FBX, OBJ, USD, STL and more — no editing, no export, no account. Free and open source.
Website · Install · Formats · Features · Privacy · Build · Known limits


brew install --cask deeeemiss/tap/peek3d
Or download the DMG from Releases. Signed with a Developer ID and notarized by Apple. Requires macOS 13 or later.
| Loader | Formats | Animation |
|---|---|---|
| GLTFKit2 (SPM) | .glb .gltf | Skeletal (skinned) + node-transform |
| ufbx (vendored) | .fbx | Node-transform (rigid/hierarchical) |
| Apple Model I/O | .obj .stl .usd .usdz .usda .usdc .dae .ply .abc | — |
All three converge into one SCNScene, so the viewer, wireframe, shading
modes, and stats never need to know where a model came from.
.glb/.gltf
(skinned) and .fbx (node-transform) modelsPeek3D makes no network connections and collects no data. Files you open are read locally and never leave your Mac.
Needs Xcode (free on the Mac App Store) — no Apple certificate or developer account.
git clone https://github.com/deeeemiss/Peek3D.git
cd Peek3D
./scripts/run.sh
It builds a universal Release app into build/ and opens it. Or open
Peek3D.xcodeproj in Xcode and hit Run.
The app runs sandboxed with the User Selected File (Read Only) entitlement.
Files opened via drag & drop or the file picker get security-scoped access
automatically; arbitrary paths are (by design) denied. External textures
referenced by an .fbx/.gltf file (not embedded) need that access too — the
app prompts for folder access and retries automatically if it's missing.
.glb using them surfaces a load error rather than a silent failure.SCNSkinner) and blend shapes are
not supported yet — a skinned FBX loads and shows its bind pose; bones still
receive their transform animation, but the mesh doesn't deform.CAAnimationGroups on a wall-clock player, which has no
API for jumping to an arbitrary time. Play / pause / clip selection work
fully; the bar is a synchronized progress readout, not a scrubber.MIT. Third-party attributions are listed in the same file and in the app (Peek3D ▸ Open Source Licenses…). The fox in the screenshot and demo is the glTF sample "Fox" (CC BY 4.0, PixelMannen / @tomkranis); test model credits are in testmodels/README.md.
Swift
81.5%
Objective-C++
9.6%
HTML
6.0%
Shell
1.8%
Objective-C
1.1%
Free, open-source native macOS viewer for 3D files — glTF/GLB, FBX, OBJ, USD/USDZ, STL, DAE, PLY. Drop a file, look at it. SwiftUI + SceneKit, no telemetry, MIT licensed.
See the codeDrop a 3D file. Look at it.
A tiny, native macOS viewer for glTF, FBX, OBJ, USD, STL and more — no editing, no export, no account. Free and open source.
Website · Install · Formats · Features · Privacy · Build · Known limits


brew install --cask deeeemiss/tap/peek3d
Or download the DMG from Releases. Signed with a Developer ID and notarized by Apple. Requires macOS 13 or later.
| Loader | Formats | Animation |
|---|---|---|
| GLTFKit2 (SPM) | .glb .gltf | Skeletal (skinned) + node-transform |
| ufbx (vendored) | .fbx | Node-transform (rigid/hierarchical) |
| Apple Model I/O | .obj .stl .usd .usdz .usda .usdc .dae .ply .abc | — |
All three converge into one SCNScene, so the viewer, wireframe, shading
modes, and stats never need to know where a model came from.
.glb/.gltf
(skinned) and .fbx (node-transform) modelsPeek3D makes no network connections and collects no data. Files you open are read locally and never leave your Mac.
Needs Xcode (free on the Mac App Store) — no Apple certificate or developer account.
git clone https://github.com/deeeemiss/Peek3D.git
cd Peek3D
./scripts/run.sh
It builds a universal Release app into build/ and opens it. Or open
Peek3D.xcodeproj in Xcode and hit Run.
The app runs sandboxed with the User Selected File (Read Only) entitlement.
Files opened via drag & drop or the file picker get security-scoped access
automatically; arbitrary paths are (by design) denied. External textures
referenced by an .fbx/.gltf file (not embedded) need that access too — the
app prompts for folder access and retries automatically if it's missing.
.glb using them surfaces a load error rather than a silent failure.SCNSkinner) and blend shapes are
not supported yet — a skinned FBX loads and shows its bind pose; bones still
receive their transform animation, but the mesh doesn't deform.CAAnimationGroups on a wall-clock player, which has no
API for jumping to an arbitrary time. Play / pause / clip selection work
fully; the bar is a synchronized progress readout, not a scrubber.MIT. Third-party attributions are listed in the same file and in the app (Peek3D ▸ Open Source Licenses…). The fox in the screenshot and demo is the glTF sample "Fox" (CC BY 4.0, PixelMannen / @tomkranis); test model credits are in testmodels/README.md.
Swift
81.5%
Objective-C++
9.6%
HTML
6.0%
Shell
1.8%
Objective-C
1.1%