{% extends 'base.html' %} {% block content %} {% from '_helpers.html' import render_field, render_checkbox_field, render_button, render_time_schedule_form, render_ternary_field, render_fieldlist_with_inline_errors %} {% from '_common_fields.html' import render_common_settings_form, show_token_placeholders %}
{{ render_field(form.requests.form.time_between_check, class="time-check-widget") }} {{ _('Default recheck time for all watches, current system minimum is') }} {{min_system_recheck_seconds}} {{ _('seconds') }} ({{ _('more info') }}).
{{ render_time_schedule_form(form.requests, available_timezones, timezone_default_config) }}
{{ render_field(form.application.form.filter_failure_notification_threshold_attempts, class="filter_failure_notification_threshold_attempts") }} {{ _('After this many consecutive times that the CSS/xPath filter is missing, send a notification') }}
{{ _('Set to') }} 0 {{ _('to disable') }}
{{ render_field(form.application.form.history_snapshot_max_length, class="history_snapshot_max_length") }} {{ _('Limit collection of history snapshots for each watch to this number of history items.') }}
{{ _('Set to empty to disable / no limit') }}
{% if not hide_remove_pass %} {% if current_user.is_authenticated %} {{ render_button(form.application.form.removepassword_button) }} {% else %} {{ render_field(form.application.form.password) }} {{ _('Password protection for your changedetection.io application.') }} {% endif %} {% else %} {{ _('Password is locked.') }} {% endif %}
{{ render_checkbox_field(form.application.form.shared_diff_access, class="shared_diff_access") }} {{ _('Allow access to the watch change history page when password is enabled (Good for sharing the diff page)') }}
{{ render_checkbox_field(form.application.form.empty_pages_are_a_change) }} {{ _('When a request returns no content, or the HTML does not contain any text, is this considered a change?') }}
{% if form.requests.proxy %}

{{ render_field(form.requests.form.proxy, class="fetch-backend-proxy") }} {{ _('Choose a default proxy for all watches') }}
{% endif %}
{{ render_common_settings_form(form.application.form, emailprefix, settings_application, extra_notification_token_placeholder_info) }}
{{ render_field(form.application.form.base_url, class="m-d") }} {{ _('Base URL used for the') }} {{ '{{ base_url }}' }} {{ _('token in notification links.') }}
{{ _('Default value is the system environment variable') }} 'BASE_URL' - {{ _('read more here') }}.
{{ render_field(form.application.form.fetch_backend, class="fetch-backend") }}

{{ _('Use the') }} {{ _('Basic') }} {{ _('method (default) where your watched sites don\'t need Javascript to render.') }}

{{ _('The') }} {{ _('Chrome/Javascript') }} {{ _('method requires a network connection to a running WebDriver+Chrome server, set by the ENV var') }} 'WEBDRIVER_URL'.

{{ _('If you\'re having trouble waiting for the page to be fully rendered (text missing etc), try increasing the \'wait\' time here.') }}
{{ _('This will wait') }} n {{ _('seconds before extracting the text.') }}
{{ render_field(form.application.form.webdriver_delay) }}
{{ render_field(form.requests.form.workers) }} {% set worker_info = get_worker_status_info() %} {{ _('Number of concurrent workers to process watches. More workers = faster processing but higher memory usage.') }}
{{ _('Currently running:') }} {{ worker_info.count }} {{ _('operational') }} {{ worker_info.type }} {{ _('workers') }}{% if worker_info.active_workers > 0 %} ({{ worker_info.active_workers }} {{ _('actively processing') }}){% endif %}.
{{ render_field(form.requests.form.jitter_seconds, class="jitter_seconds") }} {{ _('Example - 3 seconds random jitter could trigger up to 3 seconds earlier or up to 3 seconds later') }}
{{ render_field(form.requests.form.timeout) }} {{ _('For regular plain requests (not chrome based), maximum number of seconds until timeout, 1-999.') }}
{{ render_field(form.requests.form.default_ua) }} {{ _('Applied to all requests.') }}

