{% extends "base.html" %} {% block title %}{{ app.name }} — Admin{% endblock %} {% block content %}

{{ app.name }}

{{ app.app_type|upper }} · {{ app.slug }} · v{{ manifest.get('version', '—') }} {% if app.is_active %}active{% else %}inactive{% endif %}

Package Maintenance & Updates

{{ app.source_type|upper }}
Installation Source
{{ app.source_type|upper }}
{{ app.source_url or 'Local ZIP' }}
Runtime Environment
Python {{ dep_report.python_version_current if dep_report else '3.x' }}
Mode: {{ config.get('APP_VENV_MODE', 'singular') }}
{% if app.source_type == 'git' %}

One-Click Git Update

Pulls latest commits from the remote repository, executes an automated AST security scan, verifies and updates dependencies, and reloads the WSGI cache.

{% else %}

Upgrade via Replacement ZIP

Upload a new ZIP package to replace this application's files. An automated security audit and dependency check will be executed before applying.

{% endif %}

Dependency Inspector & Runtime Compatibility

{{ config.get('APP_VENV_MODE', 'singular') }}
{% if dep_report %}
PYTHON VERSION
Python {{ dep_report.python_version_current }}
{% if dep_report.python_version_ok %} Compatible {% else %} Mismatch {% endif %} (Req: {{ dep_report.python_version_required or 'Any' }})
ENVIRONMENT MODE
{% if dep_report.venv_mode == 'singular' %}Single Shared Environment{% else %}Isolated Virtual Environment{% endif %}
{% if dep_report.conflicts %} {{ dep_report.conflicts|length }} Conflicts {% else %} No Conflicts {% endif %}
{% if dep_report.conflicts %}
Dependency Conflicts:
    {% for c in dep_report.conflicts %}
  • {{ c }}
  • {% endfor %}
{% endif %} {% if dep_report.items %}
{% for item in dep_report.items %} {% endfor %}
Package Name Declared Specifier Installed Version Status
{{ item.name }} {{ item.specifier or 'any' }} {{ item.installed_version or '—' }} {% if item.status == 'satisfied' %} Satisfied {% elif item.status == 'to_install' %} To Install {% else %} Conflict {% endif %} {{ item.message or '' }}
{% else %}

No requirements.txt declared for this sub-application. Using host environment packages.

{% endif %} {% else %}

No dependency analysis available.

{% endif %}

Permissions

adjustable
{% set db_perm = permissions|selectattr('permission_type', 'equalto', 'db')|first %} {% set auth_perm = permissions|selectattr('permission_type', 'equalto', 'auth_readonly')|first %}

🗄️ Shared Database Access

{% if manifest.get('database_description') %} {{ manifest.get('database_description') }}
{% endif %} Current: {{ db_perm.access_level if db_perm else 'denied' }} {% if db_perm and db_perm.granted %} granted{% else %} denied{% endif %}

🔐 Read-Only Auth Access

Read-only access to a narrow auth subset: login state, display name, and role only. Email, user id, passwords, and tokens are never exposed. Current: {% if auth_perm and auth_perm.granted %}granted{% else %}denied{% endif %}

Search Engine Optimization

manifest-declared
{% set seo = app.get_seo() %} {% if seo %}
Title
{{ seo.title or app.name }}
Robots
{% if seo.robots %}{{ seo.robots }} {% else %}index,follow{% endif %}
{% if seo.description %}
Description
{{ seo.description }}
{% endif %} {% if seo.keywords %}
Keywords
{% for kw in seo.keywords %}{{ kw }}{% endfor %}
{% endif %} {% if seo.canonical_url %}
Canonical URL
{{ seo.canonical_url }}
{% endif %} {% if seo.og_image %}
Open Graph Image
{{ seo.og_image }}
{% endif %} {% if seo.json_ld %}
JSON-LD Structured Data
{{ seo.json_ld }}
{% endif %} {% else %}

This app has not declared any SEO metadata in its manifest. It will use host defaults.

{% endif %}
{% for item in rendered %}

{{ item.panel.label }}

{% if item.panel.endpoint %} custom panel {% else %} generated form {% endif %}
{{ item.html|safe }}
{% endfor %} {% if schema %}

Settings

generated form
{% for desc in schema %} {% set key = desc.key %} {% set label = desc.label or key %} {% set vtype = desc.type or 'json' %} {% set value = configs.get(key, desc.default) %}
{% if vtype == 'boolean' %} {% elif vtype == 'color' %} {% elif vtype == 'integer' %} {% elif vtype == 'textarea' %} {% else %} {% endif %}
{% endfor %}
{% endif %}
{% endblock %} {% block extra_js %} {% endblock %}