Concrete, runnable test steps per area with explicit known-gaps sections so nothing reads as more finished than it is. Also documents the mobile S/MIME merge (vncmail-native main 7b89839) done this session. .env.dev.example: the documented relative JMAP_SERVER_URL 400s /api/auth/stalwart-context (resolveTrustedJmapUrl rejects relative URLs), silently breaking the real session-cookie flow that S/MIME enrollment, offline sync, and the AI server/retrieval routes all depend on. Switched the example to an absolute URL with an explanatory comment.
71 lines
3.0 KiB
Bash
71 lines
3.0 KiB
Bash
# Bulwark Webmail - Development Configuration
|
|
# Copy this file to .env.local to run with the built-in mock JMAP server.
|
|
# No external mail server required - great for UI development and testing.
|
|
#
|
|
# Usage:
|
|
# cp .env.dev.example .env.local
|
|
# npm run dev
|
|
# Open http://localhost:3000 - log in with any username/password.
|
|
|
|
# =============================================================================
|
|
# Mock JMAP Server
|
|
# =============================================================================
|
|
|
|
# Enable the built-in mock JMAP server (served at /api/dev-jmap)
|
|
DEV_MOCK_JMAP=true
|
|
|
|
# Point the app at its own mock endpoint.
|
|
# IMPORTANT: must be an ABSOLUTE URL matching the origin the app runs on
|
|
# (default: port 3000) - NOT a relative path. A relative path here makes
|
|
# /api/auth/stalwart-context 400 on every request (resolveTrustedJmapUrl
|
|
# rejects it), which silently breaks the real server-side session-cookie
|
|
# flow that S/MIME enrollment, offline sync, and the AI server/retrieval
|
|
# routes all depend on. The client-side mock fetch works either way, which
|
|
# is why this is easy to miss - it only bites features needing a real
|
|
# server-side session identity.
|
|
JMAP_SERVER_URL=http://localhost:3000/api/dev-jmap
|
|
|
|
# =============================================================================
|
|
# App
|
|
# =============================================================================
|
|
|
|
APP_NAME=Bulwark Webmail (Dev)
|
|
|
|
# =============================================================================
|
|
# Session & Settings Sync (optional for dev)
|
|
# =============================================================================
|
|
|
|
SESSION_SECRET=dev-secret-not-for-production
|
|
SETTINGS_SYNC_ENABLED=true
|
|
|
|
# =============================================================================
|
|
# Logging (verbose for development)
|
|
# =============================================================================
|
|
|
|
LOG_FORMAT=text
|
|
LOG_LEVEL=debug
|
|
|
|
# =============================================================================
|
|
# Plugin Development
|
|
# =============================================================================
|
|
|
|
# Load plugins from a directory on disk instead of installing them as ZIPs.
|
|
# Each immediate subfolder is one plugin and needs a manifest.json. When the
|
|
# manifest's entrypoint exists under src/, it's bundled on demand with esbuild,
|
|
# so you can edit sources and just refresh the browser.
|
|
# PLUGIN_DEV_DIR=../my-plugins
|
|
|
|
# =============================================================================
|
|
# Login Page Customization (optional)
|
|
# =============================================================================
|
|
|
|
# LOGIN_COMPANY_NAME=Dev Team
|
|
# LOGIN_IMPRINT_URL=https://example.com/imprint
|
|
# LOGIN_PRIVACY_POLICY_URL=https://example.com/privacy
|
|
# LOGIN_WEBSITE_URL=https://example.com
|
|
|
|
# Per-domain branding overrides. Each entry must have "host" (exact or
|
|
# "*.subdomain" wildcard) plus any subset of branding fields to override.
|
|
# Unset fields fall through to the global values above.
|
|
# DOMAIN_BRANDING=[{"host":"localhost","loginCompanyName":"Local Dev"}]
|