Configuration (dashdown.yaml)

Every project has a dashdown.yaml at its root — the single config file for the whole dashboard. Data connectors live separately in sources.yaml.

Three rules hold for the entire file:

  • Everything is optional. A minimal project is just title:. Each block below has safe defaults.
  • Malformed config fails fast. A bad block raises at startup, so the server refuses to run half-configured rather than silently ignoring a typo.
  • Secrets read from the environment. Any secret value supports ${VAR} expansion (api_key: ${ANTHROPIC_API_KEY}), so credentials stay out of the file.

The dev server watches dashdown.yaml and reloads the project when it changes — no restart needed.

Full reference #

Every block in one place. All of these are optional; delete what you don't use.

title: My Analytics            # browser tab + header title

branding:                      # → see below
  logo: assets/logo.svg
  favicon: assets/favicon.png
  palette: ["#6366f1", "#22c55e", "#f59e0b"]

format:                        # → Formatting
  locale: en-US
  currency: USD
  date_format: MMM D, YYYY

auth:                          # → Authentication
  type: basic
  users:
    admin: ${ADMIN_PASSWORD}

embed:                         # → Embedding
  enabled: true
  frame_ancestors: ["https://example.com"]
  secret: ${EMBED_SECRET}
  token_ttl: 3600

llm:                           # → Ask
  provider: anthropic
  api_key: ${ANTHROPIC_API_KEY}
  model: claude-haiku-4-5

global_filters:                # → Filters
  date:
    enabled: true
    default: last_30_days
    start_param: date_start
    end_param: date_end

search:                        # → Full-text search
  enabled: true
  placeholder: "Search…"
  max_results: 8

sidebar:                       # → Sidebar
  collapsed: false             # first-visit state; reader's choice is remembered
  toggle: true                 # show the desktop collapse button
  show_single_page: false      # show the nav even on a one-page project

python_queries:                # → Python queries
  enabled: true

Top-level keys #

Key Default Purpose
title Dashdown Shown in the browser tab and the app header.

Note

Theme is not configured here — it's viewer-controlled. The page follows the visitor's OS light/dark preference by default; the header toggle overrides it (saved per browser). An embedding host can pin a theme with ?_theme=light|dark. To restyle the look — colours, radii, spacing, chrome — drop a assets/custom.css in your project; see Theming & styling.

branding #

Logo, tab icon and chart colors. (No separate page — this is the reference.)

branding:
  logo: assets/logo.svg        # project-relative path or an https:// URL
  favicon: assets/favicon.png  # overrides the default tab icon
  palette: ["#6366f1", "#22c55e", "#f59e0b"]   # chart series colors (hex)
Key Purpose
logo Rendered in the header next to the title. A path is resolved relative to the project; an http(s)/data: URL is used as-is.
favicon Overrides the bundled browser-tab icon (same path/URL rules).
palette List of hex colors overriding the default ECharts series palette on every chart.

To restyle everything else — surfaces, accents, radii, the app chrome — use a assets/custom.css file. → Theming & styling.

format #

Project-wide defaults for number, currency and date display (locale, currency, date_format). A component's own format= attributes override these.

Formatting for the full reference.

auth #

Password-protect the whole dashboard. type: basic (HTTP Basic) or type: api_key (a shared secret in a header); default none. Secrets support ${VAR}.

Authentication for setup and the cross-origin caveats.

embed #

Serve pages chrome-less inside an iframe on another site, with framing allowlists and (when auth is on) signed access tokens.

Embedding for the framing rules and token flow.

llm #

The LLM gateway used by <Ask />. Provider-only — provider (mistral · anthropic · openai · openrouter), api_key, model — so consumer knobs like max_rows stay on the component.

AI → Ask for providers, extras and usage.

global_filters #

A single project-wide date-range control shown on every date-aware page; a query opts in by using the ${date_start} / ${date_end} placeholders. The selection persists across navigation.

Filters & parameters for presets, params and how queries opt in.

The built-in full-text search box in the header. enabled (default true), placeholder, max_results. Disabling it removes only the chrome box — the <SiteSearch /> component still works.

Full-text search for how the index is built and served.

Controls the left navigation menu. (No separate page — this is the reference.)

sidebar:
  collapsed: false         # nav shown on first visit; true → start collapsed
  toggle: true             # show the desktop "hide sidebar" button
  show_single_page: false  # one-page project hides the nav; true → keep it
Key Default Purpose
collapsed false First-visit state on desktop. Only a seed — once a reader toggles the sidebar, that choice is saved per browser and wins over this.
toggle true Show the desktop collapse button in the header. false pins the sidebar to whatever collapsed says (no control).
show_single_page false A project with a single navigable page has nothing to navigate to, so the nav and both menu buttons are hidden. Set true to keep the nav anyway.

Note

This is desktop behavior. The mobile slide-in menu (the ☰ button) is unaffected by collapsed/toggle; it's only hidden when the nav is empty (single page, no show_single_page). Dynamic [slug] pages don't count toward the page total — they're already left out of the nav.

python_queries #

The one policy knob for Python queriesqueries/*.py files whose decorated function returns a table.

python_queries:
  enabled: true                # default true
Key Default Purpose
enabled true Whether queries/*.py files are loaded and run. Set false to skip them entirely.

A Python query runs author code in-process — the same trust boundary as a custom component (components/*.py), which is why the default is on. A managed / multi-tenant host that serves semi-trusted project directories sets enabled: false to refuse arbitrary in-process code execution; the .py files are then skipped (not imported, not registered) and any reference 404s as an unknown query. SQL/DAX library queries are unaffected.

Python queries for the function contract and the params-are-data guarantee.

Not in this file #

  • Data connectors live in sources.yaml, not dashdown.yaml.
  • Per-page settings (title, icon, route params) are page frontmatter.

Tip

Questions or ideas? These docs are themselves a Dashdown project — browse the source under docs/, or open an issue on the repository.

Generated