content/digital-product
Digital Product Factory — Reddit research to sellable digital product with PDF, landing page, and distribution.
Category: content
Source: workflows/content/digital_product.py
Input Schema
Section titled “Input Schema”| Field | Type | Default | Description |
|---|---|---|---|
min_quality_score | number | 6.0 | Min PDF quality score (1-10) |
niche_override | string | "" | Override auto-detected niche |
platforms | string[] | — | |
price_range | string | "$19-$29" | Target price for positioning |
product_type | string | "guide" | Product format |
quality | string | "standard" | Quality/cost preset |
regenerate | object | — | When set, this run is a regeneration. Workflows may read direction / keep / extra_instructions to modulate prompts; the engine persists parent_run_id and parent_variant_index as run lineage columns. |
tone_mode | string | "conversational" | |
topic | string | "" | Topic or niche, e.g. ‘AI security for founders’ |
variants | integer | 1 | Number of independent variant executions (1–10). When > 1, the engine runs the workflow N times with different sampling, producing N outputs. |
Output Schema
Section titled “Output Schema”No schema defined.
Task Pipeline
Section titled “Task Pipeline”research_reddit → select_audience → lock_brand_voice → refine_problems → generate_hooks → design_solution → structure_pdf → generate_pdf_content_v1 → quality_gate_pdf → generate_pdf_content_v2 → generate_pdf_design → merge_product_assets → render_pdf → generate_landing_page → generate_gumroad_page → generate_social_visuals → generate_distribution → generate_email_sequence → merge_gtm_assets → package_output| Task | Description |
|---|---|
research_reddit | Search Reddit for real problems, frustrations, and emotional language around the topic. |
select_audience | Identify the highest-value, most monetizable audience segment from Reddit data. |
lock_brand_voice | Define and lock a brand voice guide that all downstream content tasks use. |
refine_problems | Extract and refine problems from Reddit data into sellable pain points. |
generate_hooks | Generate 20-40 high-conversion hooks using existing hook generation infrastructure. |
design_solution | Design the product’s value architecture — the transformation it delivers. |
structure_pdf | Create a detailed PDF outline based on the solution framework. |
generate_pdf_content_v1 | Generate full V1 PDF content section by section, maintaining coherence. |
quality_gate_pdf | Evaluate V1 content quality. Fails below threshold to trigger retry. |
generate_pdf_content_v2 | Expand V1 into a premium V2 with case studies, worksheets, and bonus content. |
generate_pdf_design | Generate a visual design system and CSS stylesheet for the PDF. |
merge_product_assets | Merge product creation branches: content (Branch A) + design (Branch B). |
render_pdf | Render markdown content + design system into production-quality PDF. |
generate_landing_page | Generate a conversion-optimized, SEO-ready landing page as self-contained HTML. |
generate_gumroad_page | Generate Gumroad-ready product page copy. |
generate_social_visuals | Generate social media visual assets — cover, social cards, carousel slides. |
generate_distribution | Generate a full social media text distribution pack. |
generate_email_sequence | Generate a 5-email launch sequence. |
merge_gtm_assets | Merge go-to-market branches into a single dict. |
package_output | Bundle all outputs into a .tar.gz archive and save as a single artifact. |
Run-spec example
Section titled “Run-spec example”Save the YAML below as my-run.yaml, edit the values, and run with the CLI or POST it to the API. Required fields are uncommented; optional knobs are documented above the input: block — copy any line under input: and uncomment to set.
workflow: content/digital-product
# Optional fields — copy any line(s) under `input:` and uncomment to set:# Min PDF quality score (1-10)# min_quality_score: 6.0## Override auto-detected niche# niche_override: ""## platforms: []## Target price for positioning# price_range: $19-$29## Product format# product_type: guide## Quality/cost preset# quality: standard## tone_mode: conversational## Topic or niche, e.g. 'AI security for founders'# topic: ""#
input: {}Run it locally:
fab-workflow --from-file my-run.yamlOr submit over the wire — the same file is the request body:
curl -X POST 'https://gofabric.dev/v1/workflows/runs?name=content/digital-product' \ -H 'Authorization: Bearer fab_xxx' \ -H 'content-type: application/yaml' \ --data-binary @my-run.yamlEvery workflow also accepts the universal WorkflowInput fields — variants (1–10 fan-out) and regenerate (creative-direction hints with run lineage). See Run-specs (YAML / TOML / JSON) for the full top-level shape (metadata, priority, bundle, parent, etc.).
Warnings
Section titled “Warnings”- Last user task
package_outputhas no Pydantic return type — workflow output schema is null. Declare a WorkflowOutput subclass and pass it to Flow(output=…) for a strict contract. - Task
merge_product_assetshas no Pydantic types — contract is opaque to consumers. - Task
merge_gtm_assetshas no Pydantic types — contract is opaque to consumers.