{% extends "admin/base.html" %} {% block title %}Settings | Admin{% endblock %} {% block content %}

Customization

Site Settings

Brand and Contact

Address

Automatic Visitor Language

Redirect first-time visitors entering through non-language URLs using country headers supplied by Cloudflare/CDN, then browser language, with English as the final fallback.

Explicit language URLs always win. Search bots stay on English. Unsupported or inactive languages fall back to English.

Media and Social

{% if settings.logo_path %}

{{ settings.logo_path }}

{% endif %}
{% if settings.favicon_path %}

{{ settings.favicon_path }}

{% endif %}

Public CTA Buttons

Mechanical Shop & Inspection

The shop profile shown on every inspection report. The shop portal URL is sent to your mechanic so they can review, approve & stamp (or revoke) each report.

Shop portal URL

Send this one URL to the shop. It lists every inspection report for review/approval.

Mail Sender (SMTP)

Send listing enquiries, contact forms, and chatbot lead alerts through your own SMTP account instead of the hosting server.

{{ 'SMTP enabled' if smtp_status.enabled and smtp_status.host else 'SMTP not active' }}

Password: {{ 'configured' if smtp_status.password_configured else 'not saved' }}

Storage: {{ smtp_status.secret_source }}

The customer email will be used as Reply-To, not From, to avoid SPF/DMARC issues.

{% if not smtp_status.encryption_ready %}

Secret encryption is not ready, so SMTP/API passwords cannot be saved yet.

{% endif %}

Mail Inbox (IMAP)

Read incoming emails for the Inbox auto-replier. Usually the same account as SMTP.

Currency Display

Public Stock References

When internal stock is hidden, customers see references like CAS-1001 while the crawler stock stays private in admin.

Image SEO Filenames

Regenerate local listing image filenames using the current company name, listing title, public reference, and image order. Database paths are updated after files are renamed.

Image Performance Files

Create optimized WebP files for faster listing galleries: small _thumb.webp files for cards/admin and larger _gallery.webp files for public zoom/lightbox. Originals stay untouched for admin download/export.

One click starts a background job so the browser request returns immediately instead of timing out. Use generation for missing files, or regeneration if you replaced originals and want every thumb/gallery rebuilt.

{% if image_variant_job %}
Status: {{ image_variant_job.status|default('unknown')|upper }} {% if image_variant_job.processed_images is defined and image_variant_job.total_images is defined %} {{ image_variant_job.processed_images }} / {{ image_variant_job.total_images }} originals processed {% endif %} {% if image_variant_job.created_variants is defined %} {{ image_variant_job.created_variants }} optimized files written {% endif %}
{% if image_variant_job.current_image %}

Current: {{ image_variant_job.current_image }}

{% endif %} {% if image_variant_job.finished_at %}

Finished: {{ image_variant_job.finished_at }}

{% elif image_variant_job.started_at %}

Started: {{ image_variant_job.started_at }}

{% endif %} {% if image_variant_log %}
Recent background log
{{ image_variant_log|join('
') }}
{% endif %}
{% endif %}

AI Content Generation

Fireworks is the default provider for listing descriptions. AI generation runs only from admin actions after import.

{{ "Active provider configured" if ai_status.active_configured else "API key missing for active provider" }}

Per-feature provider routing

Leave a feature on "Use global default" to follow the AI provider above. Image generation always uses OpenAI.

{% set features = [("chatbot", "Chatbot"), ("lead_reply", "Lead replies"), ("descriptions", "Vehicle descriptions"), ("pages", "Page content"), ("inspection", "Inspection reports")] %} {% for key, label in features %} {% endfor %}

Active provider: {{ ai_status.provider|title }}

Fireworks key: {{ "configured" if ai_status.fireworks_configured else "missing" }}

OpenAI key: {{ "configured" if ai_status.openai_configured else "missing" }}

Z.ai key: {{ "configured" if ai_status.zai_configured else "missing" }}

Selected model: {{ ai_status.fireworks_model if ai_status.provider == 'fireworks' else (ai_status.openai_model if ai_status.provider == 'openai' else ai_status.zai_model) }}

OpenAI Image Editing

Status: {{ "API key saved" if openai_key.configured else "No API key saved" }}

Python package: {{ "openai installed" if openai_key.package_available else "openai missing in Flask environment" }}

Encryption: {{ openai_key.secret_source }}

Logo file cache: {{ settings.openai_logo_file_id or "Will upload after first edit" }}

{% if not openai_key.encryption_ready %}

{{ openai_key.message }}

{% else %}

Local development uses instance/openai_settings_secret.key if OPENAI_SETTINGS_SECRET is not set.

{% endif %}

Free Delivery Promo Banner

A slim promo strip offering free Canada-wide delivery. Use {month} in the message — it auto-fills with the current month at render time.

Banner animations
The first three are the recommended set. Slide-in message text staggers the message in after the banner appears; Urgency countdown needs the end date above.
Live preview
Free Canada-wide delivery this month

Homepage Hero

Popular Makes

The homepage "Browse by Make" section shows the top makes by vehicle count in your published inventory. Brand logos are auto-detected from static/uploads/cards/make_<Make>.png.

Featured Carousel

The homepage hero section shows a carousel of featured vehicles. Control how many compact cards appear.

{% endblock %}