deeeemiss/Peek3D

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.

Swift

2

84 commits

updated Oct 3, 2026

See the code

See what people are saying

SourceMessageScoreDate

I was going to sell my Mac app, then made it MIT instead: Peek3D, a 3D file viewer (r/coolgithubprojects)

I spent a while building a native macOS viewer for 3D files (glTF, FBX, OBJ, STL, USDZ and a few more). The plan was to charge for it. I even had licensing set up. Then I looked at it honestly. It's a good viewer, but it's not doing anything nobody else can do, so asking people to pay felt wrong. I…

2

Oct 3, 2026

README

Peek3D

Drop 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.

Homebrew Download macOS Notarized License: MIT

Website · Install · Formats · Features · Privacy · Build · Known limits

Peek3D screenshot

Peek3D demo


Install

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.

Formats

LoaderFormatsAnimation
GLTFKit2 (SPM).glb .gltfSkeletal (skinned) + node-transform
ufbx (vendored).fbxNode-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.

Features

Viewing

  • Drag & drop (empty state and to replace a loaded model), or file picker
  • Camera orbit / pan / zoom, fit-to-view
  • Colored XYZ axis gizmo (bottom-right), click an axis to snap the camera
  • Fullscreen toggle
  • Viewport screenshot → PNG

Shading

  • Default — the file's own materials/textures
  • Normals — color-coded view-space normals
  • Matcap — procedural matcap by view-space normal
  • Unlit — base colour only, no lighting
  • UV checker — procedural checkerboard on the real UVs
  • Wireframe overlay, readable in every shading mode above

Lighting

  • Default / Studio / Outdoor / Dark mood presets

Animation

  • Timeline with play / pause and clip selection for animated .glb/.gltf (skinned) and .fbx (node-transform) models
  • Wireframe stays correct while an animation plays

Info

  • Triangles, vertices, meshes, materials, bounding-box size, file size, file name

Localization

  • 11 languages: English (primary), Italiano, Español, Français, Deutsch, Português (Brasil), Русский, العربية, 日本語, 한국어, 简体中文.
  • Follows the system language by default; pick another one in Peek3D ▸ Settings ▸ General.

Settings

  • Starting shading, lighting and background for new windows
  • Grid, model info panel and animation autoplay on open

Privacy

Peek3D makes no network connections and collects no data. Files you open are read locally and never leave your Mac.

Build

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.

Sandbox

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.

Known limits

  • Draco-compressed geometry and KTX2/BasisU textures are not wired up. A .glb using them surfaces a load error rather than a silent failure.
  • FBX skinned/skeletal deformation (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.
  • Timeline drag-to-seek isn't offered (for either format): both loaders bake clips as looping 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.

License

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.

3d-models
3d-viewer
fbx
glb
gltf
homebrew
macos
macos-app
model-viewer
native
obj
oss
privacy
quick-look
scenekit
stl
swift
swiftui
usd
usdz

deeeemiss/Peek3D

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.

Swift

2

84 commits

updated Oct 3, 2026

See the code

See what people are saying

SourceMessageScoreDate

I was going to sell my Mac app, then made it MIT instead: Peek3D, a 3D file viewer (r/coolgithubprojects)

I spent a while building a native macOS viewer for 3D files (glTF, FBX, OBJ, STL, USDZ and a few more). The plan was to charge for it. I even had licensing set up. Then I looked at it honestly. It's a good viewer, but it's not doing anything nobody else can do, so asking people to pay felt wrong. I…

2

Oct 3, 2026

README

Peek3D

Drop 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.

Homebrew Download macOS Notarized License: MIT

Website · Install · Formats · Features · Privacy · Build · Known limits

Peek3D screenshot

Peek3D demo


Install

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.

Formats

LoaderFormatsAnimation
GLTFKit2 (SPM).glb .gltfSkeletal (skinned) + node-transform
ufbx (vendored).fbxNode-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.

Features

Viewing

  • Drag & drop (empty state and to replace a loaded model), or file picker
  • Camera orbit / pan / zoom, fit-to-view
  • Colored XYZ axis gizmo (bottom-right), click an axis to snap the camera
  • Fullscreen toggle
  • Viewport screenshot → PNG

Shading

  • Default — the file's own materials/textures
  • Normals — color-coded view-space normals
  • Matcap — procedural matcap by view-space normal
  • Unlit — base colour only, no lighting
  • UV checker — procedural checkerboard on the real UVs
  • Wireframe overlay, readable in every shading mode above

Lighting

  • Default / Studio / Outdoor / Dark mood presets

Animation

  • Timeline with play / pause and clip selection for animated .glb/.gltf (skinned) and .fbx (node-transform) models
  • Wireframe stays correct while an animation plays

Info

  • Triangles, vertices, meshes, materials, bounding-box size, file size, file name

Localization

  • 11 languages: English (primary), Italiano, Español, Français, Deutsch, Português (Brasil), Русский, العربية, 日本語, 한국어, 简体中文.
  • Follows the system language by default; pick another one in Peek3D ▸ Settings ▸ General.

Settings

  • Starting shading, lighting and background for new windows
  • Grid, model info panel and animation autoplay on open

Privacy

Peek3D makes no network connections and collects no data. Files you open are read locally and never leave your Mac.

Build

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.

Sandbox

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.

Known limits

  • Draco-compressed geometry and KTX2/BasisU textures are not wired up. A .glb using them surfaces a load error rather than a silent failure.
  • FBX skinned/skeletal deformation (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.
  • Timeline drag-to-seek isn't offered (for either format): both loaders bake clips as looping 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.

License

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.

3d-models
3d-viewer
fbx
glb
gltf
homebrew
macos
macos-app
model-viewer
native
obj
oss
privacy
quick-look
scenekit
stl
swift
swiftui
usd
usdz

Languages

Swift

81.5%

Objective-C++

9.6%

HTML

6.0%

Shell

1.8%

Objective-C

1.1%