Airtable build proposal · for Jack's posting
AI Blog Production, built end-to-end as the proposal artifact.
Six Airtable Run Script automations. One human-gated pipeline. Swappable image APIs. Shopify-ready HTML. Click anything below.
Your spec asks for production-quality code with proper error handling, retry logic, token cost tracking, and no hard-coded magic strings. The full package (schema, six scripts, swappable adapter, build tool) is checked in. The interactive panel below calls the same outline script the production base would use.
Twenty status states. Half are human gates, half are automation triggers.
Each *Approved status is a human gate; each *Pending or *ing status fires the next script. A failed automation never advances; it falls into Failed with the error captured in Last Error, and you re-trigger by editing the status back. The current sample article below is at stage 08, where the draft is being written.
This calls the real outline script. The response streams in below.
Click the button. The page POSTs to /api/outline, which builds the same voice + topic system prompt the production Airtable script builds, calls Claude Sonnet 4.6, and streams the response back. Same prompt code path, different rendering surface.
Same call shape, five backends. Pick the one selected on the automation.
Click a card. The selected provider is what stage 05's automation would use; the others stay one input variable away. Negative-prompt support, aspect-ratio enums, and sync-vs-async behavior all differ; the adapter hides each of those quirks.
// scripts/_lib/image_adapter.js: same shape, five backends const generate = makeImageAdapter({ provider: "gpt", apiKey: process.env.OPENAI_API_KEY }); const result = await generate(prompt, { aspectRatio: "16:9" }); // → { url, costUsd, modelId, generationId, latencyMs, rawMeta } // Note: DALL-E 3 deprecated → GPT Image 2. Flux 1.1 Pro superseded → Flux 2.
Stage 06 uploads each image to Shopify Files, swaps in CDN URLs, writes JSON-LD.
The Shopify HTML field on the Article record holds the final output. Image src URLs point to your shop's Shopify CDN (not Airtable's), so the HTML is genuinely paste-ready into a Shopify Article. JSON-LD ships with the same call.
<!-- Generated by AI Blog Production system --><!-- slug: start-retinol-without-peeling-phase --> <article class="blog-post"> <figure class="blog-hero"> <img src="https://cdn.shopify.com/s/files/1/0123/4567/files/start-retinol-without-peeling-phase-hero.png" alt="Start retinol without the peeling phase" loading="eager" /> </figure> <h1>Start retinol without the peeling phase: a 2-week ramp using buffering</h1> <p class="blog-meta">A practical 2-week onboarding schedule for retinol that uses the buffering technique to skip the peeling phase entirely.</p> <p>Most retinol guides expect you to suffer for 6-8 weeks. That timeline is why most people quit during the peeling phase, not after. Here is a 2-week ramp using the buffering technique that skips the worst of it.</p> <h2>Why the peeling phase happens</h2> <p>Retinol speeds up cell turnover faster than your skin barrier can recover, and the gap is what produces the flaking. The effect compounds at concentrations above 0.3% in week one, and on skin that already runs dry...</p> <figure class="blog-img"> <img src="https://cdn.shopify.com/s/files/1/0123/4567/files/start-retinol-without-peeling-phase-body1.png" alt="start retinol without peeling phase body1" loading="lazy" /> </figure> <h2>The buffering technique</h2> <p>...</p> </article> <script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","headline":"Start retinol without the peeling phase","description":"...","image":["https://cdn.shopify.com/.../hero.png","https://cdn.shopify.com/.../body1.png","https://cdn.shopify.com/.../body2.png","https://cdn.shopify.com/.../body3.png"],"publisher":{"@type":"Organization","name":"Maris Skin"},"datePublished":"2026-05-04"}</script>