Expo Brownfield Integration
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
Fix .well-known files (apple-app-site-association, assetlinks.json) being served as HTML by the @fastly/compute-js-static-publish SPA fallback instead of JSON.
$ npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install divinevideo/divine-mobile fastly-compute-well-known-spa-fallback --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/fastly-compute-well-known-spa-fallback .claude/skills/fastly-compute-well-known-spa-fallback && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fastly-compute-well-known-spa-fallback" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallback into .claude/skills/fastly-compute-well-known-spa-fallback/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastly-compute-well-known-spa-fallback", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallbackType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install divinevideo/divine-mobile fastly-compute-well-known-spa-fallback --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/fastly-compute-well-known-spa-fallback .agents/skills/fastly-compute-well-known-spa-fallback && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fastly-compute-well-known-spa-fallback" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallback into .agents/skills/fastly-compute-well-known-spa-fallback/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastly-compute-well-known-spa-fallback", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install divinevideo/divine-mobile fastly-compute-well-known-spa-fallback --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/fastly-compute-well-known-spa-fallback .cursor/skills/fastly-compute-well-known-spa-fallback && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fastly-compute-well-known-spa-fallback" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallback into .cursor/skills/fastly-compute-well-known-spa-fallback/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastly-compute-well-known-spa-fallback", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/divinevideo/divine-mobile.git --path .agents/skills/fastly-compute-well-known-spa-fallback--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install divinevideo/divine-mobile fastly-compute-well-known-spa-fallback --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/fastly-compute-well-known-spa-fallback .gemini/skills/fastly-compute-well-known-spa-fallback && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fastly-compute-well-known-spa-fallback" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallback into .gemini/skills/fastly-compute-well-known-spa-fallback/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastly-compute-well-known-spa-fallback", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install divinevideo/divine-mobile fastly-compute-well-known-spa-fallbackInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/fastly-compute-well-known-spa-fallback .github/skills/fastly-compute-well-known-spa-fallback && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fastly-compute-well-known-spa-fallback" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallback into .github/skills/fastly-compute-well-known-spa-fallback/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastly-compute-well-known-spa-fallback", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install divinevideo/divine-mobile fastly-compute-well-known-spa-fallback --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/fastly-compute-well-known-spa-fallback .opencode/skills/fastly-compute-well-known-spa-fallback && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fastly-compute-well-known-spa-fallback" agent skill from https://github.com/divinevideo/divine-mobile/tree/main/.agents/skills/fastly-compute-well-known-spa-fallback into .opencode/skills/fastly-compute-well-known-spa-fallback/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastly-compute-well-known-spa-fallback", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fastly-compute-well-known-spa-fallbackFix .well-known files (apple-app-site-association, assetlinks.json) being served as HTML by the @fastly/compute-js-static-publish SPA fallback instead of JSON.
Fastly Compute Well Known Spa Fallback is an agent skill from divinevideo/divine-mobile. Fix .well-known files (apple-app-site-association, assetlinks.json) being served as HTML by the @fastly/compute-js-static-publish SPA fallback instead of JSON. Use when: (1) iOS Universal Links or Android App Links are broken because the verification files return text/html instead of application/json, (2) PublisherServer with spaFile config intercepts /.well-known/ paths and returns index.html (200, text/html) instead of 404 for missing files, (3) apple-app-site-association (no file extension) gets wrong content…
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile, covering Android development. It works with Android and iOS. The licence is MPL-2.0.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c3d6f7e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developer.apple.comdeveloper.android.comnpmjs.comfastly.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fastly Compute Well Known Spa Fallback loads about 2.5k tokens when it runs. Until then it costs about 163 tokens; SKILL.md has 471 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from divinevideo/divine-mobile at commit c3d6f7e, republished under its MPL-2.0 licence (© divinevideo). 471 words, ~2,536 tokens.
.claude/skills/fastly-compute-well-known-spa-fallback/SKILL.md (or your agent's skills folder).When using @fastly/compute-js-static-publish with SPA fallback configured (spaFile: "/index.html"), the PublisherServer.serveRequest() returns index.html with status 200 and Content-Type text/html for ANY path not found in the KV store. This includes /.well-known/apple-app-site-association and /.well-known/assetlinks.json, which iOS and Android require to be served as application/json.
Symptoms:
.well-known/apple-app-site-association and gets HTML).well-known/assetlinks.json and gets HTML)curl -I https://yourdomain.com/.well-known/apple-app-site-association shows Content-Type: text/htmlnpm run fastly:publish) but still return HTMLSPA fallback returns 200, not 404: The publisher's SPA mode returns index.html with HTTP 200 for missing paths. You cannot distinguish "file served" from "fallback served" by status code alone - you must inspect the Content-Type.
apple-app-site-association has no file extension: The static publisher infers MIME type from file extension. With no extension, it cannot detect application/json, so even when the file IS published to KV, it may get application/octet-stream or be served incorrectly.
includeWellKnown: true in publish-content.config.js is necessary but not sufficient: It ensures the files are uploaded to KV, but doesn't prevent the SPA fallback from intercepting the requests, and doesn't fix the content-type for extension-less files.
Both apex domain and subdomain handlers need the fix: If your Compute handler has separate code paths for subdomains vs apex, both paths must intercept .well-known/ requests before reaching the SPA fallback.
In publish-content.config.js, confirm includeWellKnown: true is set:
// publish-content.config.js
module.exports = {
// ...
includeWellKnown: true, // Must be true to include /.well-known/ files
// ...
};Then publish static content:
npm run fastly:publishIn your Compute entry point (compute-js/src/index.js), add a .well-known handler
BEFORE any call to publisherServer.serveRequest(request) that has SPA fallback enabled.
Critical guard: Check that the publisher response is NOT text/html - if it is,
the SPA fallback fired (file not in KV), so return 404 instead of the HTML.
// In your main handleRequest function, BEFORE the final publisherServer.serveRequest() call:
// Handle .well-known requests (must come before SPA fallback)
if (url.pathname.startsWith('/.well-known/')) {
// Handle NIP-05 or other dynamic .well-known endpoints first
if (url.pathname === '/.well-known/nostr.json') {
return handleNip05(url); // Your custom handler
}
// For all other .well-known files: fetch from static publisher
const wkResponse = await publisherServer.serveRequest(request);
// CRITICAL: Guard against SPA fallback. The publisher returns index.html (text/html)
// for files not in KV. We must detect this and return 404 instead.
if (
wkResponse != null &&
wkResponse.status === 200 &&
!wkResponse.headers.get('Content-Type')?.includes('text/html')
) {
const headers = new Headers(wkResponse.headers);
// Explicitly set correct content type.
// apple-app-site-association has no extension, so the publisher may not detect JSON.
const isJsonFile =
url.pathname.endsWith('.json') ||
url.pathname.endsWith('/apple-app-site-association') ||
url.pathname === '/.well-known/apple-app-site-association';
headers.set(
'Content-Type',
isJsonFile ? 'application/json' : (headers.get('Content-Type') || 'application/octet-stream')
);
headers.set('Cache-Control', 'public, max-age=3600');
headers.append('Vary', 'X-Original-Host'); // If using multi-service routing
return new Response(wkResponse.body, { status: 200, headers });
}
// File not in KV (or publisher returned SPA fallback) - return proper 404
return new Response('Not Found', { status: 404 });
}If you have separate handling for subdomain requests, add the same guard there too. Subdomain paths hit a different code branch before reaching the apex domain handler:
if (subdomain) {
if (url.pathname.startsWith('/.well-known/')) {
if (url.pathname === '/.well-known/nostr.json') {
return handleSubdomainNip05(subdomain);
}
// Same pattern: intercept, guard against SPA fallback, force JSON content type
const wkResponse = await publisherServer.serveRequest(request);
if (
wkResponse != null &&
wkResponse.status === 200 &&
!wkResponse.headers.get('Content-Type')?.includes('text/html')
) {
const headers = new Headers(wkResponse.headers);
const contentType =
url.pathname.endsWith('.json') || url.pathname.endsWith('/apple-app-site-association')
? 'application/json'
: headers.get('Content-Type') || 'application/octet-stream';
headers.set('Content-Type', contentType);
headers.set('Cache-Control', 'public, max-age=3600');
return new Response(wkResponse.body, { status: 200, headers });
}
return new Response('Not Found', { status: 404 });
}
// ... rest of subdomain handling
}# Should return application/json, NOT text/html
curl -sI https://yourdomain.com/.well-known/apple-app-site-association | grep -i content-type
# Should return JSON body
curl -s https://yourdomain.com/.well-known/apple-app-site-association | head -c 100
# Android assetlinks.json
curl -sI https://yourdomain.com/.well-known/assetlinks.json | grep -i content-type
# Verify the SPA fallback guard works (path that does NOT exist in KV)
curl -sI https://yourdomain.com/.well-known/nonexistent-file
# Should return 404, not 200From compute-js/src/index.js in divine-web:
// 4. Handle .well-known requests
if (url.pathname.startsWith('/.well-known/')) {
// 4a. NIP-05 from KV store
if (url.pathname === '/.well-known/nostr.json') {
return await handleNip05(url);
}
// 4b. Serve other .well-known files (apple-app-site-association, assetlinks.json)
// These must be served as JSON, not the SPA fallback.
// apple-app-site-association has no file extension, so the static publisher
// cannot detect its content type - we handle it explicitly here.
const wkResponse = await publisherServer.serveRequest(request);
// Guard: if publisher returns text/html, it's the SPA fallback, not the real file
if (wkResponse != null && wkResponse.status === 200 && !wkResponse.headers.get('Content-Type')?.includes('text/html')) {
const headers = new Headers(wkResponse.headers);
// Ensure correct content type for app association files
const contentType = url.pathname.endsWith('.json') || url.pathname.endsWith('/apple-app-site-association')
? 'application/json'
: headers.get('Content-Type') || 'application/octet-stream';
headers.set('Content-Type', contentType);
headers.set('Cache-Control', 'public, max-age=3600');
headers.append('Vary', 'X-Original-Host');
return new Response(wkResponse.body, {
status: 200,
headers,
});
}
// File not found in KV - return 404 instead of SPA fallback
return new Response('Not Found', { status: 404 });
}After making code changes:
# 1. Publish static content first (uploads .well-known files to KV)
npm run fastly:publish
# 2. Deploy the edge worker code (with the .well-known interception logic)
npm run fastly:deploy
# NOTE: Order matters if files weren't in KV before. If you deploy code first,
# it will correctly return 404 for missing files. Then publish uploads the files.
# Either order works - the guard handles both cases.@fastly/compute-js-static-publish with spaFile configured..well-known verification files).publisherServer.serveRequest() needs the .well-known interception guard.fastly:publish, allow up to 2-3 minutes for KV propagation before testing.© divinevideo, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/fastly-compute-well-known-spa-fallback of divinevideo/divine-mobile.
Open the folder on GitHubat commit c3d6f7e
Fastly Compute Well Known Spa Fallback next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fastly Compute Well Known Spa Fallback this skilldivinevideo/divine-mobile | 266 | — | ~2.5k | Automated safety check: Pass | MPL-2.0 | |
| Expo Brownfield Integrationmweinbach/agent-coworker | 156 | 2 repos | ~900 | Automated safety check: Notes | Custom licence | |
| Jetpack Composedarriousliu/PiPixiv | 263 | — | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Simulator Audio E2Ehyochan/react-native-nitro-sound | 961 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Android Maps Ktxgooglemaps/android-maps-ktx | 360 | — | ~897 | Automated safety check: Pass | Apache-2.0 | |
| Expo UIarcboxlabs/linkcode | 155 | — | ~1.2k | Automated safety check: Pass | MIT |
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
darriousliu/PiPixiv
Jetpack Compose expert skill for Android UI development. An agent skill from darriousliu/PiPixiv.
hyochan/react-native-nitro-sound
Build and run repeatable react-native-nitro-sound recorder/player regression tests on an iOS Simulator or Android emulator, with explicit virtual-device selection, microphone permission, Maestro…
googlemaps/android-maps-ktx
Provides idiomatic Kotlin extension (KTX) patterns, reactive Flow event streams, and multi-subscriber shareIn rules for Google Maps SDK for Android and its Utility Library.
arcboxlabs/linkcode
Framework (OSS). An agent skill from arcboxlabs/linkcode.
ioannisa/KSafe
Required before any reply that touches KSafe (by ksafe(...), ksafe.get/put, :ksafe-compose, :ksafe-biometrics), even a 'can KSafe do X?' question or a one-line change that looks like plain Kotlin.
divinevideo/divine-mobile
Fix ArgoCD ExternalSecret deployment failing with "namespace X is not permitted in project Y".
divinevideo/divine-mobile
Art direction for any content — reads text, PDF, Word, HTML, PPT, then proposes 2-3 creative directions with photography style, mood, and visual language.
divinevideo/divine-mobile
Fix "Null check operator used on a null value" errors when an object is set to null during an async await.
divinevideo/divine-mobile
Add custom metadata headers (x-amz-meta-) to AWS v4 signed requests for GCS S3-compatible API.
divinevideo/divine-mobile
Fix password/secret authentication failures caused by trailing newlines when creating Google Cloud secrets (or similar) with bash here-strings.
divinevideo/divine-mobile
Fix silent video/media processing failures caused by URL extraction code that filters on file extensions (.mp4, .webm, .webp).
Categories
Fix .well-known files (apple-app-site-association, assetlinks.json) being served as HTML by the @fastly/compute-js-static-publish SPA fallback instead of JSON. Fastly Compute Well Known Spa Fallback is an agent skill from divinevideo/divine-mobile.json) being served as HTML by the @fastly/compute-js-static-publish SPA fallback instead of JSON.
Fastly Compute Well Known Spa Fallback fits situations like: IOS Universal Links; android App Links are broken because the verification files return text/html instead of application/json; publisherServer with spaFile config intercepts /.well-known/ paths and returns index.html (200; text/html) instead of 404 for missing files.
Run `npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a claude-code`. Or copy the skill folder (.agents/skills/fastly-compute-well-known-spa-fallback in divinevideo/divine-mobile) into .claude/skills/fastly-compute-well-known-spa-fallback in your project. Claude Code loads it when a task matches its description.
Run `npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a codex`. Or copy the skill folder (.agents/skills/fastly-compute-well-known-spa-fallback in divinevideo/divine-mobile) into .agents/skills/fastly-compute-well-known-spa-fallback in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add divinevideo/divine-mobile --skill fastly-compute-well-known-spa-fallback -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fastly-compute-well-known-spa-fallback, .gemini/skills/fastly-compute-well-known-spa-fallback, .github/skills/fastly-compute-well-known-spa-fallback and .opencode/skills/fastly-compute-well-known-spa-fallback in your project.
Going by SKILL.md and its folder, Fastly Compute Well Known Spa Fallback needs the command-line tools its instructions call (curl and npm).
SKILL.md names 4 domains. As links in the text: developer.apple.com, developer.android.com, npmjs.com and fastly.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Fastly Compute Well Known Spa Fallback is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Fastly Compute Well Known Spa Fallback: Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars), Jetpack Compose (darriousliu/PiPixiv, 263 stars), Simulator Audio E2E (hyochan/react-native-nitro-sound, 961 stars) and Android Maps Ktx (googlemaps/android-maps-ktx, 360 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
divinevideo (a GitHub organization) maintains it in divinevideo/divine-mobile, which has 266 GitHub stars. The repository holds 103 skills in this directory. The repository was last updated on October 10, 2026.
Source: divinevideo/divine-mobile on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.