{% extends "base.html" %} {% block title %}CTF Analytics{% endblock %} {% block page_title %}Analytics{% endblock %} {% block content %}
{% include "partials/analytics_tabs.html" %}

{{ overview.challenges_cracked }}/{{ overview.total_challenges }}

Challenges Cracked

{{ overview.completion_rate }}%

Cracked Rate

{{ overview.active_players }}

Active Players

{{ overview.badges_earned }}/{{ overview.badges_defined }}

Badges Earned

{{ events_7d }}

Events (7d)

{% set mins = (overview.avg_solve_seconds // 60) %}

{% if mins > 0 %}{{ mins }}m{% else %}-{% endif %}

Avg Solve Time

By Difficulty

{% if by_difficulty %}
{% for d in by_difficulty %}
{{ d.difficulty }} {{ d.completions }}/{{ d.attempts }} players · {{ d.total_challenges }} challenges
{% if d.attempts > 0 %}
{% else %}
{% endif %}
{% endfor %}
{% else %}

No challenge data

{% endif %}

By Category

{% if by_category %}
{% for c in by_category %}
{{ c.category | replace('_', ' ') | title }} {{ c.completions }}/{{ c.attempts }} players · {{ c.total_challenges }} challenges
{% if c.attempts > 0 %}
{% else %}
{% endif %}
{% endfor %}
{% else %}

No challenge data

{% endif %}

Top Challenges Solved

{% if top_challenges %}
{% for c in top_challenges %}
{{ c.title }}
{{ c.difficulty }} {{ c.solves }}
{% endfor %}
{% else %}

No completions yet

{% endif %}

Unsolved Challenges

{% if unsolved %}
{% for c in unsolved %}
{{ c.title }}
{{ c.difficulty }}
{% endfor %}
{% else %}

All challenges have been solved!

{% endif %}

Top Players

{% if top_players %}
{% for p in top_players %}
{{ p.display_name }}
{{ p.completed }} {{ p.attempted }} {{ p.total_attempts }} att
{% endfor %}
{% else %}

No players yet

{% endif %}

Daily Completions

Top Badges Earned

{% if top_badges %}
{% for b in top_badges %} {% set colors = {"common": "text-text-2", "rare": "text-cyan", "epic": "text-purple", "legendary": "text-amber"} %}
{{ b.title }} {{ b.earned }}
{% endfor %}
{% else %}

No badges earned yet

{% endif %}

Badges by Rarity

{% if badges_by_rarity %}
{% for b in badges_by_rarity %} {% set colors = {"common": "text-text-2", "rare": "text-cyan", "epic": "text-purple", "legendary": "text-amber"} %}
{{ b.rarity }} {{ b.earned }} / {{ b.defined }}
{% endfor %}
{% else %}

No badge data

{% endif %}

Recently Earned

{% if recent_badges %}
{% for b in recent_badges %} {% set colors = {"common": "text-text-2", "rare": "text-cyan", "epic": "text-purple", "legendary": "text-amber"} %}
{{ b.badge_title }} {{ b.display_name }}
{% endfor %}
{% else %}

No badges earned yet

{% endif %}

Player Sessions

Authenticated {{ ctf_sessions.perm }}
Temporary {{ ctf_sessions.temp }}
Total Players {{ ctf_sessions.total }}
{% if ctf_sessions.total > 0 %}
{{ (ctf_sessions.perm / ctf_sessions.total * 100) | round }}% auth {{ (ctf_sessions.temp / ctf_sessions.total * 100) | round }}% temp
{% endif %}

Profile Adoption

{% set pa = profile_adoption %}
Profiles Created {{ pa.profiles_created }} / {{ pa.total_users }} users
Public {{ pa.public }}
Username Claimed {{ pa.with_username }}
Bio Written {{ pa.with_bio }}
Featured Badges Set {{ pa.with_featured_badges }}
Activity Feed On {{ pa.show_activity }}
Social Links Added {{ pa.with_social_links }}

Share Links (7d)

Profile Card Views {{ share_stats.profile_card_views }}
Badge Card Views {{ share_stats.badge_card_views }}
Public Profile Views {{ share_stats.public_profile_views }}
Total Share Hits {{ share_stats.total }}

Event Volume

Top Event Types (7d)

{% if top_event_types %}
{% for e in top_event_types %}
{{ e.event_type.split('.')[-1] }} {{ e.count }}
{% endfor %}
{% else %}

No events yet

{% endif %}

Top Agents (7d)

{% if top_agents %}
{% for a in top_agents %}
{{ a.agent | replace('_', ' ') | title }} {{ a.count }}
{% endfor %}
{% else %}

No agent data

{% endif %}

Top Tools (7d)

{% if top_tools %}
{% for t in top_tools %}
{{ t.tool }} {{ t.count }}
{% endfor %}
{% else %}

No tool data

{% endif %}
{% endblock %} {% block extra_css %} .range-btn { color: #64748b; border-color: rgba(255,255,255,0.06); background: transparent; cursor: pointer; } .range-btn:hover { color: #94a3b8; border-color: #64748b; } .range-btn.active { color: #e2e8f0; border-color: #00d4ff; background: rgba(0, 212, 255, 0.1); } {% endblock %} {% block scripts %} {% endblock %}