{% extends "layout.html" %}{% block content %}

Profile

profile.md

{{ path }}{% if !exists %} — missing; saving creates it{% else %} · {{ bytes }} bytes{% endif %} · limit {{ max_bytes }} bytes. Any ## Interests section is parsed one interest per line; everything else goes into the system prompt verbatim.

The next run rebuilds the system prompt from the saved file.

What the loader parses

Passthrough sections

{% if preview_body.trim().is_empty() %}

Nothing passes through — the file is empty or only has an Interests section.

{% else %}
{{ preview_body }}
{% endif %}

Extracted ## Interests lines

{% if preview_interests.is_empty() %}

None. The prompt uses the OPML interests alone.

{% else %}
    {% for interest in preview_interests %}
  • {{ interest }}
  • {% endfor %}
{% endif %}

History

{% if versions.is_empty() %}

No saved versions yet. The first save records the current file as version 1.

{% else %}

Each row is the text that was replaced by a save (or a restore). Restore writes it back and records what is on disk now as a new version.

{% for version in versions %}{% endfor %}
VersionReplaced atBySizePreview
#{{ version.id }} {{ version.saved_at }} {{ version.saved_by }} {{ version.bytes }} bytes
{{ version.preview }}
{% endif %}

Standing interests

{{ opml_path }} · {{ opml_count }} interests, grouped the way the system prompt lists them. The union of these and the ## Interests lines above is what the prompt uses; edit the OPML file to change them.

{% if !opml_error.is_empty() %}

! {{ opml_error }}

{% endif %} {% if !themes.is_empty() %}
{% for theme in themes %}
{{ theme.name }} ({{ theme.count }})
{{ theme.members }}
{% endfor %}
{% endif %}

Learned adjustments

Rebuilt weekly from ratings by the editor model (prompt version {{ prompt_version }}, built {{ prompt_built_at }}, {{ learned_age }}). {% if rebuild_due %}A rebuild is due — the next run performs it, or start it now.{% else %}The next scheduled rebuild is at least {{ rebuild_interval_days }} days after the last one; the next run performs it when due.{% endif %}

{% if learned.trim().is_empty() %}

No learned adjustments stored yet.

{% else %}
{{ learned }}
{% endif %}
{% if !jobs_enabled %} Jobs are disabled on this server (server.jobs_enabled = false); run daily-epub profile rebuild instead.{% else %} Starts the profile-rebuild job through systemd.{% endif %}

System prompt

Stored after the last run: version {{ prompt_version }}, {{ prompt_chars }} characters, {{ prompt_verdicts }} verdict lines. Every LLM call of a run receives exactly this text.

{% if prompt.is_empty() %}

No prompt has been built yet.

{% else %}
Show the system prompt
{{ prompt }}
{% endif %}
{% endblock %}