Skip to content

Compare to Espanso Forms

Espanso has its own built-in forms feature. This page explains the differences and helps you decide which to use.

TL;DR

Use built-in Espanso forms for simple input (1-3 basic fields). Use Espanso Dynamic Forms when you need validation, complex layouts, file uploads, or Liquid templating.

espanso-edf-side-by-side.avifSide-by-side comparison of an Espanso form (left) and an Espanso Dynamic Forms form (right).

Key Differences

FeatureEspanso Forms (built-in)Espanso Dynamic Forms (this app)
Field TypesBasic types only: text, choice, listFull JSON Schema support with custom renderers (file uploads, dates, arrays, etc.)
Layout ControlSimple inline layout with [[field]] syntaxFlexible UI Schema with VerticalLayout, HorizontalLayout, Categorization, groups, and conditional visibility
ValidationNo built-in validationJSON Schema validation with AJV (required fields, type checking, patterns, etc.)
Output FormattingStatic template with basic variable substitutionLiquid template engine with filters, control flow, and loops
File HandlingNot supportedCustom file upload controls with metadata extraction
Dynamic Values{{clipboard}} token only{{clipboard}} and {{env.VAR}} tokens for environment variables
InternationalizationNot supportedi18n support for multi-language interfaces
Configuration FormatInline YAML within Espanso configSeparate YAML/JSON files
UI ComponentsBasic native form controlsMaterial Design components via Vuetify 3

Compare Example Forms

The following examples show a native Espanso form and its equivalent in Espanso Dynamic Forms config.

Espanso Forms

yaml
  - trigger: :email
    replace: |
      Subject: {{form1.subject}}
      Priority: {{form1.priority}}

      ---

      Hi {{form1.contact_name}},

      Just following up on our conversation about {{form1.subject}}.

      Regards,
      Me
    vars:
      - name: "form1"
        type: form
        params:
          layout: |
            Subject: [[subject]]
            Priority: [[priority]]
            Contact name [[contact_name]],
          fields:
            subject:
              type: text
              multiline: false
              default: "{{clipboard}}"
            priority:
              type: choice
              values:
                - High
                - Medium
                - Low
              default: Medium
            contact_name:
              type: text
              multiline: false
              default: ""

Espanso Dynamic Forms

yaml
schema:
  type: object
  properties:
    subject:
      type: string
    priority:
      type: string
      enum:
        - High
        - Medium
        - Low
    contactName:
      type: string

uischema:
  type: VerticalLayout
  elements:
    - type: Control
      scope: "#/properties/subject"
      options:
        multi: false
    - type: Control
      scope: "#/properties/priority"
      options:
        format: radio
    - type: Control
      scope: "#/properties/contactName"
      options:
        multi: false

data:
  subject: "{{clipboard}}"
  priority: Medium
  contactName: ""

template: |
  Subject: {{subject}}
  Priority: {{priority | upcase}}
  
  ---
  
  Hi {{contactName | capitalize}},

  Just following up on our conversation about {{subject}}.

  Regards,
  Me

When to Use Which

ScenarioRecommendation
Quick text input (1-2 fields)Built-in Espanso forms
Need validation (required fields, patterns)Espanso Dynamic Forms
Complex layout (tabs, groups, conditional fields)Espanso Dynamic Forms
File uploads or date pickersEspanso Dynamic Forms
Multi-language supportEspanso Dynamic Forms
Liquid templating with filters and loopsEspanso Dynamic Forms

Espanso Dynamic Forms is more powerful, but built-in forms are simpler for basic needs. Choose based on your specific requirements.