Documentation Index
Fetch the complete documentation index at: https://mintlify.com/syhily/yufan.me/llms.txt
Use this file to discover all available pages before exploring further.
The advanced settings sections control Redis caching behaviour, request rate limiting, search mode, outgoing mail, and scheduled backups — all configurable from the admin console without redeployment.
Cache (blog.cache)
Path: /admin/settings/cache
The Cache section exposes six independently configurable Redis buckets. Each bucket has a prefix (used as the Redis key namespace) and a TTL in seconds.
| Bucket | Default prefix | Default TTL |
|---|
| OG image | og: | 86400 s (24 h) |
| Calendar SVG | calendar: | 86400 s (24 h) |
| Avatar | avatar: | 86400 s (24 h) |
| Image metadata | image-meta: | 3600 s (1 h) |
| Embedding search | embedding-search: | 604800 s (7 days) |
| Search result | search-result: | 3600 s (1 h) |
TTL bounds: minimum 3600 s (1 h), maximum 2592000 s (30 days).
Prefixes must match the pattern [a-z0-9_-]+: — only letters, digits, underscores, and hyphens, ending with a colon.
Cache prefixes must be unique across all buckets and must not conflict with the reserved prefixes session:, rate-limit:, and avatar-status:. Each prefix must end with :. The server rejects any save that would cause two buckets to share a prefix or for a bucket prefix to be a prefix-of or equal-to a reserved key — this prevents SCAN operations from spilling into a neighbouring bucket’s namespace.
You can clear any cache bucket from the same settings page without touching Redis directly.
Rate limits (blog.rateLimit)
Path: /admin/settings/rate-limit
The Rate limits section lets you tune the per-surface request caps. Each bucket has a max attempts count and a window in seconds.
| Bucket | Default max attempts | Default window |
|---|
| Sign-in by IP | 5 | 1800 s (30 min) |
| Comment post by IP | 12 | 3600 s (1 h) |
| Comment post by email | 8 | 3600 s (1 h) |
| Like increase by IP | 30 | 3600 s (1 h) |
| Invite by IP | 5 | 3600 s (1 h) |
| Invite by email | 1 | 3600 s (1 h) |
| Password reset by IP | 3 | 1800 s (30 min) |
| Password reset by email | 1 | 300 s (5 min) |
| Password reset by target | 1 | 60 s (1 min) |
Bounds: window 60 – 86400 s; max attempts 1 – 1000.
The defaults mirror the historical hard-coded values, so an existing deployment that upgrades picks up the same behaviour automatically until you choose to tune the caps.
Search (blog.search)
Path: /admin/settings/search
The Search section controls whether search is available on the public site and which search engine is used.
| Field | Default | Description |
|---|
| Enabled | Off | Show the search UI and activate the search endpoint |
| Mode | like | like for SQL LIKE search; vector for OpenAI vector search |
| OpenAI endpoint | — | Custom OpenAI-compatible API endpoint (leave empty for the official OpenAI endpoint) |
| API key | — | OpenAI API key (send empty to keep the existing value) |
| Model | text-embedding-3-small | Embedding model name |
| Similarity threshold | 0.5 | Minimum cosine similarity score for a result to be returned (0 – 1) |
Embedding search requires the pgvector extension to be installed in your Postgres database. The system falls back to SQL LIKE search automatically if the extension is unavailable.
In like mode, no external API calls are made — search runs a SQL LIKE query directly against your Postgres database and has no external dependencies.
Mail (blog.mail)
Path: /admin/settings/mail
The Mail section configures outgoing email through Zeabur ZSend. Mail is disabled by default.
| Field | Default | Description |
|---|
| Enabled | Off | Enable outgoing email delivery |
| Host | api.zeabur.com | ZSend API hostname (no scheme — https:// is always used) |
| API key | — | Zeabur ZSend API key (send empty to keep the existing value) |
| Sender address | — | From address for outgoing mail (must be a valid email) |
Mail is used for comment notification emails. The sender address must be verified with Zeabur ZSend before outgoing mail will be delivered. An unverified sender will cause the ZSend API to reject the request with a 4xx error.
Use the Send test email button on the settings page to verify your configuration before enabling live notifications.
Backup (blog.backup)
Path: /admin/settings/backup
The Backup section schedules automated Postgres database dumps and configures how long backup files are retained.
Scheduled backups
| Field | Default | Description |
|---|
| Enabled | Off | Enable the backup scheduler |
| Frequency | daily | daily, weekly, or monthly |
| Hour (UTC) | 3 | Hour of day to run the backup (0 – 23) |
| Minute (UTC) | 0 | Minute within the hour (0 or 30) |
| Day of week | — | Required when frequency is weekly (1 = Monday, 7 = Sunday) |
| Day of month | — | Required when frequency is monthly (1 – 28) |
Retention
| Field | Default | Description |
|---|
| Enabled | On | Automatically delete old backups |
| Keep for | 30 days | Number of days to retain backup files (1 – 365) |
Backups are stored as gzipped pg_dump files in the S3 bucket configured in Settings → Assets. S3 must be enabled for backups to run.
The audit_log table is excluded from database backups. Audit log data has its own S3 archival pipeline: rows older than the configured DB retention period (default 30 days) are archived daily to audit-log/archive/YYYY-MM-DD.jsonl.gz in S3 and then deleted from Postgres. Archive files are kept for the configured archive retention period (default 180 days). Both values are configurable in Settings → Limits.