Open-source, config-driven AR gallery platform. Supports geo-fenced, image-recognition, and marker-based AR experiences with a web-based submission and review system.
config.yaml ←── Single source of truth
│
modules/registry.js ←── Connector loader (GPS, image-recog, markers, etc.)
│
server.js ←── Express API + static serving
│
├── /api/projects ←── Project CRUD with unlock checks
├── /api/submit ←── Community submissions
├── /api/review ←── Approval queue
├── /api/config ←── Public platform config
└── /api/connectors ←── Active connector status
│
admin/index.html ←── Web UI: submission form, review dashboard
│
public/js/platform.js ←── Client core: connector loading, carousel, geo-fence
│
index.html ←── AR gallery (model-viewer + platform.js)
│
projects/{id}/
├── manifest.json ←── Project metadata + unlockMethods
├── assets/asset.glb ←── 3D model
├── index.html ←── Standalone viewer
└── index-ar.html ←── Legacy AR.js viewer
git clone https://github.com/jlicerio/RGVXR.git
cd RGVXR
npm install
npm startEverything is driven by config.yaml:
connectors:
gps:
enabled: true # Geo-fence unlock
image-recognition:
enabled: true # MindAR image tracking
always:
enabled: true # Fallback (no restrictions)
marker-ar:
enabled: false # AR.js markers (legacy)Connectors are pluggable modules that provide unlock methods for projects. Each connector implements:
{
init(config) // One-time setup from config.yaml
check(manifest, opts) // Returns { unlocked, reason, data }
getStatus() // Returns { ready, message }
getUISchema() // Returns JSON Schema for admin form
}| Connector | Status | Description |
|---|---|---|
gps |
🟢 active | Unlock projects when user is within GPS radius |
always |
🟢 active | No restrictions — always available |
image-recognition |
🟢 active | Unlock by scanning a target image (MindAR) |
marker-ar |
🔴 planned | Unlock with printed AR markers (AR.js) |
webxr |
🔴 planned | Surface placement via WebXR hit-test |
- Enable in
config.yamlconnectors section - Create
modules/{id}/connector.jsimplementing the interface - Add client-side counterpart in
public/js/platform.jsunderclientConnectors
Each project has a manifest.json:
{
"id": "peyote",
"title": "Carrizo Comecrudo Peyote Cactus",
"description": "...",
"author": "AR Projects Team",
"status": "published",
"visibility": "public",
"unlockMethods": {
"gps": {
"lat": 26.3798,
"lng": -98.8203,
"radius": 2000,
"name": "Rio Grande City, TX"
}
},
"technologies": ["model-viewer", "WebXR"],
"license": "CC-BY-4.0"
}draft → review → published
↘ rejected
Submit: POST /api/submit or use /admin/ web UI
Review: /admin/ → Review Queue tab → Approve/Reject
Publish: Approved projects automatically move from _staging/ to projects/
| Endpoint | Method | Description |
|---|---|---|
/api/projects |
GET | List published projects |
/api/projects?lat=X&lng=Y |
GET | Projects with unlock status for location |
/api/projects/:id |
GET | Single project detail |
/api/submit |
POST | Submit new project for review |
/api/review |
GET | List projects awaiting review |
/api/review/:id |
PATCH | Approve/reject ({action:"approve"}) |
/api/config |
GET | Public platform configuration |
/api/connectors |
GET | Active connector status |
/health |
GET | Server health check |
# Production (use process manager)
npm install -g pm2
pm2 start server.js --name rgvxr
# With Tailscale Funnel (public URL)
tailscale funnel --bg --set-path /rgvxr/ http://127.0.0.1:8080- model-viewer (Google) — 3D rendering + WebXR AR
- MindAR — Image tracking
- A-Frame — Legacy AR.js support
- Express — API server
- js-yaml — Config parsing
- Fork the repo
- Enable the connectors you want in
config.yaml - Add projects via
/admin/or by creatingprojects/{id}/manifest.json - To add a new connector type: create
modules/{id}/connector.js - Submit a PR!
MIT — see LICENSE