---
title: "Key Concepts"
description: "Quick overview of essential Dify concepts "
icon: "circle-info"
---

### Dify App

Dify is made for agentic app building. In **Studio**, you can quickly build agentic workflows via a drag & drop interface and publish them as apps. You can access published apps via API, the web, or as an [MCP server](/en/guides/application-publishing/publish-mcp). Dify offers two main app types: workflow and chatflow. You will need to choose an app type when creating a new app.

<Info>
We recommend choosing Workflow or Chatflow your app type. But in addition to these, Dify also offers 3 more basic app types: Chatbot, Agent, and Text Generator.
<img
  src="/images/22087830d0a6478d42d0c60e6eb88d19bca27be3c645f2bb0968d51330b7da72.png"
  alt="22087830d0a6478d42d0c60e6eb88d19bca27be3c645f2bb0968d51330b7da72.png"
  title="22087830d0a6478d42d0c60e6eb88d19bca27be3c645f2bb0968d51330b7da72.png"
  className="mt-1"
  style={{ width:"100%" }}
/>
These app types run on the same workflow engine underneath, but comes with simpler legacy interfaces:
<img
  src="/images/chatbot-interface.png"
  alt="chatbot-interface.png"
  title="chatbot-interface.png"
  className="mt-1"
  style={{ width:"100%" }}
/>
</Info>
### Workflow

Build workflow apps to handle single-turn tasks. The webapp interface and API provides easy access to batch execute many tasks at once.

<Info>
  Underneath it all, workflow forms the basis for all other app types in Dify.
</Info>

### Chatflow

Chatflow is a special type of workflow app that gets triggered at every turn of a conversation. Other than workflow features, chatflow comes with the ability to store and update custom conversation-specific variables, enable memory in LLM nodes, and stream formatted text, images, and files at different points throughout the chatflow run.

<img
  src="/images/image.png"
  alt="image.png"
  title="image.png"
  className="mx-auto"
  style={{ width:"69%" }}
/>

### Dify DSL

All Dify apps can be exported into a YAML file in Dify's own DSL (Domain-Specific Language) and you may create Dify apps from these DSL files directly. This makes it easy to port apps to other Dify instances and share with others.

### Variables

A variable is a labeled container to store information, so you can find and use that information later by referencing its name. You'll come across different types of variables when building a Dify app:

**Inputs**: You can specify any number of input variables at the Start node for your app end users to fill in.

<img
  src="/images/CleanShot2025-08-04at14.34.04@2x.png"
  alt="CleanShot 2025-08-04 at 14.34.04@2x.png"
  title="CleanShot 2025-08-04 at 14.34.04@2x.png"
  className="mx-auto"
  style={{ width:"51%" }}
/>

Additionally, the start node comes with a set of input variables that you can reference later in the flow. For different app types, different variables are provided.

![2bc13695bb7c41fe54b7362d4b7237a480524aa7c05b42c80649fd1e1209f091.png](/images/2bc13695bb7c41fe54b7362d4b7237a480524aa7c05b42c80649fd1e1209f091.png)

Inputs are set at the start of each workflow run and cannot be updated.

**Node Outputs**: Each node produces a list of outputs that can be referenced in subsequent nodes. For instance, the LLM node has outputs:

<img
  src="/images/CleanShot2025-08-04at14.28.57@2x.png"
  alt="CleanShot 2025-08-04 at 14.28.57@2x.png"
  title="CleanShot 2025-08-04 at 14.28.57@2x.png"
  className="mx-auto"
  style={{ width:"45%" }}
/>

Like inputs, node outputs cannot be updated either.

**Environment Variable**: Use environment variable to store sensitive information like API keys specific to your app. This allows a clean separation between secrets and the Dify app itself, so you don't have to risk exposing passwords and keys when sharing your app's DSL. Environment variables are also constants and cannot be updated.

\*\*(Chatflow only) Conversation Variable: \*\*These variables are conversation-specific -- meaning they persist over multi-turn chatflow runs in a single conversatio so you can store and access dynamic information like to-do list and token cost. You can update the value of a conversation variable via the Variable Assigner node:

<img
  src="/images/2935cb58851e5c5407a08dde49f7d9738bb13aa0e64df24278e2104b316f6af6.png"
  alt="2935cb58851e5c5407a08dde49f7d9738bb13aa0e64df24278e2104b316f6af6.png"
  title="2935cb58851e5c5407a08dde49f7d9738bb13aa0e64df24278e2104b316f6af6.png"
  className="mx-auto"
  style={{ width:"70%" }}
/>

### Variable Referencing

You can easily pass variables to any node when configuring its input field by selecting from a dropdown:

<img
  src="/images/CleanShot2025-08-04at15.13.33@2x.png"
  alt="CleanShot 2025-08-04 at 15.13.33@2x.png"
  title="CleanShot 2025-08-04 at 15.13.33@2x.png"
  className="mx-auto"
  style={{ width:"70%" }}
/>

You can also insert variable values into complex text inputs by typing `/` slash, and selecting the desired variable from the dropdown.

<img
  src="/images/image.png"
  alt="image.png"
  title="image.png"
  className="mx-auto"
  style={{ width:"73%" }}
/>

{/*
Contributing Section
DO NOT edit this section!
It will be automatically generated by the script.
*/}

[Edit this page](https://github.com/langgenius/dify-docs/edit/main/en/guides/workflow/key-concepts.mdx) | [Report an issue](https://github.com/langgenius/dify-docs/issues/new?template=docs.yml)

