Synthèse automatique
Cette skill télécharge un site Framer (URL en ligne ou export local) vers des fichiers HTML/JS/CSS entièrement locaux, sans dépendance au CDN Framer.
Points forts
- Télécharge et reclasse les assets JS, CSS, images et médias dans des dossiers locaux dédiés
- Réécrit les imports ES modules statiques et dynamiques ainsi que les liens modulepreload vers les fichiers locaux
- Gère les exports multi-pages en s'appuyant sur les routeId de data-framer-hydrate-v2 et génère un server.js pour le routage SPA
- Supprime le badge « Made in Framer » et les barres d'édition, avec validation des fichiers médias par magic bytes
Limites
- Repose sur la structure d'export Framer décrite (nommage des .mjs, data-framer-hydrate-v2) : un site très personnalisé ou avec du code custom peut casser
- Les polices sont ignorées par défaut et doivent être demandées explicitement
- Nécessite un accès réseau au CDN et l'exécution de server.js pour que les routes SPA fonctionnent en local
À utiliser quand vous voulez auto-héberger un site Framer, supprimer l'image de marque Framer ou en produire une copie consultable hors ligne.
À éviter si le site n'a pas été exporté par Framer ou si vous cherchez une simple sauvegarde visuelle sans réécriture des modules JS.
Analyse de sécurité
PrudenceThe skill is a legitimate, well-scoped site-mirroring tool: it fetches public CDN assets, rewrites imports and HTML paths, strips branding, and writes a small local server. The risk profile is that of a powerful but normal dev workflow — network downloads, recursive file edits, a targeted directory deletion, and executing a generated server.js. There is no evidence of exfiltration, destructive absolute-path deletion, or obfuscation, so it warrants 'caution' rather than 'risky'.
- •Uses Bash/network to download arbitrary remote assets (JS/MJS modules, media) from Framer CDNs and then executes nothing, but the downloaded JS is later served locally via a generated Node server
- •Step 7 deletes directories (limited to 'empty' static HTML dirs, but the guard is heuristic and a mis-classified directory could remove user files)
- •Generates and runs a local server.js — running it via `node server.js` executes agent-authored code
- •No secret exfiltration, no curl|sh piping, no obfuscated payloads, no safety-disabling instructions
Exemples
Export https://example.framer.app to local HTML/JS/CSS files in ./site so I can self-host it without any Framer CDN calls.Take my local Framer export in ./my-exported-site, download all CDN assets into js/, css/, images/ and media/, and remove the 'Made in Framer' badge.My self-hosted Framer export breaks on /blogs and /pricing — fix the SPA routing, rewrite the modulepreload links, and generate a server.js with URL-to-HTML mapping.name: framer-export description: Export a Framer website to fully local HTML/JS/CSS with no CDN dependencies. Use when the user wants to self-host a Framer site, remove Framer branding, or create an offline-capable version. Works on any Framer-exported site. disable-model-invocation: true allowed-tools: Bash, Read, Grep, Write, Edit, Glob, TaskCreate, TaskUpdate, TaskList, TaskGet
Framer Exporter Skill
Export any Framer website to fully self-hosted local files with no Framer CDN dependencies.
What This Does
- Downloads all assets — JS, CSS, images, video, PDF, audio, and other files from Framer CDN to local
js/,css/,images/,media/folders - Fixes ES module imports — Updates all
importandimport()paths to use local filenames, includingmodulepreloadlinks - Handles multi-page exports — Detects and processes all HTML pages (blog posts, policy pages, sub-routes) with their unique
data-framer-hydrate-v2routeIds - Removes Framer noise — Strips "Made in Framer" badges, editor bars, and Framer branding precisely
- Fixes SPA routing — Updates nav links, deletes conflicting directories, generates a custom
server.jswith URL-to-HTML mapping
Usage
Export a live Framer site
/framer-export https://example.framer.app
Export from local HTML files
/framer-export ./my-exported-site
Workflow
Step 1: Analyze the site
- If URL: download the HTML and scan for all external CDN URLs
- If local: scan all HTML files for CDN references
- Categorize correctly by checking file extensions using regexes (e.g.
/\.(js|mjs)(\?|$)/ifor JS,/\.css(\?|$)/ifor CSS,/\.(png|jpg|jpeg|webp|gif|svg|ico)(\?|$)/ifor images). This ensures files with query parameters (e.g.,?v=2) are not misclassified as media files. - Detect all page routes: Every
.htmlfile found represents a unique route (homepage/,/blogs,/pricing,/terms-conditions,/blogs/slug-title, etc.) - Each HTML file contains
data-framer-hydrate-v2="{routeId:...}"— this JSON determines which page renders on the client and is baked in at download time, so each route needs its own HTML file - Log all discovered routes
Step 2: Create local asset directories
Create js/, css/, images/, media/ directories alongside index.html.
Step 3: Download all external resources
Download all JS, CSS, images, and media files (video, PDF, audio, documents) to local directories. Skip fonts by default unless user requests them.
- Media Validation: Validate downloaded files. For videos (MP4, WebM, Ogg) and audio, read the first 12 bytes to verify magic bytes. MP4 contains
ftypat offset 4, WebM/MKV starts with\x1a\x45\xdf\xa3. Reject empty files.
Important: Extract dynamic import URLs from script_main.mjs. Framer's SPA router dynamically imports page modules. Construct full CDN URLs from the script_main base path, and download those dynamic modules too.
Step 4: Fix ES module imports in JS files
Many Framer exports have import statements referencing CDN filenames like 7zd_4hdYd8O.mjs. Rename these to short local names and update all import paths:
from "./7zd_4hdYd8O-dG7PZxJrnFUX2tGHHFGd1cKXxhsQWgA.B72Ql4Dm.mjs"→from "./site-home.mjs"- Also fix dynamic imports:
import(`./filename.mjs`) - Also fix
modulepreloadlinks.
Step 5: Update HTML references
Replace all CDN URLs in HTML files with absolute root-relative paths (starting with /) to ensure sub-pages and nested routes resolve correctly:
https://framer.com/bootstrap.js→/js/bootstrap.js- Images:
https://framerusercontent.com/images/xxx.png→/images/xxx.png(strip query params) - Media (video/PDF/audio):
https://framerusercontent.com/files/xxx.pdf→/media/xxx.pdf - Modulepreload links: Rewrite relative/CDN modulepreload href values to
/js/filename.mjsbut ignore any links that are already absolute (starting with/) or external (starting withhttp/https) to avoid double-prefixing.
Step 6: Remove Framer noise
Surgically remove Framer badge, editor bar, iframe, and related CSS/scripts. Update all HTML files, not just the homepage.
Step 7: Fix SPA routing
- Delete empty static HTML directories (blog/, support/, etc.) that override SPA routes — but ONLY if they contain no actual HTML files
- Update nav links from
.htmlpaths to SPA routes:href="blog/index.html"→href="/blog". Skip relative asset directory prefixes (js/,css/,images/,media/) and file extensions to avoid breaking asset loading. - Generate a custom
server.jsthat maps each discovered URL slug to its HTML file. - The
server.jstemplate must double-escape regexes (e.g.url.replace(/^\\//, '')in template string) to strip leading slashes correctly.
Step 8: Verify
- Run:
node server.js - Test all routes and test page refresh on sub-pages and nested pages to check for any blank screens or 404s.
- Check browser console for "Failed to fetch dynamically imported module" errors.
Important Framer Patterns
data-framer-hydrate-v2
Framer bakes data-framer-hydrate-v2="{routeId:...,...}" JSON into each HTML page. This routeId is set at download time — each unique URL needs its own HTML file because the routeId cannot be dynamically changed after download.
CDN import paths to fix
Framer uses hash-based filenames. Common patterns:
https://framer.com/bootstrap.[hash].js
https://app.framerstatic.com/chunk-[hash].mjs
https://framerusercontent.com/sites/[siteId]/[hash].mjs
Route modules
Framer SPAs define routes in site-script_main.mjs:
W = {
routeId: { page: () => import('./route-page.mjs'), path: '/path' },
...
}
The route .mjs files often import each other — must update ALL import paths recursively.
Dynamic imports in route files
Route files often import other modules dynamically:
page: E(() => import(`./some-file.mjs`))
These also need fixing.
Image URL variants
Framer URLs appear in multiple attributes:
src="https://framerusercontent.com/images/xxx.png?width=101&height=101"
srcset="https://framerusercontent.com/images/xxx.png?w=800 800w, ..."
href="https://framerusercontent.com/images/xxx.png?..." (favicon)
content="https://framerusercontent.com/images/xxx.png?..." (og:image)
Strip query parameters from all of these and map to images/.
Framer font files
framerusercontent.com/assets/*.woff2 custom fonts — these are design fonts with no Framer branding. It's acceptable to keep them as external references. Skip by default, offer --with-fonts to download.
Output Structure
project/
├── index.html (cleaned, local refs)
├── server.js (custom SPA server with URL→HTML mapping)
├── js/
│ ├── bootstrap.js
│ ├── site-script_main.mjs
│ ├── site-[name].mjs
│ ├── route-[page].mjs
│ └── ...
├── css/
│ └── editorbar.css
├── images/
│ └── [all images]
└── media/
└── [videos, PDFs, audio, documents, etc.]
Edge Cases
- Port conflicts: Kill existing processes on the port before starting server (
taskkill //F //IM node.exeon Windows) - Static
.htmlfiles: If nav links point to.htmlfiles that exist, update those files' CDN refs too - Empty dirs vs real dirs: blog/ with only empty subdirs → delete; blog/ with
index.html→ keep and clean - Blog post slugs: URLs like
/blogs/top-ai-toolsneed their ownblogs/top-ai-tools.htmlfile — extract fromdata-framer-hydrate-v2or from the SPA router config - Font files: Skip by default; no visible branding but adds significant export time
- Canvas sandbox iframe: Editor-only, safe to remove (already caught by noise removal)
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/framer-exporter-mrx3xwu0/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/framer-exporter-mrx3xwu0' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/framer-exporter-mrx3xwu0/download' --output '.skill-downloads/framer-exporter-mrx3xwu0/SKILL.md.part' && mv '.skill-downloads/framer-exporter-mrx3xwu0/SKILL.md.part' '.skill-downloads/framer-exporter-mrx3xwu0/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Outils déclarés par l’auteur (à vérifier dans votre agent) : Bash, Read, Grep, Write, Edit, Glob, TaskCreate, TaskUpdate, TaskList, TaskGet
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/framer-exporter-mrx3xwu0/SKILL.md' && test -s '.skill-downloads/framer-exporter-mrx3xwu0/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/framer-export' && cp -R '.skill-downloads/framer-exporter-mrx3xwu0' '.claude/skills/framer-export'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/framer-exporter-mrx3xwu0'openskills read 'framer-exporter-mrx3xwu0'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/framer-exporter-mrx3xwu0/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.