Engineering at MindLink

Custom content in a Skype for Business conversation

May 21, 2018

At MindLink we like to take current trends in messaging and see if we can get more out of Skype for Business (SfB) by supporting them. This week with our intern Daniel I’ve been investigating how to display rich custom content i.e. cards, in channels while having fallback content for other clients that don’t understand the rich content.


We have made it possible to bring rich content cards as seen in many popular trendy chat platforms to existing Skype for Business deployments, further extending the value of SfB!

Getting custom data inside a SfB message

Skype for Business channels are known as Persistent Chat groups in SfB speak. They support sending Rich Text Format (RTF), but the native clients will reject unrecognised/malformed RTF and display a very specific subset of the RTF content. This is also true for 1-1 conversations.

Fortunately RTF is pretty well documented, what we need is some way to send RTF that can have some non-RTF content and a fallback if that content isn’t supported.

Enter the \object block! The RTF specification describes this as a block for representing OLE objects, where the object is a base64 encoded OLE stream and there are other blocks for defining the type and importantly the RTF “result” should the object not be supported. See the RTF Specification for more details.

By using our framework we were able to insert a test object to see how the SfB client reacts to such a definition. As expected and conforming to the RTF specification the client renders only the RTF result of the object. The format we used to achieve this within an RTF message was:

{\object \objemb {*\objclass MindLinkCard} {*\objdata <data>} {\result <fallback>}}

Using this as a starting point we defined a common representation for structured JSON data that we would encode as the object data (replacing <data> above). We then extended our core application to allow the sending of a restricted set of rich content cards, ensuring that the fallback RTF result is populated with a textual description of the content, replacing <fallback> above e.g. inserting a support ticket might render “see ticket”.

We then enhanced our client to be able to send these rich content cards and display rich content in the message history instead of the fallback text!

What’s more is that we made this extensible, so it’s possible to load client extensions to send other rich content cards! This opens up the possibility for more intuitive line of business workflows right within your conversations.

Expect to see us leverage this new extensibility in sample integrations with other line-of-business applications.

Example use case - Giphy

While we work on more advanced integrations, here’s an example popular integration with Giphy that is a very simple showcase of what these new capabilities can provide. Imagine linking this into line-of-business applications that show dynamic data or allow actions to be taken with the click of a button from right within the conversation.

Our work-in-progress extensibility API allows an extension to load a popup for composing a message card, as shown below.

Composing Popup

The extension can insert any number of pre-defined card message parts, below you can see the Giphy extension insert an image card.


When the message is sent the MindLink client will then display the card in full detail:

Inline conversation

When the card is rendered in a Skype for Business client it shows the fallback text described by the extension. For Giphy integration that’s simply the link to the GIF, for other integrations that may be a combination of text and links.

Skype for Business fallback

We are very excited to be developing this new set of features for our customers, enabling next generation functionality without requiring a whole new platform!

Luke Terry

Written by Luke Terry.

Senior Engineer at MindLink. Enjoys technology, playing games and making things work, blogs at