Document mode and exports are the same idea
A dashboard in layout_mode: document is designed to be read top to bottom, like a report. It renders in a fixed layout that maps cleanly to a printed or PDF page. Exports take that layout and deliver it on a schedule — without anyone having to open the UI.
The combination of document dashboards and scheduled exports replaces the manual "screenshot and paste into slide" workflow. You define the report once and it lands wherever it needs to go, with fresh data, on time.
Where export definitions live
Exports are YAML files inside content/exports/ in your workspace:
<workspace_slug>/
content/
exports/
sales_daily_pdf.yml
fulfillment_weekly_pdf.yml
Each file defines one export job: which dashboard, which schedule, which parameters, and where to deliver the output.
Working example
id: ec_business_daily_pdf
enabled: true
dashboard_id: ec_business_overview
schedule:
cron: "0 8 * * *"
timezone: "America/New_York"
params:
cutoff_date: "{{today}}"
destination:
type: local_folder
folder: "."
filename: "business-overview-{{today}}.pdf"
policy:
on_missed_run: skip
max_retries: 2
timeout_seconds: 180
Field by field:
id: unique identifier for this export job.enabled: set tofalseto pause without deleting.dashboard_id: must match theidof a published dashboard. Document layout mode is required for PDF exports.schedule.cron: standard five-field cron expression.0 8 * * *runs every day at 08:00.schedule.timezone: IANA timezone name. The cron expression is evaluated in this timezone.params: dashboard filter values injected at render time. These match theparamfield defined in the dashboard'sfiltersblock.destination.type:local_foldersaves the PDF to the specified folder on the export engine host.destination.filename: supports template variables.{{today}}expands to the current date in ISO format.policy.on_missed_run:skipskips missed runs silently. Usebackfillif you need missed runs to execute on recovery.policy.timeout_seconds: if the PDF render takes longer than this, the job is marked as failed.
Send the report to subscribers
An export can deliver the finished PDF straight to people — by email or WhatsApp — without anyone opening Looky. Add a subscribers block and list each recipient under the channel you want to reach them on:
subscribers:
email:
- [email protected]
- [email protected]
whatsapp:
- "+15551234567"
email: email addresses that receive the PDF as an attachment.whatsapp: phone numbers in+<country code><number>form that receive the PDF on WhatsApp.
You choose the channel explicitly — put an email under email and a phone number under whatsapp. Recipients don't need a Looky account, so a scheduled report is a simple way to keep stakeholders in the loop. Both lists are optional; an export with no subscribers just produces the PDF without sending it anywhere.
Template variables
Both params values and destination.filename support these template variables:
{{today}}— today's date in the export timezone (ISO format: YYYY-MM-DD).{{yesterday}}— yesterday's date in the export timezone.
This keeps export filenames and dashboard filter values in sync without manual configuration:
params:
cutoff_date: "{{today}}"
destination:
filename: "sales-report-{{today}}.pdf"
Cron schedule examples
0 8 * * *— every day at 08:000 8 * * 1— every Monday at 08:000 8 1 * *— first day of every month at 08:000 6,18 * * *— twice daily at 06:00 and 18:00
Always set a timezone. A cron without a timezone runs in UTC, which will produce off-by-one dates when using {{today}} if your users are in a different timezone.
Push and verify exports
Export definitions are pushed with the rest of workspace content:
looky validate
looky diff
looky push
After push, the export engine picks up the new job on its next scheduling cycle. To verify the job is registered, check the workspace status in the UI or run looky list exports.