OfflineU

{% if course %}

{{ course.name }}

{{ stats.completed_lessons }}/{{ stats.total_lessons }} lessons completed
{{ "%.1f"|format(stats.completion_percentage) }}%
{% if stats.last_accessed_path %}
Last Accessed: {{ stats.last_accessed_path }} Continue
{% endif %}
{% macro render_tree_node(node, depth=0) %}
📁 {{ node.name }} {{ (node.children|length + node.lessons|length) }} items
{% if node.children or node.lessons %} {% endif %}
{% if node.children or node.lessons %}
{% for child_name, child_node in node.children.items() %} {{ render_tree_node(child_node, depth + 1) }} {% endfor %} {% for lesson in node.lessons %} {% set lesson_relative_path = lesson.path|replace('\\', '/')|replace(course.path|replace('\\', '/'), '')|replace('//', '/')|replace('/', '', 1) %}
{% if lesson.lesson_type == 'video' %}🎥 {% elif lesson.lesson_type == 'audio' %}🎵 {% elif lesson.lesson_type == 'quiz' %}📝 {% elif lesson.lesson_type == 'mixed' %}📦 {% else %}📄{% endif %} {{ lesson.title }}
{{ lesson.lesson_type|title }} {% if lesson.completed %} {% else %} {% endif %}
{% endfor %}
{% endif %}
{% endmacro %} {{ render_tree_node(course.root_node) }}
{% else %}

Your Courses

⚙ Settings

Don't see it? Enter a path manually

How to Use OfflineU:

  • Prepare your course files in a directory structure
  • Copy the full path to your course directory
  • Paste the path in the input field above
  • Click "Load Course" or press Enter
  • Start learning! Your progress will be saved automatically

Supported File Types:

  • Videos: .mp4, .mkv, .avi, .mov, .webm
  • Audio: .mp3, .wav, .m4a, .aac
  • Documents: .txt, .md, .html, .pdf
  • Subtitles: .srt, .vtt
{% endif %}