Pipeline steps

A step is what happens to each item between a pipeline's sources and its outputs: cutting a clip, writing a post, checking it is not a repeat, asking a person. A step takes from one or more sources or steps, and hands what it makes to every step and output that takes from it.

Each step takes some kinds of item and gives one:

  • moment: a stretch of a stream. activity: something the team made. media: a picture or video in the library. clip: a clip cut from a stream. copy: a post's text, with the media it was written about. draft: a post draft already made. signal: something that happened, with its numbers.
  • Gives same means it hands on the kind it took, letting items through or holding them back.

A step that spends carries the label Uses credits in the editor. Every price is the org's credits, shown as an estimate before a run starts. See Credits.

Each section below ends with the step as it sits in a pipeline's definition, which is what an assistant reads and proposes. id is the step's short name in this pipeline, kind is the key in the heading, after names what it takes from, and settings holds only what differs from the defaults.

By what they do:

ai.copy

Write the post

Writes a post's text about each item with AI, in the brand's voice, at the length and in the language set. A video is looked at first, from frames taken across its length, so a clip with little said in it is still written about truthfully. A video that came with no words and whose picture cannot be read is refused rather than made up. The post carries the media it was written about.

Takes: activity, clip, media, signal. Gives: copy.

Settings:

  • Length (length): Short, Medium or Long (short, medium, long). Default medium. How many characters each length is, is set by GreenMind.
  • How it opens (hook): Whatever suits it (any), A question (question), A number (number), A bold claim (claim), A quote (quote) or Plainly (plain). Default whatever suits it.
  • Emoji (emoji): on or off. Default off.
  • Language (language): any language Marketing speaks, shown by its own name. Default English (en).
  • Instructions (instructions): the brand's own words for this pipeline, beside its voice guide, such as "always name the song". Up to 500 characters. Default empty.

An experiment may try different lengths, openings, or emoji against none. The language and your instructions are never tried.

Cost: uses credits. One AI call writes each post. For a video it also takes a few frames (a media job each) and has AI look at them first.

Example:

{
  "id": "write",
  "kind": "ai.copy",
  "after": ["cut"],
  "settings": { "length": "short", "instructions": "Always name Lanternfall." }
}

ai.translate

Translate

Puts each post's text in another language with AI, keeping names, hashtags and links as they are. Text already in that language goes on unchanged.

Takes: copy. Gives: copy.

Settings:

  • Language (language): the language to translate into, any language Marketing speaks. Default Spanish (es).

Cost: uses credits: one AI call for each post, nothing for text already in the language.

Example:

{ "id": "german", "kind": "ai.translate", "after": ["write"], "settings": { "language": "de" } }

copy.hashtags

Add hashtags

Adds hashtags people really search for to each post's text, with AI, from what the post says. It never adds trending tags unrelated to it, and keeps any the text already has.

Takes: copy. Gives: copy.

Settings:

  • At most (most): the most hashtags it adds, from 1 to 10. Default 3.

An experiment may try one to five hashtags at most.

Cost: uses credits: one AI call for each post.

Example:

{ "id": "tags", "kind": "copy.hashtags", "after": ["write"], "settings": { "most": 2 } }

copy.lengths

Three lengths

Rewrites each post's text short, medium and long with AI, each going on as its own post, for the brand to see which works. One item in becomes up to three out. To try lengths one post at a time instead, run an experiment on Write the post.

Takes: copy. Gives: copy.

Settings:

  • Lengths (lengths): Short, Medium and Long (short, medium, long), at least one. Default all three.

Cost: uses credits: one AI call for each post, however many lengths it makes.

Example:

{
  "id": "lengths",
  "kind": "copy.lengths",
  "after": ["write"],
  "settings": { "lengths": ["short", "long"] }
}

Add a link

