This file is for code agents that need to maintain or extend the project page in this repository.
This repository is a static academic project page for the MeMix paper.
Current entry points:
index.htmlstatic/css/index.cssstatic/js/nav.jsPrimary asset folders:
static/images/static/models/The current page is organized as:
When editing, preserve the overall academic-project-page tone. Avoid turning the site into a product landing page.
Coming Soon, NaN, TODO, or fake author names.Root-level assets should be normalized and moved into static/.
Use these conventions:
static/images/logo.pngstatic/images/original-logo.jpgstatic/images/favicon-32.pngstatic/images/apple-touch-icon.pngstatic/models/raw/*.glbstatic/models/*.glbDo not expose source PDFs on the public site unless the user explicitly asks for PDF downloads again.
If new PDFs are dropped into the root directory, treat them as private source assets by default. Generate derived images from them if needed, but do not link them from the webpage.
If new 3D scenes are dropped into the root directory, move them into static/models/raw/ before processing.
If a private source PDF was cropped in Acrobat or contains a CropBox, generate the page preview using the crop box:
pdftoppm -png -singlefile -cropbox -r 280 /path/to/source.pdf /tmp/output-prefix
Use this for sheet previews that should display exactly as cropped in the browser.
If the private source PDF has no solid page background and you want the web preview without a white rectangle, use pdftocairo with transparent output:
pdftocairo -png -singlefile -transp /path/to/source.pdf /tmp/output-prefix
This only affects the preview PNG used on the webpage.
If the logo is replaced, regenerate icon assets:
sips --resampleHeightWidth 32 32 static/images/logo.png --out static/images/favicon-32.png
sips --resampleHeightWidth 180 180 static/images/logo.png --out static/images/apple-touch-icon.png
The hero title is intentionally fixed to three lines.
Current format:
MeMix:
Writing Less, Remembering More for
Streaming 3D Reconstruction
Implementation notes:
index.html uses separate spans for fixed line breaks.static/css/index.css keeps each line as display: block with white-space: nowrap.Do not revert this back to automatic wrapping unless the user explicitly asks.
The abstract should be copied from the paper text, not paraphrased, unless the user asks for rewriting.
If the paper changes:
index.html.Pipeline section should show the standalone pipeline figure only.Overview of MeMix caption under the pipeline image now uses KaTeX auto-render; keep formula text in LaTeX form inside the figcaption.katex-caption.3R Interactive Demo section currently uses two side-by-side WebGL canvases for w/o MeMix and w/ MeMix.static/js/demo-viewer.js with about 100ms delay.W/A/S/D panning, mapped through OrbitControls’ keyboard pan handling.1200 points-per-frame cap.If new GLB scenes are added later:
static/models/raw/.tools/downsample_glb_points.py.static/models/.#demos.data-demo-sync-group.The current MeMix page still does not use CUT3R’s Viser playback system.
Instead, it now uses a dedicated Three.js-based dual-viewer implementation for .glb files:
index.html:<script>
// Under file://, do not load the module script.
// Show a clear HTTP-server warning instead.
</script>
#demos:<div class="demo-model-viewer" data-demo-webgl="viewer" data-demo-panel="left"></div>
<div class="demo-model-viewer" data-demo-webgl="viewer" data-demo-panel="right"></div>
data-demo-scene="...".static/images/examples/.The active scene list is defined in static/js/demo-viewer.js, not inline in HTML.
static/js/demo-viewer.js imports local vendor files:
./vendor/three.module.jsthree.module.js also depends on ./vendor/three.core.js./vendor/GLTFLoader.js./vendor/OrbitControls.jsGLTFLoader.js also depends on ./vendor/BufferGeometryUtils.jsindex.html only injects demo-viewer.js dynamically when the page is served over http:// or https://.100ms delay plus a smooth follow transition.static/js/nav.js no longer handles the 3D demo logic; it only handles experiment table tabs.index.html directly via file://.The current interactive section was built with these concrete steps:
#demos was removed.model-viewer attempt was added first, but it was not reliable for the current point-cloud GLBs.model-viewer with a custom Three.js dual-viewer in static/js/demo-viewer.js.w/o MeMix and w/ MeMix.static/js/vendor/.BufferGeometryUtils.js also had to be vendored locally because GLTFLoader imports it.o-memix.glb / w-memix.glb pair was retired.static/models/examples/.SCENES array inside static/js/demo-viewer.js.There are two common failure cases here:
file:// instead of being served over HTTP.GLTFLoader is missing its local BufferGeometryUtils.js dependency, so the module graph fails before rendering starts.Use an HTTP server from the repo root:
cd /Users/apple/Documents/Projects/MoM3R/MoM3R.github.io
python3 -m http.server 8000
Then open:
http://localhost:8000/
Do not judge the 3D viewer from a file://.../index.html preview.
The current interactive examples use the smaller .glb files under static/models/examples/.
If a future model bundle is too heavy for direct browser rendering, use the helper script like this:
python3 tools/downsample_glb_points.py INPUT.glb OUTPUT.glb --target-points 200000
What the script does:
POINTS primitive in the GLB.glbThe older prototype pair in this repo was reduced from about 216 MB to about 3.3 MB using this script before it was retired.
At the time this guide was updated:
static/models/raw/cut_last_even.glbstatic/models/raw/mom_last_even.glbhad the same SHA-1 hash, meaning they were byte-identical files.
This means the left/right demo infrastructure is in place, but the current two scenes do not yet show a true geometric before/after comparison.
To verify this again later:
shasum static/models/raw/cut_last_even.glb static/models/raw/mom_last_even.glb
If the hashes match, the visual content is still identical.
The experiments section uses tab-like buttons above the tables.
Files involved:
index.htmlstatic/css/index.cssstatic/js/nav.jsImplementation rules:
.experiment-tab..experiment-panel.data-panel.static/js/nav.js handles activation and hiding.If you add a new experiment table:
data-panel="..."..experiment-panel article with the same data-panel.hidden.Do not reintroduce stacked always-visible tables unless explicitly requested.
The current experiment tabs are a curated subset of the paper tables, not a full one-to-one reproduction.
When updating:
Table 2, Table 4, Table 5, Table 6, and Table 7.Table 2 and Table 5 are currently reduced to 300-view 7-Scenes slices.Table 6 and Table 7 are currently reduced to representative metrics with clearer MeMix gains..metric-better-cell when a w/ MeMix cell is better than the corresponding backbone.CUT3R’s interaction is not implemented as an inline Three.js scene written from scratch in the project page.
Instead, it uses a hosted Viser web client and playback recordings.
Based on the CUT3R website and source:
https://cut3r.github.io/https://github.com/CUT3R/CUT3R.github.iohttps://viser.studio/main/embedded_visualizations/CUT3R stores interactive scenes as .viser playback files and loads them through a prebuilt web viewer under /build/.
Their interactive.js constructs iframe URLs like:
/build/?playbackPath=/recordings/example.viser
They also add optional query parameters such as:
synchronizedVideoOverlay=/recordings/example.mp4synchronizedVideoTimeOffset=0.0initialCameraPosition=...initialCameraLookAt=...baseSpeed=0.5darkModeThen they inject that URL into an <iframe>.
CUT3R’s interactive 3D result system is roughly:
.viser file./build/..viser recording in a folder like /recordings/./recordings/*.mp4.<iframe src="/build/?playbackPath=/recordings/example.viser"></iframe>
This approach is much easier to maintain than building a custom Three.js viewer for every paper page:
You would need:
.viser playback files.index.html with iframe containers and selectors.src values based on the chosen scene.The current MeMix page does not yet include this system.
After edits:
rg -n "NaN|Coming Soon|TODO|placeholder|Author A" index.html static/css/index.css static/js/nav.js
List project assets:
find . -maxdepth 3 -type f | sort
If temporary source PDFs are present locally, use:
pdfinfo -box /path/to/source.pdf
pdftoppm -png -singlefile -cropbox -r 280 /path/to/source.pdf /tmp/output-prefix
pdftocairo -png -singlefile -transp /path/to/source.pdf /tmp/output-prefix
interactive.js in that repo