Software and systems integration for broadcast

Kookerella is a specialist software development consultancy founded to deliver system integrations, tooling and reporting development for media organisations in the broadcast and VOD sector.

Simple, reliable engineering

Our focus is on simple, reliable solutions where the focus is on delivering value, not delivering technology for technology's sake, but we have over the years developed particular areas of specialist knowledge.

  • Broadcast & VOD systems — system integrations, tooling, and reporting for media organisations
  • Deep XSLT experience — from everyday transforms to functional patterns like Maybe and Monad
  • Polyglot by necessity — F#, C#, and Scala, whichever fits the problem
Read how this works →
SafeDivision.xslt
<xsl:function name="kooks:safeDivision" as="xs:numeric?">
    <xsl:param name="numerator" as="xs:numeric"/>
    <xsl:param name="denominator" as="xs:numeric"/>
    <xsl:if test="not($denominator eq 0)">
        <xsl:sequence select="$numerator div $denominator"/>
    </xsl:if>
</xsl:function>

Open-source, when it's useful

CsExcel brings a declarative, functional way to generate Excel workbooks to C#: you build a workbook as an immutable sequence of instructions, not an object you mutate cell by cell.

  • CsExcel — a C# wrapper around FsExcel for building Excel workbooks declaratively
  • Published on NuGet, source on GitHub
  • PolyForm Noncommercial licensed — free to use and modify
See the CsExcel docs →
HelloWorld.cs
var cells = new[]
{
    Cell([ String("Hello World") ])
};

CsExcel.Render.AsFile(cells, @"c:\temp\HelloWorld.xlsx");

Decompile spreadsheets into real code

Kookerella.FsOpenXmlDsl reverse-engineers an existing .xlsx back into idiomatic F# or C# source, or plain XML/JSON — a decompiler for spreadsheets, not just a writer. A four-part series walks the same invoice template through all four targets.

  • Round-trips both ways — read an existing workbook back into source, not just write one
  • No ClosedXML underneath — built directly on the OpenXML SDK
  • One template, four ways — C#, F#, XSLT, and plain JSON, each its own post
Read the series →
InvoiceTemplate.g.fsx
open Kookerella.FsOpenXmlDsl
open type Kookerella.FsOpenXmlDsl.SheetDsl

let data =
    sheet
        "Sheet1"
        [ row [ cell (Text "Name", style = headerStyle)
                cell (Text "Amount", style = headerStyle) ]
          row [ cell (Text "Widgets")
                cell (Number 42.5) ]
          Freeze(1, 0) ]

workbook [ data ] |> Workbook.save "out.xlsx"

// Reverse transform:
let roundTripped = Workbook.load "out.xlsx"

Real pivot tables, not lookalikes

We gave the same "add a pivot table and sparklines" request to a generic Python/openpyxl AI session and to an agent using our own MCP server, then unzipped both results to see what was actually inside — not what either one claimed.

  • openpyxl: zero sparkline classes, no real pivot-cache creation API
  • fsopenxmldsl-mcp: a real pivot cache, table definition, and sparkline extension
  • One JSON payload — no field indices, no GUIDs, no cache bookkeeping
Read the comparison →
payload.json
"pivotTables": [{
  "sourceSheet": "RawSales",
  "sourceTopLeft": "A1",
  "sourceBottomRight": "D49",
  "rowField": "Region",
  "columnField": "Quarter",
  "valueField": "Revenue",
  "aggregation": "sum"
}],
"sparklineGroups": [{
  "style": { "type": "line", "showHigh": true },
  "sparklines": [
    { "cell": "F2", "dataTopLeft": "B2", "dataBottomRight": "E2" }
  ]
}]