Conceptboard file format

Disclaimer: This article uses the software Conceptboard from my current employer. All opinions are my own. My employer is not responsible for any of my doings described in this article.


Conceptboard is a software for editing digital whiteboard with multiple people in real time. Commonly, all data is stored on a server, however, users can export and import their whiteboards. Aside from being useful for backups, curious people can read and modify their whiteboards using their own tools and scripts.

Downloading

Boards can be downloaded by changing the URL in your web browser while a board has been opened. In the URL bar, which should show a URL similar to https://app.conceptboard.com/board/rx14-zsbc-cf67-e73s-uhxh, replace /board/ with /board-export-file/ and hit Enter. This will download the CCB file. Often boards are identified by their documentId which is a UUID. However, in these URLs, the identifier is the ID part of an editKey.

Note, the export job lags a bit behind live changes on the board. If you made recent changes, delay your download by a minute or two.

Reading and editing

A Conceptboard export file is a snapshot of a board. It doesn’t contain historical items, like deleted shapes. Filenames end with CCB, so a file could be named monday_meeting.ccb.

The CCB file is a gzipped JSON file. On the terminal, we can pipe it to the JSON viewer jq like this:

gunzip --stdout monday_meeting.ccb | jq

In TypeScript for NodeJS, we can unzip it like this:

import { readFile } from 'node:fs/promises';
import { promisify } from 'node:util';
import { gunzip as gunzipRaw } from 'node:zlib';
const gunzip = promisify(gunzipRaw);

const compressed = await readFile('monday_meeting.ccb');
const decompressed = await gunzip(compressed);
const data = JSON.parse(decompressed.toString());

Inside the JSON, you can find the following:

{
    "BOARD_NAME": "Monday Meeting",
    "SNAPS": {
        "images": []
    },
    "ITEMS": {
        "changes": []
    }
}

ITEMS.changes is an array of objects. An object might be an item on the board, a group or a setting of the board.

If you come across a setting called “outline”, it’s refering to the Sections you can use to create presentations. Its property ids is an ordered array of item IDs (strings).

To learn how items work, download some of your boards and inspect them. As far as I know, there’s no official documentation of the item format.

After you’ve modified your board, you can repackage it as a CCB file like this:

import { writeFile } from 'node:fs/promises';
import { promisify } from 'node:util';
import { gzip as gzipRaw } from 'node:zlib';
const gzip = promisify(gzipRaw);

const data = {
    "BOARD_NAME": "New board",
    "SNAPS": {
        "images": []
    },
    "ITEMS": {
        "changes": []
    }
};
const compressed = await gzip(JSON.stringify(data));
await writeFile('new_board.ccb', compressed);

Importing

Go to https://app.conceptboard.com/board-file-import/ and upload your CCB file to import it. If you’ve done everything correctly, you should be able to see your new whiteboard.