A collection of example workflows and projects for use with the
ByteChef platform. Every folder under
workflows/ is published as a pre-built workflow template that users can preview and
import into their own projects, and every zip under projects/ is published as a
pre-built project template that users can import as a whole project with all of its workflows.
This README describes how to submit one of each:
workflows/
ai_email_classifier/
meta.json <- template metadata (required)
workflow_definition.json <- the workflow itself (required)
screenshot.png <- optional image of the workflow canvas
- One folder per template, directly under
workflows/. Nothing is read from a subfolder. - The folder must contain both
meta.jsonandworkflow_definition.json. If either is missing, the template is skipped and never appears. - Name the folder in
lower_snake_case: no spaces, no dashes. Examples:cv_scanning,out_of_working_hours,monthly_report_generation_for_nifty_project. - The folder name becomes the template's permanent identifier and part of its URL. Renaming it later breaks every existing link, so choose it carefully the first time.
Get it working end to end in a real project first. A template that has never run is not a template,
it is a draft. Note anything environment-specific you configure along the way (spreadsheet IDs, form
IDs, label IDs, channel names, app IDs). You will have to declare those in prerequisites.
Export the workflow as JSON from the ByteChef workflow editor and save it as
workflows/<your_folder>/workflow_definition.json. Keep the exported formatting as-is.
Then clean it up:
- Remove anything private. Personal email addresses, internal channel names, credentials,
customer data, real record IDs from a production account. Replace them with neutral placeholders
(
support@example.com,your-channel). Connections are not part of the export, since the importing user picks their own, but resource IDs typed into parameters are. Leaving an ID that points at a throwaway demo resource is fine, as long asprerequisitessays what to swap out. - Give it a meaningful
labelanddescription. Both are shown to users on the template's detail page, so they are not internal notes. Keep them consistent withnameanddescriptioninmeta.json. - Label every task and trigger. The default
googleSheets_1-style names are fine asnamevalues (other steps reference them as${googleSheets_1}), but thelabelis what a user reads in the canvas.
A minimal, valid definition looks like this:
{
"label" : "Delete Sheet",
"description" : "Deletes a sheet and logs it.",
"inputs" : [ ],
"triggers" : [ ],
"tasks" : [ {
"label" : "Google Sheets",
"name" : "googleSheets_1",
"type" : "googleSheets/v1/deleteSheet",
"parameters" : {
"spreadsheetId" : "1wnYhkyBVNfys2XCxZgxjYFGOB3_pLSxB9ISMUhMvXDs",
"sheetId" : 769775461
},
"metadata" : {
"ui" : {
"dynamicPropertyTypes" : { }
}
}
} ]
}label, description, inputs, triggers and tasks are always present, even when inputs and
triggers are empty arrays (an on-demand workflow has no trigger).
Create workflows/<your_folder>/meta.json using two-space indentation:
{
"name": "Classify Gmail emails with OpenAI and forward them to the right team",
"category": "ai",
"description": "Polls Gmail for new emails and uses OpenAI to classify each one into a single department label (Sales, Support, Finance, Operations, HR, or URGENT). The matching Gmail label is applied, the department's recipient address is stored, and the original email is forwarded to the correct team.",
"shortDescription": "Classify incoming Gmail messages with AI and route them to the right team.",
"author": {
"name": "",
"email": "",
"role": "",
"socialLinks": ""
},
"keyFeatures": [
"AI classification constrained to a fixed set of labels via a JSON response schema",
"Multi-way branch routing, one case per department label",
"Automatic Gmail label tagging of the incoming message"
],
"prerequisites": [
"Google Mail (Gmail) connection",
"OpenAI API key",
"Gmail labels pre-created, matching the label IDs referenced in the workflow"
],
"idealFor": "Support and operations teams that want incoming email triaged and routed to the correct department automatically.",
"steps": [
"Trigger: poll Gmail for a new email.",
"Classify the email into a single label with OpenAI.",
"Branch on the predicted label: add the matching Gmail label and store the team's recipient address.",
"Forward the original email to the resolved team address."
],
"screenshot": "screenshot.png"
}| Field | Type | Notes |
|---|---|---|
name |
string | Title of the template card. Must not be blank: a template without a name is skipped entirely. Keep it consistent with the definition's label. |
category |
string | Exactly one ID from the category list. |
description |
string | Description on the template card, and one of the two fields users can search on. Two to four sentences saying what the workflow does, concretely. The card shows about two lines, so front-load the meaning. |
shortDescription |
string | One-sentence tagline. |
author |
object | name, email, role, socialLinks, all strings. The block must be present; leave the fields as empty strings if you would rather not be credited. |
keyFeatures |
string[] | Capability bullets ("AI urgency classification of the incoming email"). |
prerequisites |
string[] | Everything a user must have before importing: each connection, each API key, and each resource that must already exist (a spreadsheet, a Gmail label, a database table). Be specific. This is the field that decides whether an imported template actually runs. |
idealFor |
string | One sentence naming the audience: "Recruiters and hiring teams that want to pre-screen incoming job applications automatically." |
steps |
string[] | The workflow narrated step by step, one sentence per step, in execution order. Start with "Trigger: ..." when the workflow has a trigger. |
screenshot |
string | "screenshot.png" when the folder has one, otherwise omit the field. The site draws the canvas from the workflow definition, so the image is not published. |
Every field is expected in a submission. Do not add component names or the trigger. Those are taken from the workflow definition automatically.
| ID | Label |
|---|---|
ai |
AI |
sales |
Sales |
support |
Support |
finance |
Finance |
hr |
HR |
social |
Social |
marketing |
Marketing |
it |
IT Ops |
documentOps |
Document Ops |
other |
Other |
Note the exact spelling of documentOps (camelCase). An ID outside this list never matches a filter,
which leaves the template unreachable by category.
The template page renders the workflow canvas from workflow_definition.json, so a screenshot is not
required and is not shown on the site. If you add one anyway, name it screenshot.png and keep
"screenshot" in meta.json set to "screenshot.png"; otherwise leave the field out.
One template per pull request. In the description, say what the workflow automates and confirm you ran it successfully. Before opening it, check:
- The folder is
workflows/<lower_snake_case_name>/, directly underworkflows/. - It contains
meta.json,workflow_definition.jsonandscreenshot.png. - Both JSON files parse (
python3 -m json.tool <file>or an editor that validates JSON). -
meta.jsonhas a non-blankname, andcategoryis one of the IDs listed above. -
namematches the definition'slabel; the two descriptions agree. - Every field in the table is filled in, and
authoris present (empty strings are fine). -
prerequisiteslists every connection, API key and pre-existing resource the workflow needs. -
stepsnarrates the workflow in execution order. - No credentials, personal email addresses, internal channel names or customer data anywhere in the definition.
- The workflow was actually run end to end in ByteChef.
A project template is a single zip file under projects/: the zip that ByteChef produces when you
export a project, cleaned up. It carries the project and every workflow in it. Unlike workflow
templates, nothing is unpacked into folders in this repository: the zip is stored and served as-is.
projects/
customer_onboarding.zip
project.json <- project name and description
workflow-<uuid>.json <- one per workflow
- One zip per template, directly under
projects/. Every file underprojects/is read as a template zip, so put nothing else there. - All files sit at the root of the zip, exactly as ByteChef exported them. A zip that wraps them in a folder is skipped, because the files are matched by exact name.
- The zip must contain
project.jsonand at least oneworkflow-*.json. If either is missing, the template is skipped and never appears. - Name the zip in
lower_snake_case: no spaces, no dashes. Examples:customer_onboarding.zip,invoice_processing.zip. The file name becomes the template's permanent identifier and part of its URL. Renaming it later breaks every existing link, so choose it carefully the first time.
Get every workflow in the project working end to end first. Note anything environment-specific you configure along the way (spreadsheet IDs, form IDs, label IDs, channel names, app IDs) so you can replace it with a placeholder before submitting.
Open the project's settings menu in ByteChef and choose Export. You get a zip containing
project.json and one workflow-<uuid>.json per workflow.
project.json holds the project's name and description. Both are shown to users on the
template card, so make them meaningful before you export: the description should say in two to four
sentences what the project does, concretely.
Unzip the export and clean the workflow files up the same way as for a workflow template:
- Remove anything private. Personal email addresses, internal channel names, credentials, customer data, real record IDs from a production account. Replace them with neutral placeholders.
- Keep the exported formatting. Each
workflow-<uuid>.jsonis the workflow definition exactly as ByteChef exported it. Edit values inside it, but do not reformat or rename the file. - Check
labelanddescriptionof every workflow. They are shown on the template's detail page.
Do not add component names or triggers anywhere. Those are taken from the workflow definitions automatically.
Zip project.json and the workflow-*.json files so that they are at the root of the archive, and
save it as projects/<lower_snake_case_name>.zip:
cd <unzipped export>
zip ../customer_onboarding.zip project.json workflow-*.json
Screenshots are not part of a project template. Attach them to the pull request instead.
One template per pull request. In the description, say what the project automates, which categories it belongs to, how you want to be credited (name, role, a GitHub, LinkedIn or X link), and confirm you ran every workflow successfully. Before opening it, check:
- The file is
projects/<lower_snake_case_name>.zip, directly underprojects/. - The zip contains
project.jsonand at least oneworkflow-*.json, all at the root of the archive. -
project.jsonparses (python3 -m json.tool project.jsonor an editor that validates JSON) and has a non-blanknameand a realdescription. - Every workflow has a meaningful
labelanddescription. - No credentials, personal email addresses, internal channel names or customer data anywhere in the workflow definitions.
- Every workflow in the project was actually run end to end in ByteChef.