We're looking for contributors to help build open source software.Join usJoin

Showcases

Reef: One Place for Every Export

Scheduled data exports accumulate faster than anyone plans for, and the full extent of what exists only becomes clear when something stops working.

Finance wants a GL export on the first of the month. Logistics wants a daily picklist PDF. A partner integration requires UBL 2.1 XML invoices on every order. None of these are big asks individually, but each one tends to land somewhere different: a PowerShell script on someone's machine, a scheduled task on a server nobody documented, a query in a shared folder that may not still run. The full inventory of what runs, and where it runs, is rarely written down anywhere, which is how teams end up discovering jobs by noticing which ones have stopped.

What Reef is

Reef is a web-based platform for data export workflows. You define a database connection once, write a SQL query, choose an output format, point it at a destination, and set a schedule. Every job is visible in the same interface. Every run is logged. Credentials are encrypted and stored centrally, not buried in scripts or batch files.

The only requirement is SQL: if you can write the query, Reef handles formatting, delivery, scheduling, and retries. Scriban templating is available for cases where the output needs shaping beyond what a raw query result provides.

A real example: month-end GL export

The finance team needs a General Ledger export every month-end: a flat CSV with one transaction per row, dropped on the accounting SFTP at 2am on the first. In Reef, that's a profile with a SQL query against the ERP database, a Scriban template that flattens the account and transaction structure into CSV rows, and a scheduled job pointed at the SFTP destination.

{{~ for account in rows ~}}
  {{~ transactions = account.transactions_json | json.parse ~}}
  {{~ for txn in transactions ~}}
{{ account.company_name | csv_escape }},{{ account.export_date }},{{ account.period_name }},
{{ account.account_number }},{{ account.account_name | csv_escape }},
{{ txn.id }},{{ txn.date }},{{ txn.description | csv_escape }},{{ txn.debit }},{{ txn.credit }}
  {{~ end ~}}
{{~ end ~}}

The schedule is a cron expression. The destination is an SFTP connection stored in Reef with encrypted credentials. When the job runs, the execution is logged with the output path, row count, and any errors, so anyone who needs to confirm the export completed can check the run history directly.

Document generation: PDF invoices by email

Some exports are not flat files. Reef includes document generation for PDF and DOCX output, which is useful when the result is a report or an invoice that needs to be formatted. A query returning invoice line items across multiple customers can be split by a key column so that Reef generates a PDF per customer from a document template and emails each one to the appropriate address, all within a single scheduled job.

The same mechanism handles UBL 2.1 XML for partner integrations: a Scriban template shapes the query result into a standards-compliant invoice document and posts it to an HTTP endpoint. The partner gets structured EDI-style data. The query is written against the existing database schema.

What changes

Every export lives in one place, jobs run on schedule, and every run is logged so that failures appear in execution history rather than surfacing the next morning when a recipient notices the file is missing. Reef runs as a Docker container or Windows service, inside the network, next to the databases it queries, and is not intended to be exposed publicly.

Source code, templates, and documentation

Docker setup, Windows install, and a full template library including GL exports, UBL invoices, and PDF generation examples are on GitHub.