{% extends "base.html" %} {% set active_page = "projects" %} {% block title %}Projects - AI Control Plane{% endblock %} {% block head_extra %} {% endblock %} {% block content %}
{% if cache_status == 'building' %}

Cache is building… project data will appear shortly.

{% endif %}
{{ stats.total_projects }}
Projects
{{ stats.total_memory_files }}
Memory Files
${{ "%.2f"|format(stats.aggregate_cost) }}
Est. Cost
{{ stats.total_sessions }}
Sessions
{% if projects %}
{% for p in projects %}

{{ p.name or p.encoded_name }}

{{ p.path or p.encoded_name }}
{{ p.session_count or 0 }}
Sessions
{{ p.memory_file_count or 0 }}
Memory
${{ "%.2f"|format(p.estimated_cost or 0) }}
Est. Cost
{% if p.has_trust_accepted %} Trusted {% endif %} {% set _raw_perms = (p.metadata or {}).get('permissions', {}) %} {% set perms = _raw_perms if _raw_perms is mapping else {} %} {# Match list/tuple-shaped values only — strings are iterable #} {# (``"Bash"|length == 4``) and dicts are iterable (their #} {# keys), and either would produce a misleading count for a #} {# malformed metadata entry like ``"allow": "Bash"`` or #} {# ``"allow": {"x": 1}``. #} {% set _allow = perms.get('allow') %} {% set allow_count = _allow|length if (_allow is iterable and _allow is not string and _allow is not mapping) else 0 %} {% if allow_count %} {{ allow_count }} Skipping Approval {% endif %} {% set _deny = perms.get('deny') %} {% set deny_count = _deny|length if (_deny is iterable and _deny is not string and _deny is not mapping) else 0 %} {% if deny_count %} {{ deny_count }} Denied {% endif %}
{% endfor %}
{% elif cache_status != 'building' %}

No projects found. Claude Code stores project data in ~/.claude/projects/.

{% endif %}
{% endblock %}