diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml
deleted file mode 100644
index ee16cf8..0000000
--- a/.github/workflows/pages.yaml
+++ /dev/null
@@ -1,45 +0,0 @@
-name: Deploy landing page
-
-# Publishes site/ to GitHub Pages. There is no build step: the directory is
-# uploaded as authored. The Pages source must be set to "GitHub Actions".
-
-on:
- push:
- branches: [main]
- paths:
- - "site/**"
- - ".github/workflows/pages.yaml"
- workflow_dispatch:
-
-permissions:
- contents: read
- pages: write
- id-token: write
-
-concurrency:
- group: pages
- cancel-in-progress: false
-
-jobs:
- deploy:
- name: Build and deploy
- runs-on: ubuntu-latest
- environment:
- name: github-pages
- url: ${{ steps.deployment.outputs.page_url }}
- steps:
- - uses: actions/checkout@v7.0.1
- with:
- persist-credentials: false
-
- - name: Configure Pages
- uses: actions/configure-pages@v6.0.0
-
- - name: Upload site directory
- uses: actions/upload-pages-artifact@v5.0.0
- with:
- path: site
-
- - name: Deploy
- id: deployment
- uses: actions/deploy-pages@v5.0.0
diff --git a/site/.nojekyll b/site/.nojekyll
deleted file mode 100644
index e69de29..0000000
diff --git a/site/README.md b/site/README.md
deleted file mode 100644
index 6bc6ad7..0000000
--- a/site/README.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# mlx-spatial landing page
-
-Static GitHub Pages site for [mlx-spatial](https://github.com/appautomaton/mlx-spatial),
-published at .
-
-## Editing rule
-
-**Nothing on this page carries a number or a status that has to be
-maintained.** Face counts, timings, quality figures, and per-pipeline
-readiness all live in the repository, where they are produced and where they
-change. The page states what does not change — the task each pipeline
-performs, the file it leaves behind, the shape of the mesh stage, the scope —
-and links out for anything measured.
-
-That is also why the page lists five pipelines and not six: a pipeline still
-in development would need its badge revised the day it graduates. The
-capability table in the root README carries that state instead, and the page
-points at it.
-
-## Stack
-
-A single self-contained `index.html` — no build step, no framework. Styles and
-the small amount of JS (theme toggle, mobile menu, scroll reveal) are inline.
-
-- **Type:** Zodiak (display), Synonym (body), DM Mono (data). The display face
- is a high-contrast serif because the subject is *making objects* — it should
- read as carved, not as UI chrome.
-- **Colour:** the XYZ axis convention every 3D tool shares — X red, Y green,
- Z blue — on the neutral grey of a viewport. Sections advance through the
- three axes, so scrolling walks the gizmo. The choice is semantic: anyone who
- has opened a 3D application reads those three colours before the words.
-- **Signature:** the headline sits inside a bounding box whose corners
- converge onto it on load. Selecting an object in any 3D tool draws exactly
- this, and the fit is the idea — the library turns a flat image into
- something that has bounds.
-- **Ground:** an isometric lattice rather than a square grid, so the page is
- in three dimensions before anything is read.
-- **Theme:** light by default. Light/dark via `data-theme` on ``,
- persisted in localStorage, falling back to the OS scheme. Deep-link with
- `?theme=light` / `?theme=dark`.
-- **Icons:** hand-drawn SVG, no icon library. Two rules here are easy to break:
- - The dash rules select `.d`, not `[pathLength]`. Blink does not invalidate
- a camelCase attribute selector on an SVG child when a class lands on an
- ancestor, so selecting the attribute leaves every icon undrawn. A new
- stroke needs `class="d"` as well as `pathLength="100"`.
- - A filled shape carries its resting opacity in `--fill-o`, because a CSS
- `opacity` outranks the SVG presentation attribute and would otherwise
- flatten a translucent solid into an opaque blob.
-- **Motion:** [Motion](https://motion.dev) 13.0.0 from jsDelivr, pinned. It
- only drives scroll reveals; the bounding box is pure CSS. The import is
- guarded — if the CDN fails, everything is revealed rather than left hidden.
-- **Responsive:** breakpoints at 720px, 940px, and 1040px.
-- `prefers-reduced-motion` is respected — every animation renders in its final
- state.
-
-Contrast was measured on every text node in **both** themes, not just the one
-the page loads in.
-
-## The share card
-
-`assets/og.png` is 2400×1260 (1.91:1 at 2×), rendered from `assets/og.html`
-with the real webfonts rather than approximated. The source is committed so
-the card can be re-cut when the headline changes:
-
-1. open `site/assets/og.html` at a 1200×630 viewport, `deviceScaleFactor` 2;
-2. wait for `document.fonts.ready` — screenshotting early bakes in the
- fallback face, which is the whole reason this is a real browser render;
-3. capture the viewport to `site/assets/og.png`.
-
-`og.html` carries `noindex` and is not in the sitemap; it deploys with the
-rest of the directory only because the workflow uploads `site/` as-is.
-
-## Deploy
-
-Published by `.github/workflows/pages.yaml` on every push to `main` that
-touches `site/`. There is no build: the workflow uploads this directory as-is.
-The Pages source must be set to **GitHub Actions**. `.nojekyll` keeps Jekyll
-out of the way.
-
-## Local preview
-
-```bash
-python3 -m http.server -d site 8000
-# open http://localhost:8000/
-```
diff --git a/site/assets/og.html b/site/assets/og.html
deleted file mode 100644
index d1f4bf3..0000000
--- a/site/assets/og.html
+++ /dev/null
@@ -1,122 +0,0 @@
-
-
-
- An open-source library for 3D and spatial inference in MLX. Object
- reconstruction, image-to-mesh, scene geometry, Gaussian splats, and
- multi-view bundles — running on the Apple GPU, with a native Metal
- mesh pipeline behind them.
-
Diffusion, transformer, and reconstruction stacks run in MLX. A native C++/Metal extension carries the mesh work that does not belong in Python.
-
-
-
-
-
Real files, not renders
-
Every pipeline writes something a tool can open — a GLB, a PLY, an NPZ bundle. Drop it into Blender or a viewer and keep working.
-
-
-
-
-
Weights stay outside
-
Checkpoints are downloaded separately and validated before use. Nothing is vendored into the wheel, and every upstream licence stays with its weights.
-
-
-
-
-
-
-
-
-
Pipelines
-
Different questions want different files.
-
- These pipelines deliberately do not share one output type. A splat is
- not a mesh, and a scene bundle is neither. The mapping is the product.
-
-
-
-
-
-
Object reconstruction
-
image + mask→Gaussian PLY, optional GLB
- SAM 3D Objects
-
-
-
-
-
Image to textured mesh
-
object-centric RGB/RGBA→shape OBJ or textured GLB
- TRELLIS.2
-
-
-
-
-
Scene reconstruction
-
scene image or frames→camera, depth, normals, point cloud
- HY-WorldMirror 2.0
-
-
-
-
-
Image to Gaussian splat
-
object-centric RGB/RGBA→3DGS PLY
- LiTo
-
-
-
-
-
Multi-view scene bundle
-
related scene views→NPZ of depth, cameras, world points
- MapAnything
-
-
-
-
- Every pipeline ships a command-line entry point, and each one names its
- own output rather than hiding behind a shared wrapper. More pipelines
- are in development; the
- repository
- tracks which paths are release-ready.
-
-
-
-
-
-
-
-
SpatialKit
-
Inference is only half of an asset.
-
- A model's raw output is rarely something you can ship. SpatialKit is
- the mesh half — simplification, unwrapping, and baking, written
- against Metal rather than handed to a CPU library.
-
-
-
-
-
- Simplify
-
Quadric error edge collapse, running in MLX, down to a face budget you choose.
-
-
-
-
- Unwrap
-
Clustered xatlas charts, so the texture space follows the surface instead of fighting it.
-
-
-
-
- Bake
-
Physically based texture baking on Metal, not a kdtree scatter on the CPU.
-
-
-
-
- Export
-
A GLB with its materials attached, plus the artifacts that show what happened on the way.
-
-
-
-
-
-
-
-
-
Start
-
One command per pipeline.
-
-
-
-
# Python 3.13, Apple silicon
-uv add mlx-spatial
-
- The package is on
- PyPI. Releases
- can lag main, so a checkout keeps you on the code the
- repository documents.
-
-
-
-
uv run mlx-spatial-sam3d --help
-uv run mlx-spatial-trellis2 --help
-uv run mlx-spatial-hyworld2 --help
-uv run mlx-spatial-lito --help
-uv run mlx-spatial-mapanything --help
-
- Weights download separately into weights/ and are
- validated before a run. Converted checkpoints live on
- Hugging Face.
-
-
-
-
-
-
-
-
-
-
Scope
-
What this is not.
-
-
-
-
Not a training framework
-
Inference only. There is no optimiser, no dataset loader, and no fine-tuning path.
-
-
-
Apple silicon
-
MLX targets the Apple GPU, and the mesh extension is built against Metal. There is no CUDA path.
-
-
-
Quality still moving
-
Texture and mesh quality are actively improving, and some paths are still in development. The repository says which.