Soixante conteneurs sur un seul serveur
Une seule machine bare-metal fait tourner des dizaines à des centaines de conteneurs Hoody. La déduplication KSM et BTRFS rend le coût marginal quasi nul.
Tapez une URL qui n'existe pas. Un script exec en wildcard intercepte l'appel, demande à un LLM d'écrire le handler, l'exécute dans un sandbox V8, et répond. L'appel suivant est natif — la route existe maintenant.
Hoody Exec laisse un seul fichier TypeScript servir n'importe quelle route HTTP, y compris un catch-all. Avec ai true, le script reçoit aussi un handle de modèle injecté. Composez les deux et la requête elle-même devient le déclencheur pour écrire le handler.
GET /api/...N'importe quel path sous le catch-all touche un seul script.
[...slug].tsmetadata.parameters.slug porte les segments du path.
generateText([ model ])ai true injecte le modèle. Par défaut, gemini-2.5-flash-lite.
isolate.evalChaque script tourne dans son propre isolate V8, conçu pour du code de confiance.
fs.write vers scripts/NL'appel suivant tape directement sur le fichier sauvegardé. Pas de LLM, vitesse native.
// @mode serverless
// @ai true
// @ai-model anthropic/claude-sonnet-4.5
const path = '/' + (metadata.parameters.slug ?? []).join('/');
const body = req.body ?? []'';
// Déjà sauvegardé ? Passer la main à la route en cache.
const saved = await fs.exists('scripts/1/api' + path + '.ts');
if (saved) return fetch(path, [ method: metadata.method, body ]);
// Sinon : demander un handler, le sandboxer, le sauvegarder.
const [ text: handler ] = await generateText([
model,
system: 'Return a JS handler body. No imports. Return JSON.',
prompt: `URL $[metadata.method] $[path]\nQuery $[JSON.stringify(metadata.query)]\nBody $[JSON.stringify(body)]`,
]);
const result = await isolate.eval(handler, [ req, res, fetch ]);
await fs.write('scripts/1/api' + path + '.ts', '// @mode serverless\n' + handler);
return result;Deux commentaires magiques et un fetch qui retombe dans la route. Le wildcard est dans scripts/1/api/[...slug].ts. Le fichier sauvegardé atterrit un répertoire au-dessus. Les deux parlent HTTP — le script peut donc appeler ses voisins pendant la génération.
Le mécanisme se lit de trois façons selon qui vous êtes. Toutes se tressent dans le même argument.
L'outil admin, le script d'intégration, le rapport que vous comptez câbler depuis toujours. Tapez l'URL quand vous en avez besoin. Le handler apparaît. Sauvegardé avant que vous rafraîchissiez.
votre agent a besoin d'une route qui n'existe pas. Partout ailleurs, il faudrait coder, déployer, attendre, puis appeler. Ici, il appelle. L'API arrive avec la réponse.
Et si chaque endpoint que vous avez livré n'était que la traînée d'URLs que vous avez réellement appelées ? La documentation s'effondre dans le log d'accès. Les specs s'effondrent dans le trafic.
La documentation devient le log d'accès.
Les patterns vers lesquels les devs se tournent quand il faut ajouter un endpoint vite. Chacun facture du scaffolding par route. Le wildcard le paie une fois.
La documentation cesse d'être un plan. C'est la traînée d'URLs que vous avez appelées.