{% extends "base.html" %} {% block title %}Admin β€” AppManager{% endblock %} {% block content %}
Applications
{{ apps|length }}
{{ apps|selectattr('is_active')|list|length }} active
Members
{{ users|length }}
{{ users|selectattr('is_online')|list|length }} online
Roles
{{ roles|length }}
{{ roles|selectattr('is_system')|list|length }} system
Extensions
{{ apps|selectattr('app_type', 'equalto', 'extension')|list|length }}
UI slot plugins

Pull & Install from GitHub

Upload & Install ZIP

Installed Sub-Applications

{{ apps|length }} total
{% if apps %}
{% for app in apps %} {% set hlog = health_map.get(app.id) %} {% set hhist = health_history.get(app.id, []) %} {% endfor %}
Application Source / Runtime State Health Actions
{{ app.name }} {% if app.is_default %}Default{% endif %} {% if app.app_type == 'extension' %}Ext{% endif %}
/apps/{{ app.slug }}
{{ app.source_type|upper }} mode: {{ config.get('APP_VENV_MODE', 'singular') }}
{% if app.is_active %} {% else %} {% endif %}
{% if app.requires_auth %} {% else %} {% endif %}
{% if hlog %} {% if hlog.status == 'healthy' %} Healthy {% elif hlog.status == 'degraded' %} Degraded {% else %} Down {% endif %} {% else %} β€” {% endif %} {% if hhist %} {{ render_sparkline(hhist) }} {% endif %}
{% if app.source_type == 'git' %}
{% else %} {% endif %} βš™ {% if app.has_web_ui %} Launch {% else %} {% endif %}
{% if app.is_default %} {% else %} {% endif %}
{% else %}

No sub-applications installed

Use the forms above to install your first sub-app.

{% endif %}

Registered Members

{{ members_pagination.total if members_pagination else users|length }} total
{% if members_pagination %} {% include 'admin/_members_table.html' %} {% elif users %} {# Legacy fallback: render the full list inline (no pagination context) #}
{% for u in users %} {% endfor %}
Member Role Status Last Login Actions
{{ u.name or u.email }} {{ render_user_flair_badge(u.id) }}
{{ u.email }}
{% if u.role == 'admin' %}Admin{% else %}{{ u.role }}{% endif %} {% if u.is_online() %}Online{% else %}Offline{% endif %} {% if not u.is_active %}Disabled{% endif %} {{ u.last_login_at.strftime('%Y-%m-%d %H:%M') if u.last_login_at else 'Never' }}
{% else %}

No registered members

Members appear here once they register or log in.

{% endif %}

Create New Role

Configured Roles

{{ roles|length }}
{% for r in roles %} {% endfor %}
Role Slug Type Members Actions
{{ r.name }} {{ r.slug }} {% if r.is_system %} System {% else %} Custom {% endif %} {{ role_counts.get(r.slug, 0) }} {% if not r.is_system %} {% else %} Protected {% endif %}

Preset Flair Badges

Click any preset flair to quickly apply it in the member assignment table.

{% for preset in presets %}
{{ preset.title }} {{ preset.color }}
{% endfor %}

Member Flair Assignments

{{ users|length }}
{% for u in users %} {% set f = user_flairs.get(u.id) %} {% endfor %}
Member Current Flair Assign / Update
{{ u.name or u.email }}
{{ u.email }}
{% if f and f.title %} {{ f.title }} {% else %} No Flair {% endif %}
{% if f and f.title %} {% endif %}

App Access Permissions

Manage member access by application, member, or full matrix view.

{% if users and apps %}
{% for app in apps %}
{% for u in users %} {% set is_checked = perms_map.get((u.id, app.id), True) %} {% endfor %}
Member Role Access Status Toggle Access
{{ u.name or u.email }}
{{ u.email }}
{{ u.role }} {% if u.is_admin() %} Full Access (Admin) {% else %} {% if is_checked %}Granted{% else %}Revoked{% endif %} {% endif %} {% if u.is_admin() %} Always Granted {% else %} {% endif %}
{% endfor %}
{% else %}

Nothing to manage yet

You need both registered users and installed sub-apps to manage permissions.

{% endif %}
Reset
{% if audit_entries %}
{% for e in audit_entries %} {% endfor %}
Timestamp Action Actor App Details
{{ e.timestamp.strftime('%Y-%m-%d %H:%M:%S') if e.timestamp else 'β€”' }} {{ e.action }} {{ e.actor_type }}{% if e.actor_id %}:{{ e.actor_id }}{% endif %} {{ e.app_id or 'β€”' }} {% if e.details_json %} {{ e.details_json[:120] }}{% if e.details_json|length > 120 %}…{% endif %} {% else %}β€”{% endif %}
{% else %}

No audit log entries match the current filters.

{% endif %}

Search Engine Optimization

host-level

Master toggle. When off, no SEO meta tags are rendered on portal pages or injected into sub-app pages.

Used for canonical links and sitemap URLs.

When on, admins can override an app's manifest-declared SEO in the app detail page.

When on, apps that require login get noindex,nofollow injected.

Generates /sitemap.xml from indexable (public) apps.

Dashboard & Login

host behavior

When on, /dashboard and / require authentication. When off, the dashboard is public.

When off, the dashboard landing page is disabled and / redirects to the default app below.

When the dashboard is off, / redirects to this app.

Visibility

dashboard listing

When on, apps that require login are shown on the dashboard grid. When off, they are hidden entirely.

Button labels for login-required apps

When a login-required app is visible, the launch button adapts to the viewer's state:

  • Not logged in β†’ button reads Login (links to the login page).
  • Logged in, no permission β†’ button reads Permission Required.
  • Logged in with permission β†’ button reads Launch.
{% endblock %} {% block extra_js %} {% endblock %}