Two things the site was paying for on every visit.
**www served the whole site.** `web/wrangler.jsonc` binds both `codewhale.net`
and `www.codewhale.net` to this worker as custom domains, and nothing
redirected between them — so every page had a second reachable, indexable URL
and the two hosts split whatever authority they earned. `middleware.ts` now
301s `www` to the apex before the locale and static-asset branches, so a
document that moves does not keep pulling subresources from the host it left.
The redirect keeps path and query, leaves the apex, localhost, and preview
hosts alone, and still carries the security headers.
Doing it in middleware rather than moving the route to the existing
`web/redirect` worker is deliberate: reassigning a custom domain between
workers has a window where `www` answers with nothing, and this ships
atomically with the next deploy.
**The LCP element was a 440 KB PNG.** `app/[locale]/page.tsx` marks the product
screenshot `priority`, so it is the largest contentful paint, and it was served
raw — `next/image` is wired up but the Cloudflare transform binding is not
enabled, so nothing resized or re-encoded it. Re-encoded as lossless WebP:
440,507 -> 172,380 bytes (-60.9%)
Verified pixel-identical before swapping, not assumed — decoded both and
compared: difference bbox `None`, max channel delta 0 across RGBA. A lossy
q88 encode was 41 KB but showed a max channel delta of 67, which is visible
artifacting on terminal text, so it was rejected.
`docs/public-surface-facts.json` holds the README and website screenshots to
one byte-identical canonical asset, so both move together — `assets/screenshot.webp`
is the same file, and the 19 READMEs and their source stamps follow. That
contract is why this is one commit and not two.
The contract test read dimensions from the PNG IHDR; it now parses the packed
14-bit fields of the lossless VP8L header, and still accepts PNG so the asset
can be swapped back without touching the test.
Enabling the Cloudflare Images binding would let `next/image` negotiate AVIF
and per-viewport widths on top of this, but it needs Images enabled on the
zone, so it is left for a deliberate infra change rather than smuggled in here.
Verified: `npx vitest run` — 31 files, 276 tests passing (5 new middleware
tests, confirmed failing without the redirect); `tsc --noEmit` clean;
`check-readme-translations.py` reports 18 in sync; `prepare-release.sh 0.9.10`
clean.
9.7 KiB
Codewhale
Un agent de programmation open source pour votre terminal — apportez votre propre modèle.
Codewhale a commencé comme une expérience native pour DeepSeek. Il est depuis devenu un projet porté par la communauté : un harness de programmation qui convient à une communauté internationale en croissance et prend en charge autant de modèles et de fournisseurs que possible — les modèles ouverts d'abord, hébergés ou locaux, sans en privilégier aucun.
Donnez-lui un fournisseur, un modèle et une tâche. Il lit votre code, modifie
des fichiers, exécute des commandes et vérifie son propre travail, puis
s'arrête quand la tâche est terminée ou qu'il a besoin de vous. Changez de
modèle en cours de tâche avec /model. Travaillez de façon interactive dans
la TUI, ou lancez codewhale exec dans des scripts et en CI. Écrit en Rust,
sous licence MIT, il tourne sur votre machine.
Ce qui ne ressemble pas aux autres harnesses : vous choisissez le modèle de chaque rôle, et ils n'ont pas à correspondre. Une fleet fige un fournisseur, un modèle et un niveau de raisonnement par rôle — ainsi un modèle rapide et bon marché peut diriger un modèle de raisonnement coûteux, ou un builder GLM peut travailler sur la même tâche qu'un reviewer Kimi. Écrivez vos propres rôles et votre propre constitution, et le harness devient le vôtre plutôt que le nôtre.
Nous cherchons toujours des contributeurs et des façons de nous améliorer. Si un modèle ou un fournisseur que vous utilisez manque, ou si quelque chose casse, nous le dire est l'une des choses les plus utiles que vous puissiez faire — voir Contribuer.
English · 简体中文 · 日本語 · Tiếng Việt · Bahasa Indonesia · 한국어 · Español · Português · Русский · Українська · Deutsch · 繁體中文 · हिन्दी · Türkçe · Italiano · Polski · العربية · Català · codewhale.net · Docs · Changelog · Discord
Installation
npm install -g codewhale
Cargo, Docker, Nix, Scoop, les archives précompilées, Android/Termux et un
miroir CNB pour ceux qui n'atteignent pas GitHub sont documentés dans
docs/INSTALL.md. Vous venez de deepseek-tui ? Votre
configuration et vos sessions sont reprises — voir
docs/REBRAND.md.
Utilisation
codewhale auth set --provider deepseek # or export ANTHROPIC_API_KEY, etc.
codewhale # open the TUI
codewhale exec "fix the failing test" # headless
codewhale web # local browser client on 127.0.0.1
Dans la TUI : /model change fournisseur et modèle ensemble, /fleet
constitue et lance l'équipe — un rôle à la fois, chacun avec son propre
modèle —, /undo annule le dernier tour, et /restore <N> ramène
l'espace de travail à un instantané antérieur (/restore seul les
liste). Tab fait défiler Plan / Work / Operate quand le compositeur est vide —
s'il contient du texte, Tab complète les commandes slash et les mentions
@. Shift+Tab fait défiler à tout moment la posture de permission Ask /
Auto-Review / Full Access. ! exécute une commande shell par le chemin
d'approbation habituel.
Ce qu'il fait
- N'importe quel modèle, n'importe quel fournisseur — et n'importe quel
mélange. DeepSeek, Claude, GPT, Kimi, GLM et plus de 30 fournisseurs,
plus votre propre vLLM, SGLang ou Ollama sans clé, le tout via un seul
runtime et un seul jeu d'outils. Le catalogue suit la gamme en direct de
chaque fournisseur — le backend V4 Pro de DeepSeek (libellé
DeepSeek-V4-Pro-0813) reste appelable endeepseek-v4-pro, Grok 4.6 est le défaut xAI direct, et OrcaRouter route viaorcarouter/auto. Un rôle enregistré consigne explicitement sonprovider, sonmodelet son niveau de raisonnement, donc une fleet peut traverser plusieurs éditeurs dans une même exécution, et la route d'un rôle ne dépend jamais du fournisseur qui se trouve actif. Limites de contexte et prix viennent de la vraie route ; un prix inconnu s'affiche comme inconnu, pas comme 0 $. - Un harness que vous rédigez. Les rôles sont des fichiers que vous pouvez lire et modifier — un modèle, une posture d'outils et des consignes permanentes par rôle — gardés dans le projet pour que l'équipe les partage, ou à côté de vos autres réglages personnels pour qu'ils vous suivent d'un dépôt à l'autre. Une constitution consigne comment vous voulez que l'agent se comporte d'une session à l'autre, pour que le harness suive votre pratique plutôt que la nôtre.
- Lecture seule jusqu'à ce que vous autorisiez davantage. Le mode Plan
ne peut pas modifier de fichiers, et les approbations filtrent les
commandes risquées. Quand un sandbox OS enveloppe réellement une
commande, Codewhale le dit : Seatbelt sur macOS lorsqu'il est
disponible, bubblewrap en option sur Linux. Le
constitution.jsond'un dépôt se compile en verrous d'écriture que même Full Access ne peut contourner. - Un travail que vous pouvez reprendre. Une fleet consigne chaque
étape dans un registre en ajout seul, donc
fleet resumereprend là où vous vous étiez arrêté.
Intégrations
- DeepSeek Harness (dsh) — connecté via Codewhale.
codewhale integrations dsh connectrelie une installation existante de@deepseek-ai/dshà votre route de fournisseur Codewhale, vos permissions et votre espace de travail, etintegrations dsh install-bundleajoute le bundle de plugins DSH optionnel pour quedsh --profile codewhaleporte cette identité tout seul. Codewhale détient les permissions et l'autorité de cycle de vie ; dsh garde ses propres sessions, profils et identifiants intacts. Voir docs/INTEGRATIONS_DSH.md. - VS Code. Le scaffold officiel de l'extension (
extensions/vscode) ouvre Codewhale dans un terminal intégré et expose une Agent View en lecture seule sur le runtime local. C'est une préversion de développement local, pas encore une publication marketplace.
En savoir plus
- docs/PROVIDERS.md — chaque route de fournisseur : hébergée, passerelle et locale
- docs/FLEET.md — les fleets, le registre et la reprise
- docs/WORKFLOW_EXPERIMENTAL_SEARCH.md — recherche expérimentale figée et neutre vis-à-vis des fournisseurs dans Workflow
- docs/CONFIGURATION.md —
config.toml, les hooks et la constitution - docs/AUTHORIZATION_ORDER.md — comment modes, hooks, règles de permission, planchers de sécurité, loi du dépôt, approbations et sandbox se composent
- docs/HOOKS.md — les onze événements de hook du cycle
de vie TUI, leurs payloads, et lesquels parmi trois peuvent orienter un
tour (
codewhale execet les sous-commandes CLI ne déclenchent pas de hooks) - docs/WEB.md — le client navigateur en loopback uniquement et sa frontière d'authentification à usage unique
Tout le reste — modes, raccourcis, détails du sandbox, MCP, l'API runtime et l'architecture — vit dans docs et sur codewhale.net.
Contribuer
Issues, PR, étapes de reproduction, journaux et demandes de fonctionnalités sont tous du vrai travail de projet, et les premières contributions sont les bienvenues. Quand une PR ne peut pas être fusionnée telle quelle, les mainteneurs récoltent ce qui fonctionne et gardent l'auteur crédité — dans le commit, le changelog et docs/CONTRIBUTORS.md.
- Issues ouvertes — les bonnes premières contributions sont ici
- CONTRIBUTING.md — installation de dev et flux de PR
- docs/CONTRIBUTORS.md — toutes celles et ceux qui ont façonné le projet
- Offrez-moi un café
Merci à DeepSeek pour les modèles et le soutien qui ont lancé le projet, à DataWhale 🐋 de nous avoir accueillis dans la famille Whale Brother, et à OpenWarp et Open Design pour la collaboration sur l'expérience d'agent dans le terminal.
Licence
MIT. Projet communautaire indépendant, non affilié à aucun fournisseur de modèles.

