🐾 {{ app_name }} {% if not anon %} {#- Grouped menus (templating.nav_groups). One markup, two layouts: dropdowns in the header on a wide screen, a tab bar at the foot of a phone whose menus open as a sheet above it.
keeps one open at a time; app.js closes it on an outside tap. -#} {% if pup_chip %}{{ pup_chip.text }}{% if pup_chip.moving %}🧳 moving{% endif %}{% endif %} {% if safeword_paused %}🛑 paused{% endif %} {% if event %}{{ event.sign }} {{ event.day }}/{{ event.days }}{% endif %}
{{ game.rank }} Lv {{ game.level }} · {{ game.xp }} xp
{% endif %} {% if profile %}@{{ profile.handle }}{% endif %} ?
{% if demo_expires %}
🧪 A throwaway demo kennel — invented play, deleted {{ demo_expires|rel(now) }}. Nothing is kept; uploads are off. more
{% endif %} {% if key_banner %}
{{ key_banner }}
{% endif %} {% if flash_ok %}
{{ flash_ok }}
{% endif %} {% if flash_err %}
{{ flash_err }}
{% endif %} {#- A refused form's own values (web/kept.py). DATA, not a script: app.js reads it and refills the form it came from. Nothing in it is new to this browser — it is what the pup just sent. -#} {% if kept %}{% endif %} {% if beta_due %}
{{ beta_due.icon }} Beta: the {{ beta_due.title }} survey is ready for you — five minutes, {{ beta_due.when }}. Take it →
{% endif %}
{% block body %}{% endblock %}
{# no /docs link: Swagger is off because its page fetches swagger-ui from a CDN #} {#- 🔴 COMPUTED, never a constant: `footer_egress` is the list of modules reaching the network right now (Module.egress_active). It used to read "local only" while a calendar feed was being fetched every half hour. None = could not be established, and then it claims nothing either way. A reserved name, set by render() alone: a page's own `egress` is something else (see templating.render). -#} {% block scripts %}{% endblock %}