weavr 1.1.0

Claude Code transcript exporter — beautiful, self-contained HTML and Markdown
Documentation
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ project_name }} — weavr</title>
<style>
{{ css|safe }}
</style>
<script>
(function(){var t=localStorage.getItem('weavr-theme');if(t){document.documentElement.setAttribute('data-theme',t);}else if(window.matchMedia('(prefers-color-scheme: light)').matches){document.documentElement.setAttribute('data-theme','light');}})();
</script>
</head>
<body>
<div class="project-page">
  <header class="header">
    <div class="header-left">
      <div class="header-logo">
        <span class="header-logo-icon">&#x2328;</span>
        <span class="header-logo-text">ailog</span>
      </div>
      <div class="header-separator"></div>
      <div class="header-meta">
        <a href="../index.html" class="header-back-link">&larr; All Projects</a>
        <div class="header-meta-project">
          <span class="header-meta-title">{{ display_name }}</span>
          <span class="header-meta-path" title="{{ project_name }}">{{ project_name }}</span>
        </div>
      </div>
    </div>
    <div class="header-actions">
      <div class="header-session-stats">
        <span>{{ session_count }} sessions</span>
        <span class="header-stat-sep">&#x2022;</span>
        <span>{{ message_count }} messages</span>
        <span class="header-stat-sep">&#x2022;</span>
        <span>{{ token_total }} tokens</span>
      </div>
      <div class="header-separator"></div>
      {% include "components/theme_toggle.html" %}
    </div>
  </header>

  {% set search_placeholder = "Search sessions..." %}
  {% set show_view_switcher = false %}
  {% include "components/toolbar.html" %}

  <div class="session-list">
  {% for session in sessions %}
    <a href="{{ session.filename }}" class="session-card"
       data-id="{{ session.id }}"
       data-title="{{ session.title }}"
       data-started-at="{{ session.started_at.as_deref().unwrap_or("") }}"
       {% if let Some(prompt) = session.first_user_prompt %}
       data-prompt="{{ prompt }}"
       {% endif %}>
      <div class="session-card-primary">
        <h3 class="session-card-title">
          {% if let Some(prompt) = session.first_user_prompt %}
            {{ prompt }}
          {% else if session.title != session.id %}
            {{ session.title }}
          {% else %}
            (no user message)
          {% endif %}
        </h3>
        <span class="session-card-time">{{ session.relative_time }}</span>
      </div>
      <div class="session-card-secondary">
        <span class="session-card-id">{{ session.id }}</span>
        <span class="session-card-meta-sep">·</span>
        <span>{{ session.message_count }} msgs</span>
        <span class="session-card-meta-sep">·</span>
        <span>{{ session.token_total }} tokens</span>
      </div>
    </a>
  {% endfor %}
  </div>

  <div class="empty-state" hidden aria-live="polite">
    <span class="empty-state-icon">&#x1F50E;</span>
    <p class="empty-state-text">No sessions match your filters.</p>
  </div>


</div>
<script>
{{ index_js|safe }}
</script>
</body>
</html>