Démarrage
Installer Mocky, créer le premier compte, et brancher un modèle de texte.
Prérequis#
Docker, ou Node ≥ 22.12. Le fichier .nvmrc fixe la version 22.12, celle
qu'utilise l'image node:22-slim. Le plancher est passé de 20 à 22 avec la
passe de qualité : son détecteur exige Node 22.12+, et Node 20 est sorti du
support en avril 2026.
Il n'y a ni base de données, ni module natif à compiler.
ffmpeg est le seul binaire externe, et il ne sert qu'à la vidéo au défilement.
Sans lui, tout le reste fonctionne, et cette fonctionnalité-là se déclare
indisponible au lieu d'échouer.
Installation#
git clone https://github.com/PetitOursManu/Mocky.gitcd Mockydocker compose up -d --buildMocky écoute sur http://localhost:8787. Les comptes, les projets, les images
et les séquences vidéo sont conservés dans le volume mocky-data.
Le port n'est publié que sur 127.0.0.1. Plusieurs routes dépensent vos crédits
de modèle, donc l'instance n'est pas joignable depuis le réseau tant que vous ne
l'avez pas demandé. Voir Déploiement.
npm installnpm run dev:allPuis ouvrez http://localhost:5173.
Utilisez dev:all, pas dev. npm run dev ne lance que le serveur web, sans le
back-end. Or Mocky exige un compte, et les comptes vivent sur le back-end : la
boîte de connexion annoncera qu'elle ne peut pas le joindre. Muse, la
bibliothèque média et la synchronisation sont indisponibles dans ce mode aussi.
En développement, Vite renvoie /api et /sso vers http://localhost:8787, et
sert lui-même /__provider par un middleware qui importe le module du back-end
(server/provider-proxy.js). Les deux environnements appliquent donc la même
protection contre le SSRF et la même liste de sous-chemins autorisés.
npm run build # tsc && vite build → dist/npm start # Express sert dist/, l'API et le proxy sur :8787npm start sans npm run build démarre bien, mais chaque page est un 404 nu. Le
serveur affiche un avertissement, et /api/health répond 503 avec
frontendBuilt: false. C'est ce que lit la sonde de santé du conteneur.
Première utilisation#
Le bandeau est le même sur tous les écrans :

- Mocky Retour à vos projets, de partout.
- Le projet ouvert Le projet où vous êtes. Son nom est aussi le titre de sa carte à la une sur la page des projets.
- Accueil Vos projets, leurs dossiers, et
Nouveau projet. - DESIGN.md Le système de design dont part chaque génération, en Markdown que vous pouvez modifier ou charger.
- Média Toutes les images, clips et films générés ou importés.
- Réglages Votre fournisseur de modèle, votre clé et votre modèle, votre compte, et le carillon de fin de génération.
- Admin Le tableau de bord de l’instance. Visible des seuls administrateurs.
- Docs Cette documentation, dans un nouvel onglet.
- Thème Papier ou Encre. L’icône montre où vous allez, pas où vous êtes.
- Compte Votre image et votre nom ; le menu vous déconnecte.
Ouvrez MockyFait
La boîte de connexion apparaît et ne peut pas être fermée. Il n'existe pas de mode anonyme.
Créez le premier compteFait
Il devient l'administrateur de l'instance. Il n'y a pas de procédure de mot de passe oublié, et promouvoir un autre compte se fait en éditant
server/data/users.jsonà la main.Configurez un modèle de texteFait
Voir la section suivante.
Décrivez un écran et générez-leFait
Qui devient l’administrateur de l’instance ?
Le premier compte créé sur une instance vide en est l’administrateur. Il n’y a pas de mot de passe oublié : créez-le vous-même, juste après l’installation.
Pas tout à fait. Réessayez.
Le , où l’on décrit un écran :

