Kiket docs
Build

Intake forms

Let non-members submit structured requests that become issues in your workflows.

Intake forms are the front door to your workflows. Someone who doesn't have a Kiket seat — a customer, a vendor, an internal requester — fills out a form; it becomes a new issue in a workflow's initial state. No seat required on the submitter side.

Creating an intake

From the Intakes page:

  1. Click New intake. Pick a name and the target workflow the submission should land in.
  2. The app creates a starter YAML (two fields — Summary + Details) and drops you into the editor so you can shape the schema.
  3. Save to commit the file to your workspace repo. The intake's public URL is live immediately.

Each card on the Intakes page exposes Edit (re-opens the YAML in the editor), Share / embed (public URL + iframe snippet + React component snippet), History (commit log for this file), and Delete (removes the YAML and the DB record; existing submissions are retained).

File location

.kiket/intakes/*.yaml. One file per intake form. Each form is addressable at a stable URL: https://app.kiket.dev/intake/<project-key>/<form-key>.

Minimum form

key: contract-request
name: Request a contract review
workflow: contract_review
initial_state: intake

fields:
  - key: counterparty
    label: Counterparty
    type: text
    required: true
  - key: total_value_usd
    label: Contract value (USD)
    type: number
    required: true
  - key: contract_type
    label: Contract type
    type: select
    options: [msa, sow, nda, other]
    required: true
  - key: summary
    label: Brief summary
    type: textarea

When submitted, Kiket creates an issue in the contract_review workflow with these fields pre-populated.

Field types

TypeRenders as
textSingle-line input
textareaMulti-line input
numberNumeric input
dateDate picker
selectSingle-select dropdown
multiselectMulti-select with chips
checkboxSingle checkbox
fileFile upload (stored as an attachment)
emailEmail with validation
urlURL with validation

Validation

Per-field:

- key: total_value_usd
  label: Contract value (USD)
  type: number
  min: 0
  max: 10_000_000
  required: true
  help: Approximate USD equivalent.

Conditional fields

Show a field only when another matches a predicate:

- key: contract_type
  type: select
  options: [msa, sow, nda, other]
- key: other_description
  type: text
  visible_when: "contract_type == 'other'"
  required_when: "contract_type == 'other'"

Branding

Each form can carry a logo, accent color, and intro markdown:

branding:
  logo: https://example.com/logo.png
  accent: "#4f46e5"
  intro: |
    Thanks for engaging with Acme Legal.
    Fill this out and we'll respond within 24 hours.

Submission confirmation

After submit, show:

  • A simple thank-you screen (default), or
  • The issue's public URL (if you've enabled public-issue view), or
  • A redirect to an external URL.
confirmation:
  kind: redirect
  url: https://example.com/thanks

Security

  • Forms run on a separate public subdomain so they don't share cookies with the main app.
  • CAPTCHA is available (Cloudflare Turnstile); toggle via captcha: true.
  • Per-field rate limits are enforced server-side.
  • Attachments go to isolated object storage; they're scanned before anyone in the workflow can open them.

What's next?

On this page