@nextblock-cms/db 0.17.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/supabase/migrations/02000_catchup_gen1.sql +5880 -0
- package/supabase/migrations/{00000000000000_baseline_schema.sql → 02001_baseline_schema.sql} +305 -25
- package/supabase/migrations/{00000000000001_baseline_constraints_and_indexes.sql → 02002_baseline_constraints_and_indexes.sql} +194 -3
- package/supabase/migrations/{00000000000002_baseline_security_and_grants.sql → 02003_baseline_security_and_grants.sql} +403 -161
- package/supabase/migrations/02004_baseline_seed.sql +565 -0
- package/supabase/migrations/00000000000003_baseline_seed.sql +0 -468
- package/supabase/migrations/00000000000004_default_logo_email_safe.sql +0 -24
- package/supabase/migrations/00000000000005_add_custom_canonical.sql +0 -13
- package/supabase/migrations/00000000000006_home_live_demo_promo.sql +0 -67
- package/supabase/migrations/00000000000007_home_live_demo_promo_copy_fix.sql +0 -49
- package/supabase/migrations/00000000000008_setup_article_reorder.sql +0 -30
- package/supabase/migrations/00000000000009_home_live_demo_promo_contrast.sql +0 -52
- package/supabase/migrations/00000000000010_drop_github_username.sql +0 -79
- package/supabase/migrations/00000000000011_language_detection_admin_only.sql +0 -21
- package/supabase/migrations/00000000000012_cortex_ai_stock_photo_settings.sql +0 -25
- package/supabase/migrations/00000000000013_youtube_nocookie_embeds.sql +0 -136
- package/supabase/migrations/00000000000014_site_themes.sql +0 -254
- package/supabase/migrations/00000000000015_scheduled_publishing.sql +0 -43
- package/supabase/migrations/00000000000016_product_revisions_and_revision_baseline.sql +0 -310
- package/supabase/migrations/00000000000017_cortex_ai_mcp_server.sql +0 -91
- package/supabase/migrations/00000000000018_site_scripts.sql +0 -96
- package/supabase/migrations/00000000000019_site_script_revisions.sql +0 -85
- package/supabase/migrations/00000000000020_updating_article.sql +0 -162
- package/supabase/migrations/00000000000021_updating_article_git_merge.sql +0 -91
- package/supabase/migrations/00000000000022_updating_article_accuracy.sql +0 -94
- package/supabase/migrations/00000000000023_updating_article_layout_not_host.sql +0 -87
- package/supabase/migrations/00000000000024_updating_article_newline_fix.sql +0 -70
- package/supabase/migrations/00000000000025_rebrand_nextblock_dev.sql +0 -53
- package/supabase/migrations/00000000000026_product_inquiries.sql +0 -118
- package/supabase/migrations/00000000000027_message_threads.sql +0 -391
- package/supabase/migrations/00000000000028_interaction_replies.sql +0 -86
- package/supabase/migrations/00000000000029_form_endpoints_default_empty.sql +0 -52
- package/supabase/migrations/00000000000030_seo_redirects_and_robots.sql +0 -149
- package/supabase/migrations/00000000000031_seo_robots_settings_admin_only.sql +0 -35
- package/supabase/migrations/00000000000032_seed_seo_score_optimizations.sql +0 -1172
- package/supabase/migrations/00000000000033_seed_seo_score_optimizations_p2.sql +0 -353
- package/supabase/migrations/00000000000034_seed_seo_french_legal_readability.sql +0 -101
- package/supabase/migrations/00000000000035_digital_products_seo_optimizations.sql +0 -134
- package/supabase/migrations/00000000000036_seed_posts_missing_seo_metadata.sql +0 -37
- package/supabase/migrations/00000000000037_reposition_marketing_and_cortex_mcp.sql +0 -501
- package/supabase/migrations/00000000000038_mcp_guide_visual_refresh.sql +0 -64
- package/supabase/migrations/00000000000039_mcp_guide_diagram_dimensions.sql +0 -21
- package/supabase/migrations/00000000000040_home_comparison_chart_free_cms.sql +0 -81
- package/supabase/migrations/00000000000041_marketing_review_free_cms_trial.sql +0 -141
- package/supabase/migrations/00000000000042_how_nextblock_works_css_diagram.sql +0 -66
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
-- 00000000000038_mcp_guide_visual_refresh.sql
|
|
2
|
-
--
|
|
3
|
-
-- Visual refresh of the 'cortex-ai-mcp-connection-guide' post that 00000000000037
|
|
4
|
-
-- seeded. 037 stored the body as a plain Tiptap JSON document, which renders as a
|
|
5
|
-
-- wall of prose; this replaces it with the styled HTML every other seeded article
|
|
6
|
-
-- uses — summary cards, a prototype-vs-production comparison, a card per MCP tool
|
|
7
|
-
-- with its scope, numbered setup steps, terminal-style code panels, callouts, stat
|
|
8
|
-
-- tiles and a closing CTA — and adds a rendered architecture diagram
|
|
9
|
-
-- (public/images/mcp-prompt-to-production.webp, 2000x1025) as a captioned figure.
|
|
10
|
-
--
|
|
11
|
-
-- It is a separate file because 037 was already applied (and recorded) on the
|
|
12
|
-
-- sandbox before the redesign; Supabase matches history by version, so editing
|
|
13
|
-
-- 037 in place would have been skipped there silently.
|
|
14
|
-
--
|
|
15
|
-
-- Idempotent: the media row upserts on media.object_key; the body UPDATE is guarded
|
|
16
|
-
-- on the seeded Tiptap JSON shape (starts with the doc node and carries 037's
|
|
17
|
-
-- opening sentence), so once replaced — or once an editor has rewritten the post —
|
|
18
|
-
-- it no longer matches. The SEO grade stays 100/100 with the focus keyphrase
|
|
19
|
-
-- "connect Claude to NextBlock CMS" (verified with libs/utils/src/lib/seo).
|
|
20
|
-
--
|
|
21
|
-
-- After adding this file: npm run generate:migrations-bundle && npm run
|
|
22
|
-
-- generate:sandbox && npm run sync:create-nextblock.
|
|
23
|
-
|
|
24
|
-
DO $body$
|
|
25
|
-
DECLARE
|
|
26
|
-
v_en integer;
|
|
27
|
-
v_post integer;
|
|
28
|
-
BEGIN
|
|
29
|
-
SELECT id INTO v_en FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
30
|
-
|
|
31
|
-
---------------------------------------------------------------------------
|
|
32
|
-
-- 1. Media row for the inline diagram. Registered in resolveMediaUrl's bundled
|
|
33
|
-
-- keys and the text renderer's known-image map, so it is served from
|
|
34
|
-
-- public/images and optimised through next/image.
|
|
35
|
-
---------------------------------------------------------------------------
|
|
36
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_path, folder, file_type, size_bytes, description, width, height)
|
|
37
|
-
VALUES ('5c7d9e2b-1a64-4f8c-9b3e-7d2a4c6e8f10'::uuid, NULL, 'mcp-prompt-to-production.webp', 'images/mcp-prompt-to-production.webp', 'images/mcp-prompt-to-production.webp', 'images', 'image/webp', 109680, 'Diagram of the prompt-to-production flow: an AI client calls the Cortex AI MCP server at /api/mcp, which writes validated JSONB blocks to PostgreSQL that Next.js 16 publishes without a redeploy', 2000, 1025)
|
|
38
|
-
ON CONFLICT (object_key) DO UPDATE
|
|
39
|
-
SET description = COALESCE(NULLIF(public.media.description, ''), EXCLUDED.description),
|
|
40
|
-
width = COALESCE(public.media.width, EXCLUDED.width),
|
|
41
|
-
height = COALESCE(public.media.height, EXCLUDED.height),
|
|
42
|
-
updated_at = now();
|
|
43
|
-
|
|
44
|
-
---------------------------------------------------------------------------
|
|
45
|
-
-- 2. Replace the seeded Tiptap JSON body with the styled HTML version.
|
|
46
|
-
---------------------------------------------------------------------------
|
|
47
|
-
SELECT id INTO v_post
|
|
48
|
-
FROM public.posts
|
|
49
|
-
WHERE language_id = v_en AND slug = 'cortex-ai-mcp-connection-guide'
|
|
50
|
-
ORDER BY id
|
|
51
|
-
LIMIT 1;
|
|
52
|
-
|
|
53
|
-
IF v_post IS NOT NULL THEN
|
|
54
|
-
UPDATE public.blocks
|
|
55
|
-
SET content = $nbmcpguide2${"html_content":"<p class='text-lg leading-8 text-slate-700 dark:text-slate-300'>This guide shows you how to connect Claude to NextBlock CMS with an open standard instead of a vendor plugin. Cortex AI turns your site into a Model Context Protocol server. Claude Code, Cursor, ChatGPT, and Gemini can then read your database schema, draft page layouts, and update navigation from their own chat window. You pay for the AI subscription you already have, with no token markup in between.</p><div class='grid gap-4 md:grid-cols-3 my-10'><div class='rounded-3xl border border-sky-200/70 bg-sky-50/70 p-6 dark:border-sky-500/20 dark:bg-sky-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200'>One config block</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Setup in minutes.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Paste one JSON entry into Claude Code, Cursor, or VS Code. The CMS settings card writes it for you.</p></div><div class='rounded-3xl border border-indigo-200/70 bg-indigo-50/70 p-6 dark:border-indigo-500/20 dark:bg-indigo-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200'>Your subscription</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>No token markup.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Claude Pro, ChatGPT Plus, Cursor, or Gemini Advanced do the thinking. NextBlock never resells tokens.</p></div><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Live Drafts</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Nothing ships by accident.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Every layout the agent writes lands as a draft. An editor reviews it and hits publish.</p></div></div><p>Every prompt becomes a structured database record rather than a pile of generated code. Your editors keep a visual CMS, your developers keep a clean Next.js 16 app, and nothing goes live until someone hits publish.</p><h2>The Problem with Traditional AI Web Builders</h2><p>Prompt builders such as Lovable, Bolt, and v0 are impressive on day one. You describe a page and get a working React app in minutes. The trouble starts on day two.</p><div class='grid gap-4 md:grid-cols-2 my-8'><div class='rounded-3xl border border-rose-200/70 bg-rose-50/70 p-6 dark:border-rose-500/20 dark:bg-rose-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-rose-700 dark:text-rose-200'>Prototype tools</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>A codebase to babysit.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>The output is disposable code with no content layer. Every headline change is another prompt or another pull request. There are no drafts, no revisions, no translations, and no SEO checks for the people who own the words.</p></div><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>NextBlock</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>A website plus a CMS.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>AI scaffolds the site once, and a real CMS runs it forever. Marketing edits copy in a Notion-style editor. Engineers keep a codebase nobody has to babysit.</p></div></div><p>NextBlock takes the opposite view from the prototype tools. AI should draft the site, and people should own it. The MCP connection is how those two worlds meet.</p><h2>How Cortex AI Uses Model Context Protocol (MCP)</h2><p>Model Context Protocol is an open standard for giving AI agents tools. A client such as Claude Code lists the tools a server offers, calls them with typed arguments, and reads typed results back. Cortex AI ships that server inside your NextBlock install at <code>/api/mcp</code>.</p><figure class='my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10'><img src='/images/mcp-prompt-to-production.webp' alt='Diagram of the prompt-to-production flow: an AI client calls the Cortex AI MCP server at /api/mcp, which writes validated JSONB blocks to PostgreSQL that Next.js 16 publishes without a redeploy' class='w-full h-auto object-cover' /><figcaption class='border-t border-white/10 px-6 py-4 text-sm text-slate-300'>One prompt travels from your AI client, through the MCP server, into PostgreSQL as validated blocks, and out as a published page. No build step sits in between.</figcaption></figure><p>The endpoint speaks Streamable HTTP. Your client posts JSON-RPC messages over a normal HTTPS request, and the server answers in the same response. There is no long-lived SSE stream to babysit and no SDK to install on the server side. The same 29 typed tools that power the dashboard copilot are exposed over the wire, so the agent in your editor and the agent in your CMS never drift apart.</p><div class='grid gap-4 md:grid-cols-2 my-8'><div class='rounded-3xl border border-violet-200/70 bg-violet-50/70 p-6 dark:border-violet-500/20 dark:bg-violet-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Safety rule one</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Layouts stage as Live Drafts.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Layout tools write drafts, so nothing reaches visitors until an editor publishes it.</p></div><div class='rounded-3xl border border-blue-200/70 bg-blue-50/70 p-6 dark:border-blue-500/20 dark:bg-blue-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200'>Safety rule two</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Every token carries a scope.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>A read-only token never even sees a tool that could change data. Mutating tools are absent from its list.</p></div></div><h3>Available MCP Database Tools</h3><p>Five tool names form the public MCP contract. Each one forwards to a tested Cortex AI executor.</p><div class='grid gap-4 md:grid-cols-2 my-8'><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>get_database_schema</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-emerald-300 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-200'>read</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Returns every table the agent may read or change, with columns, primary keys, and read-only flags.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>generate_jsonb_layout</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-amber-300 text-amber-700 dark:border-amber-500/40 dark:text-amber-200'>write</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Turns a prompt into a full page layout, validates each block against the NextBlock schema, and stages it as a Live Draft.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>update_site_navigation</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-amber-300 text-amber-700 dark:border-amber-500/40 dark:text-amber-200'>write</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Adds, renames, or reorders header menu items per locale.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>query_site_analytics</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-emerald-300 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-200'>read</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Reads revenue, order counts, status breakdowns, and top products over a date range.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>search_stock_media</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-emerald-300 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-200'>read</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Finds free stock photos with alt text and photographer credits ready for an image block.</p></div><div class='rounded-3xl border border-dashed border-slate-300 p-5 dark:border-white/20'><p class='mt-0 mb-0 text-sm font-semibold text-slate-900 dark:text-white'>And 24 more.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>Create posts and products, translate pages, upload media, manage themes and scripts. Three resources expose the database, block, and custom block schemas.</p></div></div><h2>Step by Step: Connect Claude to NextBlock CMS in Cursor and Claude Code</h2><p>The server is off by default because it is a remote write surface onto live content. Turning it on takes three steps.</p><div class='grid gap-4 md:grid-cols-3 my-8'><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 font-mono text-3xl font-bold text-sky-500 dark:text-sky-300'>01</p><p class='mt-3 mb-0 text-lg font-semibold text-slate-900 dark:text-white'>Enable the server.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>Open <strong>CMS Settings → Cortex AI</strong> and switch on the MCP server access card.</p></div><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 font-mono text-3xl font-bold text-violet-500 dark:text-violet-300'>02</p><p class='mt-3 mb-0 text-lg font-semibold text-slate-900 dark:text-white'>Mint a token.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>Pick the scope you need. Read-only is enough for planning and audits.</p></div><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 font-mono text-3xl font-bold text-emerald-500 dark:text-emerald-300'>03</p><p class='mt-3 mb-0 text-lg font-semibold text-slate-900 dark:text-white'>Copy the config.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>The card renders one snippet each for Claude Code, Cursor, VS Code, and Claude Desktop.</p></div></div><p>Claude Code needs <code>\"type\": \"http\"</code> in the entry, or it skips the server without a warning. Cursor infers the transport from the URL and needs no type field. VS Code uses a top-level <code>servers</code> key and prompts for the token instead of storing it.</p><h3>Localhost Configuration Without a Token</h3><p>While you build, turn on <strong>Trust localhost without a token</strong> in the same settings card. A dev server on your machine then accepts loopback calls with no header at all. Standalone installs run on port 3000, and the monorepo dev server runs on port 4200.</p><p>Add this block to <code>.mcp.json</code> in your project root for Claude Code.</p><div class='my-8 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 shadow-2xl'><div class='flex items-center gap-2 border-b border-white/10 px-5 py-3'><span class='h-3 w-3 rounded-full bg-red-400/70'></span><span class='h-3 w-3 rounded-full bg-yellow-400/70'></span><span class='h-3 w-3 rounded-full bg-green-400/70'></span><span class='ml-3 text-xs font-mono text-slate-400'>.mcp.json</span></div><pre class='m-0 overflow-x-auto rounded-none bg-transparent px-6 py-5 text-sm leading-6 text-slate-200'><code>{\n \"mcpServers\": {\n \"nextblock\": {\n \"type\": \"http\",\n \"url\": \"http://localhost:3000/api/mcp\"\n }\n }\n}</code></pre></div><p>The CLI form does the same thing in one line.</p><div class='my-8 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 shadow-2xl'><div class='flex items-center gap-2 border-b border-white/10 px-5 py-3'><span class='h-3 w-3 rounded-full bg-red-400/70'></span><span class='h-3 w-3 rounded-full bg-yellow-400/70'></span><span class='h-3 w-3 rounded-full bg-green-400/70'></span><span class='ml-3 text-xs font-mono text-slate-400'>terminal</span></div><pre class='m-0 overflow-x-auto rounded-none bg-transparent px-6 py-5 text-sm leading-6 text-slate-200'><code>claude mcp add --transport http nextblock http://localhost:3000/api/mcp</code></pre></div><div class='rounded-3xl border border-amber-200 bg-amber-50/80 p-6 my-8 dark:border-amber-500/20 dark:bg-amber-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200'>Development only</p><p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Localhost trust is ignored in production builds, because a proxy can spoof the host header. Production always uses a token.</p></div><h3>Production Authentication via Bearer Tokens</h3><p>In production every client sends a bearer token. Tokens start with <code>nbmcp_</code>, are shown once at mint time, and are stored only as SHA-256 hashes. Revoking one is a single click, and the same value can never be minted again.</p><p>Add this to <code>.cursor/mcp.json</code> for Cursor, or drop the same entry into <code>.mcp.json</code> with a type field for Claude Code.</p><div class='my-8 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 shadow-2xl'><div class='flex items-center gap-2 border-b border-white/10 px-5 py-3'><span class='h-3 w-3 rounded-full bg-red-400/70'></span><span class='h-3 w-3 rounded-full bg-yellow-400/70'></span><span class='h-3 w-3 rounded-full bg-green-400/70'></span><span class='ml-3 text-xs font-mono text-slate-400'>.cursor/mcp.json</span></div><pre class='m-0 overflow-x-auto rounded-none bg-transparent px-6 py-5 text-sm leading-6 text-slate-200'><code>{\n \"mcpServers\": {\n \"nextblock\": {\n \"url\": \"https://your-site.com/api/mcp\",\n \"headers\": { \"Authorization\": \"Bearer nbmcp_your_token\" }\n }\n }\n}</code></pre></div><div class='rounded-3xl border border-violet-200 bg-violet-50/80 p-6 my-8 dark:border-violet-500/20 dark:bg-violet-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Try it</p><p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Once the client connects, ask for something concrete. Try “inspect the database schema and draft a pricing page with three tiers.” The agent calls the schema tool, then the layout tool, and your CMS shows a new Live Draft ready for review.</p></div><h2>Zero-Redeploy Production Rendering</h2><p>The reason this works is where the output lands. Cortex AI writes strict JSONB block records into PostgreSQL, not HTML strings and not source files. Each block has a Zod schema, so a bad field is rejected before it is stored.</p><div class='grid gap-4 md:grid-cols-3 my-8'><div class='rounded-3xl border border-sky-200/70 bg-sky-50/70 p-6 text-center dark:border-sky-500/20 dark:bg-sky-500/10'><p class='mt-0 mb-0 text-4xl font-extrabold text-slate-900 dark:text-white'>0</p><p class='mt-2 mb-0 text-xs font-semibold uppercase tracking-[0.2em] text-sky-700 dark:text-sky-200'>Rebuilds to publish</p></div><div class='rounded-3xl border border-violet-200/70 bg-violet-50/70 p-6 text-center dark:border-violet-500/20 dark:bg-violet-500/10'><p class='mt-0 mb-0 text-4xl font-extrabold text-slate-900 dark:text-white'>1</p><p class='mt-2 mb-0 text-xs font-semibold uppercase tracking-[0.2em] text-violet-700 dark:text-violet-200'>Zod schema per block</p></div><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 text-center dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='mt-0 mb-0 text-4xl font-extrabold text-slate-900 dark:text-white'>100</p><p class='mt-2 mb-0 text-xs font-semibold uppercase tracking-[0.2em] text-emerald-700 dark:text-emerald-200'>Lighthouse by default</p></div></div><p>At request time Next.js 16 renders those records with Server Components and caches the result at the edge. There is no build step between publish and live, and no HTML sanitizer tax on every render. The 100/100 Lighthouse defaults you get on an empty site are the same ones you get after the agent has drafted fifty pages.</p><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 my-10 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-slate-600 dark:text-slate-300'>Next step</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Connect your agent today.</p><p class='mt-3 text-sm text-slate-600 dark:text-slate-300'>One license unlocks the dashboard copilot and the MCP server. Read how the block registry keeps all of it safe if you want the full picture.</p><div class='mt-5 flex flex-wrap gap-3'><a href='https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license' class='inline-flex items-center rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white no-underline shadow-lg hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-200'>Get the Cortex AI license</a><a href='/article/how-nextblock-works' class='inline-flex items-center rounded-full border border-slate-300 px-6 py-3 text-sm font-semibold text-slate-700 no-underline hover:border-slate-500 dark:border-white/20 dark:text-slate-200 dark:hover:border-white/50'>How NextBlock works</a></div></div>"}$nbmcpguide2$::jsonb,
|
|
56
|
-
updated_at = now()
|
|
57
|
-
WHERE post_id = v_post
|
|
58
|
-
AND block_type = 'text'
|
|
59
|
-
AND "order" = 0
|
|
60
|
-
AND content->>'html_content' LIKE '{"type":"doc"%'
|
|
61
|
-
AND content->>'html_content' LIKE '%This guide shows you how to connect Claude to NextBlock CMS with an open standard%';
|
|
62
|
-
END IF;
|
|
63
|
-
END
|
|
64
|
-
$body$;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
-- 00000000000039_mcp_guide_diagram_dimensions.sql
|
|
2
|
-
--
|
|
3
|
-
-- 00000000000038 registered public/images/mcp-prompt-to-production.webp at 2000x1025.
|
|
4
|
-
-- The rendered figure was blurry because next/image was told it displays at 768px,
|
|
5
|
-
-- re-encoded it as quality-60 AVIF and the browser upscaled the result to the
|
|
6
|
-
-- full article width. The asset is now re-rendered at 2560x1312
|
|
7
|
-
-- and served unoptimized (see ClientTextBlockRenderer's knownCmsImages); this
|
|
8
|
-
-- brings the media-library row in line with the file on disk. 038 is already
|
|
9
|
-
-- applied, so this is a separate file.
|
|
10
|
-
--
|
|
11
|
-
-- Idempotent: keyed by media.object_key, guarded on the values differing.
|
|
12
|
-
|
|
13
|
-
UPDATE public.media
|
|
14
|
-
SET width = 2560,
|
|
15
|
-
height = 1312,
|
|
16
|
-
size_bytes = 156358,
|
|
17
|
-
updated_at = now()
|
|
18
|
-
WHERE object_key = 'images/mcp-prompt-to-production.webp'
|
|
19
|
-
AND (width IS DISTINCT FROM 2560
|
|
20
|
-
OR height IS DISTINCT FROM 1312
|
|
21
|
-
OR size_bytes IS DISTINCT FROM 156358);
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
-- 00000000000040_home_comparison_chart_free_cms.sql
|
|
2
|
-
--
|
|
3
|
-
-- Two marketing changes to the EN home page that 00000000000037 seeded:
|
|
4
|
-
--
|
|
5
|
-
-- 1. The prototype-tools-versus-NextBlock block under "Why an AI Website Builder
|
|
6
|
-
-- CMS Beats Prototype Code" was two prose cards that did not read as a
|
|
7
|
-
-- comparison. It is now a seven-row comparison chart (day-one output, editing,
|
|
8
|
-
-- drafts and revisions, publishing, translations and SEO, AI costs, price)
|
|
9
|
-
-- with the NextBlock column highlighted, followed by three pricing tiles.
|
|
10
|
-
-- 2. The pricing story is explicit everywhere the AI is mentioned: the CMS is
|
|
11
|
-
-- 100% free and open source, forever; Cortex AI is the one paid license, and
|
|
12
|
-
-- it runs on the AI subscription the customer already has (no token markup).
|
|
13
|
-
-- The hero card, the pricing tiles and the Cortex promo all carry it.
|
|
14
|
-
--
|
|
15
|
-
-- 037 is already applied on the sandbox, so this is a separate file. Each UPDATE
|
|
16
|
-
-- is guarded on a phrase unique to the 037 copy (Production on day two. / A codebase to babysit. /
|
|
17
|
-
-- One AI Engine) that the new copy does not contain, so re-runs are no-ops and a
|
|
18
|
-
-- home page an editor has since customised is left alone. The page still grades
|
|
19
|
-
-- 100/100 with the focus keyphrase "AI website builder CMS" (libs/utils/src/lib/seo).
|
|
20
|
-
--
|
|
21
|
-
-- After adding this file: npm run generate:migrations-bundle && npm run
|
|
22
|
-
-- generate:sandbox && npm run sync:create-nextblock.
|
|
23
|
-
|
|
24
|
-
DO $body$
|
|
25
|
-
DECLARE
|
|
26
|
-
v_en integer;
|
|
27
|
-
v_home integer;
|
|
28
|
-
BEGIN
|
|
29
|
-
SELECT id INTO v_en FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
30
|
-
|
|
31
|
-
SELECT id INTO v_home
|
|
32
|
-
FROM public.pages
|
|
33
|
-
WHERE slug = 'home' AND language_id = v_en
|
|
34
|
-
ORDER BY id
|
|
35
|
-
LIMIT 1;
|
|
36
|
-
|
|
37
|
-
IF v_home IS NULL THEN
|
|
38
|
-
RETURN;
|
|
39
|
-
END IF;
|
|
40
|
-
|
|
41
|
-
-- Hero: same H1; subtitle now says free and open source; right card carries the
|
|
42
|
-
-- "Free CMS. Paid AI." message; primary CTA reads "Start Free".
|
|
43
|
-
UPDATE public.blocks
|
|
44
|
-
SET content = $nbhero2${"is_hero":true,"padding":{"top":"xl","bottom":"xl"},"background":{"type":"gradient","gradient":{"type":"linear","stops":[{"color":"#020817","position":0},{"color":"#0f172a","position":50},{"color":"#1e293b","position":100}],"direction":"135deg"}},"column_gap":"xl","column_blocks":[[{"block_type":"text","content":{"html_content":"<h1 class='text-5xl md:text-6xl font-extrabold tracking-tight text-white text-center leading-tight'>Prompt to <span class='relative inline-block mx-1 group'><span class='absolute inset-0 bg-gradient-to-r from-blue-600 to-cyan-400 translate-y-1 md:translate-y-2 transform -skew-x-12 rounded-sm shadow-lg group-hover:skew-x-0 transition-transform duration-300 ease-out'></span><span class='relative text-white italic px-1'>Production</span></span>.<br class='md:hidden' /> The AI Website Builder CMS.</h1>"}},{"block_type":"text","content":{"html_content":"<p class='text-xl text-slate-300 text-center max-w-3xl mx-auto mt-4 leading-relaxed'>NextBlock is the free, open-source AI website builder CMS for teams that want more than a prototype. Point Claude Code, Cursor, or ChatGPT at your site over MCP and prompt the pages you need. You keep a live Next.js 16 and Supabase website with a visual editor your team owns on day two.</p>"}},{"block_type":"button","content":{"url":"/article/how-to-setup-nextblock","size":"lg","text":"Start Free","variant":"default","position":"center"}},{"block_type":"button","content":{"url":"/article/cortex-ai-mcp-connection-guide","size":"lg","text":"Connect Claude or Cursor","variant":"outline","position":"center"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-wrap justify-center gap-6 text-sm uppercase tracking-wide text-slate-400 mt-8'><a href='https://github.com/nextblock-cms' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>GitHub</a><a href='https://x.com/NextBlockCMS' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>X</a><a href='https://www.linkedin.com/in/nextblock/' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>LinkedIn</a><a href='https://dev.to/nextblockcms' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>Dev.to</a><a href='https://www.npmjs.com/~nextblockcms' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>npm</a></div>"}}],[{"block_type":"text","content":{"html_content":"<div class='p-10 border border-white/10 rounded-3xl bg-white/5 backdrop-blur-xl shadow-2xl relative overflow-hidden group'><div class='absolute inset-0 bg-gradient-to-br from-blue-500/10 to-purple-500/10 opacity-0 group-hover:opacity-100 transition-opacity duration-500'></div><div class='relative z-10'><p class='text-xs text-white uppercase tracking-widest font-semibold mb-2'>Free forever. AI optional.</p><p class='text-3xl font-bold text-white mb-2'>Free CMS. Paid AI. Your call.</p><p class='text-base text-slate-300 mb-6'>The CMS is 100% free and open source. Cortex AI is the one thing we sell, and it runs on the AI subscription you already have.</p><ul class='space-y-3 text-sm text-slate-200'><li><span class='text-blue-400 mr-2'>✓</span> Unlimited pages, editors, and sites at no cost.</li><li><span class='text-blue-400 mr-2'>✓</span> One Cortex AI license unlocks the copilot and the MCP server.</li><li><span class='text-blue-400 mr-2'>✓</span> No token markup: your Claude or ChatGPT plan does the work.</li></ul><div class='mt-6 rounded-2xl overflow-hidden border border-white/10 shadow-lg'><div class='relative w-full aspect-video'><iframe class='absolute inset-0 h-full w-full border-0' src='https://www.youtube-nocookie.com/embed/71MyfoL4YVM?si=jtlDXV6cSC8rDgz0' title='NextBlock demo video' allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share' referrerpolicy='strict-origin-when-cross-origin' loading='lazy' allowfullscreen></iframe></div></div></div></div>"}}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"vertical_alignment":"center"}$nbhero2$::jsonb,
|
|
45
|
-
updated_at = now()
|
|
46
|
-
WHERE page_id = v_home
|
|
47
|
-
AND block_type = 'section'
|
|
48
|
-
AND content::text LIKE '%Production on day two.%';
|
|
49
|
-
|
|
50
|
-
-- "Why" section: comparison chart + pricing tiles replace the two prose cards.
|
|
51
|
-
UPDATE public.blocks
|
|
52
|
-
SET content = $nbwhy2${"padding":{"top":"xl","bottom":"xl"},"background":{"type":"none"},"column_gap":"lg","column_blocks":[[{"block_type":"heading","content":{"level":2,"textAlign":"center","text_content":"Why an AI Website Builder CMS Beats Prototype Code."}},{"block_type":"text","content":{"html_content":"<p class='text-lg text-muted-foreground text-center max-w-3xl mx-auto mb-10'>Prompt builders like Lovable, Bolt, and v0 are great at a first draft. Then they hand you code you must host, patch, and rebuild for every copy change. NextBlock takes the same prompts and turns them into a website your whole team can run.</p>"}},{"block_type":"text","content":{"html_content":"<div class='grid gap-6 md:grid-cols-3'><div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-blue-300 dark:border-slate-800 dark:bg-slate-900'><div class='mb-4 flex h-10 w-10 items-center justify-center rounded-xl bg-blue-50 text-xl dark:bg-blue-950'>🧩</div><h3 class='text-lg font-bold text-foreground mb-2'>Prompt to CMS, Not Just Code.</h3><p class='text-sm text-muted-foreground leading-relaxed'>External AI agents scaffold real layouts as typed blocks. Editors then tweak copy, images, and sections in a Notion-style editor. Nobody writes a prompt or touches code to change a headline.</p></div><div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-blue-300 dark:border-slate-800 dark:bg-slate-900'><div class='mb-4 flex h-10 w-10 items-center justify-center rounded-xl bg-blue-50 text-xl dark:bg-blue-950'>🔌</div><h3 class='text-lg font-bold text-foreground mb-2'>Bring Your Own AI Subscription via MCP.</h3><p class='text-sm text-muted-foreground leading-relaxed'>Connect Claude Code, Cursor, ChatGPT, or Gemini straight to /api/mcp. You pay for the AI plan you already have, not a SaaS token markup.</p></div><div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-blue-300 dark:border-slate-800 dark:bg-slate-900'><div class='mb-4 flex h-10 w-10 items-center justify-center rounded-xl bg-blue-50 text-xl dark:bg-blue-950'>⚡</div><h3 class='text-lg font-bold text-foreground mb-2'>Zero-Redeploy JSONB Architecture.</h3><p class='text-sm text-muted-foreground leading-relaxed'>Generated blocks land in PostgreSQL as validated JSONB. Pages publish in seconds with 100/100 Lighthouse defaults and no rebuild.</p></div></div>"}},{"block_type":"text","content":{"html_content":"<div class='mt-12 overflow-hidden rounded-3xl border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900'><div class='flex flex-wrap items-end justify-between gap-3 px-5 pt-6 pb-4'><div><p class='text-xs font-semibold uppercase tracking-[0.22em] text-slate-500 dark:text-slate-400'>Side by side</p><p class='mt-1 text-xl font-semibold text-foreground'>Prototype tools versus NextBlock.</p></div><p class='text-xs text-slate-500 dark:text-slate-400'>Lovable, Bolt, and v0 compared on what happens after the first prompt.</p></div><div class='overflow-x-auto'><table class='w-full min-w-[640px] border-collapse'><thead><tr class='bg-slate-50 dark:bg-slate-950/60'><th scope='col' class='px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400'>What you get</th><th scope='col' class='px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-rose-600 dark:text-rose-300'>Lovable, Bolt, v0</th><th scope='col' class='bg-emerald-50/60 px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-200'>NextBlock</th></tr></thead><tbody><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Day one</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Prototype code you host and patch yourself.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>A live Next.js 16 and Supabase website.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Editing after launch</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>A new prompt or a pull request for every change.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>A Notion-style visual editor, no code needed.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Drafts and revisions</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Code history only, nothing for content.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Live Drafts and one-click restore of any page.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Publishing</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Rebuild and redeploy.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Instant, straight from PostgreSQL.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Translations and SEO</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Not built in.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Per-block translation and SEO graded as you type.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>AI costs</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Platform credits, bought from the tool.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Your own subscription over MCP, no markup.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Price of the platform</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>A monthly plan.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Free and open source, forever.</td></tr></tbody></table></div></div>"}},{"block_type":"text","content":{"html_content":"<div class='mt-10 grid gap-4 md:grid-cols-3'><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Free forever</p><p class='mt-3 text-xl font-semibold text-foreground'>The CMS costs nothing.</p><p class='mt-3 text-sm text-muted-foreground'>The AI website builder CMS is free and open source. Unlimited pages, editors, and sites, self-hosted or on Vercel, with no plan to outgrow.</p></div><div class='rounded-3xl border border-violet-200/70 bg-violet-50/70 p-6 dark:border-violet-500/20 dark:bg-violet-500/10'><p class='text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Cortex AI, when you want it</p><p class='mt-3 text-xl font-semibold text-foreground'>One license, two AI surfaces.</p><p class='mt-3 text-sm text-muted-foreground'>A paid Cortex AI license adds the dashboard copilot and the MCP server. Start without it and add it later. Your content never changes.</p></div><div class='rounded-3xl border border-sky-200/70 bg-sky-50/70 p-6 dark:border-sky-500/20 dark:bg-sky-500/10'><p class='text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200'>No token markup</p><p class='mt-3 text-xl font-semibold text-foreground'>Your plan does the work.</p><p class='mt-3 text-sm text-muted-foreground'>Cortex AI runs on the Claude, ChatGPT, Cursor, or Gemini subscription you already pay for. The license buys the connection, not the tokens.</p></div></div>"}}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":1}}$nbwhy2$::jsonb,
|
|
53
|
-
updated_at = now()
|
|
54
|
-
WHERE page_id = v_home
|
|
55
|
-
AND block_type = 'section'
|
|
56
|
-
AND content::text LIKE '%A codebase to babysit.%';
|
|
57
|
-
|
|
58
|
-
-- Cortex promo: "The CMS Is Free. The AI Is the Upgrade."
|
|
59
|
-
UPDATE public.blocks
|
|
60
|
-
SET content = $nbcortexpromo2${"padding":{"top":"xl","bottom":"xl"},"background":{"type":"gradient","gradient":{"type":"linear","stops":[{"color":"#1e1b4b","position":0},{"color":"#0f172a","position":100}],"direction":"135deg"}},"column_gap":"xl","column_blocks":[[{"block_type":"text","content":{"html_content":"<p class='text-xs uppercase tracking-[0.3em] text-violet-400 font-semibold mb-4'>Now Available — Cortex AI</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>The CMS Is Free.<br/>The AI Is the Upgrade.</h2><p class='text-lg text-slate-300 max-w-2xl leading-relaxed mb-4'>NextBlock costs nothing and never will. Cortex AI is the one license we sell. It adds a copilot inside the dashboard and an MCP server outside it, so Claude Code, Cursor, ChatGPT, and Gemini can build your site.</p><p class='text-base text-slate-400 max-w-2xl leading-relaxed'>You bring the AI subscription you already pay for. The license buys the connection, never the tokens, and nothing goes live until an editor publishes it.</p>"}},{"block_type":"button","content":{"url":"/article/cortex-ai-mcp-connection-guide","size":"lg","text":"Read the MCP Setup Guide →","variant":"default","position":"left"}},{"block_type":"button","content":{"url":"https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license","size":"lg","text":"Get a License","variant":"outline","position":"left"}}],[{"block_type":"text","content":{"html_content":"<div class='grid grid-cols-1 gap-4 sm:grid-cols-3 lg:grid-cols-1'><div class='rounded-2xl border border-violet-500/30 bg-white/5 p-6 text-center'><p class='text-3xl font-extrabold text-white'>$0</p><p class='text-xs uppercase tracking-wider text-violet-200 mt-1'>The CMS, forever</p></div><div class='rounded-2xl border border-violet-500/30 bg-white/5 p-6 text-center'><p class='text-3xl font-extrabold text-white'>1</p><p class='text-xs uppercase tracking-wider text-violet-200 mt-1'>License for copilot and MCP server</p></div><div class='rounded-2xl border border-violet-500/30 bg-white/5 p-6 text-center'><p class='text-3xl font-extrabold text-white'>0 %</p><p class='text-xs uppercase tracking-wider text-violet-200 mt-1'>Token markup</p></div></div>"}}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"vertical_alignment":"center"}$nbcortexpromo2$::jsonb,
|
|
61
|
-
updated_at = now()
|
|
62
|
-
WHERE page_id = v_home
|
|
63
|
-
AND block_type = 'section'
|
|
64
|
-
AND content::text LIKE '%One AI Engine%';
|
|
65
|
-
END
|
|
66
|
-
$body$;
|
|
67
|
-
|
|
68
|
-
-- The MCP guide's featured image (public/images/cortex_post.webp) was
|
|
69
|
-
-- replaced with a re-cut 1672x941 version after 037
|
|
70
|
-
-- registered it at 2664x1568. The post
|
|
71
|
-
-- hero reserves its box from media.width/height, so bring the row in line with the
|
|
72
|
-
-- file on disk. Guarded on the values differing.
|
|
73
|
-
UPDATE public.media
|
|
74
|
-
SET width = 1672,
|
|
75
|
-
height = 941,
|
|
76
|
-
size_bytes = 503790,
|
|
77
|
-
updated_at = now()
|
|
78
|
-
WHERE object_key = 'images/cortex_post.webp'
|
|
79
|
-
AND (width IS DISTINCT FROM 1672
|
|
80
|
-
OR height IS DISTINCT FROM 941
|
|
81
|
-
OR size_bytes IS DISTINCT FROM 503790);
|