Flow Metadata And Discover
Reference for mutable flow metadata managed around a workspace flow record.
Quick Answer
Use this page when you are managing grouped flows, display-icon selection,
discover card media, install-surface copy, marketplace visibility, paid
monetization, or public discover visibility.
These settings live on the workspace flow record. Some can also be authored in
the flow source and persisted on push.
Metadata Vs Source
breyta flows show,breyta flows pull, andbreyta flows validatetarget
draft by default.- Grouping metadata is mutable workspace metadata, not part of the pulled flow
source file. - Marketplace visibility is stored metadata. It can also be authored in the
flow file with:marketplace {:visible true}and then persisted on push. - Paid app monetization is stored metadata. For new source-authored paid apps,
put the catalog under:marketplace {:app {... :monetization {:plans [...]}}}
and persist it withbreyta flows push. - Legacy flow-level monetization under
:marketplace {:monetization {...}}
remains supported for existing listings, but new paid apps should use the
app-owned shape so Discover, checkout, billing, and install ownership share
the same app and plan identity. - Display-icon selection is mutable workspace metadata, not part of the pulled
flow source file. - Publish description is mutable workspace metadata, not part of the pulled
flow source file. - Discover card media is stored metadata. It can also be authored in the flow
file with:publish-mediaand then persisted on push. - Public discover visibility is stored metadata. It can also be authored in the
flow file with:discover {:public true}and then persisted on push.
Grouping Metadata
Use breyta flows update to manage grouped-flow metadata:
breyta flows update billing-sync \
--group-key billing \
--group-name "Billing" \
--group-description "Billing operations" \
--group-order 20
Inspect stored grouping state with:
breyta flows list --pretty
breyta flows show billing-sync --pretty
Grouped-flow responses expose fields such as:
groupKeygroupNamegroupDescriptiongroupOrdergroupFlowsonflows show --pretty
Clear only ordering:
breyta flows update billing-sync --group-order ""
Clear the full group:
breyta flows update billing-sync --group-key ""
Display Icon Selection
Use --primary-display-connection-slot to choose which connection/provider
icon renders anywhere the flow icon is shown:
breyta flows update billing-sync \
--primary-display-connection-slot crm
- Selectors can come from declared
:requiresslots or normalized keys from
:connections. - JSON responses may include
_hintsthat help inspect candidate selectors. - If unset or no longer matched, rendering falls back to the first explicit
:connectionsicon, then the first inferred:requiresicon.
Clear the selector with:
breyta flows update billing-sync --primary-display-connection-slot ""
Marketplace Visibility
Use marketplace visibility when the flow should be shown as a marketplace item
in discover/install surfaces:
breyta flows marketplace update billing-sync --visible=true
Notes:
- This is separate from
discover.public. - The public marketing app page for a visible marketplace flow is
https://breyta.ai/apps/<flow-slug>. - You can also author the same value in source as
:marketplace {:visible true}
and persist it withbreyta flows push. - Use
breyta flows show billing-sync --prettyto confirm stored metadata
includesmarketplace.visible.
Publish Description
Use publish description when install/discover dialog copy should differ from the
normal flow description:
breyta flows update billing-sync \
--publish-description-file ./publish-description.md
Or inline:
breyta flows update billing-sync \
--publish-description "## Install this flow"
- This markdown is used on install/discover dialog surfaces for installable
flows. - If no publish description is set, install dialogs fall back to the normal
flow description. - Discover cards still use the regular short description preview.
Clear only the publish description:
breyta flows update billing-sync --publish-description ""
Discover Card Media
Use discover card media when public discover/install cards should show a
curated image or video preview instead of only the fallback hero:
breyta flows update billing-sync \
--publish-media-type image \
--publish-media-source-kind https-url \
--publish-media-source https://cdn.example.com/hero.png \
--publish-media-alt "Billing dashboard preview"
Video media can also include an optional poster:
breyta flows update billing-sync \
--publish-media-type video \
--publish-media-source-kind https-url \
--publish-media-source https://cdn.example.com/demo.mp4 \
--publish-media-poster-kind https-url \
--publish-media-poster https://cdn.example.com/demo-poster.jpg \
--publish-media-alt "Billing reconciliation walkthrough"
Behavior:
publishMediareplaces the whole discover card media value each time you set it- Use
--clear-publish-mediato remove it explicitly https-urlsources requirehttps://...flow-resourcesources require a same-workspaceres://...URI. Use only
reviewed resources intended for public Discover/install card media.- Poster media is optional and only supported for video
- If you keep the flow in source control, you can author the same value as
:publish-mediain the.cljflow file and push it
Clear discover card media:
breyta flows update billing-sync --clear-publish-media
Public Discover Visibility
Use these commands when the flow should appear in discover/install surfaces:
breyta flows discover list
breyta flows discover search billing
breyta flows discover update billing-sync --public=true
Important distinctions:
breyta flows discover listanddiscover searchbrowse the public
installable catalog for the current workspace.breyta flows searchis separate. It searches actual workspace flow metadata,
not the public discover/install catalog. Approved reusable templates live
underbreyta flows templates search.- Public discover requires explicit public visibility and a released installable flow.
- Public app page proof uses the marketing route
https://breyta.ai/apps/<flow-slug>. Keep it distinct from workspace install
URLs such as/<workspace-id>/flows/<slug>/installations. - Public listings can include manual interfaces, schedules, and webhook
interfaces. Webhook interface setup is managed per installation. Legacy
triggers remain visible for existing flows.
Paid Monetization
For normal creator work, use the flow Publish page:
/<workspace-id>/flows/<slug>/publish
The Publish page saves public listing, paid pricing, optional trial, and live
publish state together. Paid checkout from the app path is before install for
one-time and subscription flows. Usage pricing is stored as before-run
monetization metadata while run metering and Stripe usage invoicing are rolled
out.
Source-first authoring remains useful for code-reviewed flow definitions,
fixtures, and CLI-heavy operations. New paid apps should use an app-owned
catalog in source:
{:slug :customer-insights
:name "Customer Insights"
:tags ["analytics" "customer-insights"]
:discover {:public true}
:marketplace
{:visible true
:app
{:app-id "customer-insights-suite"
:app-name "Customer Insights"
:app-primary-flow-slug "customer-insights"
:app-flow-slugs ["customer-insights"]
:monetization
{:plans
[{:plan-id "starter"
:name "Starter"
:default true
:pricing {:type "subscription"
:amount 29
:currency "usd"
:interval "month"}
:trial {:days 7
:payment-method-required false}}
{:plan-id "pro-pack"
:name "Pro Pack"
:pricing {:type "usage"
:amount 49
:currency "usd"
:unit "run"
:included-quantity 250}}]}}}}
Pricing model summary:
:free: no paid gate:one-time: one upfront purchase for paid access:subscription: recurring access subscription:usage: prepaid run pack paid once for a fixed number of successful runs:subscription-usage: recurring subscription with a fixed run allowance each billing period
Run-counted behavior:
- successful completed runs consume allowance
- failed, cancelled, terminated, and timed-out runs do not consume allowance
:usageallowance does not expire by time:subscription-usageallowance resets on renewal:subscription-usageoverages are not billed yet; exhaustion blocks further runs until renewal
Supported values:
pricing.type::free,:one-time,:subscription,:usage,:subscription-usagepricing.amount: positive price in major currency units. Decimals are allowed when the currency supports them, for example"0.99"USD.pricing.currency: lowercase ISO code such as"usd"pricing.interval::monthor:yearfor subscriptions and subscription usagepricing.unit::runfor usage and subscription usagepricing.free-quantity: zero or more free trial runs for:usage, or fallback no-card trial runs for:subscription-usagewhentrial.runsis not setpricing.included-quantity: positive paid run quantity for:usage, or positive included runs per billing period for:subscription-usagepaywall.when::before-installor:before-runfor paid flowstrial.days: positive integer, optionaltrial.payment-method-required:trueorfalse, optionalplans: app-owned catalog entries under
:marketplace {:app {:monetization {:plans [...]}}}. Every plan must
normalize to a unique stableplan-id, every entry must be valid, and at
most one plan can be markeddefaultorrecommended. If no default is set,
the first plan is treated as the default.- Seat-based pricing is not implemented. Do not describe a plan as "N seats" or
"N installs" unless the product has added explicit seat entitlements. Use
run quantities only for usage-priced plans.
Trial compatibility:
:subscriptionusestrial.days:one-timeand:usageusetrial.runs:subscription-usagecan use explicittrial.runs- if
:subscription-usageomitstrial.runs,pricing.free-quantityacts as the fallback no-card trial-run allowance - if both are present on
:subscription-usage, explicittrial.runswins
Legacy flow-level examples, supported for existing listings:
{:tags ["billing" "automation"]
:marketplace {:visible true
:monetization {:pricing {:type :subscription
:amount 25
:currency "usd"
:interval :month}
:paywall {:when :before-install}
:trial {:days 7
:payment-method-required true}}}
:discover {:public true}
...}
{:tags ["usage" "automation"]
:marketplace {:visible true
:monetization {:pricing {:type :usage
:amount 100
:currency "usd"
:unit :run
:included-quantity 500}
:paywall {:when :before-run}
:trial {:runs 5
:payment-method-required false}}}
:discover {:public true}
...}
{:tags ["catalog"]
:marketplace {:visible true
:monetization {:pricing {:type :subscription-usage
:amount 49
:currency "usd"
:interval :month
:unit :run
:included-quantity 100}
:paywall {:when :before-run}}}
:discover {:public true}
...}
If you operate directly against /api/commands, the underlying monetization
command is flows.marketplace.monetization.update, but source-authored paid
apps should prefer the app-owned catalog shape above. CLI metadata update
commands set visibility and other metadata; they do not replace the source
plan-catalog authoring path.
For day-to-day paid-flow publishing, prefer the Publish page so saved metadata
and the live buyer version do not drift.
For seller onboarding and payout prerequisites, see Paid Public Flows.
Public Flow Checklist
- If the flow is a new paid app, add
:marketplace {:app {... :monetization {:plans [...]}}}in source. Keep
legacy:marketplace {:monetization {...}}only when preserving an existing
legacy listing. - Make every connection requirement ownership explicit, including
:type :secretrequirements:- Use
:provided-by :authorfor author-owned credentials the public flow
should run with, such as Apify or OpenAI. - Use
:provided-by :installerfor user-owned accounts each installer must
connect themselves. - Public release checks reject connection slots that omit
:provided-by.
- Use
- Configure and check author-owned live bindings before release:
breyta flows configure <slug> --target live --version latest --set <slot>.conn=<connection-id>breyta flows configure check <slug> --target live --version latest
- Add install-surface copy and discover card media when the public surface should be polished:
- Install dialog markdown:
breyta flows update <slug> --publish-description-file ./publish-description.md - Discover card hero:
breyta flows update <slug> --publish-media-type image --publish-media-source-kind https-url --publish-media-source https://...
- Install dialog markdown:
- Choose one marketplace visibility path:
- Source-first: add
:marketplace {:visible true}to the flow definition before push only after explicit approval. - Explicit after push: run
breyta flows marketplace update <slug> --visible=trueonly after explicit approval.
- Source-first: add
- Choose one discover visibility path:
- Source-first: add
:discover {:public true}to the flow definition before
push only after explicit approval. - Explicit after push: run
breyta flows discover update <slug> --public=trueafter the flow has been pushed and only after explicit approval.
- Source-first: add
- Push the flow.
- If you chose an explicit marketplace/discover path, run those updates after push.
- Release or promote so there is an installable live version.
- Verify it in the web Discover UI, or with
breyta flows discover list/
breyta flows discover search <query>. - Verify the marketing app page at
https://breyta.ai/apps/<flow-slug>.
Ordering Notes
groupOrderis explicit manual metadata. Lower numbers sort first.- Use spaced values such as
10,20,30so future insertions are easy. flows show --prettyreturns siblinggroupFlowsordered by explicit
groupOrderwhen present.
Live Binding Promotion
Use this command when live bindings should start from the draft target:
breyta flows configure billing-sync \
--target live \
--from-draft \
--version latest