Storage configuration
The dashboard supports two storage backends for test artifacts (HTML reports, trace files, etc.).
Local storage (default)
Files are stored in the .data/storage/ directory relative to the application. No configuration is required.
To customise the path:
# In application/.env
STORAGE_TYPE=local
STORAGE_PATH=/custom/path/to/storageS3-compatible storage
Any S3-compatible service can be used: AWS S3, MinIO, DigitalOcean Spaces, Cloudflare R2, and others.
# In application/.env
STORAGE_TYPE=s3
S3_BUCKET=your-bucket-name
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=your-access-key
S3_SECRET_ACCESS_KEY=your-secret-key
# Optional: custom endpoint for S3-compatible services
S3_ENDPOINT=https://s3.example.comAWS S3
Obtain credentials from AWS Console → IAM → Users → Create user → Create access key.
Minimum required IAM permissions:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:HeadObject"],
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}MinIO
STORAGE_TYPE=s3
S3_ENDPOINT=http://localhost:9000
S3_BUCKET=playwright-dashboard
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadminPath-style URLs are enabled automatically when S3_ENDPOINT is set (as required by MinIO and most self-hosted S3-compatible services). Set S3_FORCE_PATH_STYLE=false to override this behaviour.
DigitalOcean Spaces
STORAGE_TYPE=s3
S3_ENDPOINT=https://nyc3.digitaloceanspaces.com
S3_BUCKET=your-space-name
S3_REGION=nyc3
S3_ACCESS_KEY_ID=your-spaces-key
S3_SECRET_ACCESS_KEY=your-spaces-secretCloudflare R2
STORAGE_TYPE=s3
S3_ENDPOINT=https://[account-id].r2.cloudflarestorage.com
S3_BUCKET=your-bucket-name
S3_REGION=auto
S3_ACCESS_KEY_ID=your-r2-access-key
S3_SECRET_ACCESS_KEY=your-r2-secret-keyStorage management
The Settings › Storage page (/settings/storage) provides administrators with:
- Statistics — total projects, test runs, unique test cases, traces, stored reports, aggregate report size, and actual on-disk storage size (local only).
- Cleanup — permanently delete all test runs older than a configurable number of days (7, 14, 30, 60, 90, 180, or 365 days). A confirmation dialog is shown before any data is deleted.
You can also delete individual test runs:
- From the test run detail page — click the red Delete button in the page header.
- From the project detail page — click the Delete button in the Actions column of the test runs table.
Storage architecture
The dashboard uses an abstraction layer that allows switching backends without any code changes. Files are stored using relative paths (e.g. project-1/run-123/index.html), making migration between backends straightforward.
Database storage
The SQLite database is stored at .data/playwright.db by default. To customise the location:
DATABASE_PATH=/custom/path/database.db npm run devSchema changes
If you modify the database schema:
# 1. Edit application/server/database/schema.ts
# 2. Generate a new migration
npm run db:generate
# 3. Restart the application — migrations apply automatically on startup
npm run devWARNING
Never delete or modify existing migration files. Always generate new migrations for schema changes.