···10101. **Gather requirements.** If not already provided, ask the user:
1111 - What webhook source and event is this for?
1212 - What path should it be mounted at? (e.g. `github/push` → `lures/github/push.lure`)
1313- - Does the provider sign requests? If so, what method (HMAC?), which header or query parameter carries the signature, and what environment variable holds the secret?
1313+ - Does the provider sign requests? If so:
1414+ - HMAC or literal token comparison?
1515+ - Which header or query parameter carries the signature or token?
1616+ - What environment variable holds the secret?
1717+ - For HMAC: does the provider prefix the digest (e.g. `sha256=`)?
1418 - What should the LLM do when it receives this webhook?
1519 - Is there any application-specific config to include?
1620···2832Specifies how to authenticate incoming webhook requests. Omit if the provider
2933does not sign requests. Only one strategy may be specified.
30343131-HMAC:
3535+HMAC (e.g. GitHub, GitLab — computes SHA-256 over the request body):
32363337```yaml
3438verify:
3539 hmac:
3636- location: header # or "query"
3737- name: X-Hub-Signature-256 # header or query parameter name
4040+ header: X-Hub-Signature-256 # or query: param-name
4141+ prefix: "sha256=" # optional: stripped before comparing the digest
4242+ secret: $ENV_VAR_NAME # must be an environment variable reference
4343+```
4444+4545+Literal (e.g. Forgejo, Omi — compares value directly against the secret):
4646+4747+```yaml
4848+verify:
4949+ literal:
5050+ header: Authorization # or query: uid
3851 secret: $ENV_VAR_NAME # must be an environment variable reference
3952```
4053
+2-74
README.md
···9595## Generating lures
96969797Since `.lure` files follow a structured format, they are well-suited to be
9898-generated by an LLM. Copy the prompt below into any LLM conversation, replace
9999-the placeholder at the end with a description of your webhook, and the LLM will
100100-produce a ready-to-use `.lure` file.
101101-102102-````
103103-You are generating a .lure file for the Lure webhook library. A .lure file is
104104-a Markdown file with YAML frontmatter. The filename without the .lure extension
105105-determines the webhook path relative to the configured base path: `push.lure`
106106-handles `<basePath>/push`, and `github/push.lure` handles
107107-`<basePath>/github/push`.
108108-109109-## Frontmatter
110110-111111-### `verify` (optional)
112112-113113-Specifies how to authenticate incoming webhook requests. Omit if the provider
114114-does not sign requests. Only one strategy may be specified.
115115-116116-HMAC (e.g. GitHub, GitLab — computes SHA-256 over the request body):
117117-118118-```yaml
119119-verify:
120120- hmac:
121121- header: X-Hub-Signature-256 # or query: param-name
122122- prefix: "sha256=" # optional: stripped before comparing the digest
123123- secret: $ENV_VAR_NAME # must be an environment variable reference
124124-```
125125-126126-Literal (e.g. Forgejo, plain API key — compares value directly):
127127-128128-```yaml
129129-verify:
130130- literal:
131131- header: Authorization # or query: uid
132132- secret: $ENV_VAR_NAME # must be an environment variable reference
133133-```
134134-135135-### `payload` (optional)
136136-137137-```yaml
138138-payload:
139139- contentType: json # currently the only supported value
140140-```
141141-142142-### `config` (optional)
143143-144144-An arbitrary object passed as-is to the application callback. Use this for any
145145-application-specific values you want to associate with this lure.
146146-147147-```yaml
148148-config:
149149- key: value
150150-```
151151-152152-## Template body
153153-154154-Below the frontmatter is a Liquid template (https://liquidjs.com). Write it as
155155-a natural language prompt for the LLM that will process the webhook. The
156156-following variables are available:
157157-158158-- `payload` — the request body (parsed JSON for `contentType: json`)
159159-- `headers` — request headers as a plain object with lowercase keys (e.g. `{{ headers["x-my-header"] }}`)
160160-- `query` — query string as a plain object (e.g. `{{ query.foo }}`)
161161-162162-Use `{{ expression }}` to interpolate values and `{% if %}...{% endif %}` for
163163-conditionals.
164164-165165-## Task
166166-167167-Generate a .lure file for the following webhook:
168168-169169-[DESCRIBE THE WEBHOOK SOURCE, EVENT TYPE, PAYLOAD SHAPE, VERIFICATION METHOD,
170170-AND WHAT THE LLM RECEIVING THE PROMPT SHOULD DO IN RESPONSE]
171171-````
9898+generated by an LLM. A `create-lure` skill is available in
9999+[SKILL.md](./SKILL.md) at the root of this repository.
172100173101## Lifecycle
174102