diff --git a/.github/README.md b/.github/README.md
index bee99636..f50bd2eb 100644
--- a/.github/README.md
+++ b/.github/README.md
@@ -38,6 +38,7 @@
|:--:|:------------------------------------------------------------------------------------------------:|:-----------------------:|:-------------------------------------------------------------:|:---------------------------------------------------------------------|:--------:|
| 🟢 | | 异次元店铺系统V3 | https://faka.wiki/ | 二次元发卡系统 | |
| 🟢 | | 异次元店铺系统V4 | https://wiki.mcy.im/ | 二次元发卡系统 | |
+| 🟢 | | AFFiNE | https://affine.pro/ | AFFiNE是一个具有完全合并文档、白板和数据库的工作空间 | |
| 🟢 | | AList | https://alist.nn.ci/ | 一款支持多重存储的文件列表程序 | |
| 🟢 | | AList-Aria2 | https://alist.nn.ci/ | 【含Aria2插件版】一款支持多重存储的文件列表程序 | |
| 🟢 | | AList-FFmpeg | https://alist.nn.ci/ | 【含FFmpeg插件版】一款支持多重存储的文件列表程序 | |
diff --git a/README.md b/README.md
index 8e175981..2a5d6aa4 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,7 @@
|:--:|:------------------------------------------------------------------------------------------------:|:-----------------------:|:-------------------------------------------------------------:|:---------------------------------------------------------------------|:--------:|
| 🟢 | | 异次元店铺系统V3 | https://faka.wiki/ | 二次元发卡系统 | |
| 🟢 | | 异次元店铺系统V4 | https://wiki.mcy.im/ | 二次元发卡系统 | |
+| 🟢 | | AFFiNE | https://affine.pro/ | AFFiNE是一个具有完全合并文档、白板和数据库的工作空间 | |
| 🟢 | | AList | https://alist.nn.ci/ | 一款支持多重存储的文件列表程序 | |
| 🟢 | | AList-Aria2 | https://alist.nn.ci/ | 【含Aria2插件版】一款支持多重存储的文件列表程序 | |
| 🟢 | | AList-FFmpeg | https://alist.nn.ci/ | 【含FFmpeg插件版】一款支持多重存储的文件列表程序 | |
diff --git a/apps/affine/README.md b/apps/affine/README.md
new file mode 100644
index 00000000..5f98c8ba
--- /dev/null
+++ b/apps/affine/README.md
@@ -0,0 +1,16 @@
+# AFFiNE
+
+AFFiNE是一个具有完全合并文档、白板和数据库的工作空间
+
+![AFFiNE](https://file.lifebus.top/imgs/affine_cover.png)
+
+![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue)
+
+## 简介
+
+AFFiNE 是一个开源的全能工作空间和操作系统,用于组装您的知识库以及更多——维基、知识管理、演示和数字资产。它是 Notion 和 Miro
+的更好替代品。
+
+---
+
+![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png)
diff --git a/apps/affine/data.yml b/apps/affine/data.yml
new file mode 100644
index 00000000..04eedd30
--- /dev/null
+++ b/apps/affine/data.yml
@@ -0,0 +1,14 @@
+additionalProperties:
+ key: affine
+ name: AFFiNE
+ tags:
+ - WebSite
+ - Local
+ shortDescZh: AFFiNE是一个具有完全合并文档、白板和数据库的工作空间
+ shortDescEn: AFFiNE is a workspace with fully merged docs, whiteboards and databases.
+ type: website
+ crossVersionUpdate: true
+ limit: 0
+ website: https://affine.pro/
+ github: https://github.com/toeverything/AFFiNE/
+ document: https://docs.affine.pro/docs/code-of-conduct/
diff --git a/apps/affine/logo.png b/apps/affine/logo.png
new file mode 100644
index 00000000..72d04e3c
Binary files /dev/null and b/apps/affine/logo.png differ
diff --git a/apps/affine/stable-1623f5d/data.yml b/apps/affine/stable-1623f5d/data.yml
new file mode 100644
index 00000000..bb37886e
--- /dev/null
+++ b/apps/affine/stable-1623f5d/data.yml
@@ -0,0 +1,183 @@
+additionalProperties:
+ formFields:
+ - child:
+ default: ""
+ envKey: PANEL_POSTGRES_SERVICE
+ required: true
+ type: service
+ default: postgresql
+ envKey: PANEL_POSTGRES_TYPE
+ labelZh: Postgres 服务 (前置检查)
+ labelEn: Postgres Service (Pre-check)
+ required: true
+ type: apps
+ values:
+ - label: PostgreSQL
+ value: postgresql
+ - child:
+ default: ""
+ envKey: PANEL_REDIS_SERVICE
+ required: true
+ type: service
+ default: redis
+ envKey: PANEL_REDIS_TYPE
+ labelZh: Redis 服务 (前置检查)
+ labelEn: Redis Service (Pre-check)
+ required: true
+ type: apps
+ values:
+ - label: Redis
+ value: redis
+ - default: "/home/affine"
+ edit: true
+ envKey: AFFINE_ROOT_PATH
+ labelZh: 数据持久化路径
+ labelEn: Data persistence path
+ required: true
+ type: text
+ - default: 3010
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelZh: WebUI 端口
+ labelEn: WebUI port
+ required: true
+ rule: paramPort
+ type: number
+ - default: 5555
+ edit: true
+ envKey: PANEL_APP_PORT_COMMUNICATION
+ labelZh: 通讯端口
+ labelEn: Communication port
+ required: true
+ rule: paramPort
+ type: number
+ - default: "http://127.0.0.1:3010"
+ edit: true
+ envKey: AFFINE_SERVER_EXTERNAL_URL
+ labelZh: 服务外部地址
+ labelEn: Service external address
+ required: true
+ type: text
+ - default: "false"
+ edit: true
+ envKey: AFFINE_SERVER_HTTPS
+ labelZh: 是否启用 HTTPS
+ labelEn: Enable HTTPS
+ required: true
+ type: select
+ values:
+ - label: 已开启
+ value: "true"
+ - label: 未开启
+ value: "false"
+ - default: "smtp.163.com"
+ edit: true
+ envKey: MAILER_HOST
+ labelZh: SMTP 服务器地址
+ labelEn: SMTP server address
+ required: true
+ type: text
+ - default: 465
+ edit: true
+ envKey: MAILER_PORT
+ labelZh: SMTP 服务器端口
+ labelEn: SMTP server port
+ required: true
+ rule: paramPort
+ type: number
+ - default: ""
+ edit: true
+ envKey: MAILER_SENDER
+ labelZh: 邮件发送者
+ labelEn: Email sender
+ required: true
+ type: text
+ - default: ""
+ edit: true
+ envKey: MAILER_USER
+ labelZh: SMTP 用户名
+ labelEn: SMTP username
+ required: true
+ type: text
+ - default: ""
+ edit: true
+ envKey: MAILER_PASSWORD
+ labelZh: SMTP 密码
+ labelEn: SMTP password
+ required: true
+ type: password
+ - default: "127.0.0.1"
+ edit: true
+ envKey: POSTGRES_HOST
+ labelZh: 数据库 主机地址
+ labelEn: Database Host
+ required: true
+ type: text
+ - default: 5432
+ edit: true
+ envKey: POSTGRES_PORT
+ labelZh: 数据库 端口
+ labelEn: Database Port
+ required: true
+ rule: paramPort
+ type: number
+ - default: "affine"
+ edit: true
+ envKey: POSTGRES_NAME
+ labelZh: 数据库 名称
+ labelEn: Database Name
+ required: true
+ rule: paramCommon
+ type: text
+ - default: "affine"
+ edit: true
+ envKey: POSTGRES_USER
+ labelZh: 数据库 用户名
+ labelEn: Database Username
+ required: true
+ type: text
+ - default: ""
+ edit: true
+ envKey: POSTGRES_PASSWORD
+ labelZh: 数据库 密码
+ labelEn: Database Password
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: "127.0.0.1"
+ edit: true
+ envKey: REDIS_SERVER_HOST
+ labelZh: Redis 主机
+ labelEn: Redis Host
+ required: true
+ type: text
+ - default: 6379
+ edit: true
+ envKey: REDIS_SERVER_PORT
+ labelZh: Redis 端口
+ labelEn: Redis Port
+ required: true
+ rule: paramPort
+ type: number
+ - default: 0
+ edit: true
+ envKey: REDIS_SERVER_DATABASE
+ labelZh: Redis 索引 (0-20)
+ labelEn: Redis Index (0-20)
+ required: true
+ type: number
+ - default: ""
+ edit: true
+ envKey: REDIS_SERVER_USER
+ labelZh: Redis 用户
+ labelEn: Redis User
+ required: false
+ type: text
+ - default: ""
+ edit: true
+ envKey: REDIS_SERVER_PASSWORD
+ labelZh: Redis 密码
+ labelEn: Redis Password
+ required: false
+ type: password
diff --git a/apps/affine/stable-1623f5d/docker-compose.yml b/apps/affine/stable-1623f5d/docker-compose.yml
new file mode 100644
index 00000000..fdf9d449
--- /dev/null
+++ b/apps/affine/stable-1623f5d/docker-compose.yml
@@ -0,0 +1,35 @@
+networks:
+ 1panel-network:
+ external: true
+
+services:
+ affine:
+ image: ghcr.io/toeverything/affine-graphql:stable-1623f5d
+ container_name: ${CONTAINER_NAME}
+ labels:
+ createdBy: "Apps"
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - ${PANEL_APP_PORT_HTTP}:3010
+ - ${PANEL_APP_PORT_COMMUNICATION}:5555
+ env_file:
+ - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env}
+ - ${ENV_FILE:-/etc/1panel/envs/default.env}
+ volumes:
+ - ${AFFINE_ROOT_PATH}/config:/root/.affine/config
+ - ${AFFINE_ROOT_PATH}/storage:/root/.affine/storage
+ environment:
+ - NODE_OPTIONS="--import=./scripts/register.js"
+ - AFFINE_CONFIG_PATH=/root/.affine/config
+ - REDIS_SERVER_HOST=redis
+ - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_NAME}
+ - NODE_ENV=production
+ - TELEMETRY_ENABLE=false
+ - AFFINE_SERVER_HOST=localhost
+ - AFFINE_SERVER_PORT=3010
+ - AFFINE_SERVER_HTTPS=false
+ - AFFINE_SERVER_EXTERNAL_URL=http://127.0.0.1:3010
+ command:
+ [ 'sh', '-c', 'node ./scripts/self-host-predeploy && node ./dist/index.js' ]
diff --git a/apps/affine/stable-1623f5d/envs/default.env b/apps/affine/stable-1623f5d/envs/default.env
new file mode 100644
index 00000000..cd05f46e
--- /dev/null
+++ b/apps/affine/stable-1623f5d/envs/default.env
@@ -0,0 +1,2 @@
+# copyright© 2024 XinJiang Ms Studio
+ENV_FILE=.env
diff --git a/apps/affine/stable-1623f5d/envs/global.env b/apps/affine/stable-1623f5d/envs/global.env
new file mode 100644
index 00000000..e10989fe
--- /dev/null
+++ b/apps/affine/stable-1623f5d/envs/global.env
@@ -0,0 +1,2 @@
+# copyright© 2024 XinJiang Ms Studio
+TZ=Asia/Shanghai
diff --git a/apps/affine/stable-1623f5d/scripts/init.sh b/apps/affine/stable-1623f5d/scripts/init.sh
new file mode 100644
index 00000000..07fb8c3f
--- /dev/null
+++ b/apps/affine/stable-1623f5d/scripts/init.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ -f .env ]; then
+ source .env
+
+ # setup-1 add default values
+ CURRENT_DIR=$(pwd)
+ sed -i '/^ENV_FILE=/d' .env
+ sed -i '/^GLOBAL_ENV_FILE=/d' .env
+ echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env
+ echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env
+
+ echo "Check Finish."
+
+else
+ echo "Error: .env file not found."
+fi
diff --git a/apps/affine/stable-1623f5d/scripts/uninstall.sh b/apps/affine/stable-1623f5d/scripts/uninstall.sh
new file mode 100644
index 00000000..c86c4fbc
--- /dev/null
+++ b/apps/affine/stable-1623f5d/scripts/uninstall.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+if [ -f .env ]; then
+ source .env
+
+ echo "Check Finish."
+
+else
+ echo "Error: .env file not found."
+fi
diff --git a/apps/affine/stable-1623f5d/scripts/upgrade.sh b/apps/affine/stable-1623f5d/scripts/upgrade.sh
new file mode 100644
index 00000000..07fb8c3f
--- /dev/null
+++ b/apps/affine/stable-1623f5d/scripts/upgrade.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ -f .env ]; then
+ source .env
+
+ # setup-1 add default values
+ CURRENT_DIR=$(pwd)
+ sed -i '/^ENV_FILE=/d' .env
+ sed -i '/^GLOBAL_ENV_FILE=/d' .env
+ echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env
+ echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env
+
+ echo "Check Finish."
+
+else
+ echo "Error: .env file not found."
+fi