- Format Mobile, Ordinateur ou Tablette pour un écran. Pour un document, les mêmes puces deviennent des formats de page.
- Type d’écran Le genre d’écran ou de document ; sa structure guide la génération. Il reste armé tant que vous ne le retirez pas.
- Nouvelle direction Cette demande réécrit la direction artistique du projet. La case se décoche après l’écran.
- Muse Inspiration, direction artistique, vrais textes et images pour le prochain écran.
- Motion Ultra Un réglage de projet : un storyboard et une série d’images pour chaque nouvel écran.
- Captures d’un site Joignez des captures d’un site existant pour le reproduire ou le refondre. Elles ne sont jamais conservées.
- La demande Décrivez l’écran.
Ctrl/⌘ + Entréel’envoie. - Améliorer Réécrit vos quelques mots en un brief complet pour le format et le type choisis.
Revenir à votre textel’annule. - Générer Crée l’écran — ou
Mettre à jourquand des écrans sont sélectionnés.
Un projet garde une seule , pour que ses écrans aient l’air d’un produit et non de cinq esquisses. Elle est fixée par le premier écran généré, puis laissée tranquille. Nouvelle direction est l’exception : cochez la case et la demande que vous vous apprêtez à envoyer réécrit la direction pour tous les écrans suivants. Elle se décoche toute seule une fois cet écran généré — c’est un geste ponctuel, pas un mode.
Deux autres choses voyagent d’un écran à l’autre sans qu’on ait à le demander : le nom du produit et son logo. Une direction décrit une palette et une voix, donc rien en elle n’empêchait un deuxième écran d’inventer une deuxième marque — c’est précisément ce qui arrivait, jusqu’à ce que le premier écran soit montré au modèle comme l’identité à respecter. La navigation, les sections et la mise en page restent libres ; épinglez un écran comme référence de mise en page (clic droit sur un écran) si vous voulez les figer aussi.
Deux boutons de la barre de zoom naviguent à votre place. Tout afficher cadre tous les écrans et — c’est la partie qui mérite d’être connue — continue de le faire : ouvrez un panneau, redimensionnez la fenêtre, tournez une tablette, et le plan se recadre tout seul. Jusqu’à ce que vous vous déplaciez ou zoomiez à la main, geste qui vous rend la vue pour de bon. Zoomer sur le dernier écran saute vers celui que vous venez de générer, qui n’est pas forcément celui que vous avez sélectionné. Les deux sont dans L’interface, avec le reste de la barre.
L’accueil après une première génération :

- Navigation La même sur toutes les pages.
- Thème Papier ou Encre, retenu par le navigateur.
- Compte Connecté : vos projets vous suivent d’un appareil à l’autre.
- Nouveau projet Un canevas vide, nommé d’après sa première demande.
- Nouveau dossier Les dossiers sont des noms posés sur les projets ; glissez ou classez un projet pour en remplir un.
- Le projet à la une Le plus récent, avec ses écrans.
Ouvriry entre ; les autres sont listés dessous, par dossier.
Les règles de compte#
| Règle | Valeur |
|---|---|
| Longueur minimale du nom d'utilisateur | 3 caractères |
| Mot de passe à l'inscription publique | 8 caractères (MIN_NEW_PASSWORD) |
| Mot de passe créé ou réinitialisé aujourd'hui | 8 caractères (MIN_NEW_PASSWORD) |
| Durée d'une session | 90 jours, glissante |
| Limite sur les routes d'authentification | 8 tentatives par minute et par IP |
Les trois chemins exigent désormais la même longueur. L'inscription publique acceptait six caractères — c'était le seul chemin qu'un attaquant peut atteindre sans session, et sur une instance vierge le compte qu'il crée est l'administrateur.
Les inscriptions publiques se ferment d'elles-mêmes une fois le premier compte créé. Un administrateur les rouvre depuis l'écran Admin s'il veut inviter quelqu'un.
Les mots de passe sont hachés avec scrypt (node:crypto) et comparés en temps
constant. Changer un mot de passe révoque toutes les sessions, y compris
celle en cours, qui reçoit immédiatement un jeton neuf.
Configurer un modèle de texte#
Il y a deux modes, et ils s'excluent. Le mode instance l'emporte toujours sur le mode navigateur.
Mode A — par navigateur (le défaut)#
Allez dans Réglages, choisissez un fournisseur, collez votre clé d'API,
choisissez un modèle et cliquez sur Tester la connexion. La liste est groupée
— les éditeurs de modèles (OpenAI, Anthropic, Google Gemini, Mistral, DeepSeek,
xAI, Moonshot), les hébergeurs de modèles ouverts (Ollama Cloud, OpenRouter, Groq,
Together, Fireworks, Cerebras, Hugging Face), et Compatible OpenAI pour tout le
reste — et chacun remplit sa propre URL de base et un modèle par défaut. Ollama
Cloud, sur https://ollama.com, est le défaut.
La clé est conservée dans le localStorage de ce navigateur, sous
mocky.settings.v1. Elle n'est jamais écrite côté serveur. Elle traverse
/__provider en en-tête Authorization, le temps de chaque requête.

