Technical Deep Dive • 18 March 2026

Spaceframe: Anatomy of a spatial micro-OS

Yiliu Shen-Burke
Founder, Softspace Inc.
01 / Context

The Bet

Timing
2022–2023: Professional VR/AR headsets are coming
Thesis
VR/AR graduates from gaming to vertical and horizontal productivity
Funding
Raised pre-seed investment and dev grants to build Spaceframe
Goal
Be the default productivity tool on day one
Meta Quest Pro headset

Meta Quest Pro

02 / Product

Spaceframe AR

Web browsing, notetaking, moodboarding, AI chat — all in 3D space.

2 people Yiliu full-time, backend contractor part-time
18 months Research, development, marketing, publishing
90:10 app:backend Yiliu wrote all of app code
85k LoC Unity app 91% of app code is C#
Spaceframe AR screenshot showing spatial workspace
03 / Architecture

3-Layer Core + Modules

XR SDKs
Interactions
Keyboards
Text Rendering
UI Components
AI Features
Core
LAYER 3 — VIEW + CONTROLLER
Unity Scene
Items
Notes Images Browsers AI Chats Topics Bookmarks PDFs
▲
IWorkspace
▼
LAYER 2 — TYPED MODEL
Workspace
9 node types · 3 edge types · Observer pattern · 8 graph event types
▲
ISpacegraph
▼
LAYER 1 — RAW MODEL
SpaceGraph
Node { id, props: Dict<string,string>, poses: Dict<string,Pose?> }
Edge { srcNodeID, trgNodeID, type, props: Dict<string,string> }
Layouting
Physics
Assets
Browsers
Persistence
Memory Mgmt
04 / Modules

Micro Spatial Operating System

🥽
XR SDKs
XRUtil detects headset; UserRig instantiates the right camera rig for Quest, SteamVR, or desktop
👆
Interactions
RayCursor + CollideCursor behind ISpatialCursor; CursorTool maps contacts to grab/resize/operate
⌨️
Keyboards
Physical, remote, and spatial VirtualKey paths all converge on ITypeable; VKB auto-shows when no hardware detected
🔤
Text
TypeableTmpInput wraps TextMeshPro for editing; CustomTmpText offsets mesh Z to solve depth-sorting
🧩
UI Components
Procedural squircle meshes, IFadeable alpha transitions, bezier link lines between objects
📐
Layouts
MulticolumnLayout composes column sublayouts; grab-to-reorder via plane intersection projection
🌀
Physics
NBodySim: Burst-compiled repulsion + attraction jobs each frame; edges become Affinity forces in 3D
📦
Assets
SkiaSharp decode + Burst mip generation; Tex2DPool and TexArrPool pack into shared GPU arrays
🌐
Browsers
Chromium WebViews behind IBrowsable; JS↔C# bridge via postMessage with typed JsMsg events
💾
Persistence
Local + Firebase behind IStorageClient; LRU cache layer; Roslyn-generated Utf8Json for AOT on Quest
🧠
Memory
Pooled collections + ByteBufferPool (256 MB pre-filled); Tex2DPool recycles GPU textures; sim runs entirely on Burst NativeArrays
✨
AI
In-headset RAG: ChunkStore splits + embeds items; Burst cosine similarity on NativeArrays; streams tokens back into the live graph
05 / Deep Dive · Requirements

1000 Images on Quest

Early user testing showed that image-based mood boarding was a popular use case.

Gallery Size
Up to 1000 images
The extreme case
Display
6.38 megapixels
2064 × 2208 × 1.4
Frame Budget
13 milliseconds
Strict 72fps framerate floor
Processing
50 milliseconds
Visibility after file load
Requirements: Load and display hundreds of images that look sharp up close while maintaining framerate.
06 / Deep Dive · Resources

Constraints & Opportunities

Nothing about our stack was made for runtime image processing and display. Unity assumes build-time asset conversion to raw textures. The Quest 3 headset has less compute than the iPhone 8.

IMG→TEX Decode
100–1000ms
On worker thread
System MEMORY
5.75GB
Out of 8GB total
2K RGBA Textures
16MB each
x100 = 1.6GB VRAM
SSD Storage
128–512GB
Games need space
Key insight: CPU and RAM are scarce. SSD is capacious. ∴ Trade off CPU+RAM usage for disk storage.
07 / Deep Dive · Implementation

SSD-Backed LoD Virtual Texturing

Cold path (first load · 100–1000ms)
JPG
cloud/local
→
SkiaSharp
decode
→
MemCpy
thread pool
→
MipTexJob
Burst
→
CopyTexture
GPU upload
→
Freeze → SSD
thread pool
Warm path (defrost · 10–50ms)
SSD cache
raw bytes
→
MemCpy
thread pool
→
CopyTexture
GPU upload
VRAM Budget: 1000 Images
1 @ LOD0 2048 × 2048 × 4-bit 16 MB
5 @ LOD1 512 × 512 × 4-bit 45 MB
996 @ LOD2 256 × 256 × 4-bit ~255 MB
Total ~316 MB VRAM
Defrost: 10–50ms vs 100–500ms full decode (10× faster). TaskQueue: 1 active decode at a time.

Project 1000 — LOD streaming in action

08 / Close

Learnings

Minimize Dependencies

Spaceframe's success required a specific hardware and platform ecosystem to take off. It hasn't yet.

Understand which bets are yours to win and which depend on someone else's execution.

Choose Important Problems

Personal productivity wasn't wasn't painful enough to pull users onto new hardware.

The best engineering can't compensate for insufficient problem-market fit.

Less is more

Open development pulled me in a dozen directions. In production, people only used a handful of features.

Ship the smallest surface that solves the core job, then expand from observed usage.

Thank you.