{{ _('Note: Simply changing the User-Agent often does not defeat anti-robot technologies, it\'s important to consider') }} {{ _('all of the ways that the browser is detected') }}.
{{ render_checkbox_field(form.application.form.ignore_whitespace) }} {{ _('Ignore whitespace, tabs and new-lines/line-feeds when considering if a change was detected.') }}
{{ _('Note:') }} {{ _('Changing this will change the status of your existing watches, possibly trigger alerts etc.') }}
{{ render_checkbox_field(form.application.form.render_anchor_tag_content) }} {{ _('Render anchor tag content, default disabled, when enabled renders links as') }} (link text)[https://somesite.com]
{{ _('Note:') }} {{ _('Changing this could affect the content of your existing watches, possibly trigger alerts etc.') }}
{{ render_field(form.application.form.global_subtractive_selectors, rows=5, placeholder="header footer nav .stockticker //*[contains(text(), 'Advertisement')]") }}
  • {{ _('Remove HTML element(s) by CSS and XPath selectors before text conversion.') }}
  • {{ _('Don\'t paste HTML here, use only CSS and XPath selectors') }}
  • {{ _('Add multiple elements, CSS or XPath selectors per line to ignore multiple parts of the HTML.') }}
{{ render_field(form.application.form.global_ignore_text, rows=5, placeholder="Some text to ignore in a line /some.regex\d{2}/ for case-INsensitive regex ") }} {{ _('Note: This is applied globally in addition to the per-watch rules.') }}
  • {{ _('Matching text will be') }} {{ _('ignored') }} {{ _('in the text snapshot (you can still see it but it wont trigger a change)') }}
  • {{ _('Note: This is applied globally in addition to the per-watch rules.') }}
  • {{ _('Each line processed separately, any line matching will be ignored (removed before creating the checksum)') }}
  • {{ _('Regular Expression support, wrap the entire line in forward slash') }} /regex/
  • {{ _('Changing this will affect the comparison checksum which may trigger an alert') }}
{{ render_checkbox_field(form.application.form.strip_ignored_lines) }} {{ _('Remove any text that appears in the "Ignore text" from the output (otherwise its just ignored for change-detection)') }}
{{ _('Note:') }} {{ _('Changing this will change the status of your existing watches, possibly trigger alerts etc.') }}

{{ _('API Access') }}

{{ _('Drive your changedetection.io via API, More about') }} {{ _('API access and examples here') }}.

{{ render_checkbox_field(form.application.form.api_access_token_enabled) }}
{{ _('Restrict API access limit by using') }} x-api-key {{ _('header - required for the Chrome Extension to work') }}


{{ _('API Key') }} {{api_key}}

{{ _('Chrome Extension') }}

{{ _('Easily add any web-page to your changedetection.io installation from within Chrome.') }}

{{ _('Step 1') }} {{ _('Install the extension,') }} {{ _('Step 2') }} {{ _('Navigate to this page,') }} {{ _('Step 3') }} {{ _('Open the extension from the toolbar and click') }} "{{ _('Sync API Access') }}"

{{ _('Chrome store icon') }} {{ _('Chrome Webstore') }}

{{ render_checkbox_field(form.application.form.rss_hide_muted_watches) }}
{{ render_field(form.application.form.rss_diff_length) }} {{ _('Maximum number of history snapshots to include in the watch specific RSS feed.') }}
{{ render_checkbox_field(form.application.form.rss_reader_mode) }} {{ _('For watching other RSS feeds - When watching RSS/Atom feeds, convert them into clean text for better change detection.') }}
{{ render_field(form.application.form.rss_content_format) }} {{ _('Does your reader support HTML? Set it here') }}
{{ render_field(form.application.form.rss_template_type) }} {{ _('\'System default\' for the same template for all items, or re-use your "Notification Body" as the template.') }}
{{ render_field(form.application.form.rss_template_override) }} {{ show_token_placeholders(extra_notification_token_placeholder_info=extra_notification_token_placeholder_info, suffix="-rss") }}

{{ _('Ensure the settings below are correct, they are used to manage the time schedule for checking your web page watches.') }}

{{ _('UTC Time & Date from Server:') }} {{ utc_time }}

{{ _('Local Time & Date in Browser:') }}

{{ render_field(form.application.form.scheduler_timezone_default) }}
{{ render_checkbox_field(form.application.form.ui.form.open_diff_in_new_tab, class="open_diff_in_new_tab") }} {{ _('Enable this setting to open the diff page in a new tab. If disabled, the diff page will open in the current tab.') }}
{{ render_checkbox_field(form.application.form.ui.form.socket_io_enabled, class="socket_io_enabled") }} {{ _('Realtime UI Updates Enabled - (Restart required if this is changed)') }}
{{ render_checkbox_field(form.application.form.ui.form.favicons_enabled, class="") }} {{ _('Enable or Disable Favicons next to the watch list') }}
{{ render_checkbox_field(form.application.form.ui.use_page_title_in_list) }}
{{ render_field(form.application.form.pager_size) }} {{ _('Number of items per page in the watch overview list, 0 to disable.') }}

{{ _('Tip') }}: {{ _('"Residential" and "Mobile" proxy type can be more successfull than "Data Center" for blocked websites.') }}

{{ render_fieldlist_with_inline_errors(form.requests.form.extra_proxies) }} {{ _('"Name" will be used for selecting the proxy in the Watch Edit settings') }}
{{ _('SOCKS5 proxies with authentication are only supported with \'plain requests\' fetcher, for other fetchers you should whitelist the IP access instead') }}

Extra Browsers can be attached to further defeat CAPTCHA's on websites that are particularly hard to scrape.
Simply paste the connection address into the box, More instructions and examples here

{{ render_fieldlist_with_inline_errors(form.requests.form.extra_browsers) }}
{% if plugin_tabs %} {% for tab in plugin_tabs %}
{% set plugin_form = plugin_forms[tab.plugin_id] %} {% if tab.template_path %} {# Plugin provides custom template - include it directly (no separate form) #} {% include tab.template_path with context %} {% else %} {# Default form rendering - fields only, no submit button #}
{% for field in plugin_form %} {% if field.type != 'CSRFToken' and field.type != 'SubmitField' %}
{% if field.type == 'BooleanField' %} {{ render_checkbox_field(field) }} {% else %} {{ render_field(field) }} {% endif %}
{% endif %} {% endfor %}
{% endif %}
{% endfor %} {% endif %}

{{ _('Uptime:') }} {{ uptime_seconds|format_duration }}

{{ _('Python version:') }} {{ python_version }}

{{ _('Plugins active:') }}

{% if active_plugins %}
    {% for plugin in active_plugins %}
  • {{ plugin.name }} - {{ plugin.description }}
  • {% endfor %}
{% else %}

{{ _('No plugins active') }}

{% endif %}
{{ render_button(form.save_button) }} {{ _('Back') }} {{ _('Clear Snapshot History') }}
{% endblock %}