AGPL-3.0-or-later · forever.

showcase · tier 1 · content

Social repurpose

One post becomes a thread, a LinkedIn version and a newsletter blurb, rewritten in parallel.

Write once, publish everywhere, same voice on every channel. · conformance-gated in nika-spec ↗ · re-proven at every push

  • 5tasksthe plan falls out of the bindings
  • 3wavesparallel by construction
  • 2verbs exercisedinvoke · infer
  • T1the tiercontent

The whole file

5 tasks · 3 waves

The plan falls out of the bindings, nothing is scheduled by hand.

social-repurpose.nika.yamlsource
nika: v1workflow:  id: social-repurpose  description: "One post → thread + LinkedIn + newsletter, in parallel"model: ollama/qwen3.5:4b   # local · zero key · swap for mistral/mistral-large or any providerconst:  # The sample post ships with the repo. Point this at your own and move the  # read permit with it — `permits:` cannot interpolate (NIKA-AUTH-007).  post_path: "examples/fixtures/launch-post.md"permits:  tools: ["nika:read", "nika:write"]  # One file in, one file out · each named exactly, no subtree granted.  fs:    read: ["examples/fixtures/launch-post.md"]    write: ["out/social-bundle.md"]tasks:  post:    invoke:      tool: "nika:read"      args: { path: "${{ const.post_path }}" }  # Three rewrites · no deps between them · they run concurrently.  thread:    with:      post: ${{ tasks.post.output }}    infer:      max_tokens: 700      prompt: "Turn this post into a 6-tweet thread · keep the voice · ${{ with.post }}"  linkedin:    with:      post: ${{ tasks.post.output }}    infer:      max_tokens: 500      prompt: "Rewrite this post for LinkedIn · hook first · ${{ with.post }}"  newsletter:    with:      post: ${{ tasks.post.output }}    infer:      max_tokens: 200      prompt: "Write a 3-sentence newsletter blurb for this post · ${{ with.post }}"  bundle:    with:      t: ${{ tasks.thread.output }}      l: ${{ tasks.linkedin.output }}      n: ${{ tasks.newsletter.output }}    invoke:      tool: "nika:write"      args:        path: out/social-bundle.md        create_dirs: true        # Prose artifact → a `content: |` block with interpolations is right        # here. A `.json` artifact is the opposite case: one `${{ … }}` value,        # never hand-typed braces (that emits unquoted fields).        content: |          # Social bundle          ## Thread          ${{ with.t }}          ## LinkedIn          ${{ with.l }}          ## Newsletter          ${{ with.n }}outputs:  bundle_path: ${{ tasks.bundle.output }}

audited · 5 tasks · 3 waves · permits declarednika 0.106.1

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

6 declared edges · 3 waves · the plan falls out of the bindings