but trust me you're not alone, I'm also excited about Workflows and eagerly waiting for some of the
but trust me you're not alone, I'm also excited about Workflows and eagerly waiting for some of these 



wrangler.toml file. I'm not seeing the wrangler command to create new workflows. When I add the bindings and deploy it out, it is just undefined. I'm running the latest version of wrangler with a current compatibility date. What am I missing?await env.MY_WORKFLOW.create(), env.MY_WORKFLOW itself is undefined. Do you need to do anything more than simply adding the [[workflows]] config in the wrangler.toml? And export the relevant workflow class from the main entry point?
wrangler.tomltypes.tssrc/index.ts./incoming-emails/forward-email-handler./incoming-emails/workflownpx wrangler workflows list show? Do your Workflow names match? Bindings type when you’re instantiating your Hono app instances? There are no deployed Workflows in this account. This is why I thought that you need something more than just the config in wrangler.toml for the deployment to work.[[workflows]].binding matches what I use for env.PROCESS_INCOMING_EMAILS_WORKFLOW as well as what I set on the Bindings type. And [[workflows]].class_name matches the name of my workflows class export, ProcessIncomingEmailsWorkflow.[[workflows]].name be any arbitrary name or what should that match?app.tstypes.ts
Can [[workflows]].name be any arbitrary name or what should that match?


workflows list shows nothing, you haven't registered your Workflow yet by deploying it.npm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter" command (apart from the empty object issue when env.MY_WORKFLOW.create() is called locally). Does this command do more than simply scaffolding the worker project on my local file system? Workflow.create was taking a whole minute. I will keep an eye when workflows get more mature.await env.MY_WORKFLOW.create()env.MY_WORKFLOWtype Env = {
// Add your bindings here, e.g. Workers KV, D1, Workers AI, etc.
MY_WORKFLOW: Workflow;
};types.tstypes.tssrc/index.ts./incoming-emails/forward-email-handler./incoming-emails/workflownpx wrangler workflows listBindingsBindingsThere are no deployed Workflows in this account[[workflows]].bindingenv.PROCESS_INCOMING_EMAILS_WORKFLOW[[workflows]].class_nameProcessIncomingEmailsWorkflow[[workflows]].nameapp.tsworkflows listnpm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter"env.MY_WORKFLOW.create()Workflow.create[[workflows]]
name = "process-incoming-emails"
binding = "PROCESS_INCOMING_EMAILS_WORKFLOW"
class_name = "ProcessIncomingEmailsWorkflow"import type { Workflow } from '@cloudflare/workers-types';
export type Bindings = {
// ...other bindings
PROCESS_INCOMING_EMAILS_WORKFLOW: Workflow;
};import { app } from './app'; // Hono app
import type { Bindings } from './types';
import { handleForwardingIncomingEmails } from './incoming-emails/forward-email-handler';
export { ProcessIncomingEmailsWorkflow } from './incoming-emails/workflow';
const handler = {
fetch: app.fetch,
async email(message, env, ctx) {
await handleForwardingIncomingEmails(message, env, ctx);
},
} satisfies ExportedHandler<Bindings>;export const handleForwardingIncomingEmails = async (
message: ForwardableEmailMessage,
env: Bindings,
_ctx: ExecutionContext,
) => {
return withLogTags(
{
tags: {
handler: 'email',
requestId: crypto.randomUUID(),
},
},
async () => {
const [address] = addressParser(message.to);
if (!address?.address) {
logger.warn('No email address found in `to` field');
return message.setReject('No email address found in `to` field');
}
logger.log('Workflow defined', {
defined: !!env.PROCESS_INCOMING_EMAILS_WORKFLOW, // <-- Not defined here!
});
// await env.PROCESS_INCOMING_EMAILS_WORKFLOW.create({
// params: {
// message,
// },
// });
}
)
}export class ProcessIncomingEmailsWorkflow extends WorkflowEntrypoint<
Bindings,
Params
> {}import { createFactory } from 'hono/factory';
import { Env } from './types';
export const factory = createFactory<Env>({
initApp: (app) => {
app.use(async (c, next) => {
// Make supabase client available to all requests
const supabase = createClient(c.env.SUPABASE_URL, c.env.SUPABASE_KEY);
c.set('supabase', supabase);
await next();
});
},
});
export const app = factory.createApp();import type { Workflow } from '@cloudflare/workers-types';
export type Bindings = {
// ...other bindings
PROCESS_INCOMING_EMAILS_WORKFLOW: Workflow;
};
export type Env = {
Bindings: Bindings;
Variables: Variables;
};#:schema node_modules/wrangler/config-schema.json
name = "my-app"
compatibility_date = "2024-10-22"
compatibility_flags = ["nodejs_compat"]
main = "dist/index.js"
minify = true
upload_source_maps = true
tail_consumers = [{ service = "my-app-tail" }]
[build]
command = "pnpm run build"
[observability]
enabled = true
[ai]
binding = "AI"
[[kv_namespaces]]
binding = "INCOMING_EMAILS_KV"
id = "<redacted>"
[[kv_namespaces]]
binding = "DLQ_KV"
id = "<redacted>"
[triggers]
crons = ["* * * * *", "*/30 * * * *"]
[[queues.consumers]]
queue = "account-emails"
dead_letter_queue = "dlq"
max_batch_size = 20
max_batch_timeout = 10
max_retries = 10
[[queues.consumers]]
queue = "incoming-emails"
dead_letter_queue = "dlq"
max_batch_size = 10
max_batch_timeout = 10
max_retries = 10
[[queues.consumers]]
queue = "dlq"
[[queues.producers]]
binding = "ACCOUNT_EMAILS_QUEUE"
queue = "account-emails"
[[queues.producers]]
binding = "INCOMING_EMAILS_QUEUE"
queue = "incoming-emails"
[[workflows]]
name = "process-incoming-emails"
binding = "PROCESS_INCOMING_EMAILS_WORKFLOW"
class_name = "ProcessIncomingEmailsWorkflow"