{% extends "base.html" %} {% block title %}Dashboard · frp-jump{% endblock %} {% block content %}
Wire up who can reach what. Changes apply next time each device's agent polls.
| Name | Owner | Status | Enrolled | Last seen | Agent | |
|---|---|---|---|---|---|---|
| {{ d.name }} | {{ d.owner_email }} | {% if d.revoked %}revoked {% elif online[d.id] %}online {% else %}offline{% endif %} | {{ d.enrolled_at.strftime("%Y-%m-%d") }} | {{ d.last_seen_at.strftime("%Y-%m-%d %H:%M") if d.last_seen_at else "never" }} | {{ d.agent_version or "—" }} | {% if not d.revoked %} {% endif %} |
No devices enrolled yet.
{% endif %}Leave name blank to let whoever redeems the token pick their own; set owner email to onboard a friend's first device under their own account instead of yours.
| Name | Owner | Created | Expires | |
|---|---|---|---|---|
| {{ t.device_name_hint or "(picked at enroll time)" }} | {{ t.owner_email }} | {{ t.created_at.strftime("%Y-%m-%d %H:%M") }} | {{ t.expires_at.strftime("%Y-%m-%d %H:%M") }} |
No unredeemed tokens.
{% endif %}| Name | Device | Protocol | Port |
|---|---|---|---|
| {{ s.name }} | {{ s.device_name }} | {{ s.protocol.value }} | {{ s.target_port }} |
No services yet.
{% endif %} {% if devices %}Add a device first.
{% endif %}| Service | Exposed by | Granted to | Status | |
|---|---|---|---|---|
| {{ g.service_name }} | {{ g.exposer_device_name }} | {{ g.consumer_device_name }} | {% if g.revoked %}revoked {% else %}active{% endif %} | {% if not g.revoked %} {% endif %} |
No grants yet — nobody can reach anybody.
{% endif %} {% if services and devices %}Add a device and a service first.
{% endif %}| Role | Devices | ||
|---|---|---|---|
| {{ u.email }} | {{ "admin" if u.is_admin else "user" }} | {{ u.device_count }} |