[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-meta-publish-to-vercel":3,"mdc-gjbbpv-key":34,"related-repo-meta-publish-to-vercel":3895,"related-org-meta-publish-to-vercel":4000},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"publish-to-vercel","publish webapps to Vercel","Publish a Meta Display Glasses webapp to Vercel for live HTTPS access on device. Use when the developer is ready to publish, host, ship, or release a webapp to a stable production URL for everyone. Handles server setup, Vercel project creation, and direct deploys without GitHub.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"meta","Meta Open Source","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmeta.png","facebook",[13,17,20],{"name":14,"slug":15,"type":16},"Vercel","vercel","tag",{"name":18,"slug":19,"type":16},"Deployment","deployment",{"name":21,"slug":22,"type":16},"Cloud","cloud",189,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-webapp","2026-09-01T08:30:34.603413",null,33,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"AI-assisted development toolkit for building web applications on Meta Ray-Ban Display glasses.","https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-webapp\u002Ftree\u002FHEAD\u002Fplugins\u002Fmeta-wearables-webapp\u002Fskills\u002Fpublish-to-vercel","---\nname: publish-to-vercel\ndescription: >-\n  Publish a Meta Display Glasses webapp to Vercel for live HTTPS access on device.\n  Use when the developer is ready to publish, host, ship, or release a webapp to a\n  stable production URL for everyone. Handles server setup, Vercel project creation,\n  and direct deploys without GitHub.\nargument-hint: \"[app-directory]\"\n---\n\n# Publish to Vercel\n\nPublish a Meta Display Glasses webapp to Vercel for live HTTPS hosting at a stable production URL. This enables loading the webapp directly on Meta Display Glasses, which require HTTPS URLs.\n\n**Use this skill only when the webapp is ready to ship to everyone.** For iterating on uncommitted changes during development, use `\u002Ftest-on-device` instead — it deploys to a `stage-\u003Cproject-name>` URL without affecting production.\n\n**No GitHub repo required** — code is pushed directly from local to Vercel.\n\n## Why Vercel?\n\nMeta Display Glasses load webapps via HTTPS URLs. Vercel provides instant static hosting with HTTPS out of the box, making it the fastest path from local development to on-device access.\n\n## Prerequisites\n\n### 1. Vercel-Compatible Node Server\n\nThe app directory must have these three files. If they don't exist, create them before proceeding.\n\n**`package.json`:**\n\n```json\n{\n  \"name\": \"\u003Capp-name>\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"start\": \"node server.js\"\n  }\n}\n```\n\n**`server.js`** — lightweight static file server:\n\n```javascript\nvar http = require('http');\nvar fs = require('fs');\nvar path = require('path');\n\nvar PORT = process.env.PORT || 3000;\n\nvar mimeTypes = {\n  '.html': 'text\u002Fhtml',\n  '.css': 'text\u002Fcss',\n  '.js': 'application\u002Fjavascript',\n  '.json': 'application\u002Fjson',\n  '.png': 'image\u002Fpng',\n  '.jpg': 'image\u002Fjpeg',\n  '.svg': 'image\u002Fsvg+xml',\n};\n\nvar server = http.createServer(function(req, res) {\n  var filePath = '.' + (req.url === '\u002F' ? '\u002Findex.html' : req.url);\n  var ext = path.extname(filePath);\n  var contentType = mimeTypes[ext] || 'application\u002Foctet-stream';\n\n  fs.readFile(filePath, function(err, content) {\n    if (err) {\n      res.writeHead(404, { 'Content-Type': 'text\u002Fhtml' });\n      res.end('\u003Ch1>404 Not Found\u003C\u002Fh1>');\n      return;\n    }\n    res.writeHead(200, { 'Content-Type': contentType });\n    res.end(content);\n  });\n});\n\nserver.listen(PORT, function() {\n  console.log('Server running at http:\u002F\u002Flocalhost:' + PORT);\n});\n```\n\n**`vercel.json`:**\n\n```json\n{\n  \"rewrites\": [\n    { \"source\": \"\u002F(.*)\", \"destination\": \"\u002F$1\" }\n  ]\n}\n```\n\nIf a server already exists, verify Vercel compatibility:\n- Port must use `process.env.PORT || 3000` (not hard-coded)\n- `vercel.json` must exist with rewrites config\n- Server must only serve static files (no Express routes or SSR)\n- `package.json` must have a `start` script\n\n### 2. Existing Webapp\n\n- Existing webapp with `index.html` (created via `\u002Fcreate-webapp` or manually)\n\n## Steps\n\n### 0. Verify Vercel Setup\n\nRun `vercel whoami` to detect the user's current state, then branch:\n\n**a. Authenticated** — `vercel whoami` returns a username. Skip to Step 0.5.\n\n**b. CLI not installed** — command returns `vercel: command not found` (or similar). Tell the user:\n\n> Publishing to Meta Display Glasses needs a public HTTPS URL. I can set this up for you via Vercel — it's free and takes a couple of minutes. You'll need to create a Vercel account at https:\u002F\u002Fvercel.com\u002Fsignup (free tier is fine), and then I'll handle installing the CLI and walking you through the rest.\n>\n> If you'd rather host this yourself on any HTTPS server, you can skip this skill entirely.\n>\n> Want me to proceed with Vercel?\n\nIf yes, wait for the user to confirm they've created the Vercel account, then run `npm i -g vercel` yourself. After install completes, proceed to the login branch below.\n\n**c. Not logged in** — CLI is installed but `vercel whoami` returns an auth error. Tell the user:\n\n> Vercel CLI is installed but not logged in. `vercel login` is interactive and needs your input — please type `! vercel login` in this prompt to run it in this session.\n\nAfter they complete login, re-run `vercel whoami` to confirm. Only proceed once it returns a valid user.\n\n### 0.5. Detect and Offer to Disable Existing Passcode\n\nIf `lock.html` exists in the app directory, the app was previously gated by `\u002Ftest-on-device`'s passcode lock. Production releases shouldn't require visitors to enter a passcode, so ask the user:\n\n> This app has a passcode lock screen from `\u002Ftest-on-device`. For a public production release, do you want to disable it? (default: yes)\n>\n> I'll only disable the routing — `lock.html`, `lock.css`, and `lock.js` will stay in the directory in case you re-test later.\n\nIf yes, revert only the routing wiring (leave `lock.html`\u002F`lock.css`\u002F`lock.js` files in place):\n\n1. **`server.js`** — change the root path back to serve `index.html`:\n   ```javascript\n   \u002F\u002F Find this:\n   var filePath = '.' + (req.url === '\u002F' ? '\u002Flock.html' : req.url);\n   \u002F\u002F Replace with:\n   var filePath = '.' + (req.url === '\u002F' ? '\u002Findex.html' : req.url);\n   ```\n2. **`vercel.json`** — remove the `{ \"source\": \"\u002F\", \"destination\": \"\u002Flock.html\" }` rewrite. Keep the catch-all.\n3. **`index.html`** — remove the inline `localStorage` guard `\u003Cscript>` from `\u003Chead>` (the one that redirects to `lock.html` when the storage key is unset).\n\nIf the user says no, leave everything in place — the production URL will continue to gate visitors with the passcode.\n\nIf `lock.html` does not exist, skip this step. Do **not** proactively add a passcode lock during publish.\n\n### 1. Ensure No GitHub Repo Is Linked\n\nThis workflow pushes code directly from local to Vercel — no GitHub repo needed.\n\nIf a Vercel project was previously linked to GitHub, disconnect it:\n\n```bash\nvercel git disconnect --yes\n```\n\n### 2. Create Vercel Project and Publish\n\nFor a first-time publish, run from the app directory:\n\n```bash\nvercel --yes --prod\n```\n\nThis will:\n1. Create a new Vercel project (auto-named from directory)\n2. Upload all files directly\n3. Build and deploy to production\n4. Output the live HTTPS URL\n\nThe project will be linked locally via a `.vercel\u002F` directory (auto-added to `.gitignore`).\n\n### 3. Disable Deployment Protection\n\nImmediately after the first deploy, disable Vercel Authentication so the glasses browser can access the URL without login:\n\n```bash\nPROJECT_ID=$(python3 -c \"import json; print(json.load(open('.vercel\u002Fproject.json'))['projectId'])\")\necho '{\"ssoProtection\":null}' | vercel api \"\u002Fv9\u002Fprojects\u002F$PROJECT_ID\" -X PATCH --input - --silent\n```\n\n> This is safe to run on every deploy — it's a no-op if already disabled.\n\n### 4. Alias to a Stable Production URL\n\nAfter deploying, alias the deployment to a predictable `\u003Cproject-name>` URL:\n\n```bash\nURL=$(vercel --prod)\nvercel alias set \"$URL\" \u003Cproject-name>.vercel.app\n```\n\nReplace `\u003Cproject-name>` with the actual project name (from `package.json` or `.vercel\u002Fproject.json`). For example, if the project is `my-glasses-app`, the stable URL becomes `https:\u002F\u002Fmy-glasses-app.vercel.app`.\n\nThis is the URL to share with everyone. It never changes between deploys.\n\n### 5. Generate QR Code for Easy Device Setup\n\nGenerate a QR code that users can scan from their phone to automatically add the webapp — no manual URL typing needed.\n\nThe QR code data must use this deep link format:\n```\nfb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>\n```\n\nFor example, if the app is called `my-glasses-app` and the stable URL is `https:\u002F\u002Fmy-glasses-app.vercel.app`:\n```\nfb-viewapp:\u002F\u002Fweb_app_deep_link?appName=my-glasses-app&appUrl=https%3A%2F%2Fmy-glasses-app.vercel.app\n```\n\nUse the `\u002Fqr-code` skill to generate the QR code:\n\n```bash\npython3 skills\u002Fqr-code\u002Fscripts\u002Fqr_generator.py --png \u003Capp-dir>\u002Fqr-publish.png \"fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>\"\n```\n\nThe PNG is saved to the app directory. If your environment supports rendering images inline (e.g. Claude Code's Read tool), display the QR code directly. Otherwise, provide the file path and tell the user to open it and scan from their phone.\n\n### 6. Give the User the Stable URL and Setup Instructions\n\nAfter deploy, alias, and QR generation, present the user with:\n\n**Stable URL:**\n```\nhttps:\u002F\u002F\u003Cproject-name>.vercel.app\n```\n\n**Option A — Scan QR code (recommended):**\nScan the generated QR code with your phone camera. It will open the Meta AI app and automatically add the webapp.\n\n**Option B — Manual setup:**\n1. Open the **Meta AI app** on your phone\n2. Go to **Devices** > **Display Glasses settings**\n3. Navigate to **App connections** > **Web apps**\n4. Tap **Add a web app**\n5. Enter the name: `\u003Capp-name>`\n6. Enter the URL: `https:\u002F\u002F\u003Cproject-name>.vercel.app`\n\n### 7. After Each Update — Republish\n\nAfter making changes, republish, re-alias, and regenerate the QR code every time:\n\n```bash\nURL=$(vercel --prod)\nvercel alias set \"$URL\" \u003Cproject-name>.vercel.app\n\n# Regenerate QR code\npython3 skills\u002Fqr-code\u002Fscripts\u002Fqr_generator.py --png \u003Capp-dir>\u002Fqr-publish.png \"fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>\"\n```\n\nThe stable URL automatically serves the latest version. No `git push` needed — Vercel receives the files directly.\n\nAfter each republish, show the QR code and setup instructions (following Steps 5-6).\n\n> **PS:** If the user has already added this webapp to their glasses, no need to re-add — the stable URL automatically serves the latest deploy.\n\n## Verification\n\n- [ ] Step 0 verified Vercel setup (`vercel whoami` returns a user) before any deploy\n- [ ] If `lock.html` existed, user was offered the option to disable the passcode routing for production\n- [ ] No new passcode lock was added during publish\n- [ ] `package.json`, `server.js`, and `vercel.json` exist in app directory\n- [ ] `server.js` uses `process.env.PORT`\n- [ ] `vercel --prod` completes successfully\n- [ ] `vercel alias set` succeeds and maps to `\u003Cproject-name>.vercel.app`\n- [ ] Stable URL returns the app (check in browser)\n- [ ] URL uses HTTPS (required for Meta Display Glasses)\n- [ ] App loads correctly on device via the stable URL\n- [ ] Subsequent deploys + alias keep the same URL working\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| `vercel: command not found` | Run `npm i -g vercel` |\n| Auth error | Run `vercel login` |\n| GitHub link error on deploy | Run `vercel git disconnect --yes` first |\n| 404 on sub-pages | Check `vercel.json` rewrites config |\n| Old version still showing | Run `vercel --prod --force` to skip cache, then re-alias |\n| Alias name taken | The `\u003Cproject-name>.vercel.app` subdomain may already be claimed. Try a more specific name like `\u003Cproject-name>-\u003Cteam>.vercel.app` |\n| Permission denied on `gh` config | Ignore — this workflow doesn't need GitHub |\n| QR code won't scan | Ensure the deep link format is correct and the URL is properly percent-encoded. Try increasing `--scale` for a larger QR image |\n\n## Related Skills\n\n| Skill | Purpose | When to Use |\n|-------|---------|-------------|\n| `\u002Ftest-on-device` | Preview uncommitted changes on glasses | Quick iteration without committing |\n| `\u002Fcreate-webapp` | Create a new webapp | Before first publish |\n| `\u002Fadd-ui` | Add screens, buttons, components | Adding UI before republish |\n| `\u002Fconnect-api` | Add API connections | Adding data sources before republish |\n| `\u002Fqr-code` | Generate QR codes | Used automatically by this skill for device setup |\n| `\u002Fpasscode-for-testing` | Add passcode lock screen | Not added by this skill — if one already exists from `\u002Ftest-on-device`, Step 0.5 offers to disable the routing for production |\n",{"data":35,"body":37},{"name":4,"description":6,"argument-hint":36},"[app-directory]",{"type":38,"children":39},"root",[40,48,54,82,92,99,104,110,117,122,136,348,362,1667,1680,1811,1816,1866,1872,1896,1902,1908,1921,1938,1956,1985,1998,2015,2039,2051,2057,2077,2120,2144,2453,2458,2476,2482,2487,2492,2523,2529,2534,2558,2563,2586,2607,2613,2618,2745,2753,2759,2772,2859,2901,2906,2912,2917,2922,2932,2950,2959,2972,3032,3037,3043,3048,3056,3065,3075,3083,3162,3168,3173,3312,3325,3330,3343,3349,3521,3527,3720,3726,3889],{"type":41,"tag":42,"props":43,"children":44},"element","h1",{"id":4},[45],{"type":46,"value":47},"text","Publish to Vercel",{"type":41,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"Publish a Meta Display Glasses webapp to Vercel for live HTTPS hosting at a stable production URL. This enables loading the webapp directly on Meta Display Glasses, which require HTTPS URLs.",{"type":41,"tag":49,"props":55,"children":56},{},[57,63,65,72,74,80],{"type":41,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":46,"value":62},"Use this skill only when the webapp is ready to ship to everyone.",{"type":46,"value":64}," For iterating on uncommitted changes during development, use ",{"type":41,"tag":66,"props":67,"children":69},"code",{"className":68},[],[70],{"type":46,"value":71},"\u002Ftest-on-device",{"type":46,"value":73}," instead — it deploys to a ",{"type":41,"tag":66,"props":75,"children":77},{"className":76},[],[78],{"type":46,"value":79},"stage-\u003Cproject-name>",{"type":46,"value":81}," URL without affecting production.",{"type":41,"tag":49,"props":83,"children":84},{},[85,90],{"type":41,"tag":58,"props":86,"children":87},{},[88],{"type":46,"value":89},"No GitHub repo required",{"type":46,"value":91}," — code is pushed directly from local to Vercel.",{"type":41,"tag":93,"props":94,"children":96},"h2",{"id":95},"why-vercel",[97],{"type":46,"value":98},"Why Vercel?",{"type":41,"tag":49,"props":100,"children":101},{},[102],{"type":46,"value":103},"Meta Display Glasses load webapps via HTTPS URLs. Vercel provides instant static hosting with HTTPS out of the box, making it the fastest path from local development to on-device access.",{"type":41,"tag":93,"props":105,"children":107},{"id":106},"prerequisites",[108],{"type":46,"value":109},"Prerequisites",{"type":41,"tag":111,"props":112,"children":114},"h3",{"id":113},"_1-vercel-compatible-node-server",[115],{"type":46,"value":116},"1. Vercel-Compatible Node Server",{"type":41,"tag":49,"props":118,"children":119},{},[120],{"type":46,"value":121},"The app directory must have these three files. If they don't exist, create them before proceeding.",{"type":41,"tag":49,"props":123,"children":124},{},[125],{"type":41,"tag":58,"props":126,"children":127},{},[128,134],{"type":41,"tag":66,"props":129,"children":131},{"className":130},[],[132],{"type":46,"value":133},"package.json",{"type":46,"value":135},":",{"type":41,"tag":137,"props":138,"children":143},"pre",{"className":139,"code":140,"language":141,"meta":142,"style":142},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"\u003Capp-name>\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"start\": \"node server.js\"\n  }\n}\n","json","",[144],{"type":41,"tag":66,"props":145,"children":146},{"__ignoreMap":142},[147,159,203,241,267,293,330,339],{"type":41,"tag":148,"props":149,"children":152},"span",{"class":150,"line":151},"line",1,[153],{"type":41,"tag":148,"props":154,"children":156},{"style":155},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[157],{"type":46,"value":158},"{\n",{"type":41,"tag":148,"props":160,"children":162},{"class":150,"line":161},2,[163,168,174,179,183,188,194,198],{"type":41,"tag":148,"props":164,"children":165},{"style":155},[166],{"type":46,"value":167},"  \"",{"type":41,"tag":148,"props":169,"children":171},{"style":170},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[172],{"type":46,"value":173},"name",{"type":41,"tag":148,"props":175,"children":176},{"style":155},[177],{"type":46,"value":178},"\"",{"type":41,"tag":148,"props":180,"children":181},{"style":155},[182],{"type":46,"value":135},{"type":41,"tag":148,"props":184,"children":185},{"style":155},[186],{"type":46,"value":187}," \"",{"type":41,"tag":148,"props":189,"children":191},{"style":190},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[192],{"type":46,"value":193},"\u003Capp-name>",{"type":41,"tag":148,"props":195,"children":196},{"style":155},[197],{"type":46,"value":178},{"type":41,"tag":148,"props":199,"children":200},{"style":155},[201],{"type":46,"value":202},",\n",{"type":41,"tag":148,"props":204,"children":206},{"class":150,"line":205},3,[207,211,216,220,224,228,233,237],{"type":41,"tag":148,"props":208,"children":209},{"style":155},[210],{"type":46,"value":167},{"type":41,"tag":148,"props":212,"children":213},{"style":170},[214],{"type":46,"value":215},"version",{"type":41,"tag":148,"props":217,"children":218},{"style":155},[219],{"type":46,"value":178},{"type":41,"tag":148,"props":221,"children":222},{"style":155},[223],{"type":46,"value":135},{"type":41,"tag":148,"props":225,"children":226},{"style":155},[227],{"type":46,"value":187},{"type":41,"tag":148,"props":229,"children":230},{"style":190},[231],{"type":46,"value":232},"1.0.0",{"type":41,"tag":148,"props":234,"children":235},{"style":155},[236],{"type":46,"value":178},{"type":41,"tag":148,"props":238,"children":239},{"style":155},[240],{"type":46,"value":202},{"type":41,"tag":148,"props":242,"children":244},{"class":150,"line":243},4,[245,249,254,258,262],{"type":41,"tag":148,"props":246,"children":247},{"style":155},[248],{"type":46,"value":167},{"type":41,"tag":148,"props":250,"children":251},{"style":170},[252],{"type":46,"value":253},"private",{"type":41,"tag":148,"props":255,"children":256},{"style":155},[257],{"type":46,"value":178},{"type":41,"tag":148,"props":259,"children":260},{"style":155},[261],{"type":46,"value":135},{"type":41,"tag":148,"props":263,"children":264},{"style":155},[265],{"type":46,"value":266}," true,\n",{"type":41,"tag":148,"props":268,"children":270},{"class":150,"line":269},5,[271,275,280,284,288],{"type":41,"tag":148,"props":272,"children":273},{"style":155},[274],{"type":46,"value":167},{"type":41,"tag":148,"props":276,"children":277},{"style":170},[278],{"type":46,"value":279},"scripts",{"type":41,"tag":148,"props":281,"children":282},{"style":155},[283],{"type":46,"value":178},{"type":41,"tag":148,"props":285,"children":286},{"style":155},[287],{"type":46,"value":135},{"type":41,"tag":148,"props":289,"children":290},{"style":155},[291],{"type":46,"value":292}," {\n",{"type":41,"tag":148,"props":294,"children":296},{"class":150,"line":295},6,[297,302,308,312,316,320,325],{"type":41,"tag":148,"props":298,"children":299},{"style":155},[300],{"type":46,"value":301},"    \"",{"type":41,"tag":148,"props":303,"children":305},{"style":304},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[306],{"type":46,"value":307},"start",{"type":41,"tag":148,"props":309,"children":310},{"style":155},[311],{"type":46,"value":178},{"type":41,"tag":148,"props":313,"children":314},{"style":155},[315],{"type":46,"value":135},{"type":41,"tag":148,"props":317,"children":318},{"style":155},[319],{"type":46,"value":187},{"type":41,"tag":148,"props":321,"children":322},{"style":190},[323],{"type":46,"value":324},"node server.js",{"type":41,"tag":148,"props":326,"children":327},{"style":155},[328],{"type":46,"value":329},"\"\n",{"type":41,"tag":148,"props":331,"children":333},{"class":150,"line":332},7,[334],{"type":41,"tag":148,"props":335,"children":336},{"style":155},[337],{"type":46,"value":338},"  }\n",{"type":41,"tag":148,"props":340,"children":342},{"class":150,"line":341},8,[343],{"type":41,"tag":148,"props":344,"children":345},{"style":155},[346],{"type":46,"value":347},"}\n",{"type":41,"tag":49,"props":349,"children":350},{},[351,360],{"type":41,"tag":58,"props":352,"children":353},{},[354],{"type":41,"tag":66,"props":355,"children":357},{"className":356},[],[358],{"type":46,"value":359},"server.js",{"type":46,"value":361}," — lightweight static file server:",{"type":41,"tag":137,"props":363,"children":367},{"className":364,"code":365,"language":366,"meta":142,"style":142},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","var http = require('http');\nvar fs = require('fs');\nvar path = require('path');\n\nvar PORT = process.env.PORT || 3000;\n\nvar mimeTypes = {\n  '.html': 'text\u002Fhtml',\n  '.css': 'text\u002Fcss',\n  '.js': 'application\u002Fjavascript',\n  '.json': 'application\u002Fjson',\n  '.png': 'image\u002Fpng',\n  '.jpg': 'image\u002Fjpeg',\n  '.svg': 'image\u002Fsvg+xml',\n};\n\nvar server = http.createServer(function(req, res) {\n  var filePath = '.' + (req.url === '\u002F' ? '\u002Findex.html' : req.url);\n  var ext = path.extname(filePath);\n  var contentType = mimeTypes[ext] || 'application\u002Foctet-stream';\n\n  fs.readFile(filePath, function(err, content) {\n    if (err) {\n      res.writeHead(404, { 'Content-Type': 'text\u002Fhtml' });\n      res.end('\u003Ch1>404 Not Found\u003C\u002Fh1>');\n      return;\n    }\n    res.writeHead(200, { 'Content-Type': contentType });\n    res.end(content);\n  });\n});\n\nserver.listen(PORT, function() {\n  console.log('Server running at http:\u002F\u002Flocalhost:' + PORT);\n});\n","javascript",[368],{"type":41,"tag":66,"props":369,"children":370},{"__ignoreMap":142},[371,425,470,515,524,579,586,606,646,684,722,760,798,836,874,883,891,959,1075,1123,1181,1189,1250,1277,1355,1397,1410,1419,1485,1518,1535,1552,1560,1599,1651],{"type":41,"tag":148,"props":372,"children":373},{"class":150,"line":151},[374,379,385,390,396,401,406,411,415,420],{"type":41,"tag":148,"props":375,"children":376},{"style":170},[377],{"type":46,"value":378},"var",{"type":41,"tag":148,"props":380,"children":382},{"style":381},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[383],{"type":46,"value":384}," http ",{"type":41,"tag":148,"props":386,"children":387},{"style":155},[388],{"type":46,"value":389},"=",{"type":41,"tag":148,"props":391,"children":393},{"style":392},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[394],{"type":46,"value":395}," require",{"type":41,"tag":148,"props":397,"children":398},{"style":381},[399],{"type":46,"value":400},"(",{"type":41,"tag":148,"props":402,"children":403},{"style":155},[404],{"type":46,"value":405},"'",{"type":41,"tag":148,"props":407,"children":408},{"style":190},[409],{"type":46,"value":410},"http",{"type":41,"tag":148,"props":412,"children":413},{"style":155},[414],{"type":46,"value":405},{"type":41,"tag":148,"props":416,"children":417},{"style":381},[418],{"type":46,"value":419},")",{"type":41,"tag":148,"props":421,"children":422},{"style":155},[423],{"type":46,"value":424},";\n",{"type":41,"tag":148,"props":426,"children":427},{"class":150,"line":161},[428,432,437,441,445,449,453,458,462,466],{"type":41,"tag":148,"props":429,"children":430},{"style":170},[431],{"type":46,"value":378},{"type":41,"tag":148,"props":433,"children":434},{"style":381},[435],{"type":46,"value":436}," fs ",{"type":41,"tag":148,"props":438,"children":439},{"style":155},[440],{"type":46,"value":389},{"type":41,"tag":148,"props":442,"children":443},{"style":392},[444],{"type":46,"value":395},{"type":41,"tag":148,"props":446,"children":447},{"style":381},[448],{"type":46,"value":400},{"type":41,"tag":148,"props":450,"children":451},{"style":155},[452],{"type":46,"value":405},{"type":41,"tag":148,"props":454,"children":455},{"style":190},[456],{"type":46,"value":457},"fs",{"type":41,"tag":148,"props":459,"children":460},{"style":155},[461],{"type":46,"value":405},{"type":41,"tag":148,"props":463,"children":464},{"style":381},[465],{"type":46,"value":419},{"type":41,"tag":148,"props":467,"children":468},{"style":155},[469],{"type":46,"value":424},{"type":41,"tag":148,"props":471,"children":472},{"class":150,"line":205},[473,477,482,486,490,494,498,503,507,511],{"type":41,"tag":148,"props":474,"children":475},{"style":170},[476],{"type":46,"value":378},{"type":41,"tag":148,"props":478,"children":479},{"style":381},[480],{"type":46,"value":481}," path ",{"type":41,"tag":148,"props":483,"children":484},{"style":155},[485],{"type":46,"value":389},{"type":41,"tag":148,"props":487,"children":488},{"style":392},[489],{"type":46,"value":395},{"type":41,"tag":148,"props":491,"children":492},{"style":381},[493],{"type":46,"value":400},{"type":41,"tag":148,"props":495,"children":496},{"style":155},[497],{"type":46,"value":405},{"type":41,"tag":148,"props":499,"children":500},{"style":190},[501],{"type":46,"value":502},"path",{"type":41,"tag":148,"props":504,"children":505},{"style":155},[506],{"type":46,"value":405},{"type":41,"tag":148,"props":508,"children":509},{"style":381},[510],{"type":46,"value":419},{"type":41,"tag":148,"props":512,"children":513},{"style":155},[514],{"type":46,"value":424},{"type":41,"tag":148,"props":516,"children":517},{"class":150,"line":243},[518],{"type":41,"tag":148,"props":519,"children":521},{"emptyLinePlaceholder":520},true,[522],{"type":46,"value":523},"\n",{"type":41,"tag":148,"props":525,"children":526},{"class":150,"line":269},[527,531,536,540,545,550,555,559,564,569,575],{"type":41,"tag":148,"props":528,"children":529},{"style":170},[530],{"type":46,"value":378},{"type":41,"tag":148,"props":532,"children":533},{"style":381},[534],{"type":46,"value":535}," PORT ",{"type":41,"tag":148,"props":537,"children":538},{"style":155},[539],{"type":46,"value":389},{"type":41,"tag":148,"props":541,"children":542},{"style":381},[543],{"type":46,"value":544}," process",{"type":41,"tag":148,"props":546,"children":547},{"style":155},[548],{"type":46,"value":549},".",{"type":41,"tag":148,"props":551,"children":552},{"style":381},[553],{"type":46,"value":554},"env",{"type":41,"tag":148,"props":556,"children":557},{"style":155},[558],{"type":46,"value":549},{"type":41,"tag":148,"props":560,"children":561},{"style":381},[562],{"type":46,"value":563},"PORT ",{"type":41,"tag":148,"props":565,"children":566},{"style":155},[567],{"type":46,"value":568},"||",{"type":41,"tag":148,"props":570,"children":572},{"style":571},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[573],{"type":46,"value":574}," 3000",{"type":41,"tag":148,"props":576,"children":577},{"style":155},[578],{"type":46,"value":424},{"type":41,"tag":148,"props":580,"children":581},{"class":150,"line":295},[582],{"type":41,"tag":148,"props":583,"children":584},{"emptyLinePlaceholder":520},[585],{"type":46,"value":523},{"type":41,"tag":148,"props":587,"children":588},{"class":150,"line":332},[589,593,598,602],{"type":41,"tag":148,"props":590,"children":591},{"style":170},[592],{"type":46,"value":378},{"type":41,"tag":148,"props":594,"children":595},{"style":381},[596],{"type":46,"value":597}," mimeTypes ",{"type":41,"tag":148,"props":599,"children":600},{"style":155},[601],{"type":46,"value":389},{"type":41,"tag":148,"props":603,"children":604},{"style":155},[605],{"type":46,"value":292},{"type":41,"tag":148,"props":607,"children":608},{"class":150,"line":341},[609,614,620,624,628,633,638,642],{"type":41,"tag":148,"props":610,"children":611},{"style":155},[612],{"type":46,"value":613},"  '",{"type":41,"tag":148,"props":615,"children":617},{"style":616},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[618],{"type":46,"value":619},".html",{"type":41,"tag":148,"props":621,"children":622},{"style":155},[623],{"type":46,"value":405},{"type":41,"tag":148,"props":625,"children":626},{"style":155},[627],{"type":46,"value":135},{"type":41,"tag":148,"props":629,"children":630},{"style":155},[631],{"type":46,"value":632}," '",{"type":41,"tag":148,"props":634,"children":635},{"style":190},[636],{"type":46,"value":637},"text\u002Fhtml",{"type":41,"tag":148,"props":639,"children":640},{"style":155},[641],{"type":46,"value":405},{"type":41,"tag":148,"props":643,"children":644},{"style":155},[645],{"type":46,"value":202},{"type":41,"tag":148,"props":647,"children":649},{"class":150,"line":648},9,[650,654,659,663,667,671,676,680],{"type":41,"tag":148,"props":651,"children":652},{"style":155},[653],{"type":46,"value":613},{"type":41,"tag":148,"props":655,"children":656},{"style":616},[657],{"type":46,"value":658},".css",{"type":41,"tag":148,"props":660,"children":661},{"style":155},[662],{"type":46,"value":405},{"type":41,"tag":148,"props":664,"children":665},{"style":155},[666],{"type":46,"value":135},{"type":41,"tag":148,"props":668,"children":669},{"style":155},[670],{"type":46,"value":632},{"type":41,"tag":148,"props":672,"children":673},{"style":190},[674],{"type":46,"value":675},"text\u002Fcss",{"type":41,"tag":148,"props":677,"children":678},{"style":155},[679],{"type":46,"value":405},{"type":41,"tag":148,"props":681,"children":682},{"style":155},[683],{"type":46,"value":202},{"type":41,"tag":148,"props":685,"children":687},{"class":150,"line":686},10,[688,692,697,701,705,709,714,718],{"type":41,"tag":148,"props":689,"children":690},{"style":155},[691],{"type":46,"value":613},{"type":41,"tag":148,"props":693,"children":694},{"style":616},[695],{"type":46,"value":696},".js",{"type":41,"tag":148,"props":698,"children":699},{"style":155},[700],{"type":46,"value":405},{"type":41,"tag":148,"props":702,"children":703},{"style":155},[704],{"type":46,"value":135},{"type":41,"tag":148,"props":706,"children":707},{"style":155},[708],{"type":46,"value":632},{"type":41,"tag":148,"props":710,"children":711},{"style":190},[712],{"type":46,"value":713},"application\u002Fjavascript",{"type":41,"tag":148,"props":715,"children":716},{"style":155},[717],{"type":46,"value":405},{"type":41,"tag":148,"props":719,"children":720},{"style":155},[721],{"type":46,"value":202},{"type":41,"tag":148,"props":723,"children":725},{"class":150,"line":724},11,[726,730,735,739,743,747,752,756],{"type":41,"tag":148,"props":727,"children":728},{"style":155},[729],{"type":46,"value":613},{"type":41,"tag":148,"props":731,"children":732},{"style":616},[733],{"type":46,"value":734},".json",{"type":41,"tag":148,"props":736,"children":737},{"style":155},[738],{"type":46,"value":405},{"type":41,"tag":148,"props":740,"children":741},{"style":155},[742],{"type":46,"value":135},{"type":41,"tag":148,"props":744,"children":745},{"style":155},[746],{"type":46,"value":632},{"type":41,"tag":148,"props":748,"children":749},{"style":190},[750],{"type":46,"value":751},"application\u002Fjson",{"type":41,"tag":148,"props":753,"children":754},{"style":155},[755],{"type":46,"value":405},{"type":41,"tag":148,"props":757,"children":758},{"style":155},[759],{"type":46,"value":202},{"type":41,"tag":148,"props":761,"children":763},{"class":150,"line":762},12,[764,768,773,777,781,785,790,794],{"type":41,"tag":148,"props":765,"children":766},{"style":155},[767],{"type":46,"value":613},{"type":41,"tag":148,"props":769,"children":770},{"style":616},[771],{"type":46,"value":772},".png",{"type":41,"tag":148,"props":774,"children":775},{"style":155},[776],{"type":46,"value":405},{"type":41,"tag":148,"props":778,"children":779},{"style":155},[780],{"type":46,"value":135},{"type":41,"tag":148,"props":782,"children":783},{"style":155},[784],{"type":46,"value":632},{"type":41,"tag":148,"props":786,"children":787},{"style":190},[788],{"type":46,"value":789},"image\u002Fpng",{"type":41,"tag":148,"props":791,"children":792},{"style":155},[793],{"type":46,"value":405},{"type":41,"tag":148,"props":795,"children":796},{"style":155},[797],{"type":46,"value":202},{"type":41,"tag":148,"props":799,"children":801},{"class":150,"line":800},13,[802,806,811,815,819,823,828,832],{"type":41,"tag":148,"props":803,"children":804},{"style":155},[805],{"type":46,"value":613},{"type":41,"tag":148,"props":807,"children":808},{"style":616},[809],{"type":46,"value":810},".jpg",{"type":41,"tag":148,"props":812,"children":813},{"style":155},[814],{"type":46,"value":405},{"type":41,"tag":148,"props":816,"children":817},{"style":155},[818],{"type":46,"value":135},{"type":41,"tag":148,"props":820,"children":821},{"style":155},[822],{"type":46,"value":632},{"type":41,"tag":148,"props":824,"children":825},{"style":190},[826],{"type":46,"value":827},"image\u002Fjpeg",{"type":41,"tag":148,"props":829,"children":830},{"style":155},[831],{"type":46,"value":405},{"type":41,"tag":148,"props":833,"children":834},{"style":155},[835],{"type":46,"value":202},{"type":41,"tag":148,"props":837,"children":839},{"class":150,"line":838},14,[840,844,849,853,857,861,866,870],{"type":41,"tag":148,"props":841,"children":842},{"style":155},[843],{"type":46,"value":613},{"type":41,"tag":148,"props":845,"children":846},{"style":616},[847],{"type":46,"value":848},".svg",{"type":41,"tag":148,"props":850,"children":851},{"style":155},[852],{"type":46,"value":405},{"type":41,"tag":148,"props":854,"children":855},{"style":155},[856],{"type":46,"value":135},{"type":41,"tag":148,"props":858,"children":859},{"style":155},[860],{"type":46,"value":632},{"type":41,"tag":148,"props":862,"children":863},{"style":190},[864],{"type":46,"value":865},"image\u002Fsvg+xml",{"type":41,"tag":148,"props":867,"children":868},{"style":155},[869],{"type":46,"value":405},{"type":41,"tag":148,"props":871,"children":872},{"style":155},[873],{"type":46,"value":202},{"type":41,"tag":148,"props":875,"children":877},{"class":150,"line":876},15,[878],{"type":41,"tag":148,"props":879,"children":880},{"style":155},[881],{"type":46,"value":882},"};\n",{"type":41,"tag":148,"props":884,"children":886},{"class":150,"line":885},16,[887],{"type":41,"tag":148,"props":888,"children":889},{"emptyLinePlaceholder":520},[890],{"type":46,"value":523},{"type":41,"tag":148,"props":892,"children":894},{"class":150,"line":893},17,[895,899,904,908,913,917,922,926,931,935,941,946,951,955],{"type":41,"tag":148,"props":896,"children":897},{"style":170},[898],{"type":46,"value":378},{"type":41,"tag":148,"props":900,"children":901},{"style":381},[902],{"type":46,"value":903}," server ",{"type":41,"tag":148,"props":905,"children":906},{"style":155},[907],{"type":46,"value":389},{"type":41,"tag":148,"props":909,"children":910},{"style":381},[911],{"type":46,"value":912}," http",{"type":41,"tag":148,"props":914,"children":915},{"style":155},[916],{"type":46,"value":549},{"type":41,"tag":148,"props":918,"children":919},{"style":392},[920],{"type":46,"value":921},"createServer",{"type":41,"tag":148,"props":923,"children":924},{"style":381},[925],{"type":46,"value":400},{"type":41,"tag":148,"props":927,"children":928},{"style":170},[929],{"type":46,"value":930},"function",{"type":41,"tag":148,"props":932,"children":933},{"style":155},[934],{"type":46,"value":400},{"type":41,"tag":148,"props":936,"children":938},{"style":937},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[939],{"type":46,"value":940},"req",{"type":41,"tag":148,"props":942,"children":943},{"style":155},[944],{"type":46,"value":945},",",{"type":41,"tag":148,"props":947,"children":948},{"style":937},[949],{"type":46,"value":950}," res",{"type":41,"tag":148,"props":952,"children":953},{"style":155},[954],{"type":46,"value":419},{"type":41,"tag":148,"props":956,"children":957},{"style":155},[958],{"type":46,"value":292},{"type":41,"tag":148,"props":960,"children":962},{"class":150,"line":961},18,[963,968,973,978,982,986,990,995,1000,1004,1008,1013,1018,1022,1027,1031,1036,1040,1045,1049,1054,1059,1063,1067,1071],{"type":41,"tag":148,"props":964,"children":965},{"style":170},[966],{"type":46,"value":967},"  var",{"type":41,"tag":148,"props":969,"children":970},{"style":381},[971],{"type":46,"value":972}," filePath",{"type":41,"tag":148,"props":974,"children":975},{"style":155},[976],{"type":46,"value":977}," =",{"type":41,"tag":148,"props":979,"children":980},{"style":155},[981],{"type":46,"value":632},{"type":41,"tag":148,"props":983,"children":984},{"style":190},[985],{"type":46,"value":549},{"type":41,"tag":148,"props":987,"children":988},{"style":155},[989],{"type":46,"value":405},{"type":41,"tag":148,"props":991,"children":992},{"style":155},[993],{"type":46,"value":994}," +",{"type":41,"tag":148,"props":996,"children":997},{"style":616},[998],{"type":46,"value":999}," (",{"type":41,"tag":148,"props":1001,"children":1002},{"style":381},[1003],{"type":46,"value":940},{"type":41,"tag":148,"props":1005,"children":1006},{"style":155},[1007],{"type":46,"value":549},{"type":41,"tag":148,"props":1009,"children":1010},{"style":381},[1011],{"type":46,"value":1012},"url",{"type":41,"tag":148,"props":1014,"children":1015},{"style":155},[1016],{"type":46,"value":1017}," ===",{"type":41,"tag":148,"props":1019,"children":1020},{"style":155},[1021],{"type":46,"value":632},{"type":41,"tag":148,"props":1023,"children":1024},{"style":190},[1025],{"type":46,"value":1026},"\u002F",{"type":41,"tag":148,"props":1028,"children":1029},{"style":155},[1030],{"type":46,"value":405},{"type":41,"tag":148,"props":1032,"children":1033},{"style":155},[1034],{"type":46,"value":1035}," ?",{"type":41,"tag":148,"props":1037,"children":1038},{"style":155},[1039],{"type":46,"value":632},{"type":41,"tag":148,"props":1041,"children":1042},{"style":190},[1043],{"type":46,"value":1044},"\u002Findex.html",{"type":41,"tag":148,"props":1046,"children":1047},{"style":155},[1048],{"type":46,"value":405},{"type":41,"tag":148,"props":1050,"children":1051},{"style":155},[1052],{"type":46,"value":1053}," :",{"type":41,"tag":148,"props":1055,"children":1056},{"style":381},[1057],{"type":46,"value":1058}," req",{"type":41,"tag":148,"props":1060,"children":1061},{"style":155},[1062],{"type":46,"value":549},{"type":41,"tag":148,"props":1064,"children":1065},{"style":381},[1066],{"type":46,"value":1012},{"type":41,"tag":148,"props":1068,"children":1069},{"style":616},[1070],{"type":46,"value":419},{"type":41,"tag":148,"props":1072,"children":1073},{"style":155},[1074],{"type":46,"value":424},{"type":41,"tag":148,"props":1076,"children":1078},{"class":150,"line":1077},19,[1079,1083,1088,1092,1097,1101,1106,1110,1115,1119],{"type":41,"tag":148,"props":1080,"children":1081},{"style":170},[1082],{"type":46,"value":967},{"type":41,"tag":148,"props":1084,"children":1085},{"style":381},[1086],{"type":46,"value":1087}," ext",{"type":41,"tag":148,"props":1089,"children":1090},{"style":155},[1091],{"type":46,"value":977},{"type":41,"tag":148,"props":1093,"children":1094},{"style":381},[1095],{"type":46,"value":1096}," path",{"type":41,"tag":148,"props":1098,"children":1099},{"style":155},[1100],{"type":46,"value":549},{"type":41,"tag":148,"props":1102,"children":1103},{"style":392},[1104],{"type":46,"value":1105},"extname",{"type":41,"tag":148,"props":1107,"children":1108},{"style":616},[1109],{"type":46,"value":400},{"type":41,"tag":148,"props":1111,"children":1112},{"style":381},[1113],{"type":46,"value":1114},"filePath",{"type":41,"tag":148,"props":1116,"children":1117},{"style":616},[1118],{"type":46,"value":419},{"type":41,"tag":148,"props":1120,"children":1121},{"style":155},[1122],{"type":46,"value":424},{"type":41,"tag":148,"props":1124,"children":1126},{"class":150,"line":1125},20,[1127,1131,1136,1140,1145,1150,1155,1160,1164,1168,1173,1177],{"type":41,"tag":148,"props":1128,"children":1129},{"style":170},[1130],{"type":46,"value":967},{"type":41,"tag":148,"props":1132,"children":1133},{"style":381},[1134],{"type":46,"value":1135}," contentType",{"type":41,"tag":148,"props":1137,"children":1138},{"style":155},[1139],{"type":46,"value":977},{"type":41,"tag":148,"props":1141,"children":1142},{"style":381},[1143],{"type":46,"value":1144}," mimeTypes",{"type":41,"tag":148,"props":1146,"children":1147},{"style":616},[1148],{"type":46,"value":1149},"[",{"type":41,"tag":148,"props":1151,"children":1152},{"style":381},[1153],{"type":46,"value":1154},"ext",{"type":41,"tag":148,"props":1156,"children":1157},{"style":616},[1158],{"type":46,"value":1159},"] ",{"type":41,"tag":148,"props":1161,"children":1162},{"style":155},[1163],{"type":46,"value":568},{"type":41,"tag":148,"props":1165,"children":1166},{"style":155},[1167],{"type":46,"value":632},{"type":41,"tag":148,"props":1169,"children":1170},{"style":190},[1171],{"type":46,"value":1172},"application\u002Foctet-stream",{"type":41,"tag":148,"props":1174,"children":1175},{"style":155},[1176],{"type":46,"value":405},{"type":41,"tag":148,"props":1178,"children":1179},{"style":155},[1180],{"type":46,"value":424},{"type":41,"tag":148,"props":1182,"children":1184},{"class":150,"line":1183},21,[1185],{"type":41,"tag":148,"props":1186,"children":1187},{"emptyLinePlaceholder":520},[1188],{"type":46,"value":523},{"type":41,"tag":148,"props":1190,"children":1192},{"class":150,"line":1191},22,[1193,1198,1202,1207,1211,1215,1219,1224,1228,1233,1237,1242,1246],{"type":41,"tag":148,"props":1194,"children":1195},{"style":381},[1196],{"type":46,"value":1197},"  fs",{"type":41,"tag":148,"props":1199,"children":1200},{"style":155},[1201],{"type":46,"value":549},{"type":41,"tag":148,"props":1203,"children":1204},{"style":392},[1205],{"type":46,"value":1206},"readFile",{"type":41,"tag":148,"props":1208,"children":1209},{"style":616},[1210],{"type":46,"value":400},{"type":41,"tag":148,"props":1212,"children":1213},{"style":381},[1214],{"type":46,"value":1114},{"type":41,"tag":148,"props":1216,"children":1217},{"style":155},[1218],{"type":46,"value":945},{"type":41,"tag":148,"props":1220,"children":1221},{"style":170},[1222],{"type":46,"value":1223}," function",{"type":41,"tag":148,"props":1225,"children":1226},{"style":155},[1227],{"type":46,"value":400},{"type":41,"tag":148,"props":1229,"children":1230},{"style":937},[1231],{"type":46,"value":1232},"err",{"type":41,"tag":148,"props":1234,"children":1235},{"style":155},[1236],{"type":46,"value":945},{"type":41,"tag":148,"props":1238,"children":1239},{"style":937},[1240],{"type":46,"value":1241}," content",{"type":41,"tag":148,"props":1243,"children":1244},{"style":155},[1245],{"type":46,"value":419},{"type":41,"tag":148,"props":1247,"children":1248},{"style":155},[1249],{"type":46,"value":292},{"type":41,"tag":148,"props":1251,"children":1253},{"class":150,"line":1252},23,[1254,1260,1264,1268,1273],{"type":41,"tag":148,"props":1255,"children":1257},{"style":1256},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1258],{"type":46,"value":1259},"    if",{"type":41,"tag":148,"props":1261,"children":1262},{"style":616},[1263],{"type":46,"value":999},{"type":41,"tag":148,"props":1265,"children":1266},{"style":381},[1267],{"type":46,"value":1232},{"type":41,"tag":148,"props":1269,"children":1270},{"style":616},[1271],{"type":46,"value":1272},") ",{"type":41,"tag":148,"props":1274,"children":1275},{"style":155},[1276],{"type":46,"value":158},{"type":41,"tag":148,"props":1278,"children":1280},{"class":150,"line":1279},24,[1281,1286,1290,1295,1299,1304,1308,1313,1317,1322,1326,1330,1334,1338,1342,1347,1351],{"type":41,"tag":148,"props":1282,"children":1283},{"style":381},[1284],{"type":46,"value":1285},"      res",{"type":41,"tag":148,"props":1287,"children":1288},{"style":155},[1289],{"type":46,"value":549},{"type":41,"tag":148,"props":1291,"children":1292},{"style":392},[1293],{"type":46,"value":1294},"writeHead",{"type":41,"tag":148,"props":1296,"children":1297},{"style":616},[1298],{"type":46,"value":400},{"type":41,"tag":148,"props":1300,"children":1301},{"style":571},[1302],{"type":46,"value":1303},"404",{"type":41,"tag":148,"props":1305,"children":1306},{"style":155},[1307],{"type":46,"value":945},{"type":41,"tag":148,"props":1309,"children":1310},{"style":155},[1311],{"type":46,"value":1312}," {",{"type":41,"tag":148,"props":1314,"children":1315},{"style":155},[1316],{"type":46,"value":632},{"type":41,"tag":148,"props":1318,"children":1319},{"style":616},[1320],{"type":46,"value":1321},"Content-Type",{"type":41,"tag":148,"props":1323,"children":1324},{"style":155},[1325],{"type":46,"value":405},{"type":41,"tag":148,"props":1327,"children":1328},{"style":155},[1329],{"type":46,"value":135},{"type":41,"tag":148,"props":1331,"children":1332},{"style":155},[1333],{"type":46,"value":632},{"type":41,"tag":148,"props":1335,"children":1336},{"style":190},[1337],{"type":46,"value":637},{"type":41,"tag":148,"props":1339,"children":1340},{"style":155},[1341],{"type":46,"value":405},{"type":41,"tag":148,"props":1343,"children":1344},{"style":155},[1345],{"type":46,"value":1346}," }",{"type":41,"tag":148,"props":1348,"children":1349},{"style":616},[1350],{"type":46,"value":419},{"type":41,"tag":148,"props":1352,"children":1353},{"style":155},[1354],{"type":46,"value":424},{"type":41,"tag":148,"props":1356,"children":1358},{"class":150,"line":1357},25,[1359,1363,1367,1372,1376,1380,1385,1389,1393],{"type":41,"tag":148,"props":1360,"children":1361},{"style":381},[1362],{"type":46,"value":1285},{"type":41,"tag":148,"props":1364,"children":1365},{"style":155},[1366],{"type":46,"value":549},{"type":41,"tag":148,"props":1368,"children":1369},{"style":392},[1370],{"type":46,"value":1371},"end",{"type":41,"tag":148,"props":1373,"children":1374},{"style":616},[1375],{"type":46,"value":400},{"type":41,"tag":148,"props":1377,"children":1378},{"style":155},[1379],{"type":46,"value":405},{"type":41,"tag":148,"props":1381,"children":1382},{"style":190},[1383],{"type":46,"value":1384},"\u003Ch1>404 Not Found\u003C\u002Fh1>",{"type":41,"tag":148,"props":1386,"children":1387},{"style":155},[1388],{"type":46,"value":405},{"type":41,"tag":148,"props":1390,"children":1391},{"style":616},[1392],{"type":46,"value":419},{"type":41,"tag":148,"props":1394,"children":1395},{"style":155},[1396],{"type":46,"value":424},{"type":41,"tag":148,"props":1398,"children":1400},{"class":150,"line":1399},26,[1401,1406],{"type":41,"tag":148,"props":1402,"children":1403},{"style":1256},[1404],{"type":46,"value":1405},"      return",{"type":41,"tag":148,"props":1407,"children":1408},{"style":155},[1409],{"type":46,"value":424},{"type":41,"tag":148,"props":1411,"children":1413},{"class":150,"line":1412},27,[1414],{"type":41,"tag":148,"props":1415,"children":1416},{"style":155},[1417],{"type":46,"value":1418},"    }\n",{"type":41,"tag":148,"props":1420,"children":1422},{"class":150,"line":1421},28,[1423,1428,1432,1436,1440,1445,1449,1453,1457,1461,1465,1469,1473,1477,1481],{"type":41,"tag":148,"props":1424,"children":1425},{"style":381},[1426],{"type":46,"value":1427},"    res",{"type":41,"tag":148,"props":1429,"children":1430},{"style":155},[1431],{"type":46,"value":549},{"type":41,"tag":148,"props":1433,"children":1434},{"style":392},[1435],{"type":46,"value":1294},{"type":41,"tag":148,"props":1437,"children":1438},{"style":616},[1439],{"type":46,"value":400},{"type":41,"tag":148,"props":1441,"children":1442},{"style":571},[1443],{"type":46,"value":1444},"200",{"type":41,"tag":148,"props":1446,"children":1447},{"style":155},[1448],{"type":46,"value":945},{"type":41,"tag":148,"props":1450,"children":1451},{"style":155},[1452],{"type":46,"value":1312},{"type":41,"tag":148,"props":1454,"children":1455},{"style":155},[1456],{"type":46,"value":632},{"type":41,"tag":148,"props":1458,"children":1459},{"style":616},[1460],{"type":46,"value":1321},{"type":41,"tag":148,"props":1462,"children":1463},{"style":155},[1464],{"type":46,"value":405},{"type":41,"tag":148,"props":1466,"children":1467},{"style":155},[1468],{"type":46,"value":135},{"type":41,"tag":148,"props":1470,"children":1471},{"style":381},[1472],{"type":46,"value":1135},{"type":41,"tag":148,"props":1474,"children":1475},{"style":155},[1476],{"type":46,"value":1346},{"type":41,"tag":148,"props":1478,"children":1479},{"style":616},[1480],{"type":46,"value":419},{"type":41,"tag":148,"props":1482,"children":1483},{"style":155},[1484],{"type":46,"value":424},{"type":41,"tag":148,"props":1486,"children":1488},{"class":150,"line":1487},29,[1489,1493,1497,1501,1505,1510,1514],{"type":41,"tag":148,"props":1490,"children":1491},{"style":381},[1492],{"type":46,"value":1427},{"type":41,"tag":148,"props":1494,"children":1495},{"style":155},[1496],{"type":46,"value":549},{"type":41,"tag":148,"props":1498,"children":1499},{"style":392},[1500],{"type":46,"value":1371},{"type":41,"tag":148,"props":1502,"children":1503},{"style":616},[1504],{"type":46,"value":400},{"type":41,"tag":148,"props":1506,"children":1507},{"style":381},[1508],{"type":46,"value":1509},"content",{"type":41,"tag":148,"props":1511,"children":1512},{"style":616},[1513],{"type":46,"value":419},{"type":41,"tag":148,"props":1515,"children":1516},{"style":155},[1517],{"type":46,"value":424},{"type":41,"tag":148,"props":1519,"children":1521},{"class":150,"line":1520},30,[1522,1527,1531],{"type":41,"tag":148,"props":1523,"children":1524},{"style":155},[1525],{"type":46,"value":1526},"  }",{"type":41,"tag":148,"props":1528,"children":1529},{"style":616},[1530],{"type":46,"value":419},{"type":41,"tag":148,"props":1532,"children":1533},{"style":155},[1534],{"type":46,"value":424},{"type":41,"tag":148,"props":1536,"children":1538},{"class":150,"line":1537},31,[1539,1544,1548],{"type":41,"tag":148,"props":1540,"children":1541},{"style":155},[1542],{"type":46,"value":1543},"}",{"type":41,"tag":148,"props":1545,"children":1546},{"style":381},[1547],{"type":46,"value":419},{"type":41,"tag":148,"props":1549,"children":1550},{"style":155},[1551],{"type":46,"value":424},{"type":41,"tag":148,"props":1553,"children":1555},{"class":150,"line":1554},32,[1556],{"type":41,"tag":148,"props":1557,"children":1558},{"emptyLinePlaceholder":520},[1559],{"type":46,"value":523},{"type":41,"tag":148,"props":1561,"children":1562},{"class":150,"line":27},[1563,1568,1572,1577,1582,1586,1590,1595],{"type":41,"tag":148,"props":1564,"children":1565},{"style":381},[1566],{"type":46,"value":1567},"server",{"type":41,"tag":148,"props":1569,"children":1570},{"style":155},[1571],{"type":46,"value":549},{"type":41,"tag":148,"props":1573,"children":1574},{"style":392},[1575],{"type":46,"value":1576},"listen",{"type":41,"tag":148,"props":1578,"children":1579},{"style":381},[1580],{"type":46,"value":1581},"(PORT",{"type":41,"tag":148,"props":1583,"children":1584},{"style":155},[1585],{"type":46,"value":945},{"type":41,"tag":148,"props":1587,"children":1588},{"style":170},[1589],{"type":46,"value":1223},{"type":41,"tag":148,"props":1591,"children":1592},{"style":155},[1593],{"type":46,"value":1594},"()",{"type":41,"tag":148,"props":1596,"children":1597},{"style":155},[1598],{"type":46,"value":292},{"type":41,"tag":148,"props":1600,"children":1602},{"class":150,"line":1601},34,[1603,1608,1612,1617,1621,1625,1630,1634,1638,1643,1647],{"type":41,"tag":148,"props":1604,"children":1605},{"style":381},[1606],{"type":46,"value":1607},"  console",{"type":41,"tag":148,"props":1609,"children":1610},{"style":155},[1611],{"type":46,"value":549},{"type":41,"tag":148,"props":1613,"children":1614},{"style":392},[1615],{"type":46,"value":1616},"log",{"type":41,"tag":148,"props":1618,"children":1619},{"style":616},[1620],{"type":46,"value":400},{"type":41,"tag":148,"props":1622,"children":1623},{"style":155},[1624],{"type":46,"value":405},{"type":41,"tag":148,"props":1626,"children":1627},{"style":190},[1628],{"type":46,"value":1629},"Server running at http:\u002F\u002Flocalhost:",{"type":41,"tag":148,"props":1631,"children":1632},{"style":155},[1633],{"type":46,"value":405},{"type":41,"tag":148,"props":1635,"children":1636},{"style":155},[1637],{"type":46,"value":994},{"type":41,"tag":148,"props":1639,"children":1640},{"style":381},[1641],{"type":46,"value":1642}," PORT",{"type":41,"tag":148,"props":1644,"children":1645},{"style":616},[1646],{"type":46,"value":419},{"type":41,"tag":148,"props":1648,"children":1649},{"style":155},[1650],{"type":46,"value":424},{"type":41,"tag":148,"props":1652,"children":1654},{"class":150,"line":1653},35,[1655,1659,1663],{"type":41,"tag":148,"props":1656,"children":1657},{"style":155},[1658],{"type":46,"value":1543},{"type":41,"tag":148,"props":1660,"children":1661},{"style":381},[1662],{"type":46,"value":419},{"type":41,"tag":148,"props":1664,"children":1665},{"style":155},[1666],{"type":46,"value":424},{"type":41,"tag":49,"props":1668,"children":1669},{},[1670],{"type":41,"tag":58,"props":1671,"children":1672},{},[1673,1679],{"type":41,"tag":66,"props":1674,"children":1676},{"className":1675},[],[1677],{"type":46,"value":1678},"vercel.json",{"type":46,"value":135},{"type":41,"tag":137,"props":1681,"children":1683},{"className":139,"code":1682,"language":141,"meta":142,"style":142},"{\n  \"rewrites\": [\n    { \"source\": \"\u002F(.*)\", \"destination\": \"\u002F$1\" }\n  ]\n}\n",[1684],{"type":41,"tag":66,"props":1685,"children":1686},{"__ignoreMap":142},[1687,1694,1719,1796,1804],{"type":41,"tag":148,"props":1688,"children":1689},{"class":150,"line":151},[1690],{"type":41,"tag":148,"props":1691,"children":1692},{"style":155},[1693],{"type":46,"value":158},{"type":41,"tag":148,"props":1695,"children":1696},{"class":150,"line":161},[1697,1701,1706,1710,1714],{"type":41,"tag":148,"props":1698,"children":1699},{"style":155},[1700],{"type":46,"value":167},{"type":41,"tag":148,"props":1702,"children":1703},{"style":170},[1704],{"type":46,"value":1705},"rewrites",{"type":41,"tag":148,"props":1707,"children":1708},{"style":155},[1709],{"type":46,"value":178},{"type":41,"tag":148,"props":1711,"children":1712},{"style":155},[1713],{"type":46,"value":135},{"type":41,"tag":148,"props":1715,"children":1716},{"style":155},[1717],{"type":46,"value":1718}," [\n",{"type":41,"tag":148,"props":1720,"children":1721},{"class":150,"line":205},[1722,1727,1731,1736,1740,1744,1748,1753,1757,1761,1765,1770,1774,1778,1782,1787,1791],{"type":41,"tag":148,"props":1723,"children":1724},{"style":155},[1725],{"type":46,"value":1726},"    {",{"type":41,"tag":148,"props":1728,"children":1729},{"style":155},[1730],{"type":46,"value":187},{"type":41,"tag":148,"props":1732,"children":1733},{"style":304},[1734],{"type":46,"value":1735},"source",{"type":41,"tag":148,"props":1737,"children":1738},{"style":155},[1739],{"type":46,"value":178},{"type":41,"tag":148,"props":1741,"children":1742},{"style":155},[1743],{"type":46,"value":135},{"type":41,"tag":148,"props":1745,"children":1746},{"style":155},[1747],{"type":46,"value":187},{"type":41,"tag":148,"props":1749,"children":1750},{"style":190},[1751],{"type":46,"value":1752},"\u002F(.*)",{"type":41,"tag":148,"props":1754,"children":1755},{"style":155},[1756],{"type":46,"value":178},{"type":41,"tag":148,"props":1758,"children":1759},{"style":155},[1760],{"type":46,"value":945},{"type":41,"tag":148,"props":1762,"children":1763},{"style":155},[1764],{"type":46,"value":187},{"type":41,"tag":148,"props":1766,"children":1767},{"style":304},[1768],{"type":46,"value":1769},"destination",{"type":41,"tag":148,"props":1771,"children":1772},{"style":155},[1773],{"type":46,"value":178},{"type":41,"tag":148,"props":1775,"children":1776},{"style":155},[1777],{"type":46,"value":135},{"type":41,"tag":148,"props":1779,"children":1780},{"style":155},[1781],{"type":46,"value":187},{"type":41,"tag":148,"props":1783,"children":1784},{"style":190},[1785],{"type":46,"value":1786},"\u002F$1",{"type":41,"tag":148,"props":1788,"children":1789},{"style":155},[1790],{"type":46,"value":178},{"type":41,"tag":148,"props":1792,"children":1793},{"style":155},[1794],{"type":46,"value":1795}," }\n",{"type":41,"tag":148,"props":1797,"children":1798},{"class":150,"line":243},[1799],{"type":41,"tag":148,"props":1800,"children":1801},{"style":155},[1802],{"type":46,"value":1803},"  ]\n",{"type":41,"tag":148,"props":1805,"children":1806},{"class":150,"line":269},[1807],{"type":41,"tag":148,"props":1808,"children":1809},{"style":155},[1810],{"type":46,"value":347},{"type":41,"tag":49,"props":1812,"children":1813},{},[1814],{"type":46,"value":1815},"If a server already exists, verify Vercel compatibility:",{"type":41,"tag":1817,"props":1818,"children":1819},"ul",{},[1820,1834,1844,1849],{"type":41,"tag":1821,"props":1822,"children":1823},"li",{},[1824,1826,1832],{"type":46,"value":1825},"Port must use ",{"type":41,"tag":66,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":46,"value":1831},"process.env.PORT || 3000",{"type":46,"value":1833}," (not hard-coded)",{"type":41,"tag":1821,"props":1835,"children":1836},{},[1837,1842],{"type":41,"tag":66,"props":1838,"children":1840},{"className":1839},[],[1841],{"type":46,"value":1678},{"type":46,"value":1843}," must exist with rewrites config",{"type":41,"tag":1821,"props":1845,"children":1846},{},[1847],{"type":46,"value":1848},"Server must only serve static files (no Express routes or SSR)",{"type":41,"tag":1821,"props":1850,"children":1851},{},[1852,1857,1859,1864],{"type":41,"tag":66,"props":1853,"children":1855},{"className":1854},[],[1856],{"type":46,"value":133},{"type":46,"value":1858}," must have a ",{"type":41,"tag":66,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":46,"value":307},{"type":46,"value":1865}," script",{"type":41,"tag":111,"props":1867,"children":1869},{"id":1868},"_2-existing-webapp",[1870],{"type":46,"value":1871},"2. Existing Webapp",{"type":41,"tag":1817,"props":1873,"children":1874},{},[1875],{"type":41,"tag":1821,"props":1876,"children":1877},{},[1878,1880,1886,1888,1894],{"type":46,"value":1879},"Existing webapp with ",{"type":41,"tag":66,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":46,"value":1885},"index.html",{"type":46,"value":1887}," (created via ",{"type":41,"tag":66,"props":1889,"children":1891},{"className":1890},[],[1892],{"type":46,"value":1893},"\u002Fcreate-webapp",{"type":46,"value":1895}," or manually)",{"type":41,"tag":93,"props":1897,"children":1899},{"id":1898},"steps",[1900],{"type":46,"value":1901},"Steps",{"type":41,"tag":111,"props":1903,"children":1905},{"id":1904},"_0-verify-vercel-setup",[1906],{"type":46,"value":1907},"0. Verify Vercel Setup",{"type":41,"tag":49,"props":1909,"children":1910},{},[1911,1913,1919],{"type":46,"value":1912},"Run ",{"type":41,"tag":66,"props":1914,"children":1916},{"className":1915},[],[1917],{"type":46,"value":1918},"vercel whoami",{"type":46,"value":1920}," to detect the user's current state, then branch:",{"type":41,"tag":49,"props":1922,"children":1923},{},[1924,1929,1931,1936],{"type":41,"tag":58,"props":1925,"children":1926},{},[1927],{"type":46,"value":1928},"a. Authenticated",{"type":46,"value":1930}," — ",{"type":41,"tag":66,"props":1932,"children":1934},{"className":1933},[],[1935],{"type":46,"value":1918},{"type":46,"value":1937}," returns a username. Skip to Step 0.5.",{"type":41,"tag":49,"props":1939,"children":1940},{},[1941,1946,1948,1954],{"type":41,"tag":58,"props":1942,"children":1943},{},[1944],{"type":46,"value":1945},"b. CLI not installed",{"type":46,"value":1947}," — command returns ",{"type":41,"tag":66,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":46,"value":1953},"vercel: command not found",{"type":46,"value":1955}," (or similar). Tell the user:",{"type":41,"tag":1957,"props":1958,"children":1959},"blockquote",{},[1960,1975,1980],{"type":41,"tag":49,"props":1961,"children":1962},{},[1963,1965,1973],{"type":46,"value":1964},"Publishing to Meta Display Glasses needs a public HTTPS URL. I can set this up for you via Vercel — it's free and takes a couple of minutes. You'll need to create a Vercel account at ",{"type":41,"tag":1966,"props":1967,"children":1971},"a",{"href":1968,"rel":1969},"https:\u002F\u002Fvercel.com\u002Fsignup",[1970],"nofollow",[1972],{"type":46,"value":1968},{"type":46,"value":1974}," (free tier is fine), and then I'll handle installing the CLI and walking you through the rest.",{"type":41,"tag":49,"props":1976,"children":1977},{},[1978],{"type":46,"value":1979},"If you'd rather host this yourself on any HTTPS server, you can skip this skill entirely.",{"type":41,"tag":49,"props":1981,"children":1982},{},[1983],{"type":46,"value":1984},"Want me to proceed with Vercel?",{"type":41,"tag":49,"props":1986,"children":1987},{},[1988,1990,1996],{"type":46,"value":1989},"If yes, wait for the user to confirm they've created the Vercel account, then run ",{"type":41,"tag":66,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":46,"value":1995},"npm i -g vercel",{"type":46,"value":1997}," yourself. After install completes, proceed to the login branch below.",{"type":41,"tag":49,"props":1999,"children":2000},{},[2001,2006,2008,2013],{"type":41,"tag":58,"props":2002,"children":2003},{},[2004],{"type":46,"value":2005},"c. Not logged in",{"type":46,"value":2007}," — CLI is installed but ",{"type":41,"tag":66,"props":2009,"children":2011},{"className":2010},[],[2012],{"type":46,"value":1918},{"type":46,"value":2014}," returns an auth error. Tell the user:",{"type":41,"tag":1957,"props":2016,"children":2017},{},[2018],{"type":41,"tag":49,"props":2019,"children":2020},{},[2021,2023,2029,2031,2037],{"type":46,"value":2022},"Vercel CLI is installed but not logged in. ",{"type":41,"tag":66,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":46,"value":2028},"vercel login",{"type":46,"value":2030}," is interactive and needs your input — please type ",{"type":41,"tag":66,"props":2032,"children":2034},{"className":2033},[],[2035],{"type":46,"value":2036},"! vercel login",{"type":46,"value":2038}," in this prompt to run it in this session.",{"type":41,"tag":49,"props":2040,"children":2041},{},[2042,2044,2049],{"type":46,"value":2043},"After they complete login, re-run ",{"type":41,"tag":66,"props":2045,"children":2047},{"className":2046},[],[2048],{"type":46,"value":1918},{"type":46,"value":2050}," to confirm. Only proceed once it returns a valid user.",{"type":41,"tag":111,"props":2052,"children":2054},{"id":2053},"_05-detect-and-offer-to-disable-existing-passcode",[2055],{"type":46,"value":2056},"0.5. Detect and Offer to Disable Existing Passcode",{"type":41,"tag":49,"props":2058,"children":2059},{},[2060,2062,2068,2070,2075],{"type":46,"value":2061},"If ",{"type":41,"tag":66,"props":2063,"children":2065},{"className":2064},[],[2066],{"type":46,"value":2067},"lock.html",{"type":46,"value":2069}," exists in the app directory, the app was previously gated by ",{"type":41,"tag":66,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":46,"value":71},{"type":46,"value":2076},"'s passcode lock. Production releases shouldn't require visitors to enter a passcode, so ask the user:",{"type":41,"tag":1957,"props":2078,"children":2079},{},[2080,2092],{"type":41,"tag":49,"props":2081,"children":2082},{},[2083,2085,2090],{"type":46,"value":2084},"This app has a passcode lock screen from ",{"type":41,"tag":66,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":46,"value":71},{"type":46,"value":2091},". For a public production release, do you want to disable it? (default: yes)",{"type":41,"tag":49,"props":2093,"children":2094},{},[2095,2097,2102,2104,2110,2112,2118],{"type":46,"value":2096},"I'll only disable the routing — ",{"type":41,"tag":66,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":46,"value":2067},{"type":46,"value":2103},", ",{"type":41,"tag":66,"props":2105,"children":2107},{"className":2106},[],[2108],{"type":46,"value":2109},"lock.css",{"type":46,"value":2111},", and ",{"type":41,"tag":66,"props":2113,"children":2115},{"className":2114},[],[2116],{"type":46,"value":2117},"lock.js",{"type":46,"value":2119}," will stay in the directory in case you re-test later.",{"type":41,"tag":49,"props":2121,"children":2122},{},[2123,2125,2130,2131,2136,2137,2142],{"type":46,"value":2124},"If yes, revert only the routing wiring (leave ",{"type":41,"tag":66,"props":2126,"children":2128},{"className":2127},[],[2129],{"type":46,"value":2067},{"type":46,"value":1026},{"type":41,"tag":66,"props":2132,"children":2134},{"className":2133},[],[2135],{"type":46,"value":2109},{"type":46,"value":1026},{"type":41,"tag":66,"props":2138,"children":2140},{"className":2139},[],[2141],{"type":46,"value":2117},{"type":46,"value":2143}," files in place):",{"type":41,"tag":2145,"props":2146,"children":2147},"ol",{},[2148,2388,2409],{"type":41,"tag":1821,"props":2149,"children":2150},{},[2151,2159,2161,2166,2168],{"type":41,"tag":58,"props":2152,"children":2153},{},[2154],{"type":41,"tag":66,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":46,"value":359},{"type":46,"value":2160}," — change the root path back to serve ",{"type":41,"tag":66,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":46,"value":1885},{"type":46,"value":2167},":\n",{"type":41,"tag":137,"props":2169,"children":2171},{"className":364,"code":2170,"language":366,"meta":142,"style":142},"\u002F\u002F Find this:\nvar filePath = '.' + (req.url === '\u002F' ? '\u002Flock.html' : req.url);\n\u002F\u002F Replace with:\nvar filePath = '.' + (req.url === '\u002F' ? '\u002Findex.html' : req.url);\n",[2172],{"type":41,"tag":66,"props":2173,"children":2174},{"__ignoreMap":142},[2175,2184,2285,2293],{"type":41,"tag":148,"props":2176,"children":2177},{"class":150,"line":151},[2178],{"type":41,"tag":148,"props":2179,"children":2181},{"style":2180},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[2182],{"type":46,"value":2183},"\u002F\u002F Find this:\n",{"type":41,"tag":148,"props":2185,"children":2186},{"class":150,"line":161},[2187,2191,2196,2200,2204,2208,2212,2216,2221,2225,2230,2235,2239,2243,2247,2251,2255,2260,2264,2268,2272,2276,2281],{"type":41,"tag":148,"props":2188,"children":2189},{"style":170},[2190],{"type":46,"value":378},{"type":41,"tag":148,"props":2192,"children":2193},{"style":381},[2194],{"type":46,"value":2195}," filePath ",{"type":41,"tag":148,"props":2197,"children":2198},{"style":155},[2199],{"type":46,"value":389},{"type":41,"tag":148,"props":2201,"children":2202},{"style":155},[2203],{"type":46,"value":632},{"type":41,"tag":148,"props":2205,"children":2206},{"style":190},[2207],{"type":46,"value":549},{"type":41,"tag":148,"props":2209,"children":2210},{"style":155},[2211],{"type":46,"value":405},{"type":41,"tag":148,"props":2213,"children":2214},{"style":155},[2215],{"type":46,"value":994},{"type":41,"tag":148,"props":2217,"children":2218},{"style":381},[2219],{"type":46,"value":2220}," (req",{"type":41,"tag":148,"props":2222,"children":2223},{"style":155},[2224],{"type":46,"value":549},{"type":41,"tag":148,"props":2226,"children":2227},{"style":381},[2228],{"type":46,"value":2229},"url ",{"type":41,"tag":148,"props":2231,"children":2232},{"style":155},[2233],{"type":46,"value":2234},"===",{"type":41,"tag":148,"props":2236,"children":2237},{"style":155},[2238],{"type":46,"value":632},{"type":41,"tag":148,"props":2240,"children":2241},{"style":190},[2242],{"type":46,"value":1026},{"type":41,"tag":148,"props":2244,"children":2245},{"style":155},[2246],{"type":46,"value":405},{"type":41,"tag":148,"props":2248,"children":2249},{"style":155},[2250],{"type":46,"value":1035},{"type":41,"tag":148,"props":2252,"children":2253},{"style":155},[2254],{"type":46,"value":632},{"type":41,"tag":148,"props":2256,"children":2257},{"style":190},[2258],{"type":46,"value":2259},"\u002Flock.html",{"type":41,"tag":148,"props":2261,"children":2262},{"style":155},[2263],{"type":46,"value":405},{"type":41,"tag":148,"props":2265,"children":2266},{"style":155},[2267],{"type":46,"value":1053},{"type":41,"tag":148,"props":2269,"children":2270},{"style":381},[2271],{"type":46,"value":1058},{"type":41,"tag":148,"props":2273,"children":2274},{"style":155},[2275],{"type":46,"value":549},{"type":41,"tag":148,"props":2277,"children":2278},{"style":381},[2279],{"type":46,"value":2280},"url)",{"type":41,"tag":148,"props":2282,"children":2283},{"style":155},[2284],{"type":46,"value":424},{"type":41,"tag":148,"props":2286,"children":2287},{"class":150,"line":205},[2288],{"type":41,"tag":148,"props":2289,"children":2290},{"style":2180},[2291],{"type":46,"value":2292},"\u002F\u002F Replace with:\n",{"type":41,"tag":148,"props":2294,"children":2295},{"class":150,"line":243},[2296,2300,2304,2308,2312,2316,2320,2324,2328,2332,2336,2340,2344,2348,2352,2356,2360,2364,2368,2372,2376,2380,2384],{"type":41,"tag":148,"props":2297,"children":2298},{"style":170},[2299],{"type":46,"value":378},{"type":41,"tag":148,"props":2301,"children":2302},{"style":381},[2303],{"type":46,"value":2195},{"type":41,"tag":148,"props":2305,"children":2306},{"style":155},[2307],{"type":46,"value":389},{"type":41,"tag":148,"props":2309,"children":2310},{"style":155},[2311],{"type":46,"value":632},{"type":41,"tag":148,"props":2313,"children":2314},{"style":190},[2315],{"type":46,"value":549},{"type":41,"tag":148,"props":2317,"children":2318},{"style":155},[2319],{"type":46,"value":405},{"type":41,"tag":148,"props":2321,"children":2322},{"style":155},[2323],{"type":46,"value":994},{"type":41,"tag":148,"props":2325,"children":2326},{"style":381},[2327],{"type":46,"value":2220},{"type":41,"tag":148,"props":2329,"children":2330},{"style":155},[2331],{"type":46,"value":549},{"type":41,"tag":148,"props":2333,"children":2334},{"style":381},[2335],{"type":46,"value":2229},{"type":41,"tag":148,"props":2337,"children":2338},{"style":155},[2339],{"type":46,"value":2234},{"type":41,"tag":148,"props":2341,"children":2342},{"style":155},[2343],{"type":46,"value":632},{"type":41,"tag":148,"props":2345,"children":2346},{"style":190},[2347],{"type":46,"value":1026},{"type":41,"tag":148,"props":2349,"children":2350},{"style":155},[2351],{"type":46,"value":405},{"type":41,"tag":148,"props":2353,"children":2354},{"style":155},[2355],{"type":46,"value":1035},{"type":41,"tag":148,"props":2357,"children":2358},{"style":155},[2359],{"type":46,"value":632},{"type":41,"tag":148,"props":2361,"children":2362},{"style":190},[2363],{"type":46,"value":1044},{"type":41,"tag":148,"props":2365,"children":2366},{"style":155},[2367],{"type":46,"value":405},{"type":41,"tag":148,"props":2369,"children":2370},{"style":155},[2371],{"type":46,"value":1053},{"type":41,"tag":148,"props":2373,"children":2374},{"style":381},[2375],{"type":46,"value":1058},{"type":41,"tag":148,"props":2377,"children":2378},{"style":155},[2379],{"type":46,"value":549},{"type":41,"tag":148,"props":2381,"children":2382},{"style":381},[2383],{"type":46,"value":2280},{"type":41,"tag":148,"props":2385,"children":2386},{"style":155},[2387],{"type":46,"value":424},{"type":41,"tag":1821,"props":2389,"children":2390},{},[2391,2399,2401,2407],{"type":41,"tag":58,"props":2392,"children":2393},{},[2394],{"type":41,"tag":66,"props":2395,"children":2397},{"className":2396},[],[2398],{"type":46,"value":1678},{"type":46,"value":2400}," — remove the ",{"type":41,"tag":66,"props":2402,"children":2404},{"className":2403},[],[2405],{"type":46,"value":2406},"{ \"source\": \"\u002F\", \"destination\": \"\u002Flock.html\" }",{"type":46,"value":2408}," rewrite. Keep the catch-all.",{"type":41,"tag":1821,"props":2410,"children":2411},{},[2412,2420,2422,2428,2430,2436,2438,2444,2446,2451],{"type":41,"tag":58,"props":2413,"children":2414},{},[2415],{"type":41,"tag":66,"props":2416,"children":2418},{"className":2417},[],[2419],{"type":46,"value":1885},{"type":46,"value":2421}," — remove the inline ",{"type":41,"tag":66,"props":2423,"children":2425},{"className":2424},[],[2426],{"type":46,"value":2427},"localStorage",{"type":46,"value":2429}," guard ",{"type":41,"tag":66,"props":2431,"children":2433},{"className":2432},[],[2434],{"type":46,"value":2435},"\u003Cscript>",{"type":46,"value":2437}," from ",{"type":41,"tag":66,"props":2439,"children":2441},{"className":2440},[],[2442],{"type":46,"value":2443},"\u003Chead>",{"type":46,"value":2445}," (the one that redirects to ",{"type":41,"tag":66,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":46,"value":2067},{"type":46,"value":2452}," when the storage key is unset).",{"type":41,"tag":49,"props":2454,"children":2455},{},[2456],{"type":46,"value":2457},"If the user says no, leave everything in place — the production URL will continue to gate visitors with the passcode.",{"type":41,"tag":49,"props":2459,"children":2460},{},[2461,2462,2467,2469,2474],{"type":46,"value":2061},{"type":41,"tag":66,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":46,"value":2067},{"type":46,"value":2468}," does not exist, skip this step. Do ",{"type":41,"tag":58,"props":2470,"children":2471},{},[2472],{"type":46,"value":2473},"not",{"type":46,"value":2475}," proactively add a passcode lock during publish.",{"type":41,"tag":111,"props":2477,"children":2479},{"id":2478},"_1-ensure-no-github-repo-is-linked",[2480],{"type":46,"value":2481},"1. Ensure No GitHub Repo Is Linked",{"type":41,"tag":49,"props":2483,"children":2484},{},[2485],{"type":46,"value":2486},"This workflow pushes code directly from local to Vercel — no GitHub repo needed.",{"type":41,"tag":49,"props":2488,"children":2489},{},[2490],{"type":46,"value":2491},"If a Vercel project was previously linked to GitHub, disconnect it:",{"type":41,"tag":137,"props":2493,"children":2497},{"className":2494,"code":2495,"language":2496,"meta":142,"style":142},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","vercel git disconnect --yes\n","bash",[2498],{"type":41,"tag":66,"props":2499,"children":2500},{"__ignoreMap":142},[2501],{"type":41,"tag":148,"props":2502,"children":2503},{"class":150,"line":151},[2504,2508,2513,2518],{"type":41,"tag":148,"props":2505,"children":2506},{"style":304},[2507],{"type":46,"value":15},{"type":41,"tag":148,"props":2509,"children":2510},{"style":190},[2511],{"type":46,"value":2512}," git",{"type":41,"tag":148,"props":2514,"children":2515},{"style":190},[2516],{"type":46,"value":2517}," disconnect",{"type":41,"tag":148,"props":2519,"children":2520},{"style":190},[2521],{"type":46,"value":2522}," --yes\n",{"type":41,"tag":111,"props":2524,"children":2526},{"id":2525},"_2-create-vercel-project-and-publish",[2527],{"type":46,"value":2528},"2. Create Vercel Project and Publish",{"type":41,"tag":49,"props":2530,"children":2531},{},[2532],{"type":46,"value":2533},"For a first-time publish, run from the app directory:",{"type":41,"tag":137,"props":2535,"children":2537},{"className":2494,"code":2536,"language":2496,"meta":142,"style":142},"vercel --yes --prod\n",[2538],{"type":41,"tag":66,"props":2539,"children":2540},{"__ignoreMap":142},[2541],{"type":41,"tag":148,"props":2542,"children":2543},{"class":150,"line":151},[2544,2548,2553],{"type":41,"tag":148,"props":2545,"children":2546},{"style":304},[2547],{"type":46,"value":15},{"type":41,"tag":148,"props":2549,"children":2550},{"style":190},[2551],{"type":46,"value":2552}," --yes",{"type":41,"tag":148,"props":2554,"children":2555},{"style":190},[2556],{"type":46,"value":2557}," --prod\n",{"type":41,"tag":49,"props":2559,"children":2560},{},[2561],{"type":46,"value":2562},"This will:",{"type":41,"tag":2145,"props":2564,"children":2565},{},[2566,2571,2576,2581],{"type":41,"tag":1821,"props":2567,"children":2568},{},[2569],{"type":46,"value":2570},"Create a new Vercel project (auto-named from directory)",{"type":41,"tag":1821,"props":2572,"children":2573},{},[2574],{"type":46,"value":2575},"Upload all files directly",{"type":41,"tag":1821,"props":2577,"children":2578},{},[2579],{"type":46,"value":2580},"Build and deploy to production",{"type":41,"tag":1821,"props":2582,"children":2583},{},[2584],{"type":46,"value":2585},"Output the live HTTPS URL",{"type":41,"tag":49,"props":2587,"children":2588},{},[2589,2591,2597,2599,2605],{"type":46,"value":2590},"The project will be linked locally via a ",{"type":41,"tag":66,"props":2592,"children":2594},{"className":2593},[],[2595],{"type":46,"value":2596},".vercel\u002F",{"type":46,"value":2598}," directory (auto-added to ",{"type":41,"tag":66,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":46,"value":2604},".gitignore",{"type":46,"value":2606},").",{"type":41,"tag":111,"props":2608,"children":2610},{"id":2609},"_3-disable-deployment-protection",[2611],{"type":46,"value":2612},"3. Disable Deployment Protection",{"type":41,"tag":49,"props":2614,"children":2615},{},[2616],{"type":46,"value":2617},"Immediately after the first deploy, disable Vercel Authentication so the glasses browser can access the URL without login:",{"type":41,"tag":137,"props":2619,"children":2621},{"className":2494,"code":2620,"language":2496,"meta":142,"style":142},"PROJECT_ID=$(python3 -c \"import json; print(json.load(open('.vercel\u002Fproject.json'))['projectId'])\")\necho '{\"ssoProtection\":null}' | vercel api \"\u002Fv9\u002Fprojects\u002F$PROJECT_ID\" -X PATCH --input - --silent\n",[2622],{"type":41,"tag":66,"props":2623,"children":2624},{"__ignoreMap":142},[2625,2666],{"type":41,"tag":148,"props":2626,"children":2627},{"class":150,"line":151},[2628,2633,2638,2643,2648,2652,2657,2661],{"type":41,"tag":148,"props":2629,"children":2630},{"style":381},[2631],{"type":46,"value":2632},"PROJECT_ID",{"type":41,"tag":148,"props":2634,"children":2635},{"style":155},[2636],{"type":46,"value":2637},"=$(",{"type":41,"tag":148,"props":2639,"children":2640},{"style":304},[2641],{"type":46,"value":2642},"python3",{"type":41,"tag":148,"props":2644,"children":2645},{"style":190},[2646],{"type":46,"value":2647}," -c",{"type":41,"tag":148,"props":2649,"children":2650},{"style":155},[2651],{"type":46,"value":187},{"type":41,"tag":148,"props":2653,"children":2654},{"style":190},[2655],{"type":46,"value":2656},"import json; print(json.load(open('.vercel\u002Fproject.json'))['projectId'])",{"type":41,"tag":148,"props":2658,"children":2659},{"style":155},[2660],{"type":46,"value":178},{"type":41,"tag":148,"props":2662,"children":2663},{"style":155},[2664],{"type":46,"value":2665},")\n",{"type":41,"tag":148,"props":2667,"children":2668},{"class":150,"line":161},[2669,2674,2678,2683,2687,2692,2697,2702,2706,2711,2716,2720,2725,2730,2735,2740],{"type":41,"tag":148,"props":2670,"children":2671},{"style":392},[2672],{"type":46,"value":2673},"echo",{"type":41,"tag":148,"props":2675,"children":2676},{"style":155},[2677],{"type":46,"value":632},{"type":41,"tag":148,"props":2679,"children":2680},{"style":190},[2681],{"type":46,"value":2682},"{\"ssoProtection\":null}",{"type":41,"tag":148,"props":2684,"children":2685},{"style":155},[2686],{"type":46,"value":405},{"type":41,"tag":148,"props":2688,"children":2689},{"style":155},[2690],{"type":46,"value":2691}," |",{"type":41,"tag":148,"props":2693,"children":2694},{"style":304},[2695],{"type":46,"value":2696}," vercel",{"type":41,"tag":148,"props":2698,"children":2699},{"style":190},[2700],{"type":46,"value":2701}," api",{"type":41,"tag":148,"props":2703,"children":2704},{"style":155},[2705],{"type":46,"value":187},{"type":41,"tag":148,"props":2707,"children":2708},{"style":190},[2709],{"type":46,"value":2710},"\u002Fv9\u002Fprojects\u002F",{"type":41,"tag":148,"props":2712,"children":2713},{"style":381},[2714],{"type":46,"value":2715},"$PROJECT_ID",{"type":41,"tag":148,"props":2717,"children":2718},{"style":155},[2719],{"type":46,"value":178},{"type":41,"tag":148,"props":2721,"children":2722},{"style":190},[2723],{"type":46,"value":2724}," -X",{"type":41,"tag":148,"props":2726,"children":2727},{"style":190},[2728],{"type":46,"value":2729}," PATCH",{"type":41,"tag":148,"props":2731,"children":2732},{"style":190},[2733],{"type":46,"value":2734}," --input",{"type":41,"tag":148,"props":2736,"children":2737},{"style":190},[2738],{"type":46,"value":2739}," -",{"type":41,"tag":148,"props":2741,"children":2742},{"style":190},[2743],{"type":46,"value":2744}," --silent\n",{"type":41,"tag":1957,"props":2746,"children":2747},{},[2748],{"type":41,"tag":49,"props":2749,"children":2750},{},[2751],{"type":46,"value":2752},"This is safe to run on every deploy — it's a no-op if already disabled.",{"type":41,"tag":111,"props":2754,"children":2756},{"id":2755},"_4-alias-to-a-stable-production-url",[2757],{"type":46,"value":2758},"4. Alias to a Stable Production URL",{"type":41,"tag":49,"props":2760,"children":2761},{},[2762,2764,2770],{"type":46,"value":2763},"After deploying, alias the deployment to a predictable ",{"type":41,"tag":66,"props":2765,"children":2767},{"className":2766},[],[2768],{"type":46,"value":2769},"\u003Cproject-name>",{"type":46,"value":2771}," URL:",{"type":41,"tag":137,"props":2773,"children":2775},{"className":2494,"code":2774,"language":2496,"meta":142,"style":142},"URL=$(vercel --prod)\nvercel alias set \"$URL\" \u003Cproject-name>.vercel.app\n",[2776],{"type":41,"tag":66,"props":2777,"children":2778},{"__ignoreMap":142},[2779,2804],{"type":41,"tag":148,"props":2780,"children":2781},{"class":150,"line":151},[2782,2787,2791,2795,2800],{"type":41,"tag":148,"props":2783,"children":2784},{"style":381},[2785],{"type":46,"value":2786},"URL",{"type":41,"tag":148,"props":2788,"children":2789},{"style":155},[2790],{"type":46,"value":2637},{"type":41,"tag":148,"props":2792,"children":2793},{"style":304},[2794],{"type":46,"value":15},{"type":41,"tag":148,"props":2796,"children":2797},{"style":190},[2798],{"type":46,"value":2799}," --prod",{"type":41,"tag":148,"props":2801,"children":2802},{"style":155},[2803],{"type":46,"value":2665},{"type":41,"tag":148,"props":2805,"children":2806},{"class":150,"line":161},[2807,2811,2816,2821,2825,2830,2834,2839,2844,2849,2854],{"type":41,"tag":148,"props":2808,"children":2809},{"style":304},[2810],{"type":46,"value":15},{"type":41,"tag":148,"props":2812,"children":2813},{"style":190},[2814],{"type":46,"value":2815}," alias",{"type":41,"tag":148,"props":2817,"children":2818},{"style":190},[2819],{"type":46,"value":2820}," set",{"type":41,"tag":148,"props":2822,"children":2823},{"style":155},[2824],{"type":46,"value":187},{"type":41,"tag":148,"props":2826,"children":2827},{"style":381},[2828],{"type":46,"value":2829},"$URL",{"type":41,"tag":148,"props":2831,"children":2832},{"style":155},[2833],{"type":46,"value":178},{"type":41,"tag":148,"props":2835,"children":2836},{"style":155},[2837],{"type":46,"value":2838}," \u003C",{"type":41,"tag":148,"props":2840,"children":2841},{"style":190},[2842],{"type":46,"value":2843},"project-nam",{"type":41,"tag":148,"props":2845,"children":2846},{"style":381},[2847],{"type":46,"value":2848},"e",{"type":41,"tag":148,"props":2850,"children":2851},{"style":155},[2852],{"type":46,"value":2853},">",{"type":41,"tag":148,"props":2855,"children":2856},{"style":190},[2857],{"type":46,"value":2858},".vercel.app\n",{"type":41,"tag":49,"props":2860,"children":2861},{},[2862,2864,2869,2871,2876,2878,2884,2886,2892,2894,2900],{"type":46,"value":2863},"Replace ",{"type":41,"tag":66,"props":2865,"children":2867},{"className":2866},[],[2868],{"type":46,"value":2769},{"type":46,"value":2870}," with the actual project name (from ",{"type":41,"tag":66,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":46,"value":133},{"type":46,"value":2877}," or ",{"type":41,"tag":66,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":46,"value":2883},".vercel\u002Fproject.json",{"type":46,"value":2885},"). For example, if the project is ",{"type":41,"tag":66,"props":2887,"children":2889},{"className":2888},[],[2890],{"type":46,"value":2891},"my-glasses-app",{"type":46,"value":2893},", the stable URL becomes ",{"type":41,"tag":66,"props":2895,"children":2897},{"className":2896},[],[2898],{"type":46,"value":2899},"https:\u002F\u002Fmy-glasses-app.vercel.app",{"type":46,"value":549},{"type":41,"tag":49,"props":2902,"children":2903},{},[2904],{"type":46,"value":2905},"This is the URL to share with everyone. It never changes between deploys.",{"type":41,"tag":111,"props":2907,"children":2909},{"id":2908},"_5-generate-qr-code-for-easy-device-setup",[2910],{"type":46,"value":2911},"5. Generate QR Code for Easy Device Setup",{"type":41,"tag":49,"props":2913,"children":2914},{},[2915],{"type":46,"value":2916},"Generate a QR code that users can scan from their phone to automatically add the webapp — no manual URL typing needed.",{"type":41,"tag":49,"props":2918,"children":2919},{},[2920],{"type":46,"value":2921},"The QR code data must use this deep link format:",{"type":41,"tag":137,"props":2923,"children":2927},{"className":2924,"code":2926,"language":46},[2925],"language-text","fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>\n",[2928],{"type":41,"tag":66,"props":2929,"children":2930},{"__ignoreMap":142},[2931],{"type":46,"value":2926},{"type":41,"tag":49,"props":2933,"children":2934},{},[2935,2937,2942,2944,2949],{"type":46,"value":2936},"For example, if the app is called ",{"type":41,"tag":66,"props":2938,"children":2940},{"className":2939},[],[2941],{"type":46,"value":2891},{"type":46,"value":2943}," and the stable URL is ",{"type":41,"tag":66,"props":2945,"children":2947},{"className":2946},[],[2948],{"type":46,"value":2899},{"type":46,"value":135},{"type":41,"tag":137,"props":2951,"children":2954},{"className":2952,"code":2953,"language":46},[2925],"fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=my-glasses-app&appUrl=https%3A%2F%2Fmy-glasses-app.vercel.app\n",[2955],{"type":41,"tag":66,"props":2956,"children":2957},{"__ignoreMap":142},[2958],{"type":46,"value":2953},{"type":41,"tag":49,"props":2960,"children":2961},{},[2962,2964,2970],{"type":46,"value":2963},"Use the ",{"type":41,"tag":66,"props":2965,"children":2967},{"className":2966},[],[2968],{"type":46,"value":2969},"\u002Fqr-code",{"type":46,"value":2971}," skill to generate the QR code:",{"type":41,"tag":137,"props":2973,"children":2975},{"className":2494,"code":2974,"language":2496,"meta":142,"style":142},"python3 skills\u002Fqr-code\u002Fscripts\u002Fqr_generator.py --png \u003Capp-dir>\u002Fqr-publish.png \"fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>\"\n",[2976],{"type":41,"tag":66,"props":2977,"children":2978},{"__ignoreMap":142},[2979],{"type":41,"tag":148,"props":2980,"children":2981},{"class":150,"line":151},[2982,2986,2991,2996,3000,3005,3010,3014,3019,3023,3028],{"type":41,"tag":148,"props":2983,"children":2984},{"style":304},[2985],{"type":46,"value":2642},{"type":41,"tag":148,"props":2987,"children":2988},{"style":190},[2989],{"type":46,"value":2990}," skills\u002Fqr-code\u002Fscripts\u002Fqr_generator.py",{"type":41,"tag":148,"props":2992,"children":2993},{"style":190},[2994],{"type":46,"value":2995}," --png",{"type":41,"tag":148,"props":2997,"children":2998},{"style":155},[2999],{"type":46,"value":2838},{"type":41,"tag":148,"props":3001,"children":3002},{"style":190},[3003],{"type":46,"value":3004},"app-di",{"type":41,"tag":148,"props":3006,"children":3007},{"style":381},[3008],{"type":46,"value":3009},"r",{"type":41,"tag":148,"props":3011,"children":3012},{"style":155},[3013],{"type":46,"value":2853},{"type":41,"tag":148,"props":3015,"children":3016},{"style":190},[3017],{"type":46,"value":3018},"\u002Fqr-publish.png",{"type":41,"tag":148,"props":3020,"children":3021},{"style":155},[3022],{"type":46,"value":187},{"type":41,"tag":148,"props":3024,"children":3025},{"style":190},[3026],{"type":46,"value":3027},"fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>",{"type":41,"tag":148,"props":3029,"children":3030},{"style":155},[3031],{"type":46,"value":329},{"type":41,"tag":49,"props":3033,"children":3034},{},[3035],{"type":46,"value":3036},"The PNG is saved to the app directory. If your environment supports rendering images inline (e.g. Claude Code's Read tool), display the QR code directly. Otherwise, provide the file path and tell the user to open it and scan from their phone.",{"type":41,"tag":111,"props":3038,"children":3040},{"id":3039},"_6-give-the-user-the-stable-url-and-setup-instructions",[3041],{"type":46,"value":3042},"6. Give the User the Stable URL and Setup Instructions",{"type":41,"tag":49,"props":3044,"children":3045},{},[3046],{"type":46,"value":3047},"After deploy, alias, and QR generation, present the user with:",{"type":41,"tag":49,"props":3049,"children":3050},{},[3051],{"type":41,"tag":58,"props":3052,"children":3053},{},[3054],{"type":46,"value":3055},"Stable URL:",{"type":41,"tag":137,"props":3057,"children":3060},{"className":3058,"code":3059,"language":46},[2925],"https:\u002F\u002F\u003Cproject-name>.vercel.app\n",[3061],{"type":41,"tag":66,"props":3062,"children":3063},{"__ignoreMap":142},[3064],{"type":46,"value":3059},{"type":41,"tag":49,"props":3066,"children":3067},{},[3068,3073],{"type":41,"tag":58,"props":3069,"children":3070},{},[3071],{"type":46,"value":3072},"Option A — Scan QR code (recommended):",{"type":46,"value":3074},"\nScan the generated QR code with your phone camera. It will open the Meta AI app and automatically add the webapp.",{"type":41,"tag":49,"props":3076,"children":3077},{},[3078],{"type":41,"tag":58,"props":3079,"children":3080},{},[3081],{"type":46,"value":3082},"Option B — Manual setup:",{"type":41,"tag":2145,"props":3084,"children":3085},{},[3086,3098,3115,3131,3141,3151],{"type":41,"tag":1821,"props":3087,"children":3088},{},[3089,3091,3096],{"type":46,"value":3090},"Open the ",{"type":41,"tag":58,"props":3092,"children":3093},{},[3094],{"type":46,"value":3095},"Meta AI app",{"type":46,"value":3097}," on your phone",{"type":41,"tag":1821,"props":3099,"children":3100},{},[3101,3103,3108,3110],{"type":46,"value":3102},"Go to ",{"type":41,"tag":58,"props":3104,"children":3105},{},[3106],{"type":46,"value":3107},"Devices",{"type":46,"value":3109}," > ",{"type":41,"tag":58,"props":3111,"children":3112},{},[3113],{"type":46,"value":3114},"Display Glasses settings",{"type":41,"tag":1821,"props":3116,"children":3117},{},[3118,3120,3125,3126],{"type":46,"value":3119},"Navigate to ",{"type":41,"tag":58,"props":3121,"children":3122},{},[3123],{"type":46,"value":3124},"App connections",{"type":46,"value":3109},{"type":41,"tag":58,"props":3127,"children":3128},{},[3129],{"type":46,"value":3130},"Web apps",{"type":41,"tag":1821,"props":3132,"children":3133},{},[3134,3136],{"type":46,"value":3135},"Tap ",{"type":41,"tag":58,"props":3137,"children":3138},{},[3139],{"type":46,"value":3140},"Add a web app",{"type":41,"tag":1821,"props":3142,"children":3143},{},[3144,3146],{"type":46,"value":3145},"Enter the name: ",{"type":41,"tag":66,"props":3147,"children":3149},{"className":3148},[],[3150],{"type":46,"value":193},{"type":41,"tag":1821,"props":3152,"children":3153},{},[3154,3156],{"type":46,"value":3155},"Enter the URL: ",{"type":41,"tag":66,"props":3157,"children":3159},{"className":3158},[],[3160],{"type":46,"value":3161},"https:\u002F\u002F\u003Cproject-name>.vercel.app",{"type":41,"tag":111,"props":3163,"children":3165},{"id":3164},"_7-after-each-update-republish",[3166],{"type":46,"value":3167},"7. After Each Update — Republish",{"type":41,"tag":49,"props":3169,"children":3170},{},[3171],{"type":46,"value":3172},"After making changes, republish, re-alias, and regenerate the QR code every time:",{"type":41,"tag":137,"props":3174,"children":3176},{"className":2494,"code":3175,"language":2496,"meta":142,"style":142},"URL=$(vercel --prod)\nvercel alias set \"$URL\" \u003Cproject-name>.vercel.app\n\n# Regenerate QR code\npython3 skills\u002Fqr-code\u002Fscripts\u002Fqr_generator.py --png \u003Capp-dir>\u002Fqr-publish.png \"fb-viewapp:\u002F\u002Fweb_app_deep_link?appName=\u003Capp-name>&appUrl=\u003Curl-encoded-prod-url>\"\n",[3177],{"type":41,"tag":66,"props":3178,"children":3179},{"__ignoreMap":142},[3180,3203,3250,3257,3265],{"type":41,"tag":148,"props":3181,"children":3182},{"class":150,"line":151},[3183,3187,3191,3195,3199],{"type":41,"tag":148,"props":3184,"children":3185},{"style":381},[3186],{"type":46,"value":2786},{"type":41,"tag":148,"props":3188,"children":3189},{"style":155},[3190],{"type":46,"value":2637},{"type":41,"tag":148,"props":3192,"children":3193},{"style":304},[3194],{"type":46,"value":15},{"type":41,"tag":148,"props":3196,"children":3197},{"style":190},[3198],{"type":46,"value":2799},{"type":41,"tag":148,"props":3200,"children":3201},{"style":155},[3202],{"type":46,"value":2665},{"type":41,"tag":148,"props":3204,"children":3205},{"class":150,"line":161},[3206,3210,3214,3218,3222,3226,3230,3234,3238,3242,3246],{"type":41,"tag":148,"props":3207,"children":3208},{"style":304},[3209],{"type":46,"value":15},{"type":41,"tag":148,"props":3211,"children":3212},{"style":190},[3213],{"type":46,"value":2815},{"type":41,"tag":148,"props":3215,"children":3216},{"style":190},[3217],{"type":46,"value":2820},{"type":41,"tag":148,"props":3219,"children":3220},{"style":155},[3221],{"type":46,"value":187},{"type":41,"tag":148,"props":3223,"children":3224},{"style":381},[3225],{"type":46,"value":2829},{"type":41,"tag":148,"props":3227,"children":3228},{"style":155},[3229],{"type":46,"value":178},{"type":41,"tag":148,"props":3231,"children":3232},{"style":155},[3233],{"type":46,"value":2838},{"type":41,"tag":148,"props":3235,"children":3236},{"style":190},[3237],{"type":46,"value":2843},{"type":41,"tag":148,"props":3239,"children":3240},{"style":381},[3241],{"type":46,"value":2848},{"type":41,"tag":148,"props":3243,"children":3244},{"style":155},[3245],{"type":46,"value":2853},{"type":41,"tag":148,"props":3247,"children":3248},{"style":190},[3249],{"type":46,"value":2858},{"type":41,"tag":148,"props":3251,"children":3252},{"class":150,"line":205},[3253],{"type":41,"tag":148,"props":3254,"children":3255},{"emptyLinePlaceholder":520},[3256],{"type":46,"value":523},{"type":41,"tag":148,"props":3258,"children":3259},{"class":150,"line":243},[3260],{"type":41,"tag":148,"props":3261,"children":3262},{"style":2180},[3263],{"type":46,"value":3264},"# Regenerate QR code\n",{"type":41,"tag":148,"props":3266,"children":3267},{"class":150,"line":269},[3268,3272,3276,3280,3284,3288,3292,3296,3300,3304,3308],{"type":41,"tag":148,"props":3269,"children":3270},{"style":304},[3271],{"type":46,"value":2642},{"type":41,"tag":148,"props":3273,"children":3274},{"style":190},[3275],{"type":46,"value":2990},{"type":41,"tag":148,"props":3277,"children":3278},{"style":190},[3279],{"type":46,"value":2995},{"type":41,"tag":148,"props":3281,"children":3282},{"style":155},[3283],{"type":46,"value":2838},{"type":41,"tag":148,"props":3285,"children":3286},{"style":190},[3287],{"type":46,"value":3004},{"type":41,"tag":148,"props":3289,"children":3290},{"style":381},[3291],{"type":46,"value":3009},{"type":41,"tag":148,"props":3293,"children":3294},{"style":155},[3295],{"type":46,"value":2853},{"type":41,"tag":148,"props":3297,"children":3298},{"style":190},[3299],{"type":46,"value":3018},{"type":41,"tag":148,"props":3301,"children":3302},{"style":155},[3303],{"type":46,"value":187},{"type":41,"tag":148,"props":3305,"children":3306},{"style":190},[3307],{"type":46,"value":3027},{"type":41,"tag":148,"props":3309,"children":3310},{"style":155},[3311],{"type":46,"value":329},{"type":41,"tag":49,"props":3313,"children":3314},{},[3315,3317,3323],{"type":46,"value":3316},"The stable URL automatically serves the latest version. No ",{"type":41,"tag":66,"props":3318,"children":3320},{"className":3319},[],[3321],{"type":46,"value":3322},"git push",{"type":46,"value":3324}," needed — Vercel receives the files directly.",{"type":41,"tag":49,"props":3326,"children":3327},{},[3328],{"type":46,"value":3329},"After each republish, show the QR code and setup instructions (following Steps 5-6).",{"type":41,"tag":1957,"props":3331,"children":3332},{},[3333],{"type":41,"tag":49,"props":3334,"children":3335},{},[3336,3341],{"type":41,"tag":58,"props":3337,"children":3338},{},[3339],{"type":46,"value":3340},"PS:",{"type":46,"value":3342}," If the user has already added this webapp to their glasses, no need to re-add — the stable URL automatically serves the latest deploy.",{"type":41,"tag":93,"props":3344,"children":3346},{"id":3345},"verification",[3347],{"type":46,"value":3348},"Verification",{"type":41,"tag":1817,"props":3350,"children":3353},{"className":3351},[3352],"contains-task-list",[3354,3373,3389,3398,3426,3447,3463,3485,3494,3503,3512],{"type":41,"tag":1821,"props":3355,"children":3358},{"className":3356},[3357],"task-list-item",[3359,3364,3366,3371],{"type":41,"tag":3360,"props":3361,"children":3363},"input",{"disabled":520,"type":3362},"checkbox",[],{"type":46,"value":3365}," Step 0 verified Vercel setup (",{"type":41,"tag":66,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":46,"value":1918},{"type":46,"value":3372}," returns a user) before any deploy",{"type":41,"tag":1821,"props":3374,"children":3376},{"className":3375},[3357],[3377,3380,3382,3387],{"type":41,"tag":3360,"props":3378,"children":3379},{"disabled":520,"type":3362},[],{"type":46,"value":3381}," If ",{"type":41,"tag":66,"props":3383,"children":3385},{"className":3384},[],[3386],{"type":46,"value":2067},{"type":46,"value":3388}," existed, user was offered the option to disable the passcode routing for production",{"type":41,"tag":1821,"props":3390,"children":3392},{"className":3391},[3357],[3393,3396],{"type":41,"tag":3360,"props":3394,"children":3395},{"disabled":520,"type":3362},[],{"type":46,"value":3397}," No new passcode lock was added during publish",{"type":41,"tag":1821,"props":3399,"children":3401},{"className":3400},[3357],[3402,3405,3407,3412,3413,3418,3419,3424],{"type":41,"tag":3360,"props":3403,"children":3404},{"disabled":520,"type":3362},[],{"type":46,"value":3406}," ",{"type":41,"tag":66,"props":3408,"children":3410},{"className":3409},[],[3411],{"type":46,"value":133},{"type":46,"value":2103},{"type":41,"tag":66,"props":3414,"children":3416},{"className":3415},[],[3417],{"type":46,"value":359},{"type":46,"value":2111},{"type":41,"tag":66,"props":3420,"children":3422},{"className":3421},[],[3423],{"type":46,"value":1678},{"type":46,"value":3425}," exist in app directory",{"type":41,"tag":1821,"props":3427,"children":3429},{"className":3428},[3357],[3430,3433,3434,3439,3441],{"type":41,"tag":3360,"props":3431,"children":3432},{"disabled":520,"type":3362},[],{"type":46,"value":3406},{"type":41,"tag":66,"props":3435,"children":3437},{"className":3436},[],[3438],{"type":46,"value":359},{"type":46,"value":3440}," uses ",{"type":41,"tag":66,"props":3442,"children":3444},{"className":3443},[],[3445],{"type":46,"value":3446},"process.env.PORT",{"type":41,"tag":1821,"props":3448,"children":3450},{"className":3449},[3357],[3451,3454,3455,3461],{"type":41,"tag":3360,"props":3452,"children":3453},{"disabled":520,"type":3362},[],{"type":46,"value":3406},{"type":41,"tag":66,"props":3456,"children":3458},{"className":3457},[],[3459],{"type":46,"value":3460},"vercel --prod",{"type":46,"value":3462}," completes successfully",{"type":41,"tag":1821,"props":3464,"children":3466},{"className":3465},[3357],[3467,3470,3471,3477,3479],{"type":41,"tag":3360,"props":3468,"children":3469},{"disabled":520,"type":3362},[],{"type":46,"value":3406},{"type":41,"tag":66,"props":3472,"children":3474},{"className":3473},[],[3475],{"type":46,"value":3476},"vercel alias set",{"type":46,"value":3478}," succeeds and maps to ",{"type":41,"tag":66,"props":3480,"children":3482},{"className":3481},[],[3483],{"type":46,"value":3484},"\u003Cproject-name>.vercel.app",{"type":41,"tag":1821,"props":3486,"children":3488},{"className":3487},[3357],[3489,3492],{"type":41,"tag":3360,"props":3490,"children":3491},{"disabled":520,"type":3362},[],{"type":46,"value":3493}," Stable URL returns the app (check in browser)",{"type":41,"tag":1821,"props":3495,"children":3497},{"className":3496},[3357],[3498,3501],{"type":41,"tag":3360,"props":3499,"children":3500},{"disabled":520,"type":3362},[],{"type":46,"value":3502}," URL uses HTTPS (required for Meta Display Glasses)",{"type":41,"tag":1821,"props":3504,"children":3506},{"className":3505},[3357],[3507,3510],{"type":41,"tag":3360,"props":3508,"children":3509},{"disabled":520,"type":3362},[],{"type":46,"value":3511}," App loads correctly on device via the stable URL",{"type":41,"tag":1821,"props":3513,"children":3515},{"className":3514},[3357],[3516,3519],{"type":41,"tag":3360,"props":3517,"children":3518},{"disabled":520,"type":3362},[],{"type":46,"value":3520}," Subsequent deploys + alias keep the same URL working",{"type":41,"tag":93,"props":3522,"children":3524},{"id":3523},"troubleshooting",[3525],{"type":46,"value":3526},"Troubleshooting",{"type":41,"tag":3528,"props":3529,"children":3530},"table",{},[3531,3550],{"type":41,"tag":3532,"props":3533,"children":3534},"thead",{},[3535],{"type":41,"tag":3536,"props":3537,"children":3538},"tr",{},[3539,3545],{"type":41,"tag":3540,"props":3541,"children":3542},"th",{},[3543],{"type":46,"value":3544},"Issue",{"type":41,"tag":3540,"props":3546,"children":3547},{},[3548],{"type":46,"value":3549},"Solution",{"type":41,"tag":3551,"props":3552,"children":3553},"tbody",{},[3554,3575,3592,3612,3632,3652,3678,3699],{"type":41,"tag":3536,"props":3555,"children":3556},{},[3557,3566],{"type":41,"tag":3558,"props":3559,"children":3560},"td",{},[3561],{"type":41,"tag":66,"props":3562,"children":3564},{"className":3563},[],[3565],{"type":46,"value":1953},{"type":41,"tag":3558,"props":3567,"children":3568},{},[3569,3570],{"type":46,"value":1912},{"type":41,"tag":66,"props":3571,"children":3573},{"className":3572},[],[3574],{"type":46,"value":1995},{"type":41,"tag":3536,"props":3576,"children":3577},{},[3578,3583],{"type":41,"tag":3558,"props":3579,"children":3580},{},[3581],{"type":46,"value":3582},"Auth error",{"type":41,"tag":3558,"props":3584,"children":3585},{},[3586,3587],{"type":46,"value":1912},{"type":41,"tag":66,"props":3588,"children":3590},{"className":3589},[],[3591],{"type":46,"value":2028},{"type":41,"tag":3536,"props":3593,"children":3594},{},[3595,3600],{"type":41,"tag":3558,"props":3596,"children":3597},{},[3598],{"type":46,"value":3599},"GitHub link error on deploy",{"type":41,"tag":3558,"props":3601,"children":3602},{},[3603,3604,3610],{"type":46,"value":1912},{"type":41,"tag":66,"props":3605,"children":3607},{"className":3606},[],[3608],{"type":46,"value":3609},"vercel git disconnect --yes",{"type":46,"value":3611}," first",{"type":41,"tag":3536,"props":3613,"children":3614},{},[3615,3620],{"type":41,"tag":3558,"props":3616,"children":3617},{},[3618],{"type":46,"value":3619},"404 on sub-pages",{"type":41,"tag":3558,"props":3621,"children":3622},{},[3623,3625,3630],{"type":46,"value":3624},"Check ",{"type":41,"tag":66,"props":3626,"children":3628},{"className":3627},[],[3629],{"type":46,"value":1678},{"type":46,"value":3631}," rewrites config",{"type":41,"tag":3536,"props":3633,"children":3634},{},[3635,3640],{"type":41,"tag":3558,"props":3636,"children":3637},{},[3638],{"type":46,"value":3639},"Old version still showing",{"type":41,"tag":3558,"props":3641,"children":3642},{},[3643,3644,3650],{"type":46,"value":1912},{"type":41,"tag":66,"props":3645,"children":3647},{"className":3646},[],[3648],{"type":46,"value":3649},"vercel --prod --force",{"type":46,"value":3651}," to skip cache, then re-alias",{"type":41,"tag":3536,"props":3653,"children":3654},{},[3655,3660],{"type":41,"tag":3558,"props":3656,"children":3657},{},[3658],{"type":46,"value":3659},"Alias name taken",{"type":41,"tag":3558,"props":3661,"children":3662},{},[3663,3665,3670,3672],{"type":46,"value":3664},"The ",{"type":41,"tag":66,"props":3666,"children":3668},{"className":3667},[],[3669],{"type":46,"value":3484},{"type":46,"value":3671}," subdomain may already be claimed. Try a more specific name like ",{"type":41,"tag":66,"props":3673,"children":3675},{"className":3674},[],[3676],{"type":46,"value":3677},"\u003Cproject-name>-\u003Cteam>.vercel.app",{"type":41,"tag":3536,"props":3679,"children":3680},{},[3681,3694],{"type":41,"tag":3558,"props":3682,"children":3683},{},[3684,3686,3692],{"type":46,"value":3685},"Permission denied on ",{"type":41,"tag":66,"props":3687,"children":3689},{"className":3688},[],[3690],{"type":46,"value":3691},"gh",{"type":46,"value":3693}," config",{"type":41,"tag":3558,"props":3695,"children":3696},{},[3697],{"type":46,"value":3698},"Ignore — this workflow doesn't need GitHub",{"type":41,"tag":3536,"props":3700,"children":3701},{},[3702,3707],{"type":41,"tag":3558,"props":3703,"children":3704},{},[3705],{"type":46,"value":3706},"QR code won't scan",{"type":41,"tag":3558,"props":3708,"children":3709},{},[3710,3712,3718],{"type":46,"value":3711},"Ensure the deep link format is correct and the URL is properly percent-encoded. Try increasing ",{"type":41,"tag":66,"props":3713,"children":3715},{"className":3714},[],[3716],{"type":46,"value":3717},"--scale",{"type":46,"value":3719}," for a larger QR image",{"type":41,"tag":93,"props":3721,"children":3723},{"id":3722},"related-skills",[3724],{"type":46,"value":3725},"Related Skills",{"type":41,"tag":3528,"props":3727,"children":3728},{},[3729,3750],{"type":41,"tag":3532,"props":3730,"children":3731},{},[3732],{"type":41,"tag":3536,"props":3733,"children":3734},{},[3735,3740,3745],{"type":41,"tag":3540,"props":3736,"children":3737},{},[3738],{"type":46,"value":3739},"Skill",{"type":41,"tag":3540,"props":3741,"children":3742},{},[3743],{"type":46,"value":3744},"Purpose",{"type":41,"tag":3540,"props":3746,"children":3747},{},[3748],{"type":46,"value":3749},"When to Use",{"type":41,"tag":3551,"props":3751,"children":3752},{},[3753,3774,3795,3817,3839,3860],{"type":41,"tag":3536,"props":3754,"children":3755},{},[3756,3764,3769],{"type":41,"tag":3558,"props":3757,"children":3758},{},[3759],{"type":41,"tag":66,"props":3760,"children":3762},{"className":3761},[],[3763],{"type":46,"value":71},{"type":41,"tag":3558,"props":3765,"children":3766},{},[3767],{"type":46,"value":3768},"Preview uncommitted changes on glasses",{"type":41,"tag":3558,"props":3770,"children":3771},{},[3772],{"type":46,"value":3773},"Quick iteration without committing",{"type":41,"tag":3536,"props":3775,"children":3776},{},[3777,3785,3790],{"type":41,"tag":3558,"props":3778,"children":3779},{},[3780],{"type":41,"tag":66,"props":3781,"children":3783},{"className":3782},[],[3784],{"type":46,"value":1893},{"type":41,"tag":3558,"props":3786,"children":3787},{},[3788],{"type":46,"value":3789},"Create a new webapp",{"type":41,"tag":3558,"props":3791,"children":3792},{},[3793],{"type":46,"value":3794},"Before first publish",{"type":41,"tag":3536,"props":3796,"children":3797},{},[3798,3807,3812],{"type":41,"tag":3558,"props":3799,"children":3800},{},[3801],{"type":41,"tag":66,"props":3802,"children":3804},{"className":3803},[],[3805],{"type":46,"value":3806},"\u002Fadd-ui",{"type":41,"tag":3558,"props":3808,"children":3809},{},[3810],{"type":46,"value":3811},"Add screens, buttons, components",{"type":41,"tag":3558,"props":3813,"children":3814},{},[3815],{"type":46,"value":3816},"Adding UI before republish",{"type":41,"tag":3536,"props":3818,"children":3819},{},[3820,3829,3834],{"type":41,"tag":3558,"props":3821,"children":3822},{},[3823],{"type":41,"tag":66,"props":3824,"children":3826},{"className":3825},[],[3827],{"type":46,"value":3828},"\u002Fconnect-api",{"type":41,"tag":3558,"props":3830,"children":3831},{},[3832],{"type":46,"value":3833},"Add API connections",{"type":41,"tag":3558,"props":3835,"children":3836},{},[3837],{"type":46,"value":3838},"Adding data sources before republish",{"type":41,"tag":3536,"props":3840,"children":3841},{},[3842,3850,3855],{"type":41,"tag":3558,"props":3843,"children":3844},{},[3845],{"type":41,"tag":66,"props":3846,"children":3848},{"className":3847},[],[3849],{"type":46,"value":2969},{"type":41,"tag":3558,"props":3851,"children":3852},{},[3853],{"type":46,"value":3854},"Generate QR codes",{"type":41,"tag":3558,"props":3856,"children":3857},{},[3858],{"type":46,"value":3859},"Used automatically by this skill for device setup",{"type":41,"tag":3536,"props":3861,"children":3862},{},[3863,3872,3877],{"type":41,"tag":3558,"props":3864,"children":3865},{},[3866],{"type":41,"tag":66,"props":3867,"children":3869},{"className":3868},[],[3870],{"type":46,"value":3871},"\u002Fpasscode-for-testing",{"type":41,"tag":3558,"props":3873,"children":3874},{},[3875],{"type":46,"value":3876},"Add passcode lock screen",{"type":41,"tag":3558,"props":3878,"children":3879},{},[3880,3882,3887],{"type":46,"value":3881},"Not added by this skill — if one already exists from ",{"type":41,"tag":66,"props":3883,"children":3885},{"className":3884},[],[3886],{"type":46,"value":71},{"type":46,"value":3888},", Step 0.5 offers to disable the routing for production",{"type":41,"tag":3890,"props":3891,"children":3892},"style",{},[3893],{"type":46,"value":3894},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3896,"total":762},[3897,3913,3927,3941,3955,3969,3983],{"slug":3898,"name":3898,"fn":3899,"description":3900,"org":3901,"tags":3902,"stars":23,"repoUrl":24,"updatedAt":3912},"add-device-sensors","integrate device sensor data","Add device sensor data to a Meta Display Glasses webapp — IMU (accelerometer, gyroscope, orientation) via DeviceMotionEvent\u002FDeviceOrientationEvent, and GPS location via navigator.geolocation. Use when the user wants motion tracking, compass, level tool, step counter, shake detection, head tracking, or location.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3903,3906,3909],{"name":3904,"slug":3905,"type":16},"Frontend","frontend",{"name":3907,"slug":3908,"type":16},"Hardware","hardware",{"name":3910,"slug":3911,"type":16},"IoT","iot","2026-09-01T08:30:33.453548",{"slug":3914,"name":3914,"fn":3915,"description":3916,"org":3917,"tags":3918,"stars":23,"repoUrl":24,"updatedAt":3926},"add-gestures","handle gesture interactions in webapps","Handle EMG pinch (tap-to-activate) and opt into continuous pinch-and-drag in a Meta Display Glasses webapp. Use when the user wants sliders, drawing, maps, drag interactions, or game-style continuous input.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3919,3922,3923],{"name":3920,"slug":3921,"type":16},"Design","design",{"name":3904,"slug":3905,"type":16},{"name":3924,"slug":3925,"type":16},"Interaction","interaction","2026-09-01T08:30:53.889244",{"slug":3928,"name":3928,"fn":3929,"description":3930,"org":3931,"tags":3932,"stars":23,"repoUrl":24,"updatedAt":3940},"add-local-storage","add client-side data persistence","Add client-side data persistence to a Meta Display Glasses webapp using the W3C Web Storage API (localStorage and sessionStorage). Use when the user wants to save settings, cache data, persist state, or store user preferences.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3933,3934,3937],{"name":3904,"slug":3905,"type":16},{"name":3935,"slug":3936,"type":16},"Persistence","persistence",{"name":3938,"slug":3939,"type":16},"Storage","storage","2026-09-01T08:30:31.384362",{"slug":3942,"name":3942,"fn":3943,"description":3944,"org":3945,"tags":3946,"stars":23,"repoUrl":24,"updatedAt":3954},"add-offline","enable offline support for webapps","Make a Meta Display Glasses webapp work offline with a Service Worker + Cache API (precache the app shell, cache-first fetch, online\u002Foffline UI). Use when the user wants offline support or resilience to flaky Wi-Fi.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3947,3948,3951],{"name":3904,"slug":3905,"type":16},{"name":3949,"slug":3950,"type":16},"Offline","offline",{"name":3952,"slug":3953,"type":16},"Performance","performance","2026-09-01T08:30:33.83287",{"slug":3956,"name":3956,"fn":3957,"description":3958,"org":3959,"tags":3960,"stars":23,"repoUrl":24,"updatedAt":3968},"add-text-input","add text input to webapps","Add text entry to a Meta Display Glasses webapp. Standard HTML inputs open the on-glasses composer (handwriting + voice) when focused and tapped. Use when the user wants a text field, search box, form input, or notes area.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3961,3964,3965],{"name":3962,"slug":3963,"type":16},"Forms","forms",{"name":3904,"slug":3905,"type":16},{"name":3966,"slug":3967,"type":16},"UI Components","ui-components","2026-09-01T08:30:30.563354",{"slug":3970,"name":3970,"fn":3971,"description":3972,"org":3973,"tags":3974,"stars":23,"repoUrl":24,"updatedAt":3982},"add-ui","add UI components to webapps","Add UI components to a Meta Display Glasses webapp — screens, buttons, lists, cards, forms, toggles, counters, or nav bars. Works with vanilla JS and React apps. Use when the user wants to add any interactive UI element or new screen.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3975,3976,3978,3981],{"name":3904,"slug":3905,"type":16},{"name":3977,"slug":366,"type":16},"JavaScript",{"name":3979,"slug":3980,"type":16},"React","react",{"name":3966,"slug":3967,"type":16},"2026-09-01T08:30:27.477785",{"slug":3984,"name":3984,"fn":3985,"description":3986,"org":3987,"tags":3988,"stars":23,"repoUrl":24,"updatedAt":3999},"connect-api","connect webapps to REST APIs and WebSockets","Connect a Meta Display Glasses webapp to REST APIs or WebSockets. Use when the user wants to fetch data from an API, add real-time updates, show loading\u002Ferror states, or cache API responses.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3989,3992,3993,3996],{"name":3990,"slug":3991,"type":16},"API Development","api-development",{"name":3904,"slug":3905,"type":16},{"name":3994,"slug":3995,"type":16},"REST API","rest-api",{"name":3997,"slug":3998,"type":16},"WebSockets","websockets","2026-09-01T08:30:30.968156",{"items":4001,"total":1601},[4002,4022,4034,4055,4074,4091,4102,4116,4129,4142,4157,4169],{"slug":4003,"name":4003,"fn":4004,"description":4005,"org":4006,"tags":4007,"stars":4019,"repoUrl":4020,"updatedAt":4021},"relay-best-practices","write idiomatic Relay code","Best practices for writing idiomatic Relay code. ALWAYS use this skill when writing or modifying React components that use Relay for data fetching. Covers fragments, queries, mutations, pagination, and common anti-patterns. Use when you see `useFragment`, `useLazyLoadQuery`, `usePreloadedQuery`, `useMutation`, `usePaginationFragment`, `graphql` template literals, `react-relay` imports, or `__generated__\u002F*.graphql` files. Also use when asked to explain Relay concepts, debug Relay issues, or review Relay code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4008,4011,4012,4015,4016],{"name":4009,"slug":4010,"type":16},"Engineering","engineering",{"name":3904,"slug":3905,"type":16},{"name":4013,"slug":4014,"type":16},"GraphQL","graphql",{"name":3979,"slug":3980,"type":16},{"name":4017,"slug":4018,"type":16},"Relay","relay",18950,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Frelay","2026-04-22T04:58:15.370563",{"slug":4023,"name":4023,"fn":4024,"description":4025,"org":4026,"tags":4027,"stars":4019,"repoUrl":4020,"updatedAt":4033},"relay-performance","optimize Relay application performance","Performance best practices for Relay applications. Use when optimizing data fetching, reducing re-renders, configuring caching, or improving time to first meaningful paint. Covers query placement, @defer, pagination, fetch policies, garbage collection, fragment granularity, and server-side filtering. Companion to the relay-best-practices skill which covers correctness and architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4028,4029,4030,4031,4032],{"name":3904,"slug":3905,"type":16},{"name":4013,"slug":4014,"type":16},{"name":3952,"slug":3953,"type":16},{"name":3979,"slug":3980,"type":16},{"name":4017,"slug":4018,"type":16},"2026-06-10T07:30:28.726513",{"slug":4035,"name":4035,"fn":4036,"description":4037,"org":4038,"tags":4039,"stars":4052,"repoUrl":4053,"updatedAt":4054},"add-shape-types-to-torch-model","annotate PyTorch models with tensor shapes","Port a PyTorch model to use pyrefly's tensor shape type system (Tensor[[B, C, H, W]], Int[T]). Use this skill whenever the user wants to add shape annotations to a PyTorch model, type a model with tensor dimensions, port a model to use shape tracking, or annotate model forward methods with tensor shapes. Also use when the user mentions tensor shape ports, Int types for PyTorch, or pyrefly shape checking on a model file. Invoke BEFORE starting any model port — the skill's gated workflow prevents common failure modes.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4040,4043,4046,4049],{"name":4041,"slug":4042,"type":16},"Data Modeling","data-modeling",{"name":4044,"slug":4045,"type":16},"Deep Learning","deep-learning",{"name":4047,"slug":4048,"type":16},"Python","python",{"name":4050,"slug":4051,"type":16},"PyTorch","pytorch",6833,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fpyrefly","2026-07-18T05:12:08.515952",{"slug":4056,"name":4056,"fn":4057,"description":4058,"org":4059,"tags":4060,"stars":4071,"repoUrl":4072,"updatedAt":4073},"camera-streaming","configure camera streaming and photo capture","Stream, video frames, photo capture, resolution\u002Fframe rate configuration",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4061,4064,4065,4068],{"name":4062,"slug":4063,"type":16},"Camera","camera",{"name":3907,"slug":3908,"type":16},{"name":4066,"slug":4067,"type":16},"iOS","ios",{"name":4069,"slug":4070,"type":16},"Video","video",488,"https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fmeta-wearables-dat-ios","2026-08-06T05:38:47.523424",{"slug":4075,"name":4075,"fn":4076,"description":4077,"org":4078,"tags":4079,"stars":4071,"repoUrl":4072,"updatedAt":4090},"dat-conventions","develop iOS applications with DAT SDK","Swift patterns, async\u002Fawait, naming conventions, key types for DAT SDK iOS development",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4080,4081,4084,4087],{"name":4066,"slug":4067,"type":16},{"name":4082,"slug":4083,"type":16},"Mobile","mobile",{"name":4085,"slug":4086,"type":16},"SDK","sdk",{"name":4088,"slug":4089,"type":16},"Swift","swift","2026-08-06T05:38:49.536777",{"slug":4092,"name":4092,"fn":4093,"description":4094,"org":4095,"tags":4096,"stars":4071,"repoUrl":4072,"updatedAt":4101},"debugging","debug wearable device software","Common issues, Developer Mode, version compatibility, state machine diagnosis",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4097,4099,4100],{"name":4098,"slug":4092,"type":16},"Debugging",{"name":4009,"slug":4010,"type":16},{"name":4066,"slug":4067,"type":16},"2026-08-06T05:38:50.51086",{"slug":4103,"name":4103,"fn":4104,"description":4105,"org":4106,"tags":4107,"stars":4071,"repoUrl":4072,"updatedAt":4115},"display-access","manage display capabilities on wearable devices","Display capability setup, display-capable device selection, UI DSL, icons, buttons, images, and video playback",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4108,4109,4112,4113,4114],{"name":3920,"slug":3921,"type":16},{"name":4110,"slug":4111,"type":16},"Images","images",{"name":3924,"slug":3925,"type":16},{"name":3966,"slug":3967,"type":16},{"name":4069,"slug":4070,"type":16},"2026-08-06T05:38:53.520488",{"slug":4117,"name":4117,"fn":4118,"description":4119,"org":4120,"tags":4121,"stars":4071,"repoUrl":4072,"updatedAt":4128},"getting-started","set up Meta wearable SDK integration","SDK setup, Swift Package Manager integration, Info.plist configuration, and first connection to Meta glasses",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4122,4125,4126,4127],{"name":4123,"slug":4124,"type":16},"Configuration","configuration",{"name":4066,"slug":4067,"type":16},{"name":4085,"slug":4086,"type":16},{"name":4088,"slug":4089,"type":16},"2026-08-06T05:38:48.514522",{"slug":4130,"name":4130,"fn":4131,"description":4132,"org":4133,"tags":4134,"stars":4071,"repoUrl":4072,"updatedAt":4141},"live-debugging-mcp","debug iOS wearable applications","Use this whenever debugging an iOS DAT app with local DAT Inspector MCP tools, live device events, Meta AI app\u002Fdevice boundary issues, permissions, registration, sessions, streaming, callbacks, or user reports that the app cannot communicate with glasses.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4135,4136,4137,4140],{"name":4098,"slug":4092,"type":16},{"name":4066,"slug":4067,"type":16},{"name":4138,"slug":4139,"type":16},"MCP","mcp",{"name":4082,"slug":4083,"type":16},"2026-08-06T06:09:15.013902",{"slug":4143,"name":4143,"fn":4144,"description":4145,"org":4146,"tags":4147,"stars":4071,"repoUrl":4072,"updatedAt":4156},"mockdevice-testing","test wearable apps with mock devices","MockDeviceKit for testing without physical glasses hardware",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4148,4149,4150,4153],{"name":4066,"slug":4067,"type":16},{"name":4082,"slug":4083,"type":16},{"name":4151,"slug":4152,"type":16},"QA","qa",{"name":4154,"slug":4155,"type":16},"Testing","testing","2026-05-15T06:14:37.406692",{"slug":4158,"name":4158,"fn":4159,"description":4160,"org":4161,"tags":4162,"stars":4071,"repoUrl":4072,"updatedAt":4168},"permissions-registration","register apps with Meta AI","App registration with Meta AI, camera permission flows",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4163,4164,4165],{"name":4062,"slug":4063,"type":16},{"name":4066,"slug":4067,"type":16},{"name":4166,"slug":4167,"type":16},"Permissions","permissions","2026-05-15T06:14:46.030253",{"slug":4170,"name":4170,"fn":4171,"description":4172,"org":4173,"tags":4174,"stars":4071,"repoUrl":4072,"updatedAt":4178},"sample-app-guide","build wearable apps with camera streaming","Building a complete DAT app with camera streaming and photo capture",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[4175,4176,4177],{"name":4062,"slug":4063,"type":16},{"name":4066,"slug":4067,"type":16},{"name":4082,"slug":4083,"type":16},"2026-08-06T05:38:51.509255"]