Un post, nove lingue, dieci piattaforme: la pipeline di distribuzione di MODAY
Condividi
Un post, nove lingue, dieci piattaforme: la pipeline di distribuzione di MODAY
Scrivo una volta in giapponese, atterra in nove lingue su dieci posti
Ecco cosa succede ogni volta che chiudo una bozza in giapponese per il devlog di MODAY:
| Livello | Destinazione |
|---|---|
| Proprietà mia | Shopify Blog (JA + 8 locali) |
| Distribuito automaticamente via API | dev.to / Qiita / Zenn / GitHub devlog |
| Paste manuale, ma con file di handoff già pronti | note / Medium / Tumblr |
Tutto quello che devo fare lato scrittura è: chiudere la bozza, lanciare distribute.py una volta. Il resto si propaga da solo.
Ho montato questa pipeline in tre giorni, e ci faccio passare ogni post dal numero uno. Qui sotto la forma reale della cosa, senza romanticismi.
La scelta di design: separare «auto» e «manuale» fin dall'inizio
La prima decisione è stata dividere le destinazioni in due livelli.
Da una parte le piattaforme con un'API di scrittura che funziona (Shopify, dev.to, Qiita, Zenn-via-GitHub, GitHub stesso). Dall'altra quelle senza API, o con un'API ostile (note, Medium, Tumblr). Nel momento in cui provi a unificarle, lo script diventa una palude.
Quindi:
- Livello auto —
distribute.pyfa tutto via HTTP - Livello manuale —
prepare_handoff.pysputa file pronti da incollare che un umano porta nella UI
Il livello manuale è la parte che ancora non sono riuscito a passare all'IA. Ma tutto quello che sta prima del momento dell'incollata è automatizzato.
Cosa fa davvero distribute.py
Il flusso interno è questo:
- Hero gate all'avvio. Se
content/posts/<slug>/hero.pngmanca, lo script si ferma. Senza immagine di copertina, niente distribuzione. È una protezione strutturale contro il classico «cavolo, mi sono dimenticato l'hero». - Pubblica sul blog Shopify Journal, corpo del post + hero in un colpo solo.
- Registra le traduzioni Shopify. Legge i file fratelli
webhook/posts/<NNN>-<slug>-{en,de,es,fr,it,ko,pt-BR,zh-CN}.mde infila tutte e otto le locali viatranslationsRegisterin un'unica batch. - POST su dev.to, corpo EN, con l'URL del CDN Shopify riutilizzato come cover.
- POST su Qiita, corpo JA con
canonical_urlche rimanda a Shopify. - Zenn — nessuna chiamata API. Zenn non espone un'API di scrittura, quindi ho configurato la sincronizzazione Zenn ↔ GitHub. Un push pubblica un post automaticamente.
- GitHub devlog: commit di
<slug>-ja.md,<slug>-en.md,<slug>-hero.pngnel repomoday-devlog. - Chiama
prepare_handoff.pyper generare i file del livello manuale. - Scrive
status.jsonaccanto al sorgente, registrando URL/ID/timestamp di ogni piattaforma.
Le due parti che mi soddisfano di più sono l'hero gate e la rotta Zenn-via-GitHub. L'hero gate rende strutturalmente impossibile spedire un post senza copertina. E Zenn — che deliberatamente non espone API di scrittura — il post lo riceve lo stesso, perché un git push è tutto quello di cui ha bisogno il ponte.
Cosa fa prepare_handoff.py
Produce file pronti da incollare per le tre destinazioni manuali:
| File | Contenuto | Lingua |
|---|---|---|
note.md |
Originale JA con commenti di istruzione per il paste. Le tabelle vengono convertite in paragrafi «Etichetta: valore» perché note non renderizza le tabelle Markdown. | JA |
medium.html |
Traduzione EN in HTML. Banner di istruzioni in alto con CSS che ne disabilita la selezione, corpo sotto. ⌘+A → ⌘+C copia solo il corpo. | EN |
tumblr.md |
Lede EN (dall'H1 fino al primo H2, hard-cap a 1500 caratteri) + canonical link + blocco di tag in stile Tumblr. | EN |
Il punto non ovvio qui è il dialetto per piattaforma.
note non renderizza le tabelle Markdown — incolli la versione raw e ti compare | header | value | come testo letterale, che fa pena. Quindi prepare_handoff.py riscrive ogni tabella in paragrafi con etichetta in grassetto.
Medium ha il problema opposto: il copia-incolla da qualsiasi fonte tende a trascinarsi dietro metadati. Volevo che chi scrive (io) potesse fare ⌘+A → ⌘+C sulla pagina e portare via solo il corpo. Quindi l'HTML in uscita ha in cima un banner di istruzioni con user-select: none — visibile a chi scrive, invisibile alla clipboard.
La cultura di Tumblr non premia chi ci scarica dentro saggi da 3.000 parole. Quindi estraggo solo il lede e rimando al canonical.
Ogni piattaforma riceve il rispetto del suo dialetto e della sua cultura, in un unico posto centralizzato.
La traduzione la passo all'IA — ma solo dentro l'abbonamento
L'intero pitch di MODAY è «un brand costruito guidato dall'IA», quindi ovvio che anche la traduzione vada all'IA. Recentemente ho cambiato il come.
- Prima:
distribute.pychiamava l'API Anthropic con Claude Haiku per ogni locale. - Adesso: chiedo direttamente a Claude Code (Opus 4.7) di «riscrivere per otto locali», in sessione.
Il motivo è banale e poco glamour: non voglio una seconda bolletta a consumo. L'abbonamento Claude Max già lo pago. Tutto quello che può succedere dentro quell'abbonamento, deve succedere dentro quell'abbonamento.
Questa è meno una scelta tecnica e più una scelta da imprenditore. Per una bottega di una persona sola, la cosa più importante è tenere giù i costi fissi. Far girare un abbonamento Claude Max e contemporaneamente un addebito a consumo sull'API Anthropic per lo stesso task è un modo trasandato di gestire il P&L personale.
L'altra cosa che pesava: la qualità. Le uscite di Haiku-via-API si leggevano come traduzioni — utilizzabili, ma non native. Andare in nove locali vuol dire che mi servono riscritture che si leggano come se un founder locale le avesse scritte lui, sul posto. Senza quello, il brand non atterra in nessuno di quei mercati.
Quel tipo di riscrittura non è traduzione; è localizzazione-riscrittura. Farla passare per Claude Code su Opus 4.7 mi ha dato un output sensibilmente migliore rispetto alla vecchia pipeline Haiku-API.
Tagliando il costo, è salita anche la qualità. Non me lo aspettavo.
La giornata tipo, in pratica
Il ritmo operativo adesso è questo:
- Scrivo la bozza JA nell'app Claude su mobile (di solito in treno).
- In una sessione di Claude Code, la deposito in
webhook/posts/004-<slug>-ja.md. - Chiedo a Claude Code di «riscrivere per otto locali» — produce
webhook/posts/004-<slug>-{en,de,es,fr,it,ko,pt-BR,zh-CN}.md. - Genero l'hero con
webhook/generate_hero.py→content/posts/<slug>/hero.png. - Lancio
python webhook/distribute.py webhook/posts/004-<slug>-ja.md.
- Distribuisce in automatico su Shopify (JA + 8 locali), dev.to, Qiita, GitHub.
- Chiamaprepare_handoff.pyper piazzarecontent/posts/<slug>/{note.md, medium.html, tumblr.md}. - Apro note / Medium / Tumblr nel browser, incollo i file già preparati.
L'unico passo dove uso davvero il cervello è il numero 1. Tutto il resto è istruzioni a Claude Code, esecuzione di uno script e incollata.
Da «mi è venuta un'idea in treno» a «è tutto online» nello stesso giorno
La parte che mi piace di più di tutto questo non è nemmeno lo script — è il flusso lato umano.
Le idee mi arrivano quando sono lontano dalla scrivania. In commuting. Subito prima di dormire. Camminando da qualche parte. È in quei momenti che apro Claude su mobile, richiamo il progetto MODAY, e parlo del post. Quando arrivo a casa, la bozza è praticamente fatta.
Alla scrivania, apro Claude Code, gli passo la bozza, lui produce le riscritture per locale e fa girare la pipeline.
Il tempo che passo seduto a una scrivania a spostare parole avanti e indietro è vicino a zero. Quella è la parte di «brand costruito guidato dall'IA» che, in questo momento, mi sembra davvero reale.
Per chiudere
Anche la pipeline in sé l'ha scritta Claude Code. Io ho solo detto «voglio uno script che distribuisca in nove lingue su dieci piattaforme», e abbiamo lavorato le specifiche parlando.
Sulla to-do ci sono ancora cose: integrare l'API Tumblr, una vista a dashboard di status.json, fan-out automatico sui social. Le aggiungerò mano a mano che il brand cammina.
A presto.
— Yoskee
moday.me
Indossa il giorno. — Le T-shirt MODAY
| Set | Pezzi | Prezzo |
|---|---|---|
| La settimana intera → | Mon–Sun (7) | $159 |
| La settimana lavorativa → | Mon–Fri (5) | $119 |
| Pacchetto Starter → | Mon · Wed · Fri (3) | $79 |
| Il weekend → | Sat · Sun (2) | $55 |
Spedizione gratuita oltre $99 · 8 colori × 6 taglie · 9 lingue