Compatible OpenAI pour le reste.- Fournisseur Seize, groupés : les éditeurs de modèles, les hébergeurs de modèles ouverts, et
Compatible OpenAIpour le reste. - URL de base Remplie par le fournisseur. Ne la changez que pour votre propre serveur.
- Clé d’API Gardée dans ce navigateur seulement, envoyée en jeton Bearer avec chaque requête.
- Modèle Listé depuis le fournisseur une fois la clé saisie ; vous pouvez aussi taper un nom.
- Tester la connexion Une petite requête qui dit si la clé et le modèle répondent.
Réglages. C’est le mode par navigateur : la clé ne quitte pas cette machine.
Ce mode proposait autrefois un seul fournisseur, Ollama Cloud — non pas parce
que les autres ne pouvaient pas fonctionner, mais parce que le navigateur ne
disait jamais au serveur quel dialecte parlait son endpoint. Il le dit
maintenant (en-tête x-provider-kind), et src/lib/settings.ts offre la même
liste que l'écran Admin, moins fal, dont l'authentification Key ne peut pas
passer par l'en-tête Bearer qu'envoie un navigateur. Les deux listes sont tenues
égales par tests/text-providers-mirror.test.js.
Plus bas sur la même page, Notification décide si Mocky vous prévient quand une
génération se termine pendant que vous êtes dans un autre onglet :

- Son de fin de génération Un carillon bref quand une génération se termine alors que Mocky n’est pas l’onglet affiché, plus grave si elle a échoué, et ✓ ou ⚠ dans le titre de l’onglet.
- Tester Le joue tout de suite, pour vérifier vos haut-parleurs.
Mode B — pour toute l'instance (administrateur)#
Allez dans Admin → Fournisseurs, section Modèles de texte. La clé est stockée sur le serveur, dans
server/data/text-config.json. Elle est utilisée par tous les comptes, et les
Réglages personnels de chacun sont alors ignorés.
server/text/config.js déclare seize fournisseurs.

