CMS Node.js · TypeScript · self-hosted

Un CMS che la tua AI
sa davvero gestire.

NodePress è un CMS in stile WordPress scritto in TypeScript: pagine rese dal server, editor a blocchi, contenuti multilingua e temi che si modificano dal vivo — più un server MCP integrato, così Claude e gli altri assistenti gestiscono tutto il sito in linguaggio naturale.

Node.js 22 · MySQL / MariaDBSelf-hosted, anche con DockerMCP con OAuth 2.1
~/mikedag.dev
~ claude mcp add --transport http nodepress https://mikedag.dev/mcp
✓ Autenticato via OAuth · accesso: admin
> Aggiungi una pagina NodePress sotto /apps, in italiano e inglese
→ content_create · theme_write_files · theme_preview
✓ Fatto — la stai leggendo.
~ 
Node.jsTypeScriptReact RouterSSRMySQLMariaDBDrizzle ORMTiptapshadcn/uiMCPOAuth 2.1Tailwind CSS v4MonacoesbuildDocker
Cosa c'è dentro

Tutto quello che serve a un sito. Niente di più.

Editor a blocchi e multilingua

Editor Tiptap con immagini, gallerie, embed e sezioni del tema. Ogni pagina esiste per lingua, con slug tradotti, campi SEO e redirect 301 automatici quando un percorso cambia.

Tiptapi18nSEO301

Server MCP integrato

50 strumenti per contenuti, media, menu, redirect, lingue, utenti e temi. Si collega a claude.ai, Claude Desktop, Claude Code o Cursor con OAuth 2.1 o una API key.

MCPOAuth 2.1PKCE

Temi nel database

I temi si creano e si modificano a runtime, senza ricompilare. Ogni salvataggio produce una build bozza; pubblicando, le build restano nello storico per il rollback.

BozzeBuildRollback

Editor visuale

Template composti da sezioni con il trascinamento, token di design, valori per breakpoint e visibilità, anteprima da mobile a desktop.

SezioniTokenResponsive

Sicuro di default

Il markup dei temi diventa un AST JSON: il server non esegue mai il codice del tema. CSP con nonce a ogni richiesta, cookie Strict e origine separata per il pannello.

CSPSameSiteOrigine admin
Temi

JSX, ma senza JavaScript.

I template sono file .np: HTML, espressioni, && e .map(). Vengono compilati in un AST che React interpreta, quindi un errore è un errore con file, riga e colonna — non una falla di sicurezza.

  • Editor Monaco nel pannelloAutocompletamento di tag, componenti, filtri e token CSS, con gli errori sottolineati mentre scrivi.
  • Tailwind CSS v4, se vuoiImportalo in un foglio di stile e si compila a ogni salvataggio, senza configurazione.
  • CLI per lavorare con gitnp theme pull, push e watch sincronizzano una cartella locale, con rilevamento dei conflitti a tre vie.
themes/mikedag
theme.json        nome, template, token di design
templates/*.np    template scritti a mano
templates/*.json  template composti da sezioni
sections/*.np     schema, markup, stile con scope
groups/*.json     header e footer condivisi
components/*.np   componenti riusabili
styles/*.css      CSS con nesting o Tailwind
scripts/main.js   JS del browser, con esbuild
assets/*          font e immagini con hash
Nato per l'AI

Parla al tuo sito. Ti ascolta.

Basta l'indirizzo /mcp: l'assistente apre il pannello, accedi e scegli cosa autorizzare. Da lì scrive pagine in Markdown, carica immagini, sistema i menu e modifica i temi in bozza, con l'anteprima prima di pubblicare.

11

Contenuti

content_create · content_save_translation · content_seo_analysis
7

Media

media_upload · media_update · media_folders
18

Sito

menu_save · redirect_create · language_add · settings_update
12

Temi

theme_write_files · theme_preview · theme_publish
2

Orientamento

site_info · guide

Sicuro per costruzione

PKCE obbligatorio, access token di un'ora legati a /mcp, refresh token ruotati a ogni uso e solo hash nel database. I tool distruttivi sono marcati, così il client chiede conferma.

Installazione

In piedi in tre comandi.

~/nodepress
# Node.js 22.22+ · MySQL 8 o MariaDB 10.6+
~ npm install
~ cp .env.example .env   # DATABASE_URL, SESSION_SECRET
~ npm run dev
→ http://localhost:5173/admin/setup  # crea admin, sito e lingua

# In produzione, anche con Docker
~ docker build -t nodepress .
~ docker run -p 3000:3000 --env-file .env -v nodepress-media:/app/storage nodepress

Scritto in TypeScript, alla luce del sole.

Il codice è su GitHub, roadmap compresa. Idee, issue e pull request sono benvenute.