All posts

Inside the Golden Reports Blocks SDK

Every block in Golden Reports is a TypeScript class. Here is how the Blocks SDK works under the hood, and where it is headed for third-party developers.

Golden Reports Blocks SDK — TypeScript decorators on dark navy background

When you drag a Divider block onto a Golden Reports canvas, you're working with a TypeScript class. When you pick a chart type from the properties panel, that dropdown is powered by a decorator. Every block we ship is built the same way we want third-party developers to build blocks eventually.

Here's how it works.

Three Files. One Block.

Each block lives in its own folder with three files:

  • sales-chart.block.ts: the TypeScript class
  • sales-chart.css: styles
  • sales-chart.liquid: the HTML template
Three files that make up a Golden Reports block: .block.ts (TypeScript class), .css (styles), .liquid (HTML template)
Three files that make up a Golden Reports block: .block.ts (TypeScript class), .css (styles), .liquid (HTML template)

No module registration. No config files. The decorators on the class handle everything.

What a Block Looks Like

Here's the actual DividerBlock from our core package:

import { block, prop } from '@wolfverse/golden-reports-pdk';
import styles from './divider.css';
import template from './divider.liquid';

@block({ template, styles })
export default class DividerBlock {

  @prop({ type: 'enum', options: ['solid','dashed','dotted','double'],
          default: 'solid', label: 'Line style' })
  variant!: string;

  @prop({ type: 'enum', options: ['thin','medium','thick'],
          default: 'thin', label: 'Thickness' })
  thickness!: string;

  @prop({ type: 'color', default: '', label: 'Color' })
  color!: string;

  @prop({ type: 'string', default: '', label: 'Center label' })
  label!: string;
}

The @block decorator registers the class and wires up the template and styles. Each @prop becomes a field in the properties panel. The editor renders the right input based on the type.

The Four Decorators

DecoratorWhat it doesWhen to use it
@blockRegisters the class as a report blockEvery block (required)
@propExposes a property in the editor panelAnything configurable
@eventCreates an event handler on the blockHandling events fired by the report editor
@watchReacts when a data context changesBlocks that react to property changes that need to re-render

The lifecycle side is familiar too. Blocks support onInit, afterViewInit, and onDestroy: the same hooks you'd use in an Angular component. If you've written Angular, you already know when to use them.

What Ships with the MVP

Custom block authoring isn't available yet. For the initial release, Golden Reports comes with a set of core blocks that covers the most common report needs:

CategoryBlocks
Data DisplayChart, Gauge, KPI, List, Progress, Table
LayoutBody, Columns, Divider, Page-Break, Page-Footer, Page-Header, Section
MediaImage
TypographyHeading, Text
Golden Reports block palette showing core blocks organized by category
Golden Reports block palette showing core blocks organized by category

Third-party block authoring, custom packages, and a block marketplace are on the roadmap for later this year.

Why We're Sharing This Now

We build all our own blocks with this API. It works. It's not a concept or a prototype. It's what ships.

When we open up block authoring to third-party developers, this is what it'll look like. We wanted to share the direction now, even if you can't build your own blocks quite yet.

Golden Reports launches Early Access in May 2026. Join the waitlist at goldenreports.dev.

Mariano Santoro
Published March 17, 2026
All posts