- Le tableau de bord Vue d’ensemble, activité en direct, utilisateurs, sessions, système, fournisseurs, journal d’audit, annonce, maintenance. Voir Le tableau de bord d’administration.
- Génération des écrans Un fournisseur choisi ici sert à tous les comptes, et les Réglages personnels sont ignorés.
Aucunlaisse chacun sur sa propre clé. - Muse — dossier de design Un second modèle facultatif, moins cher, pour Muse ;
Aucunréutilise le modèle de génération.
Admin. Un modèle défini ici sert à tous les comptes, et les Réglages personnels de chacun sont alors ignorés.
| id | Dialecte | URL de base par défaut | Modèle par défaut |
|---|---|---|---|
ollama-cloud | Ollama | https://ollama.com | gpt-oss:120b |
openai | OpenAI | https://api.openai.com | gpt-4o-mini |
anthropic | OpenAI | https://api.anthropic.com | claude-sonnet-4-5 |
gemini | OpenAI | https://generativelanguage.googleapis.com/v1beta/openai | gemini-3.8-flash |
mistral | OpenAI | https://api.mistral.ai/v1 | mistral-medium-latest |
deepseek | OpenAI | https://api.deepseek.com | deepseek-flash |
xai | OpenAI | https://api.x.ai/v1 | grok-4.7 |
moonshot | OpenAI | https://api.moonshot.ai/v1 | kimi-k3 |
openrouter | OpenAI | https://openrouter.ai/api | openai/gpt-4o-mini |
groq | OpenAI | https://api.groq.com/openai/v1 | openai/gpt-oss-120b |
together | OpenAI | https://api.together.ai/v1 | openai/gpt-oss-120b |
fireworks | OpenAI | https://api.fireworks.ai/inference/v1 | accounts/fireworks/models/gpt-oss-120b |
cerebras | OpenAI | https://api.cerebras.ai/v1 | gpt-oss-120b |
huggingface | OpenAI | https://router.huggingface.co/v1 | openai/gpt-oss-120b |
fal | OpenAI, auth Key | https://fal.run/openrouter/router/openai | openai/gpt-4o-mini |
openai-compatible | OpenAI | (à vous de la saisir) | (à vous de le saisir) |
openai-compatible couvre le reste — Qwen, Cohere, LM Studio, vLLM — tout ce qui
expose l'API de chat d'OpenAI. Une URL de base qui finit déjà par une version
(…/v1, ou …/v1beta/openai) est utilisée telle quelle ; les autres reçoivent
/v1. C'est pour cela que l'URL que la documentation d'un éditeur vous dit de
coller fonctionne telle que collée.
Le bloc Utilisation, sur le même écran#
Sous les deux colonnes de modèles, en pleine largeur, se trouve Utilisation — une ligne par compte, avec une barre. Pleine largeur plutôt que glissé dans la liste des comptes, parce qu'une ligne avec une barre a besoin de la largeur pour rester lisible aux tailles que la grille donne à une colonne.
Par compte : trois décomptes nommés — Projets, Écrans, Médias — et le total sur disque, aligné à droite. La barre sous la ligne porte le détail en infobulle : « {data} de projets · {media} de médias · {avatar} d'avatar ».
C'est une route à part, GET /api/admin/usage, et ce n'est pas un accident de
découpage. La produire suppose d'analyser le blob de projets de chaque
utilisateur — la seule chose que le serveur traite par ailleurs comme une chaîne
opaque — et de parcourir un répertoire par séquence de défilement. Repliée dans
la liste des comptes, elle ferait payer ce coût à quiconque ouvre l'onglet Admin,
qu'il la regarde ou non.
Trois lectures méritent d'être connues avant d'agir sur ce tableau :
- « Données illisibles » en face d'un compte, et un tiret cadratin là où seraient ses décomptes de projets et d'écrans. Un blob qui ne s'analyse pas n'a pas zéro projet, et un zéro affirmé enverrait un administrateur chasser un problème qui est le sien. Les octets restent comptés ; seul le détail manque.
- « dont {n} supprimé(s) en attente de synchronisation » sous un décompte de projets. Les pierres tombales restent dans le blob pour qu'une suppression puisse voyager jusqu'aux autres appareils de l'utilisateur. Elles coûtent du stockage sans être des projets, ce qui est exactement le genre d'écart qui fait paraître un total faux.
- « Sans propriétaire », sur sa propre ligne en bas. Des médias déposés avant que la propriété ne soit enregistrée, ou appartenant à un compte supprimé. Ces octets sont réels et leur propriétaire est inconnu : ils sont donc rapportés à part, plutôt que devinés ou répartis sur tout le monde. Les médias étant dédupliqués, un fichier déposé par deux personnes est un seul fichier dont la taille est partagée entre elles — c'est ce qui fait que la colonne totalise ce que le volume contient réellement.
En haut à droite de l'en-tête de section, à côté du mot Utilisation, se
trouve le total de l'instance rapporté à MOCKY_MAX_STORAGE_MB — ou « sans
plafond » quand cette variable vaut 0. Voir le
Déploiement.
Configurer OpenRouter#
- Admin → Modèles de texte → profil Génération → OpenRouter.
- URL de base :
https://openrouter.ai/api. N'ajoutez pas/v1. La couche de traduction ajoute elle-même/v1/chat/completions, donc un/v1en trop produit un 404 sur/v1/v1/chat/completions. - Clé d'API : votre valeur
sk-or-…, envoyée enAuthorization: Bearer …. - Modèle : l'identifiant OpenRouter complet, sous la forme
vendeur/modèle. Par exempleopenai/gpt-4o-mini,anthropic/claude-3.5-sonnetougoogle/gemini-2.5-flash. - Cliquez sur Tester. Une vraie requête part, par la même couche de traduction que celle qu'utilise l'application.
Le test distingue trois échecs :
- une réponse HTTP non-2xx ;
- une réponse vide d'un modèle « reasoning » qui a dépensé son budget de jetons à réfléchir ;
- une réponse coupée, signalée par
finish_reason: length.
Un HTTP 200 sans texte visible n'est pas un succès, et le test le dit. Ce modèle produirait des écrans vides.
Une erreur fréquente. Coller un identifiant de modèle d'images dans le champ texte. C'est facile avec fal, qui vend les deux sous une seule clé. Le fournisseur répond « is not a valid model ID », ce qui n'explique rien.
looksLikeImageModel()reconnaît le motif —text-to-image,flux,seedream,sdxl,dall-e,veo,klinget similaires — et affiche un message qui nomme le problème.
Les deux profils de texte#
| Profil | Son travail | Reçoit l'image d'inspiration |
|---|---|---|
generation | Écrit les écrans et exécute le planificateur | Oui. C'est ce profil qu'on sonde pour savoir s'il gère la vision |
inspiration | Écrit le dossier de design de Muse | Seulement si on le sonde explicitement |
Le profil voyage dans un en-tête x-mocky-profile: inspiration. Tout le reste, y
compris l'absence d'en-tête, vaut generation.
Laisser le profil inspiration vide le fait retomber sur generation, ce qui
est le comportement d'origine à un seul modèle. Le dossier n'écrit pas de code :
un modèle moins cher suffit généralement.
Les fichiers de configuration écrits avant l'existence des profils sont un objet
plat. liftLegacy() les remonte dans generation à la lecture, clés comprises.
Ce que le proxy accepte#
/__provider ne relaie que deux sous-chemins :
export const ALLOWED_SUBPATHS = new Set(['/api/chat', '/api/tags'])C'est une liste d'autorisation, pas un filtre. Avant qu'elle existe, un
DELETE /__provider/api/delete portant {"name":"llama3"} atteignait l'Ollama
configuré et supprimait un modèle. La réécriture du corps ne remplace que
model, donc name passait intact.
Les redirections sont signalées, pas suivies (redirect: 'manual'). Une cible
qui passe la protection SSRF puis répond 302 → http://169.254.169.254/… la
contournerait sinon d'un seul pas.
Configurer la génération d'images#
Allez dans Admin → Génération d'images (Muse). Les clés sont stockées sur le
serveur et ne repartent jamais vers le navigateur : publicView() remplace
chacune par un booléen hasApiKey ou hasToken.
Le bouton Tester génère réellement une image jetable — une pomme rouge sur fond blanc, en 1024×1024 — et ne la range pas dans la bibliothèque.
| Fournisseur | Clé | Détails |
|---|---|---|
pollinations | Non | Le défaut. Gratuit, basé sur des URL ; peut ajouter un filigrane. Limité à environ une requête toutes les 15 secondes, donc les requêtes sont mises en file côté serveur. Un jeton gratuit facultatif relève la limite |
fal | Oui | fal.ai, FLUX et compagnie. L'endpoint synchrone est utilisé : préférez un modèle rapide. Seul fournisseur capable de faire de la vidéo |
openai-image | Oui | Tout endpoint exposant POST {baseUrl}/v1/images/generations : OpenAI, LiteLLM, passerelles compatibles |
cloudflare-workers-ai | Oui | Palier gratuit généreux. Demande un identifiant de compte et un jeton ayant la permission Workers AI |
sd-webui | Non | Votre propre instance Automatic1111, Forge ou SD.Next lancée avec --api. Rien ne sort de votre machine |
none | — | Muse tourne quand même. Les emplacements d'image reçoivent des aplats issus de la palette |
Trois profils d'images#
Les trois métiers sont réellement différents, donc ils ont des réglages séparés.
content produit les images posées dans l'écran : visuel principal, produits,
fonds. Il peut y en avoir plusieurs par écran, donc ce profil doit être rapide et
bon marché. C'est le chemin d'origine, sans configuration, et Pollinations en est
le défaut.
inspiration produit l'unique planche de direction artistique montrée au
modèle. Elle doit convaincre, donc elle mérite un modèle plus lent et plus cher.
Laisser son fournisseur vide le fait retomber sur content.
edit fait de l'image-vers-image : une image existante entre, une dérivée
sort. C’est le profil des variantes de Motion Ultra. Facultatif comme
inspiration, mais facultatif dans l'autre sens : le laisser vide ne retombe
sur rien du tout, cela veut dire que l'image-vers-image est désactivée sur cette
instance. Un modèle texte-vers-image à qui l'on donne une image source rendrait
une image issue du seul texte, présentée comme une dérivée de la vôtre — et rien
en aval ne saurait faire la différence. Emprunter la clé du profil content
serait donc exactement le mensonge que ce profil existe pour empêcher.
Sa liste de fournisseurs est plus courte que les autres, et le panneau dit
pourquoi : seuls fal, openai-image, cloudflare-workers-ai et sd-webui
acceptent une image d'entrée. Pollinations ne le peut pas — son API prend une URL
que ses serveurs vont chercher, or les images de Mocky ne sont servies que par
votre instance. Les modèles par défaut diffèrent aussi de ceux du texte-vers-image
(fal-ai/flux/dev/image-to-image, @cf/runwayml/stable-diffusion-v1-5-img2img) :
hériter des autres livrerait un profil configuré pour échouer. Le bouton
« Tester » envoie une vraie image source, parce qu'un test texte-vers-image
réussit contre un modèle incapable d'éditer.
sd-webuiest appelé par le serveur de Mocky et pointe par définition vers une adresse locale. Il contourne donc volontairement la protection SSRF appliquée aux URL non fiables. Seul un administrateur peut le régler.
Vidéo au défilement#
Deux prérequis indépendants. Admin → Génération d'images → Vidéo les signale séparément, parce qu'ils se réparent à des endroits complètement différents.
| Prérequis | Détail |
|---|---|
| Un fournisseur vidéo | fal uniquement. Aucun autre fournisseur configuré n'a d'endpoint texte-vers-vidéo. Le modèle par défaut est fal-ai/ltx-video |
ffmpeg | Fourni dans l'image Docker. Depuis les sources, à installer vous-même |
GET /api/videos/availability renvoie
reason: 'no-provider' | 'no-key' | 'no-ffmpeg' | null, ordonné par ce qu'il faut
corriger en premier.
Importer votre propre clip ne demande que ffmpeg : pas de fournisseur, pas
de clé, aucun coût. Une instance qui n'a jamais configuré fal peut donc utiliser
toute la fonctionnalité avec ses propres images.
Motion Ultra#
Une autre fonctionnalité que la précédente, et le singulier est ce qui permet de
les distinguer dans le code : server/videos/ découpe des séquences au
défilement, server/video/ fabrique des films. Celle-ci transforme des images de
la médiathèque en .mp4.
Elle est désactivée par défaut, et son moteur de rendu n'est pas installé par défaut, ce qui relève de la licence plutôt que de la technique. Remotion est gratuit pour les particuliers, les organisations à but non lucratif et les sociétés jusqu'à trois salariés, et sa licence ne traite pas de la redistribution au sein d'un produit auto-hébergé — il vit donc dans une image séparée que personne ne construit par accident. Pourquoi toute la fonctionnalité est bâtie autour de cela est dans Motion Ultra.
Trois étapes, dans cet ordre.
1. Construire et lancer le worker. Depuis la racine du dépôt :
docker compose --profile video-export up -d --buildSans --profile video-export, rien ici n'est construit, créé ni démarré, et
docker compose up -d se comporte exactement comme avant. Construire cette image
est le moment où la question de licence devient la vôtre : lisez d'abord
https://www.remotion.dev/, et notez que le seuil compte les salariés de votre
organisation, pas les comptes de cette instance.
2. L’activer dans Administration → Motion Ultra.
| Réglage | Détail |
|---|---|
| Activer Motion Ultra | L’interrupteur maître. Fermé, personne n'exporte, quelle que soit la portée |
| Portée | Tout le monde, ou une liste de comptes. Un administrateur n'est pas autorisé d'office — un rendu coûte du processeur et se compte par compte, donc l'accès s'accorde explicitement, y compris à soi-même |
| URL du worker de rendu | http://video-worker:3030 par défaut, c'est-à-dire le nom du service Compose sur un pont interne. Cela a l'air de ne pas pouvoir marcher : c'est la troisième dérogation réservée à l'administrateur au garde SSRF, et le raisonnement est dans les invariants |
| Clé de licence Remotion | Facultative. Stockée côté serveur, jamais renvoyée au navigateur. En renseigner une active la télémétrie sortante qu'un rendu sous licence exige à partir de Remotion 5.0 ; sans clé, le conteneur du worker n'a aucune sortie réseau |
Le panneau sonde le worker et rapporte Disponible avec sa version,
Injoignable, Non configuré, ou une adresse qu'il a refusée avant tout appel.
Ce dernier cas mérite d'être lu attentivement : rien n'a été contacté, donc
redémarrer le worker n'y changera rien — seuls http:// et https:// sont
acceptés.
3. S'en servir. Plus → Motion Ultra dans un projet. Vingt scènes au plus, deux
minutes au plus, et pas de son.
Les variantes — « Partir d'une image », dans ce panneau — sont la seule partie qui s'appuie sur un autre réglage. Avec un profil d'image « edit » configuré, ce sont de vraies dérivations de votre image ; sans lui, ce sont des sœurs nées du même texte, et le panneau le dit avant que les appels au fournisseur soient dépensés.
Serveurs MCP#
Les serveurs MCP locaux sont déclarés dans mocky.mcp.json, à la racine du
dépôt, et lancés par le back-end en stdio. Le fichier livré en déclare un seul :
{ "mcpServers": { "fetcher": { "command": "npx", "args": ["-y", "fetcher-mcp"], "autoStart": false, "role": "inspiration-fetch", "idleTimeoutMs": 300000 } }}Le routeur associe des rôles sémantiques au serveur qui expose un outil
correspondant, ce qui permet d'en changer sans toucher au code. La santé est
rapportée par GET /api/mcp/status. Les détails sont dans la page
moteur d'inspiration.
Un fichier absent ou invalide n'est jamais fatal. Il donne une liste de serveurs vide, et Muse retombe sur sa bibliothèque de patterns hors ligne.
Commandes d'entretien#
npm run backup # → backups/mocky-YYYY-MM-DD-HHmm.zipnpm run backup -- <dir> # écrire ailleursnpm run check:vendor # vérifier les bundles copiés contre leurs empreintesnpm test # vitest run, la suite complètenpm run test:watchnpm run backup est du Node pur et réutilise l'écrivain ZIP sans dépendance du
dépôt. Il se comporte donc identiquement sous Windows, macOS et Linux.
Pour une instance Docker, sortez d'abord les données du volume :
docker compose cp mocky:/app/server/data ./server/datanpm run backupL'archive contient des empreintes de mots de passe et des jetons de session.
backups/ est ignoré par git ; qu'il le reste.
Diagnostic#
| Symptôme | Cause probable |
|---|---|
| Toutes les pages sont en 404 mais l'API répond | npm start sans npm run build. /api/health indique frontendBuilt: false |
| La connexion ne joint pas le back-end | Vous avez lancé npm run dev au lieu de npm run dev:all |
EADDRINUSE au démarrage | Un autre Mocky occupe le port. Utilisez MOCKY_PORT=8788 npm start |
| Neuf échecs de connexion bloquent toute l'instance | Un reverse proxy sans TRUST_PROXY=1. Toutes les requêtes semblent venir de 127.0.0.1, donc la limite devient un compteur unique partagé |
| HTTP 401 ou 403 du fournisseur | Clé absente ou invalide. En mode instance, la clé du navigateur est ignorée : c'est celle de l'administrateur qui compte |
| Un écran est coupé au milieu d'une chaîne | Le modèle a atteint son plafond de sortie. Mocky le détecte via done_reason ou finish_reason valant length, et le dit, au lieu de laisser une erreur de syntaxe incompréhensible |
Aperçu blanc, console pleine d'erreurs CORS origin 'null' | La maquette a essayé de naviguer hors d'elle-même. Le parent recharge le srcdoc et affiche « les liens sont inertes » |
| Muse ne fait rien | Muse a besoin du back-end. En mode localStorage pur, l'interrupteur est masqué |
Merci pour votre retour !