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
<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
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
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
"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" }
]
}]