{% extends "base.html" %} {% block content %}

Customization

Tunables that shape what your customers see on the captive portal — branding, timing, copy, and theme color. Changes apply on the next portal page load (or next coin-slot session for the countdown).

{% if flash_msg %}
{{ flash_msg }}
{% endif %} {% if error_msg %}
{{ error_msg }}
{% endif %}

Branding — Banner

Optional banner image shown above the Vendora wordmark on the customer portal. When unset, the portal falls back to the Vendora logo. PNG or JPG, up to {{ max_banner_kb }} KB; display caps at ~90 px tall.

{# Staged banner — preview + confirm/cancel #} {% if banner_staged %}
Staged — not yet live {{ banner_staged_ext|upper }}
Staged banner
{% endif %} {# Active banner — preview + delete #} {% if banner_active %}
Currently live {{ banner_active_ext|upper }}
Active banner
{% else %} {% if not banner_staged %}

No banner set — customers see the Vendora wordmark.

{% endif %} {% endif %}

Upload here stages the banner for preview. Confirm with the Confirm & Apply button above; until then the live banner is unchanged.

Customer Portal Settings

These fields render on the customer-facing captive portal. All changes save together — partial save isn't allowed, so a typo in one field doesn't half-apply the rest.

10–300 seconds. Default: {{ settings.portal_coin_countdown_secs.default }}.

{{ settings.portal_theme_color.value }}

Affects h1, section headings, focus rings. Default: {{ settings.portal_theme_color.default }}.

Max 120 chars. Shows under the wordmark / banner.

Max 80 chars. Shows at the bottom of every portal page.

When ON: a customer who taps Pause and revisits the portal from the same device is silently reconnected — no voucher re-entry — as long as their voucher still has time and validity. When OFF: every visit forces the voucher form. Default: ON.

Bandwidth Management

Per-customer caps prevent one device from hogging the WAN. Total caps prevent a fully-loaded vendo from saturating the modem. Pick Kbps or Mbps per field — the form auto-displays the cleanest unit on reload. Changes apply within ~2 seconds to active sessions (portal SIGHUP rebuilds the HTB tree).

{% macro bw_field(key, label, hint) %} {% set d = bw_display[key] %}

{{ hint }}

{% endmacro %} {{ bw_field( "portal_bandwidth_per_client_down_kbps", "Per-client download cap", "Max download speed per customer. Default 5 Mbps." ) }} {{ bw_field( "portal_bandwidth_per_client_up_kbps", "Per-client upload cap", "Max upload speed per customer. Default 2 Mbps." ) }} {{ bw_field( "portal_bandwidth_total_wan_down_kbps", "Total WAN download cap", "Shared by all customers + SBC. Set to your modem's plan rate. Default 50 Mbps." ) }} {{ bw_field( "portal_bandwidth_total_wan_up_kbps", "Total WAN upload cap", "Shared by all customers + SBC. Set to your modem's upload plan rate. Default 20 Mbps." ) }}

Anti-Abuse Throttle

Punishes customers who keep tapping Insert Coin (or Extend) without actually dropping a coin — that wastes relay actuations and blocks legitimate customers via the Coinslot-in-use lockout. Counter resets the moment any coin is dropped, OR when the next attempt is more than the decay window after the previous one (so an occasional misclick doesn't pile up).

1–100 empty tries. Default: {{ settings.portal_abuse_max_no_coin_attempts.default }}.

1–1440 minutes (max 24 h). Default: {{ settings.portal_abuse_lock_duration_minutes.default }} minutes.

If the next empty attempt is more than this many minutes after the previous one, the counter starts over at 1. Default: {{ settings.portal_abuse_decay_window_minutes.default }} minutes.

Each new lock in a streak doubles the previous duration (lock 1 = base, 2 = ×2, 3 = ×4 …) capped at this ceiling. Persistent abusers eventually wait the full ceiling between attempts; one-time misclickers always get just the base duration. Default: {{ settings.portal_abuse_lock_max_minutes.default }} minutes.

{% endblock %}