A self-hosted LanguageTool (dev: docker/docker-compose.yml, started by `make up`) checks what the user writes in the compose window, through POST /api/spellcheck — the browser never talks to the engine directly. - Marks are CSS highlights over the text, never written into the message: red wavy for spelling, blue for grammar/style. Clicking one shows the message, up to five suggestions (applied as typed, so Ctrl+Z undoes them) and Ignore. The popup, like the link popup, opens above its anchor when there is no room below. - Checked after a pause in typing; the signature and quoted original are skipped; marks on words just edited drop at once; a check overtaken by a newer one, by turning checking off, or by closing the window is discarded. - With "auto", text is checked in chunks of lines, each in its own detected language — LanguageTool settles on one language per request, so a mixed Polish/English message had every English word flagged as a Polish typo. - Settings > Appearance: on/off and language (Auto-detect or any of the engine's languages); the compose window's More menu overrides it for one message. The browser's own spellcheck steps aside while ours runs, and comes back when it is off or the server has no engine (503 from the endpoint). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.9 KiB
Makefile
43 lines
1.9 KiB
Makefile
up: ## start services
|
|
docker compose -f docker/docker-compose.yml up -d postgres redis meilisearch languagetool
|
|
down: ## stop services (data kept)
|
|
docker compose -f docker/docker-compose.yml down
|
|
reset-db: ## DESTRUCTIVE: wipe db + search + blobs, re-migrate
|
|
docker compose -f docker/docker-compose.yml down -v
|
|
rm -rf var/blobs && mkdir -p var/blobs
|
|
docker compose -f docker/docker-compose.yml up -d --wait postgres redis meilisearch
|
|
cd backend && alembic upgrade head
|
|
api:
|
|
uvicorn app.main:create_app --factory --reload --port 8000 --app-dir backend
|
|
worker: ## run both sync + jobs in one process (dev)
|
|
cd backend && WORKER_ROLE=all python -m workers.run
|
|
worker-sync: ## run only the account-sync supervisor
|
|
cd backend && WORKER_ROLE=sync python -m workers.run
|
|
worker-jobs: ## run only the arq job consumers (interactive + bulk)
|
|
cd backend && WORKER_ROLE=jobs python -m workers.run
|
|
web:
|
|
cd frontend && npm run dev
|
|
test:
|
|
cd backend && pytest -q && cd ../frontend && npx vitest run
|
|
mail-test: ## start throwaway IMAP/SMTP server
|
|
docker compose -f docker/docker-compose.yml up -d greenmail
|
|
|
|
# --- production (NAS / single-host Docker deploy; see docs/nas-install.md) ---
|
|
prod-init: ## generate docker/.env.prod + data dirs
|
|
./deploy/webmail.sh init
|
|
prod-up: ## start the production stack
|
|
./deploy/webmail.sh up
|
|
prod-down: ## stop the production stack (data kept)
|
|
./deploy/webmail.sh down
|
|
prod-status: ## what is running, versions, disk, backups
|
|
./deploy/webmail.sh status
|
|
prod-update: ## backup -> migrate -> roll -> health-gate (auto-rollback on failure)
|
|
./deploy/webmail.sh update
|
|
prod-backup: ## take a verified database dump now
|
|
./deploy/webmail.sh backup
|
|
prod-doctor: ## pre-flight checks on a deployment
|
|
./deploy/webmail.sh doctor
|
|
prod-images: ## build production images locally (no push)
|
|
docker build -f docker/Dockerfile.backend -t webmail/backend:local .
|
|
docker build -f docker/Dockerfile.frontend -t webmail/web:local .
|