Puts a link in each post's text: the item's own link where it has one (a blog post's address, a Twitch clip), else the address set here. When the post is saved, the link becomes a tracked short link, so Links counts its clicks. Text that already holds the link is left alone.

Takes: copy. Gives: copy.

Settings:

  • Address (url): used when the item has no link of its own. Starts with https://. Default not set, so only items with their own link get one.

Cost: free.

Example:

{
  "id": "link",
  "kind": "link.track",
  "after": ["write"],
  "settings": { "url": "https://example.com/lanternfall" }
}

copy.similarity

Not too similar

Holds back post text too like what the brand, or another brand on the same account, posted lately, as networks read near repeats as spam. The run says how close it was and quotes the start of the other post. How far back it looks and how alike is too alike are set by GreenMind. A pipeline posting by itself stops doing so when this holds something back, until a person turns it on again.

Takes: copy. Gives: copy.

Settings:

  • Weighed against (channels): the channels whose recent posts are compared. Default none ticked, so every channel.

Cost: free.

Example:

{ "id": "fresh", "kind": "copy.similarity", "after": ["write"], "settings": {} }

stream.transcript-highlights

Moments from what was said

Hears the whole stream once and lets AI pick the moments worth a clip by what was said: funny, tense, a reveal, moving or useful. They are ranked together with the moments chat, viewers and markers suggest, so it suits streams too small for chat to say much. One moment in (usually a whole stream from A stream ended) becomes up to the number set. Only so many minutes of a long stream are heard, a limit GreenMind sets.

Takes: moment. Gives: moment.

Settings:

  • Most from one stream (most): the most moments it gives, best first, from 1 to 20. Default 5.
  • Looks for (looksFor): Funny (funny), Exciting or tense (exciting), A reveal or announcement (reveal), Moving (moving) and A useful tip (useful), at least one. Default all five.

Cost: uses credits, by the minute of stream heard: the sound taken from the recording (media jobs), a transcription, and one AI call reading it.

Example:

{
  "id": "said",
  "kind": "stream.transcript-highlights",
  "after": ["ended"],
  "settings": { "most": 3, "looksFor": ["funny", "exciting"] }
}

clip.make

Cut a clip

Cuts each moment into a clip by the same work a clip cut by hand goes through, with a vertical version and captions if chosen, and puts it in the library. A moment from a stream still being recorded waits until the recording arrives. If a vertical version was asked for and could not be made, the run asks a person in the review queue whether to go on in the shape it has. Captions that could not be made are left off, and the run says so.

Takes: moment. Gives: clip.

Settings:

  • Vertical version (vertical): The scene the stream marked, else the middle (scene-or-centre), The middle of the picture (centre) or None (none). Default the scene the stream marked. Shorts, Reels and TikTok need a vertical version.
  • Captions (captions): burned into the picture from a transcription. On or off. Default off.
  • In the library (keep): A draft somebody keeps (draft) or Kept as it is made (kept). Default a draft.

An experiment may try with and without captions, or the two vertical crops. It never tries None.

Cost: uses credits, by the minute of clip: cutting it and its vertical version (media jobs), and a transcription when Captions is on.

Example:

{
  "id": "cut",
  "kind": "clip.make",
  "after": ["markers"],
  "settings": { "captions": true, "keep": "kept" }
}

clip.keep

Keep the clip

Keeps a draft clip in the library and hands one of its videos on as media, for steps that work on a video, such as Burn in captions or Make a thumbnail. A clip with no video of the shape asked for is left out.

Takes: clip. Gives: media.

Settings:

  • Which video (video): The best made: captioned, then vertical (best), The vertical one (vertical) or The original shape (original). Default the best made.

Cost: free.

Example:

{ "id": "keep", "kind": "clip.keep", "after": ["cut"], "settings": { "video": "vertical" } }

media.reframe

Make it vertical

Cuts each video to a vertical 9:16 version, 1080 by 1920, around a point of the frame, for Shorts, Reels and TikTok. The new version is kept in the library beside the video it came from, which is left as it was. A video that is vertical already goes on as it is. Anything but a video is left out.

Takes: media. Gives: media.

Settings:

  • Keep in frame (focus): The middle (centre), The left side (left) or The right side (right). Default the middle.

Cost: uses credits, by the minute of video: one media job. Free for a video that is vertical already.

Example:

{ "id": "vertical", "kind": "media.reframe", "after": ["video"], "settings": { "focus": "left" } }

media.captions

Burn in captions

Hears each video and draws its captions into the picture, for people watching with the sound off. The captioned video is kept in the library as a new version. A video in which nobody speaks goes on as it is. Anything but a video is left out.

Takes: media. Gives: media.

Settings:

  • Where they sit (position): At the bottom (bottom) or In the middle (middle), the seam of a stacked vertical video. Default at the bottom.

Cost: uses credits, by the minute of video: the sound taken from it (a media job), a transcription, and drawing the captions in (a media job).

Example:

{ "id": "captions", "kind": "media.captions", "after": ["vertical"], "settings": {} }

media.thumbnail

Make a thumbnail

Takes a frame from each video as its thumbnail and hands the video on with it. With an AI preset, the frame is remade in the preset's style. The video stays the item, since it is what goes out; a network that shows a picture beside a video gets the thumbnail. Anything but a video is left out.

Takes: media. Gives: media.

Settings:

  • Frame at, in seconds (atSeconds): how far into the video the frame is taken. Default 1.
  • AI preset (presetId): one of the AI studio's presets, by name. Default not set, which takes the frame as it is. In a pipeline that follows a shared one, the brand chooses its own.

Cost: uses credits: one media job for the frame, and an AI picture on top with a preset.

Example:

{ "id": "thumb", "kind": "media.thumbnail", "after": ["keep"], "settings": { "atSeconds": 4 } }

collection.evergreen

Pick from a collection

Picks a picture or video from one of the brand's collections each time something comes in, the one posted least lately first, and one never posted before all. Put it after On a schedule to post from the collection every week, with the schedule saying how often. Spoilers and anything under embargo are passed over. A collection with nothing approved to post leaves the run with nothing.

Takes: signal, activity. Gives: media.

Settings:

  • Collection (collectionId): the collection it picks from, by name. Default not set, and it picks nothing until one is chosen. In a pipeline that follows a shared one, the brand chooses its own.
  • Kinds of media (kinds): Pictures (image) and Videos (video). Default both.

Cost: free.

Example:

{
  "id": "pick",
  "kind": "collection.evergreen",
  "after": ["weekly"],
  "settings": { "collectionId": "c_123", "kinds": ["image"] }
}

activity.media

Its picture or video

Hands on the video or picture each thing the team made came with, carrying its title and summary, so a post written about the media still knows what it shows. Something with none of the kind asked for is left out, which makes this a filter for "has a video" too.

Takes: activity. Gives: media.

Settings:

  • Which (kind): Its video (video), Its picture (image) or Either (any). Default its video.

Cost: free.

Example:

{ "id": "video", "kind": "activity.media", "after": ["shipped"], "settings": { "kind": "video" } }

image.style

Restyle with AI

Remakes each picture with AI in the style of one of the brand's AI presets. The result is kept in the library and marked as made with AI. Without a preset chosen, or handed anything but a picture, it leaves the item out.

Takes: media. Gives: media.

Settings:

  • AI preset (presetId): one of the AI studio's presets, by name. Default not set. In a pipeline that follows a shared one, the brand chooses its own.

Cost: uses credits: one AI picture for each item.

Example:

{
  "id": "styled",
  "kind": "image.style",
  "after": ["approved"],
  "settings": { "presetId": "p_123" }
}

media.render

Render to a size

Renders each picture to one of the brand's sizes, cut around the focus point marked in the library, as the library cuts its own renditions. The result is a new picture in the library, and the one it came from is left as it was. Anything but a picture is left out.

Takes: media. Gives: media.

Settings:

  • Size (preset): Link preview (Open Graph) (og-image), Wide (16:9) (16x9-1920), Square (1:1) (1x1-1080), Portrait (4:5) (4x5-1080) and Tall (9:16) (9x16-1080), and the store sizes a kit adds, such as Steam's capsules. Default square.

Cost: uses credits: one media job for each picture.

Example:

{
  "id": "square",
  "kind": "media.render",
  "after": ["approved"],
  "settings": { "preset": "4x5-1080" }
}

filter.items

Filter

Lets through only the items that meet every condition set: a score, a length, a kind, tags, a video, a language. A condition left empty lets everything through. The run says why an item was left out.

Takes: any kind. Gives: same.

Settings:

  • Lowest score (minScore): a suggested moment's score: "Clip that" is 3, a marker 2, chat picking up 1.5. Default not set.
  • Shortest, in seconds (minSeconds): for media and moments. Default not set.
  • Longest, in seconds (maxSeconds): for media and moments. Default not set.
  • Only these kinds (kinds): an activity's kind (feature, art) or a media item's (image, video). Default empty, so any kind.
  • Tagged with one of (tagsAny): Default empty.
  • Never tagged with (tagsNone): Default empty.
  • Only with a video (video): on lets through only items with a video, off only those without. Default not set, so either.
  • Only in these languages (languages): for post text, by language code such as en or pt-BR. Default empty, so any language.

Cost: free.

Example:

{
  "id": "long-enough",
  "kind": "filter.items",
  "after": ["moments"],
  "settings": { "minSeconds": 10, "tagsNone": ["wip"] }
}

rights.check

Rights check

Keeps out of posts items tagged as covers or spoilers, and AI-made media where the pipeline says so.

Takes: any kind. Gives: same.

Settings:

  • Tags kept out of posts (blockTags): Default spoiler and cover.
  • Media made with AI (aiGenerated): Let it through (allow) or Keep it out (skip). Default let it through: every channel carries the disclosure.

Cost: free.

Example:

{
  "id": "rights",
  "kind": "rights.check",
  "after": ["approved"],
  "settings": { "aiGenerated": "skip" }
}

cooldown.source

Cooldown

Drops an item whose source already made a post for the brand, from any pipeline, within the days set: the same stream, the same feature, the same picture.

Takes: any kind. Gives: same.

Settings:

  • Days (days): from 1 to 365. Default 30.

Cost: free.

Example:

{ "id": "cooldown", "kind": "cooldown.source", "after": ["pick"], "settings": { "days": 60 } }

select.best

Keep the best

Waits for everything one source item gave (the moments of one stream, say) and keeps the best few. It chooses by the items' own scores for free, or has AI weigh them against what the brand wants. Those not chosen are left out with the reason "Others from its source were better."

Takes: moment, media, clip, copy, activity, signal. Gives: same.

Settings:

  • How many to keep (keep): of what one source item gave, from 1 to 20. Default 3.
  • Chosen by (by): Their own scores, free (own) or AI, which costs credits (ai). Default their own scores.
  • What to look for (goal): for AI, what the brand wants from the posts, such as "the funniest" or "shows the new boss". Default empty.
  • Wait for the rest, in minutes (waitMinutes): how long it waits for the rest of a source item's items before choosing, from 1 to 1440. Default 15.

Cost: free when chosen by their own scores. With AI it uses credits: one AI call for each choice, and none when there are no more items than it keeps.

Example:

{
  "id": "best",
  "kind": "select.best",
  "after": ["said"],
  "settings": { "keep": 2, "by": "ai", "goal": "the funniest" }
}

gate.approve

Ask a person

Waits for somebody who may publish the brand's posts to let each item through, in the review queue. An item rejected there, or whose review is called off, goes no further.

Takes: any kind. Gives: same.

Settings:

  • What to ask (question): in the brand's own words, up to 200 characters. Default empty, which asks whether to let it through.

Cost: free.

Example:

{
  "id": "ask",
  "kind": "gate.approve",
  "after": ["cut"],
  "settings": { "question": "Is this clip worth a post?" }
}

delay.wait

Wait

Holds each item for the time set before it goes on: a clip the day after the stream, say.

Takes: any kind. Gives: same.

Settings:

  • Minutes (minutes): how long it holds each item, from 1 minute to 60 days. A day is 1440 minutes. Default 1440.

Cost: free.

Example:

{ "id": "next-day", "kind": "delay.wait", "after": ["cut"], "settings": { "minutes": 1440 } }

batch.collect

Gather

Gathers items from many runs into one, at a set time each day or week, or at once when there are enough: a weekly devlog, a roundup. Each run waits here until the batch closes. Then the oldest carries them all on as one item, and the others finish as left out with the reason "Gathered into an earlier run." Activities become one activity listing each; media become one item with all their pictures or videos, up to 20.

Takes: activity, media. Gives: same.

Settings:

  • At least (atLeast): the fewest items a batch goes on with, from 1 to 50. Fewer roll over to the next time round. Default 3.
  • At most (atMost): a batch goes on at once when it has this many, from 1 to 50. Default 12.
  • When a batch closes (closes):
    • How often (every): Every day (day) or Once a week (week). Default once a week.
    • Day of the week (weekday): from 0 for Sunday to 6 for Saturday. Default 5, Friday.
    • At (at): Default 17:00.
    • Time zone (timeZone): Default UTC.

Cost: free.

Example:

{
  "id": "week",
  "kind": "batch.collect",
  "after": ["made"],
  "settings": {
    "closes": { "every": "week", "weekday": 5, "at": "15:00", "timeZone": "Europe/Berlin" }
  }
}

draft.post

Draft a post

Makes a post draft of each item, on the channels chosen, for somebody to edit, approve and schedule in Posts. It writes through the same service as a post written by hand, so tracked links and the repeat-text check work as they do there. A channel the post could not go to is never quietly missing: the post and the run both say why. A post that could reach none of its channels stops the step for a person to put right. Most pipelines need no Draft a post, as an output makes the post; use it when a step after it works on the draft.

Takes: copy, clip, media, activity. Gives: draft.

Settings:

  • Channels (channels): where the post is addressed. The brand's one account on each is chosen where it has one. Default none, which leaves a draft with no channel chosen.
  • Which video of a clip (video): The best made: captioned, then vertical (best), The vertical one (vertical) or The original shape (original). Default the best made.
  • Finished in the network's app (native): of those channels, the ones whose posts a person finishes on their phone in the network's own app, to add a sound, music or a sticker. See Finishing a post by hand. Default none.
  • Trial reel (instagramTrial): for Instagram Reels only. No: a Reel for everyone (off), A trial reel, shared to followers by hand in Instagram (manual) or A trial reel, shared to followers by Instagram if it does well (performance). Default off.
  • Where it goes on each network (outputs): the account to post from where the brand has several, and what a network needs saying, such as Reddit's subreddit. Default nothing set.

In a pipeline that follows a shared one, the brand keeps its own Channels and Finished in the network's app.

Cost: free.

Example:

{
  "id": "draft",
  "kind": "draft.post",
  "after": ["write"],
  "settings": { "channels": ["bluesky", "x"] }
}