AGPL-3.0-or-later · forever.

showcase · tier 2 · content

SEO content brief

Maps the competitor’s sitemap, reads their best page, then writes a typed brief that goes after the gaps.

Your writer starts from gaps and search intent, grounded in pages that actually rank. · conformance-gated in nika-spec ↗ · re-proven at every push

The whole file

4 tasks · 4 waves · the plan falls out of the bindings, nothing is scheduled by hand.

t2-seo-content-brief.nika.yamlsource
nika: v1workflow:  id: seo-content-brief  description: "Competitor sitemap → top page → gap analysis → typed brief"model: ollama/qwen3.5:4b   # local · zero key · swap for openai/gpt-5.2vars:  topic:    type: string    required: true    description: "The keyword/topic you want to rank for"  competitor_sitemap: "https://competitor.example.com/sitemap.xml"tasks:  map:    invoke:      tool: "nika:fetch"      args:        url: "${{ vars.competitor_sitemap }}"        mode: sitemap    output:      top: ".[:5] | map(.loc)"  top_page:    with:      map_top: ${{ tasks.map.top[0] }}    invoke:      tool: "nika:fetch"      args:        url: "${{ with.map_top }}"        mode: article  brief:    with:      map_top: ${{ tasks.map.top }}      top_page: ${{ tasks.top_page.output }}    infer:      prompt: |        Topic to rank for · ${{ vars.topic }}        Competitor's top URLs · ${{ with.map_top }}        Their best page on it ·        ${{ with.top_page }}        Write a content brief that BEATS this page · find the gaps they        missed · angle for search intent.      schema:        type: object        required: [title, angle, outline, keywords]        properties:          title: { type: string }          angle: { type: string }          outline: { type: array, items: { type: string } }          keywords: { type: array, items: { type: string } }  save:    with:      brief: ${{ tasks.brief.output }}    invoke:      tool: "nika:write"      args:        path: "./briefs/${{ vars.topic }}.json"        content: "${{ with.brief }}"        create_dirs: trueoutputs:  brief:    value: ${{ tasks.brief.output }}    description: "The typed content brief"

nika inspect · engine 0.105.0 · vendored graph, never re-derived

4 declared edges · 4 waves · the plan falls out of the bindings