{% extends "base.html" %} {% block title %}Piply Dashboard{% endblock %} {% block content %}
Lightweight DAG orchestration

Run task-based pipelines with a clean control plane.

Piply now models each pipeline as a lightweight flow of tasks, keeps the UI focused on execution clarity, and stays small enough to evolve without dragging in a heavy orchestration stack.

config {{ project.config_path }} workspace {{ project.workspace }} heartbeat {{ scheduler.heartbeat or 'waiting for first tick' }} queue {{ scheduler.queue_depth or '0' }} sensors {{ scheduler.sensor_count or '0' }}
Total pipelines
{{ stats.total_pipelines }}
{{ stats.scheduled_pipelines }} with active schedules
Total runs
{{ stats.total_runs }}
Every run and log line stored in SQLite
Running now
{{ stats.running_runs }}
Across manual, scheduled, and pipeline-triggered runs
Success rate
{{ stats.success_rate }}%
{{ stats.successful_runs }} success and {{ stats.failed_runs }} failed

Priority pipelines

A fast read on schedules, task counts, and what each flow will launch next.

See all
{% if pipelines %}
{% for pipeline in pipelines[:4] %}
{{ pipeline.schedule_text }} {% if pipeline.last_run %} {{ pipeline.last_run.status }} {% else %} no runs yet {% endif %}

{{ pipeline.title }}

{{ pipeline.pipeline_id }}
{% if pipeline.paused %}paused{% else %}active{% endif %}

{{ pipeline.description or "No operator-facing description added yet." }}

{{ pipeline.task_count }} tasks next {{ pipeline.next_run_label }} running {{ pipeline.active_runs }} {{ pipeline.execution_summary }}
{% if pipeline.trigger_targets %}
{% for target in pipeline.trigger_targets %} triggers {{ target }} {% endfor %}
{% endif %}
View DAG
{% endfor %}
{% else %}
No pipelines found. Add one to {{ project.config_path }} and refresh the page.
{% endif %}

Runtime trend

Recent run duration by completion order.

{% set max_duration = runtime_trend | map(attribute='duration_seconds') | max if runtime_trend else 0 %} {% for point in runtime_trend %} {% set height = 10 + (point.duration_seconds / max_duration * 120 if max_duration else 0) %} {% endfor %}
Active pipelines
{{ active_pipelines|length }}
{% if active_pipelines %}
{% for pipeline in active_pipelines %} {{ pipeline.pipeline_id }} {% endfor %}
{% endif %}
Queue
{{ runtime_metrics.queue.due|default(0) }} due / {{ runtime_metrics.queue.queued|default(0) }} queued
Workers
{{ runtime_metrics.workers.running_tasks|default(0) }} running tasks
Runtime config
{{ scheduler.database_path }}

Recent failures

Failed runs that need operator attention.

Open logs
{% if recent_failures %}
{% for run in recent_failures %} {% endfor %}
{% else %}
No recent failures.
{% endif %}

Recent activity

Recent pipeline runs with task-level completion counts at a glance.

View all runs
{% if recent_runs %}
{% for run in recent_runs %} {% endfor %}
Run Pipeline Status Trigger Tasks Started
{{ run.run_id }} {{ run.pipeline_title }} {{ run.status }} {{ run.trigger }} {{ run.successful_tasks }}/{{ run.task_count }} {{ run.started_at or run.created_at }}
{% else %}
No runs have been recorded yet. Launch a pipeline to populate the timeline.
{% endif %}
{% endblock %}