with one click
dashboard
// Use when reading, editing, or creating files in dlt/_workspace/helpers/dashboard/ or tests/workspace/helpers/dashboard/ or tests/e2e/
// Use when reading, editing, or creating files in dlt/_workspace/helpers/dashboard/ or tests/workspace/helpers/dashboard/ or tests/e2e/
Find and prioritize open GitHub issues by severity, community impact, and maintainer abandonment
Analyze a GitHub pull request including diff, comments, related issues, and local code context
Enforces dlt docstring conventions. Use when writing or modifying docstrings, classes, or function signatures in Python files.
Enforces dlt import conventions and ordering. Use when writing or modifying Python imports in dlt/ or tests/.
Create or reuse a git worktree for a pull request or branch so reviews and work happen in isolation
Triage, plan, and implement a fix or feature for a GitHub issue end-to-end
| name | dashboard |
| description | Use when reading, editing, or creating files in dlt/_workspace/helpers/dashboard/ or tests/workspace/helpers/dashboard/ or tests/e2e/ |
| user-invocable | false |
Consult this skill whenever working on the dashboard codebase. It tells you where files live, what each module does, and where new code belongs.
The dashboard is a marimo-based reactive web UI for inspecting dlt pipelines, schemas, data, and run traces. It lives at dlt/_workspace/helpers/dashboard/.
dlt/_workspace/helpers/dashboard/
āāā dlt_dashboard.py # Main marimo app (~30 reactive cells)
āāā dlt_dashboard_styles.css # CSS: colors, badges, timeline, tables
āāā runner.py # Subprocess launcher, CLI integration
āāā config.py # DashboardConfiguration @configspec dataclass
āāā const.py # Constants: port (2718), timeouts, colors, defaults
āāā typing.py # Shared TypedDicts (TTableListItem, TLoadItem, etc.)
āāā strings.py # All user-facing UI text (~350 lines)
āāā utils/
āāā __init__.py # Package exports
āāā pipeline.py # get_pipeline(), pipeline_details(), exception handling
āāā queries.py # SQL execution, caching (BoundedDict), row counts, loads
āāā schema.py # Table/column lists, schema version fetching
āāā trace.py # Trace rendering, sanitization
āāā visualization.py # Execution timeline HTML, load status badges
āāā home.py # Home page / workspace home rendering
āāā ui.py # dlt_table(), section_marker(), error_callout(), BoundedDict
āāā formatters.py # Datetime humanization, string formatting
āāā data_quality.py # dlthub data quality integration
@app.cell(hide_code=True) decorators define reactive cells in dlt_dashboard.py?pipeline=X&profile=Y) via mo.query_params()BoundedDict (LRU, 64/32 entries) in utils/queries.py and utils/schema.py--dlt-color-lime, --dlt-color-aqua, --dlt-color-purple, --dlt-color-pink)dlt.attach(), file watcher for auto-refreshThree CLI commands all call runner.run_dashboard():
dlt dashboard ā workspace-level (DashboardCommand in dlt/_workspace/cli/commands.py)dlt pipeline <name> show ā pipeline-specific (dlt/_workspace/cli/_pipeline_command.py)dlt workspace show ā workspace-level (dlt/_workspace/cli/_workspace_command.py)Edit mode (--edit) ejects dlt_dashboard.py and CSS to the cwd for user customization.
From pyproject.toml [workspace] extra: marimo>=0.14.5, duckdb>=0.9, ibis-framework>=12.0.0, pyarrow>=16.0.0.
| What you're adding | Where it goes |
|---|---|
| New dashboard section/cell | dlt_dashboard.py ā add @app.cell(hide_code=True) |
| New UI text/messages | strings.py ā add to appropriate section |
| New data fetching/queries | utils/queries.py or new file in utils/ |
| Schema-related helpers | utils/schema.py |
| Pipeline metadata helpers | utils/pipeline.py |
| Trace/execution helpers | utils/trace.py or utils/visualization.py |
| UI component helpers | utils/ui.py |
| Formatting/display helpers | utils/formatters.py |
| New TypedDicts | typing.py |
| New constants/defaults | const.py |
| Configuration options | config.py (DashboardConfiguration dataclass) |
| CSS styling | dlt_dashboard_styles.css |
| Data quality features | utils/data_quality.py |
strings.py, never inline in cells_ (underscore prefix). In marimo, variables that are only used within a single cell and should not be shared across cells must be prefixed with _. Only variables intended to be consumed by other cells should be unprefixed.utils/ui.py functions (dlt_table(), section(), error_callout()) for consistent UIsection-header, pipeline-execution-timeline, status-badge, dlt_table.badge-grey, .badge-yellow, .badge-green, .badge-redtyping.py for data passed between cells@configspec dataclass in config.pytests/workspace/helpers/dashboard/ # Unit and integration tests
āāā conftest.py # Fixtures: pipeline types and temp directories
āāā test_pipeline_workflow.py # Pipeline data retrieval integration
āāā test_all_cells.py # Cell execution and dependency testing
āāā test_visualization.py # Timeline and badge rendering
āāā test_ui_elements.py # UI component styling
āāā test_table_operations.py # Table listing/filtering
āāā test_trace_operations.py # Trace parsing/display
āāā test_query_operations.py # SQL query execution
āāā test_loads.py # Load history retrieval
āāā test_data_formatting.py # String formatting
āāā test_pipeline_operations.py # Pipeline metadata
āāā test_dashboard_config.py # Configuration resolution
tests/e2e/ # Playwright browser tests
make test-workspace-dashboard # unit/integration tests
make test-e2e-dashboard # headless chromium e2e
make test-e2e-dashboard-headed # visible browser e2e
make create-test-pipelines # create pipelines for manual testing
Tests use parametrized pipeline fixtures via ALL_PIPELINES and PIPELINES_WITH_LOAD constants in conftest.py. Key fixtures: success_pipeline_duckdb, success_pipeline_filesystem, extract_exception_pipeline, never_ran_pipeline, load_exception_pipeline.
test_*.py file (e.g., new query helper ā test_query_operations.py)test_all_cells.py, plus a dedicated test file if the section has significant logictest_visualization.py or test_ui_elements.pytests/e2e/