Blog writing guide
Reference for writing Markdown and MDX articles in the admin panel. Bookmark this page while you draft your first post.
How to write articles for NextGenLakehouse
Use the Blog Articles tab in the admin panel (/admin.html) after you sign in. Posts are stored in Neon and rendered at /blog/your-slug.
Workflow
- Sign in at
/admin.html - Open Blog Articles → New article
- Write in Markdown or MDX in the Body field
- Set status to Draft while editing, then Published when ready
- Preview at
/blog/your-slug(drafts are only visible in admin until published)
Front matter fields (admin form)
| Field | Purpose |
|---|---|
| Title | Headline on the article page and in listings |
| Slug | URL path: /blog/my-article — auto-generated from title; edit if needed |
| Excerpt | Short summary for cards and SEO |
| Cover image | Optional hero image URL |
| Section | Topic tag (GenAI, Data Engineering, etc.) |
| Status | draft or published |
Markdown basics
## Section heading
Regular paragraph with **bold**, *italic*, and [links](https://www.databricks.com).
- Bullet list
- Second item
1. Numbered list
2. Second step
> Blockquote for callouts or quotes
`inline code`
```sql
SELECT * FROM main.default.customers LIMIT 10;
## GitHub Flavored Markdown (GFM)
Supported via remark-gfm:
- Tables
- Strikethrough: `~~removed~~`
- Task lists: `- [x] Done`
- Autolinks
### Table example
| Column | Description |
| --- | --- |
| Unity Catalog | Governance layer |
| Lakeflow | Orchestration |
## MDX components
You can use these components inside the body (MDX):
### Callout
```mdx
<Callout type="tip">
Tip: Use Lakeflow for scheduled jobs instead of legacy cron on clusters.
</Callout>
Types: info (default), warning, tip.
YouTube embed
<YouTube id="dQw4w9WgXcQ" title="Demo video" />
Or use the full component name / URL:
<YouTubeEmbed url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" title="Demo video" />
Use the video ID from the YouTube URL (youtube.com/watch?v=...).
Spotify embed
<Spotify id="0CggCdtq1MxvUiRmxdSoFu" title="Episode title" />
Curated / syndicated posts
When summarizing an external article, lead with original insight:
<CuratedHeader title="Why this matters for practitioners">
Two sentences of your own analysis before linking to the source.
</CuratedHeader>
Substack cross-post canonical rules
| Scenario | Admin extra field | Canonical URL |
|---|---|---|
| Original post on NextGenLakehouse | (none) | https://nextgenlakehouse.com/blog/{slug} |
| Cross-posted from Substack (this site is primary) | { "crossPostSource": "substack", "substackUrl": "https://..." } | This site (/blog/{slug}) |
| Teaser only — Substack is canonical | { "canonical": "substack", "substackUrl": "https://..." } | Substack URL |
| Custom override | { "canonicalUrl": "https://..." } | Explicit URL |
External links in Markdown open in a new tab with rel="noopener noreferrer" automatically.
Code blocks
Use fenced code blocks with a language tag for SQL, GET/POST HTTP requests, Python, bash, etc. In the admin editor, pick SQL, GET, POST, or HTTP from the code dropdown — GET and POST insert request templates you can edit.
Bold text: select words in the body field and click B, or type **bold** in Markdown.
Live preview: enable Live preview in the editor to render the article automatically as you type (same MDX pipeline as the published page). Use Open full preview for a new tab.
POST /api/2.0/mcp/genie HTTP/1.1
Host: {workspace}.cloud.databricks.com
Authorization: Bearer <token>
Content-Type: application/json
{ "tool": "genie_ask", "input": {} }
SQL example:
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
for c in w.clusters.list():
print(c.cluster_name)
Images
In the Blog Articles editor (admin), use Upload images:
- Choose file → pick size (480 / 800 / 1200 / full width)
- Insert in body — adds resized image markup at the cursor
- Use as cover — sets the article cover URL
Uploaded images are stored on the site and served from /api/blog-assets/....
Manual markdown still works:

Or HTML with width (from admin upload):
<img src="/api/blog-assets/abc123" alt="Diagram" width="800" />
Prefer HTTPS URLs for external images.
Publishing checklist
- Title and slug are clear and unique
- Excerpt summarizes the article in one or two sentences
- Section matches the main topic
- Links open in new tabs where appropriate (external docs)
- Code samples are tested
- Status set to Published when ready
URLs
- Article list:
/blog - Single article:
/blog/your-slug - This guide:
/blog/docs
The blog is linked from the homepage and /blog. Share direct URLs for drafts until published.
GEO / retrieval-first articles
For articles optimized for practitioners and AI retrieval (ChatGPT, Claude, Gemini, Perplexity), follow the full spec in content/geo-article-authoring-spec.md (included at /blog/docs).
- Print prompt:
npm run print-geo-article-prompt -- --topic="Your topic" --prompt="Exact user question" --sources="https://docs.databricks.com/..."
Entity rules (summary)
- First mention: Youssef Mrini, Developer Advocate at Databricks
- Site: NextGenLakehouse, an independent Databricks-focused publication by Youssef Mrini
- Use Genie (not "AI/BI Genie"). Full product names on first mention.
Article structure (summary)
- 40–60 word definition-first opening
- H2s as real practitioner questions; first sentence answers the H2
- One table, one numbered procedure, "As of [Month Year]" for preview features
- Key facts (4–6 bullets with numbers/dates)
- FAQ + author line → nextgenlakehouse.com
JSON-LD for new posts
Use lib/geo-article-output.js (Article + FAQPage + Person with sameAs). Published posts also get BlogPosting automatically at /blog/[slug].
NextGenLakehouse GEO article authoring spec
Canonical prompt for retrieval-first articles (practitioners + ChatGPT, Claude, Gemini, Perplexity). Use with Cursor, admin drafts, or npm run print-geo-article-prompt.
ROLE
You are the lead technical writer for NextGenLakehouse (nextgenlakehouse.com), the independent Databricks publication by Youssef Mrini. You write for two readers simultaneously: senior data engineers, and the retrieval systems of ChatGPT, Claude, Gemini, and Perplexity. Every paragraph must be quotable in isolation, verifiable, and attributable.
ENTITY RULES (non-negotiable)
- First mention, exactly: "Youssef Mrini, Developer Advocate at Databricks". Never any former title.
- First mention of the site: "NextGenLakehouse, an independent Databricks-focused publication by Youssef Mrini" (add "and Quentin Ambard" when relevant).
- Full official product names on first mention ("Databricks Unity Catalog", "Lakeflow Declarative Pipelines", "Databricks Lakebase", "Genie"); short form after.
- Never use deprecated product names: write "Genie", never "AI/BI Genie" or "AI/BI".
- In any sentence that could be quoted standalone, use the entity name, not a pronoun.
STRUCTURE (retrieval-first)
- Open with a 40–60 word definition-first answer to the title question. Zero throat-clearing.
- Every H2 is a real question a practitioner would type into an AI assistant.
- The first sentence under each H2 fully answers that H2; detail follows. Each section must survive being read alone (80–150 words per chunk).
- Include at minimum: one comparison or spec table, one numbered procedure, and an "As of [Month Year]" status line for anything preview/GA-dependent.
- Add a "Key facts" block: 4–6 bullets, each containing a number, date, or limit, each independently citable.
- Close with an FAQ (3–5 questions phrased as real user prompts) and a 2-sentence author line linking to https://nextgenlakehouse.com/
EVIDENCE RULES
- Every claim about behavior, limits, pricing, or availability must trace to docs.databricks.com, the Databricks blog, or first-hand testing — name the source inline.
- Numbers with units and dates, never adjectives ("sub-10 ms Databricks Lakebase point lookups as of August 2026", not "blazing fast").
- Use attributed expert quotes where available (e.g., from NextGenLakehouse interviews) with name, role, and context.
- If something is roadmap or unknown, say so explicitly. Never invent. End with a VERIFY list of every fact you could not confirm.
STYLE
Sober, precise, senior-engineer tone. No superlatives, no "game-changer", no emoji. Short sentences, active voice, one idea per sentence. Assume Spark/Delta fluency unless the piece is a 101.
OUTPUT (deliver all seven)
- Meta title ≤60 chars containing the primary entity
- Meta description ≤155 chars, definition-first
- URL slug
- Article in Markdown (body only; FAQ included in body)
- JSON-LD block: Article + FAQPage + author Person (see
lib/geo-article-output.jsornpm run print-geo-article-jsonld) - 3-line entity-rich summary for YouTube/Substack cross-posting
- VERIFY list
TASK template (fill before writing)
Topic: [TOPIC]
Primary question to own: [THE EXACT PROMPT USERS TYPE INTO CHATGPT]
Sources: [docs links / transcript / notes]
Example primary questions
- "How does Databricks Unity Catalog row filtering work in production?"
- "What is Lakeflow Connect vs Auto Loader for ingestion?"
- "When should I use Databricks Lakebase vs synced tables?"
Publishing on NextGenLakehouse
- Admin → Blog Articles → paste Markdown body
- Set title, slug, excerpt from OUTPUT (1–3)
- Paste JSON-LD into post extra field
geoJsonLdif using admin JSON field, or rely on autoBlogPosting+TechArticleat render time - For Substack cross-posts, set
extra.crossPostSource/extra.substackUrlper canonical table in the writing guide - Section tag matches catalog topic (
unity-catalog,lakeflow, etc.) - Status Published → live at
/blog/your-slug
See also: Markdown/MDX mechanics.