Skip to main content
A routine can save an HTML report: KPI tiles, Plotly charts, tables, markdown, and interactive filters that update charts and tables in the browser. Reports open on the Routines page next to the routine that made them. If you schedule a routine every hour, a report per run is easier to browse than 24 Telegram messages a day.

Viewing reports

There is no separate Reports tab. Select a routine on the Routines page and its latest report opens on the right. /reports redirects to /routines.
  • Step through a routine’s reports with the previous and next buttons, the time strip above the report, or the ← and → keys. ↑ and ↓ move between routines.
  • Download saves the report as a standalone HTML file.
  • Delete removes one report after you confirm.
In Telegram, a run that saved a report shows a 📤 Share Report button. It sends the report to the chat as an HTML file. You see the reports from runs you started. Admins see every report.

Creating a report

Import ReportBuilder, add sections, and await save(). Every method except save() returns the builder, so calls can be chained. save() returns the new report’s ID.
You don’t have to call source(). When Condor runs a routine, any report saved without a source is filed under that routine, so it still shows up on the Routines page. Condor also records which agent ran the routine and which user started it.

ReportBuilder methods

Report settings

Static sections

Interactive components

Interactive components read rows from a named dataset and react to filters in the browser. Register the dataset first. width is a column span from 1 to 12. This routine fetches hourly candles for three pairs and builds an interactive report from them:
For every component and option in one place, run the shipped report_component_gallery routine and open its report.

Live reports

A continuous routine can keep one report up to date instead of saving a new one on every loop. Use LiveReport. This excerpt is from the full, tested example on that page:
  • LiveReport(title, source_name="", tags=None, auto_refresh_seconds=None) sets the source to ("routine", source_name) for you.
  • report.builder is a normal ReportBuilder. report.clear() replaces it with an empty one.
  • await report.update() saves the first time and overwrites the same report after that. It returns the report ID. If someone deletes the report while the routine runs, the next update creates a new one.

Where reports are stored

Reports are HTML files in the reports/ folder of your Condor install, with an index in reports/reports_index.json:
File names are <UTC timestamp>_<title slug>_<report ID>.html. To remove a report, use Delete on the Routines page. Deleting files by hand leaves stale rows in reports_index.json.