{ name = "Blog Post Metadata", description = "Create or edit blog post metadata. Saved to {slug}.ncl alongside the post body. thumbnail and image_url are excluded — owned exclusively by generate-images.nu.", display_mode = "complete", elements = [ # ── Identity ───────────────────────────────────────────────────────────── { type = "section_header", name = "identity_header", title = "Identity", border_top = true, border_bottom = true, }, { type = "text", name = "title", prompt = "Title", required = true, nickel_path = ["title"], help = "Post title shown in listings, headings, and browser tab.", }, { type = "text", name = "slug", prompt = "Slug", required = true, nickel_path = ["slug"], help = "URL segment — lowercase, hyphens only, max 60 chars. Matches the .ncl filename stem. Immutable after publication.", }, { type = "text", name = "subtitle", prompt = "Subtitle", required = false, nickel_path = ["subtitle"], help = "Secondary heading displayed under the title.", }, { type = "text", name = "excerpt", prompt = "Excerpt", required = false, nickel_path = ["excerpt"], help = "1-3 sentences for index listings and SEO meta description.", }, # ── Taxonomy ────────────────────────────────────────────────────────────── { type = "section_header", name = "taxonomy_header", title = "Taxonomy", border_top = true, border_bottom = true, }, { type = "text", name = "category", prompt = "Category", required = true, nickel_path = ["category"], help = "Primary category slug — must match the parent directory name (e.g. rust, devops, web3).", }, { type = "text", name = "tags", prompt = "Tags", required = false, nickel_path = ["tags"], help = "Comma-separated. new-post.nu converts to Array String before writing the NCL. E.g. rust, leptos, async", }, # ── Publication ─────────────────────────────────────────────────────────── { type = "section_header", name = "publication_header", title = "Publication", border_top = true, border_bottom = true, }, { type = "text", name = "date", prompt = "Publication date", required = true, nickel_path = ["date"], help = "YYYY-MM-DD. Original publication date — never update after publication.", }, { type = "text", name = "updated_at", prompt = "Updated at", required = false, nickel_path = ["updated_at"], help = "YYYY-MM-DD — date of last significant content change. Leave blank on creation.", }, { type = "confirm", name = "published", prompt = "Published?", default = false, nickel_path = ["published"], help = "False hides the post from all listings and the API. Set to false on creation.", }, { type = "confirm", name = "draft", prompt = "Draft?", default = true, nickel_path = ["draft"], help = "Draft posts are excluded from the index and /api/content-render. Set to true on creation.", }, { type = "confirm", name = "featured", prompt = "Featured?", default = false, nickel_path = ["featured"], help = "Pins to the top of the category listing and enables featured styling.", }, # ── Display ─────────────────────────────────────────────────────────────── { type = "section_header", name = "display_header", title = "Display", border_top = true, border_bottom = true, }, { type = "text", name = "read_time", prompt = "Read time", required = false, nickel_path = ["read_time"], help = "Estimated reading time for the listing card. E.g. '8 min read'. Auto-derived from word count when absent.", }, { type = "text", name = "sort_order", prompt = "Sort order", required = false, default = "0", nickel_path = ["sort_order"], help = "Manual position within the category listing. Lower values appear first. 0 = no preference. new-post.nu converts to Number.", }, ], }