Profile
Edit
{% if profile.config.avatar %}
{% else %}
{{ profile.name[0] | upper }}
{% endif %}
{{ profile.name }}
{% if profile.config.full_name %}
{{ profile.config.full_name }}
{% endif %}
{% if profile.config.bio %}
{{ profile.config.bio }}
{% else %}
No bio set.
{% endif %}
Address
{% if profile.address %}
Scan QR code from mobile app to start a chat
{% else %}
Start the profile to generate an address.
{% endif %}
{% if profile.bot_type == 'directory' %}
{% set safe = profile.name | lower | replace(' ', '_') %}
Directory website
Auto-generated listing page for this directory bot.
{% endif %}
Config
Key Value
{% for k, v in profile.config.items() if k not in ['avatar', 'bio', 'full_name'] %}
{{ k }} {% if k == 'api_key' %}•••••••• (set){% else %}{{ v }}{% endif %}
{% else %}
No extra config set.
{% endfor %}
Contacts ({{ contacts | length }})
{% if contacts %}
Name
{% for c in contacts %}
{{ c.localDisplayName }}
{% endfor %}
{% else %}
No contacts yet.
{% endif %}
{# Macro: one group/channel row. api_list_groups gives bare GroupInfo dicts:
g.groupId, g.groupProfile.displayName, g.groupSummary.currentMembers.
The verb is "Post" for channels (broadcast) and "Msg" for groups. #}
{% macro groupRow(g) %}
{% set name = g.groupProfile.displayName %}
{% set gid = g.groupId %}
{% set mcnt = g.groupSummary.currentMembers %}
{% set invited = (g.membership.memberStatus if g.membership else '') == 'invited' %}
{% set is_owner = (g.membership.memberRole if g.membership else '') == 'owner' %}
{{ name }}
{% if invited %}
⏳ invited
{% else %}
{{ mcnt }}
{% endif %}
{% endmacro %}
Groups ({{ groups | length }})
{% if profile.running %}
+ Create Group
{% endif %}
{% if groups %}
Name Members
{% for g in groups %}{{ groupRow(g) }}{% endfor %}
{% else %}
No groups yet.{% if not profile.running %} Start the profile first.{% endif %}
{% endif %}
Channels ({{ channels | length }})
{% if profile.running %}
+ Create Channel
{% endif %}
{% if channels %}
Name Subscribers
{% for g in channels %}{{ groupRow(g) }}{% endfor %}
{% else %}
No channels yet.{% if not profile.running %} Start the profile first.{% endif %}
{% endif %}
Event Log
Refresh
{% for line in log_lines %}{{ line }}
{% endfor %}