diff --git a/docker/formbricks.sh b/docker/formbricks.sh
index b49d99b8d3..f9cdf989b8 100755
--- a/docker/formbricks.sh
+++ b/docker/formbricks.sh
@@ -340,9 +340,11 @@ EOT
sed -i "s|# S3_BUCKET_NAME:|S3_BUCKET_NAME: \"$ext_s3_bucket\"|" docker-compose.yml
if [[ -n $ext_s3_endpoint ]]; then
sed -i "s|# S3_ENDPOINT_URL:|S3_ENDPOINT_URL: \"$ext_s3_endpoint\"|" docker-compose.yml
- sed -i "s|S3_FORCE_PATH_STYLE: 0|S3_FORCE_PATH_STYLE: 1|" docker-compose.yml
+ # Ensure S3_FORCE_PATH_STYLE is enabled for S3-compatible endpoints (match commented or uncommented)
+ sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|S3_FORCE_PATH_STYLE: 1|' docker-compose.yml
else
- sed -i "s|S3_FORCE_PATH_STYLE: 0|# S3_FORCE_PATH_STYLE:|" docker-compose.yml
+ # Comment out S3_FORCE_PATH_STYLE for native AWS S3 (match commented or uncommented)
+ sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|# S3_FORCE_PATH_STYLE:|' docker-compose.yml
fi
echo "🚗 External S3 configuration updated successfully!"
elif [[ $minio_storage == "y" ]]; then
@@ -356,7 +358,8 @@ EOT
else
sed -i "s|# S3_ENDPOINT_URL:|S3_ENDPOINT_URL: \"http://$files_domain\"|" docker-compose.yml
fi
- sed -i "s|S3_FORCE_PATH_STYLE: 0|S3_FORCE_PATH_STYLE: 1|" docker-compose.yml
+ # Ensure S3_FORCE_PATH_STYLE is enabled for MinIO (match commented or uncommented)
+ sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|S3_FORCE_PATH_STYLE: 1|' docker-compose.yml
echo "🚗 MinIO S3 configuration updated successfully!"
fi
@@ -407,7 +410,7 @@ EOT
minio:
restart: always
- image: minio/minio:RELEASE.2025-09-07T16-13-09Z
+ image: minio/minio@sha256:13582eff79c6605a2d315bdd0e70164142ea7e98fc8411e9e10d089502a6d883
command: server /data
environment:
MINIO_ROOT_USER: "$minio_root_user"
@@ -438,7 +441,7 @@ EOT
- "traefik.http.middlewares.minio-ratelimit.ratelimit.average=100"
- "traefik.http.middlewares.minio-ratelimit.ratelimit.burst=200"
minio-init:
- image: minio/mc:latest
+ image: minio/mc@sha256:95b5f3f7969a5c5a9f3a700ba72d5c84172819e13385aaf916e237cf111ab868
depends_on:
minio:
condition: service_healthy
diff --git a/docs/api-reference/openapi.json b/docs/api-reference/openapi.json
index 10a0290902..a7090768f8 100644
--- a/docs/api-reference/openapi.json
+++ b/docs/api-reference/openapi.json
@@ -5675,7 +5675,7 @@
},
"/api/v1/management/storage": {
"post": {
- "description": "API endpoint for uploading public files. Uploaded files are public and accessible by anyone. This endpoint requires authentication. It accepts a JSON body with fileName, fileType, environmentId, and optionally allowedFileExtensions to restrict file types. On success, it returns a signed URL for uploading the file to S3 along with a local upload URL.",
+ "description": "API endpoint for uploading public files. Uploaded files are public and accessible by anyone. This endpoint requires authentication. It accepts a JSON body with fileName, fileType, environmentId, and optionally allowedFileExtensions to restrict file types. On success, it returns a signed URL for uploading the file to S3.",
"parameters": [
{
"example": "{{apiKey}}",
@@ -5732,8 +5732,15 @@
"example": {
"data": {
"fileUrl": "http://localhost:3000/storage/cm1ubebtj000614kqe4hs3c67/public/profile--fid--abc123.png",
- "localUrl": "http://localhost:3000/storage/cm1ubebtj000614kqe4hs3c67/public/profile.png",
- "signedUrl": "http://localhost:3000/api/v1/client/cm1ubebtj000614kqe4hs3c67/storage/public",
+ "presignedFields": {
+ "Policy": "base64EncodedPolicy",
+ "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
+ "X-Amz-Credential": "your-credential",
+ "X-Amz-Date": "20250312T000000Z",
+ "X-Amz-Signature": "your-signature",
+ "key": "uploads/public/profile--fid--abc123.png"
+ },
+ "signedUrl": "https://s3.example.com/your-bucket",
"updatedFileName": "profile--fid--abc123.png"
}
},
@@ -5745,9 +5752,12 @@
"description": "URL where the uploaded file can be accessed.",
"type": "string"
},
- "localUrl": {
- "description": "URL for uploading the file to local storage.",
- "type": "string"
+ "presignedFields": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Form fields to include in the multipart/form-data POST to S3.",
+ "type": "object"
},
"signedUrl": {
"description": "Signed URL for uploading the file to S3.",
@@ -5765,7 +5775,7 @@
}
}
},
- "description": "OK - Returns the signed URL, updated file name, and file URL."
+ "description": "OK - Returns the signed URL, presigned fields, updated file name, and file URL."
},
"400": {
"content": {
@@ -5829,187 +5839,6 @@
"tags": ["Management API - Storage"]
}
},
- "/api/v1/management/storage/local": {
- "post": {
- "description": "Management API endpoint for uploading public files to local storage. This endpoint requires authentication. File metadata is provided via headers (X-File-Type, X-File-Name, X-Environment-ID, X-Signature, X-UUID, X-Timestamp) and the file is provided as a multipart/form-data file field named \"file\". The \"Content-Type\" header must be set to a valid MIME type.",
- "parameters": [
- {
- "example": "{{apiKey}}",
- "in": "header",
- "name": "x-api-key",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "description": "MIME type of the file. Must be a valid MIME type.",
- "in": "header",
- "name": "X-File-Type",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "description": "URI encoded file name.",
- "in": "header",
- "name": "X-File-Name",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "description": "ID of the environment.",
- "in": "header",
- "name": "X-Environment-ID",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "description": "Signature for verifying the request.",
- "in": "header",
- "name": "X-Signature",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "description": "Unique identifier for the signed upload.",
- "in": "header",
- "name": "X-UUID",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "description": "Timestamp used for the signature.",
- "in": "header",
- "name": "X-Timestamp",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "multipart/form-data": {
- "schema": {
- "properties": {
- "file": {
- "description": "The file to be uploaded as a valid file object (buffer).",
- "format": "binary",
- "type": "string"
- }
- },
- "required": ["file"],
- "type": "object"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "content": {
- "application/json": {
- "example": {
- "data": {
- "message": "File uploaded successfully"
- }
- },
- "schema": {
- "properties": {
- "data": {
- "properties": {
- "message": {
- "description": "Success message.",
- "type": "string"
- }
- },
- "type": "object"
- }
- },
- "type": "object"
- }
- }
- },
- "description": "OK - File uploaded successfully."
- },
- "400": {
- "content": {
- "application/json": {
- "example": {
- "error": "fileType is required"
- },
- "schema": {
- "properties": {
- "error": {
- "description": "Detailed error message.",
- "type": "string"
- }
- },
- "type": "object"
- }
- }
- },
- "description": "Bad Request - Missing required fields, invalid header values, or file issues."
- },
- "401": {
- "content": {
- "application/json": {
- "example": {
- "error": "Not authenticated"
- },
- "schema": {
- "properties": {
- "error": {
- "description": "Detailed error message.",
- "type": "string"
- }
- },
- "type": "object"
- }
- }
- },
- "description": "Unauthorized - Authentication failed, invalid signature, or user not authorized."
- },
- "500": {
- "content": {
- "application/json": {
- "example": {
- "error": "File upload failed"
- },
- "schema": {
- "properties": {
- "error": {
- "description": "Detailed error message.",
- "type": "string"
- }
- },
- "type": "object"
- }
- }
- },
- "description": "Internal Server Error - File upload failed due to server error."
- }
- },
- "servers": [
- {
- "description": "Formbricks API Server",
- "url": "https://app.formbricks.com/api/v1"
- }
- ],
- "summary": "Upload Public File to Local Storage",
- "tags": ["Management API - Storage"]
- }
- },
"/api/v1/management/surveys": {
"get": {
"description": "Fetches all existing surveys",
diff --git a/docs/api-v2-reference/openapi.yml b/docs/api-v2-reference/openapi.yml
index a7c8627a06..ed35450d8c 100644
--- a/docs/api-v2-reference/openapi.yml
+++ b/docs/api-v2-reference/openapi.yml
@@ -3843,6 +3843,7 @@ components:
type: string
enum:
- draft
+ - scheduled
- inProgress
- paused
- completed
diff --git a/docs/docs.json b/docs/docs.json
index d6247c01b9..60274bc3fa 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -225,6 +225,7 @@
"self-hosting/configuration/custom-ssl",
"self-hosting/configuration/environment-variables",
"self-hosting/configuration/smtp",
+ "self-hosting/configuration/file-uploads",
"self-hosting/configuration/domain-configuration",
{
"group": "Auth & SSO",
diff --git a/docs/self-hosting/configuration/file-uploads.mdx b/docs/self-hosting/configuration/file-uploads.mdx
new file mode 100644
index 0000000000..7ad4a959f4
--- /dev/null
+++ b/docs/self-hosting/configuration/file-uploads.mdx
@@ -0,0 +1,316 @@
+---
+title: "File Uploads Configuration"
+description: "Configure file storage for survey images, file uploads, and project assets in your self-hosted Formbricks instance"
+icon: "upload"
+---
+
+Formbricks requires S3-compatible storage for file uploads. You can use external cloud storage services or the bundled MinIO option for a self-hosted solution.
+
+## Why Configure File Uploads?
+
+Setting up file storage enables important features in Formbricks, including:
+
+- Adding images to surveys (questions, backgrounds, logos)
+- 'File Upload' and 'Picture Selection' question types
+- Project logos and branding
+- Custom organization logos in emails
+- Survey background images from uploads
+
+
+ If file uploads are not configured, the above features will be disabled and users won't be able to upload
+ files or images.
+
+
+## Storage Options
+
+Formbricks supports S3-compatible storage with two main configurations:
+
+### 1. External S3-Compatible Storage
+
+Use cloud storage services for production deployments:
+
+- **AWS S3** (Amazon Web Services)
+- **DigitalOcean Spaces**
+- **Backblaze B2**
+- **Wasabi**
+- **StorJ**
+- Any S3-compatible storage service
+
+### 2. Bundled MinIO Storage (Self-Hosted)
+
+
+ **Important**: MinIO requires a dedicated subdomain to function properly. You must configure a subdomain
+ like `files.yourdomain.com` that points to your server. MinIO will not work without this subdomain setup.
+
+
+MinIO provides a self-hosted S3-compatible storage solution that runs alongside Formbricks. This option:
+
+- Runs in a Docker container alongside Formbricks
+- Provides full S3 API compatibility
+- Requires minimal additional configuration
+
+## Configuration Methods
+
+### Option 1: One-Click Setup Script
+
+When using the Formbricks installation script, you'll be prompted to configure file uploads:
+
+```bash
+📁 Do you want to configure file uploads?
+ If you skip this, the following features will be disabled:
+ - Adding images to surveys (e.g., in questions or as background)
+ - 'File Upload' and 'Picture Selection' question types
+ - Project logos
+ - Custom organization logo in emails
+Configure file uploads now? [Y/n] y
+```
+
+#### External S3-Compatible Storage
+
+Choose this option for AWS S3, DigitalOcean Spaces, or other cloud providers:
+
+```bash
+🗄️ Do you want to use an external S3-compatible storage (AWS S3/DO Spaces/etc.)? [y/N] y
+🔧 Enter S3 configuration (leave Endpoint empty for AWS S3):
+ S3 Access Key: your_access_key
+ S3 Secret Key: your_secret_key
+ S3 Region (e.g., us-east-1): us-east-1
+ S3 Bucket Name: your-bucket-name
+ S3 Endpoint URL (leave empty if you are using AWS S3): https://your-endpoint.com
+```
+
+#### Bundled MinIO Storage
+
+Choose this option for a self-hosted S3-compatible storage that runs alongside Formbricks:
+
+
+ **Critical Requirement**: Before proceeding, ensure you have configured a subdomain (e.g.,
+ `files.yourdomain.com`) that points to your server's IP address. MinIO will not function without this
+ subdomain setup.
+
+
+```bash
+🗄️ Do you want to use an external S3-compatible storage (AWS S3/DO Spaces/etc.)? [y/N] n
+🔗 Enter the files subdomain for object storage (e.g., files.yourdomain.com): files.yourdomain.com
+```
+
+The script will automatically:
+
+- Generate secure MinIO credentials
+- Create the storage bucket
+- Configure SSL certificates for the files subdomain
+- Configure Traefik routing for the subdomain
+
+### Option 2: Manual Environment Variables
+
+Add the following environment variables to your `docker-compose.yml` or `.env` file:
+
+#### For S3-Compatible Storage
+
+```bash
+# S3 Storage Configuration
+S3_ACCESS_KEY=your_access_key
+S3_SECRET_KEY=your_secret_key
+S3_REGION=us-east-1
+S3_BUCKET_NAME=your-bucket-name
+
+# Optional: For third-party S3-compatible services (leave empty for AWS S3)
+S3_ENDPOINT_URL=https://your-endpoint.com
+
+# Enable path-style URLs for third-party services (1 for enabled, 0 for disabled)
+S3_FORCE_PATH_STYLE=1
+```
+
+## Provider-Specific Examples
+
+### AWS S3
+
+```bash
+S3_ACCESS_KEY=AKIA1234567890EXAMPLE
+S3_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+S3_REGION=us-east-1
+S3_BUCKET_NAME=my-formbricks-uploads
+# S3_ENDPOINT_URL is not needed for AWS S3
+# S3_FORCE_PATH_STYLE=0
+```
+
+### DigitalOcean Spaces
+
+```bash
+S3_ACCESS_KEY=your_spaces_key
+S3_SECRET_KEY=your_spaces_secret
+S3_REGION=nyc3
+S3_BUCKET_NAME=my-formbricks-space
+S3_ENDPOINT_URL=https://nyc3.digitaloceanspaces.com
+S3_FORCE_PATH_STYLE=1
+```
+
+### MinIO (Self-Hosted)
+
+```bash
+S3_ACCESS_KEY=minio_access_key
+S3_SECRET_KEY=minio_secret_key
+S3_REGION=us-east-1
+S3_BUCKET_NAME=formbricks-uploads
+S3_ENDPOINT_URL=https://files.yourdomain.com
+S3_FORCE_PATH_STYLE=1
+```
+
+### Backblaze B2
+
+```bash
+S3_ACCESS_KEY=your_b2_key_id
+S3_SECRET_KEY=your_b2_application_key
+S3_REGION=us-west-000
+S3_BUCKET_NAME=my-formbricks-bucket
+S3_ENDPOINT_URL=https://s3.us-west-000.backblazeb2.com
+S3_FORCE_PATH_STYLE=1
+```
+
+## Bundled MinIO Setup
+
+When using the bundled MinIO option through the setup script, you get:
+
+### Automatic Configuration
+
+- **Storage Service**: MinIO running in a Docker container
+- **Credentials**: Auto-generated secure access keys
+- **Bucket**: Automatically created `formbricks-uploads` bucket
+- **SSL**: Automatic certificate generation for the files subdomain
+
+### Access Information
+
+After setup, you'll see:
+
+```bash
+🗄️ MinIO Storage Setup Complete:
+ • S3 API: https://files.yourdomain.com
+ • Access Key: formbricks-a1b2c3d4
+ • Bucket: formbricks-uploads (✅ automatically created)
+```
+
+### DNS Requirements
+
+
+ **Critical for MinIO**: The subdomain configuration is mandatory for MinIO to function. Without proper
+ subdomain DNS setup, MinIO will fail to work entirely.
+
+
+For the bundled MinIO setup, ensure:
+
+1. **Main domain**: `yourdomain.com` points to your server IP
+2. **Files subdomain**: `files.yourdomain.com` points to your server IP (this is required for MinIO to work)
+3. **Firewall**: Ports 80 and 443 are open in your server's firewall
+4. **DNS propagation**: Allow time for DNS changes to propagate globally
+
+## Docker Compose Configuration
+
+For manual setup, update your `docker-compose.yml`:
+
+```yaml
+services:
+ formbricks:
+ image: ghcr.io/formbricks/formbricks:latest
+ environment:
+ # ... other environment variables ...
+
+ # S3 Storage Configuration
+ S3_ACCESS_KEY: your_access_key
+ S3_SECRET_KEY: your_secret_key
+ S3_REGION: us-east-1
+ S3_BUCKET_NAME: your-bucket-name
+ S3_ENDPOINT_URL: https://your-endpoint.com # Optional
+ S3_FORCE_PATH_STYLE: 1 # For third-party services
+ volumes:
+ - uploads:/home/nextjs/apps/web/uploads/ # Still needed for temporary files
+```
+
+## Security Considerations
+
+### S3 Bucket Permissions
+
+Configure your S3 bucket with a least-privileged policy:
+
+1. **Scoped Public Read Access**: Only allow public read access to specific prefixes where needed
+2. **Restricted Write Access**: Only your Formbricks instance should be able to upload files
+3. **CORS Configuration**: Allow requests from your Formbricks domain
+
+Example least-privileged S3 bucket policy:
+
+```json
+{
+ "Statement": [
+ {
+ "Action": "s3:GetObject",
+ "Effect": "Allow",
+ "Principal": "*",
+ "Resource": "arn:aws:s3:::your-bucket-name/uploads/public/*",
+ "Sid": "PublicReadForPublicUploads"
+ },
+ {
+ "Action": ["s3:PutObject", "s3:PutObjectAcl"],
+ "Effect": "Allow",
+ "Principal": {
+ "AWS": "arn:aws:iam::123456789012:user/formbricks-service"
+ },
+ "Resource": "arn:aws:s3:::your-bucket-name/*",
+ "Sid": "AllowFormbricksWrite"
+ }
+ ],
+ "Version": "2012-10-17"
+}
+```
+
+### MinIO Security
+
+When using bundled MinIO:
+
+- Credentials are auto-generated and secure
+- Access is restricted through Traefik proxy
+- CORS is automatically configured
+- Rate limiting is applied to prevent abuse
+- A bucket policy with the least privileges is applied to the bucket
+
+## Troubleshooting
+
+### Common Issues
+
+**Files not uploading:**
+
+1. Check that S3 credentials are correct
+2. Verify bucket exists and is accessible
+3. Ensure bucket permissions allow uploads from your server
+4. Check network connectivity to S3 endpoint
+
+**Images not displaying in surveys:**
+
+1. Verify bucket has public read access
+2. Check CORS configuration allows requests from your domain
+3. Ensure S3_ENDPOINT_URL is correctly set for third-party services
+
+**MinIO not starting:**
+
+1. **Verify subdomain DNS**: Ensure `files.yourdomain.com` points to your server IP (this is the most common issue)
+2. **Check DNS propagation**: Use tools like `nslookup` or `dig` to verify DNS resolution
+3. **Verify ports**: Ensure ports 80 and 443 are open in your firewall
+4. **SSL certificate**: Check that SSL certificate generation completed successfully
+5. **Container logs**: Check Docker container logs: `docker compose logs minio`
+
+### Testing Your Configuration
+
+To test if file uploads are working:
+
+1. **Admin Panel**: Try uploading a project logo in the project settings
+2. **Survey Editor**: Attempt to add a background image to a survey
+3. **Question Types**: Create a 'File Upload' or 'Picture Selection' question
+4. **Check Logs**: Monitor container logs for any storage-related errors
+
+```bash
+# Check Formbricks logs
+docker compose logs formbricks
+
+# Check MinIO logs (if using bundled MinIO)
+docker compose logs minio
+```
+
+For additional help, join the conversation on [GitHub Discussions](https://github.com/formbricks/formbricks/discussions).
diff --git a/docs/xm-and-surveys/core-features/email-customization.mdx b/docs/xm-and-surveys/core-features/email-customization.mdx
index c1b6ab473c..c8ae3b1803 100644
--- a/docs/xm-and-surveys/core-features/email-customization.mdx
+++ b/docs/xm-and-surveys/core-features/email-customization.mdx
@@ -4,14 +4,16 @@ description: "Branding the emails that are sent to your respondents."
icon: "envelope"
---
+
+ **Self-Hosting Requirements**: Uploading custom organization logos for emails requires file upload storage
+ to be configured. If you're self-hosting Formbricks, make sure to [configure file
+ uploads](/self-hosting/configuration/file-uploads) before using this feature.
+
+
Email branding is a white-label feature that allows you to customize the email that is sent to your users. You can upload a logo of your company and use it in the email.
-
- Email branding is part of the Formbricks [Enterprise Edition](/self-hosting/advanced/license).
-
-
- Only the Owner and Managers of the organization can modify the logo.
-
+Email branding is part of the Formbricks [Enterprise Edition](/self-hosting/advanced/license).
+Only the Owner and Managers of the organization can modify the logo.
## How to upload a logo
diff --git a/docs/xm-and-surveys/core-features/styling-theme.mdx b/docs/xm-and-surveys/core-features/styling-theme.mdx
index 8f0d1be055..12ee42d0d4 100644
--- a/docs/xm-and-surveys/core-features/styling-theme.mdx
+++ b/docs/xm-and-surveys/core-features/styling-theme.mdx
@@ -1,10 +1,15 @@
---
title: "Styling Theme"
-description:
- "Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic."
+description: "Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic."
icon: "palette"
---
+
+ **Self-Hosting Requirements**: Uploading custom background images and brand logos requires file upload
+ storage to be configured. If you're self-hosting Formbricks, make sure to [configure file
+ uploads](/self-hosting/configuration/file-uploads) before using these features.
+
+
Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic.
## Configuration
@@ -20,7 +25,6 @@ In the left side bar, you find the `Configuration` page. On this page you find t

-
- **Brand Color**: Sets the primary color tone of the survey.
- **Text Color**: This is a single color scheme that will be used across to display all the text on your survey. Ensures all text is readable against the background.
- **Input Color:** Alters the border color of input fields.
@@ -63,17 +67,14 @@ Customize your survey with your brand's logo.

-
3. Add a background color: If you’ve uploaded a transparent image and want to add background to it, enable this toggle and select the color of your choice.

-
4. Remember to save your changes!

-
The logo settings apply across all Link Surveys pages.
## Overwrite Styling Theme
diff --git a/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx b/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx
index f68677906e..24cf4c7445 100644
--- a/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx
+++ b/docs/xm-and-surveys/surveys/general-features/add-image-or-video-question.mdx
@@ -4,6 +4,12 @@ description: "Enhance your questions by adding images or videos. This makes inst
icon: "image"
---
+
+ **Self-Hosting Requirements**: Adding images to questions requires file upload storage to be configured. If
+ you're self-hosting Formbricks, make sure to [configure file
+ uploads](/self-hosting/configuration/file-uploads) before using this feature.
+
+
## How to Add Images
Click the icon on the right side of the question to add an image or video:
@@ -25,6 +31,6 @@ Toggle to add a video via link:
We support YouTube, Vimeo, and Loom URLs.
- **YouTube Privacy Mode**: This option reduces tracking by converting YouTube
- URLs to no-cookie URLs. It only works with YouTube.
+ **YouTube Privacy Mode**: This option reduces tracking by converting YouTube URLs to no-cookie URLs. It only
+ works with YouTube.
diff --git a/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx b/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx
index 5d9b3665d8..7e9d21234e 100644
--- a/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx
+++ b/docs/xm-and-surveys/surveys/link-surveys/link-settings.mdx
@@ -4,6 +4,12 @@ description: "Customize link titles, descriptions, and preview images to make yo
icon: "gear"
---
+
+ **Self-Hosting Requirements**: Adding a preview image requires file upload storage to be configured. If
+ you're self-hosting Formbricks, make sure to [configure file
+ uploads](/self-hosting/configuration/file-uploads) before using this feature.
+
+
## What are Link Settings?
Link Settings allow you to configure the metadata (Open Graph tags) for your survey links, controlling how they appear when shared:
@@ -14,7 +20,6 @@ Link Settings allow you to configure the metadata (Open Graph tags) for your sur

-
## Configuring Link Metadata
@@ -22,21 +27,22 @@ Link Settings allow you to configure the metadata (Open Graph tags) for your sur
Navigate to your survey's Summary page and click the **Share survey** button in the top toolbar.
-
- In the Share Modal, click on the **Link Settings** tab to access the customization options.
-
+
+ In the Share Modal, click on the **Link Settings** tab to access the customization options.
+
-
- Enter a title for your survey link. This will appear as the main headline when your link is shared.
-
+
+ Enter a title for your survey link. This will appear as the main headline when your link is shared.
+
-
- Write a brief description for your survey. This will appear as the description of your Survey Link.
-
+
+ Write a brief description for your survey. This will appear as the description of your Survey Link.
+
-
- Add a custom image that will display when your link is shared. This makes your survey more visually appealing and can increase engagement.
-
+
+ Add a custom image that will display when your link is shared. This makes your survey more visually
+ appealing and can increase engagement.
+
Click **Save** to apply your link settings. These changes will take effect immediately for all future link shares.
diff --git a/docs/xm-and-surveys/surveys/question-type/file-upload.mdx b/docs/xm-and-surveys/surveys/question-type/file-upload.mdx
index 4ac4e7b049..0d890768a0 100644
--- a/docs/xm-and-surveys/surveys/question-type/file-upload.mdx
+++ b/docs/xm-and-surveys/surveys/question-type/file-upload.mdx
@@ -4,6 +4,12 @@ description: "The File Upload question type allows respondents to upload files r
icon: "upload"
---
+
+ **Self-Hosting Requirements**: This question type requires file upload storage to be configured. If you're
+ self-hosting Formbricks, make sure to [configure file uploads](/self-hosting/configuration/file-uploads)
+ before using this feature.
+
+