Exportateur Framer

VérifiéPrudence

Exporte un site Framer en fichiers HTML/JS/CSS locaux sans dépendances CDN. Idéal pour auto-héberger, supprimer la marque Framer ou créer une version hors ligne.

Spar Skills Guide Bot
DeveloppementAvancé
23/07/2026
Claude Code
#framer#self-hosting#static-site-export#es-modules#asset-download

Recommandé pour

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
Quand l'utiliser

À utiliser quand vous voulez auto-héberger un site Framer, supprimer l'image de marque Framer ou en produire une copie consultable hors ligne.

Quand l'éviter

À é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é

Prudence
Score qualité74/100

The 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'.

Points d'attention
  • •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
Comment cette analyse est faite

Exemples

Export a live Framer site
Export https://example.framer.app to local HTML/JS/CSS files in ./site so I can self-host it without any Framer CDN calls.
Clean up a local export
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.
Fix sub-page routing
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

  1. Downloads all assets — JS, CSS, images, video, PDF, audio, and other files from Framer CDN to local js/, css/, images/, media/ folders
  2. Fixes ES module imports — Updates all import and import() paths to use local filenames, including modulepreload links
  3. Handles multi-page exports — Detects and processes all HTML pages (blog posts, policy pages, sub-routes) with their unique data-framer-hydrate-v2 routeIds
  4. Removes Framer noise — Strips "Made in Framer" badges, editor bars, and Framer branding precisely
  5. Fixes SPA routing — Updates nav links, deletes conflicting directories, generates a custom server.js with 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)(\?|$)/i for JS, /\.css(\?|$)/i for CSS, /\.(png|jpg|jpeg|webp|gif|svg|ico)(\?|$)/i for images). This ensures files with query parameters (e.g., ?v=2) are not misclassified as media files.
  • Detect all page routes: Every .html file 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 ftyp at 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 modulepreload links.

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.mjs but ignore any links that are already absolute (starting with /) or external (starting with http/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

  1. Delete empty static HTML directories (blog/, support/, etc.) that override SPA routes — but ONLY if they contain no actual HTML files
  2. Update nav links from .html paths 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.
  3. Generate a custom server.js that maps each discovered URL slug to its HTML file.
  4. The server.js template 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.exe on Windows)
  • Static .html files: If nav links point to .html files 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-tools need their own blogs/top-ai-tools.html file — extract from data-framer-hydrate-v2 or 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 annexes

Ce 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.md

Depuis 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’OpenSkills
openskills 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 sync

Mode 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.

Skills similaires