Skip to content

Toolkit Authoring Guide

This guide walks you through creating custom toolkits for your Contio-powered offering. Whether you're building meeting workflows for your own platform or enabling your customers to extend their experience, this guide covers the complete authoring process.


Two Distribution Models

Before you begin authoring, decide how your toolkit will be distributed:

Model How It's Installed Who Controls Updates Best For
Partner-Administered Via Partner Admin API You (the partner) Core functionality you manage for all customers
Customer-Administered Via Settings UI (file import) Your customer Extensions your customers create and customize

Partner-Administered Toolkits

When you install a toolkit via the Partner Admin API (POST /v1/partner/admin/toolkits), you retain control over the entities. You can push updates, fix prompts, and add new templates—all changes propagate to your customers' workspaces automatically.

Use this model when:

  • The toolkit is core to your product offering
  • You need to maintain consistency across all customer workspaces
  • You want to push updates without customer intervention

Customer-Administered Toolkits

When your customers import a toolkit via the Contio Settings UI, they own the resulting entities. They can customize prompts, add shortcuts, and modify next steps freely.

Use this model when:

  • You're providing a starter kit that customers will tailor
  • Your customers have unique meeting formats
  • Customization is a key value proposition

See Ownership & Distribution for detailed governance implications.


Planning Your Toolkit

1. Define the Meeting Lifecycle

Start by mapping the meeting types your toolkit supports:

What meetings? → What happens during? → What happens after?

Example — Recruiting Interview Suite:

Meeting Type During Meeting After Meeting
Phone Screen Quick-capture shortcuts Candidate summary, next interview recommendation
Technical Interview Competency flags, code review notes Technical assessment scorecard
Panel Debrief Voting shortcuts Hiring recommendation, stakeholder notification

2. Identify Entity Types

Once you've mapped the lifecycle, identify which entities you need:

Entity Type Purpose When to Use
Meeting Templates Define agenda structure and default settings Every toolkit needs at least one
Next Steps AI-powered post-meeting outputs When you want automated summaries, scorecards, or analysis
Action Buttons Deliver content (email, clipboard, webhook) Pair with next steps for content distribution
Shortcuts Quick in-meeting actions Rapid note-taking, flags, structured captures
Canvas Templates Structured document templates Scorecards, dashboards, collaborative docs

3. Sketch the Reference Graph

Entities reference each other. Before writing JSON, sketch the relationships:

Template: "Sales Discovery"
    ├── Next Step: "Meeting Summary"
    │       └── Action Button: "Email Summary"
    │       └── Action Button: "Copy to Clipboard"
    └── Next Step: "Follow-up Email Draft"
            └── Action Button: "Open Email Client"

Writing the Manifest

Manifest Structure

Every toolkit uses a wrapper containing provenance metadata and the manifest content:

{
  "name": "My Toolkit",
  "slug": "my-toolkit",
  "version": "1.0.0",
  "license": "LicenseRef-MyCompany",
  "license_url": "https://mycompany.com/toolkit-license",
  "manifest": {
    "schema_version": "1",
    "toolkit_prompt": "You are a helpful assistant for...",
    "templates": [...],
    "next_steps": [...],
    "action_buttons": [...],
    "shortcuts": [...],
    "canvas_templates": [...]
  }
}
Field Purpose
name Human-readable display name
slug URL-safe identifier (used for updates and deduplication)
version Semantic version for upgrade detection
toolkit_prompt Global AI persona applied to all next steps

Entity IDs and References

Use $id to declare entities and $ref to link them:

{
  "next_steps": [
    {
      "spec": {
        "$id": "ns-summary",
        "name": "Meeting Summary",
        "type": "ai",
        "ai_prompt": "Summarize this meeting..."
      },
      "action_buttons": [
        { "action_button": { "$ref": "ab-email" }, "sort_order": 1 }
      ]
    }
  ],
  "action_buttons": [
    {
      "spec": {
        "$id": "ab-email",
        "name": "Email Summary",
        "delivery_mechanism": "email",
        "content_format": "rich_text"
      }
    }
  ]
}

When installed, these local identifiers resolve to database UUIDs.


Entity Deep Dive

Meeting Templates

Templates define the structure users see when creating meetings:

{
  "templates": [
    {
      "spec": {
        "$id": "standup",
        "name": "Daily Standup",
        "title": "Daily Standup",
        "slug": "daily-standup",
        "description": "15-minute team sync",
        "meeting_duration_seconds": 900,
        "agenda_items": [
          {
            "item_type": "DISCUSSION",
            "title": "Yesterday's Progress",
            "time_allocation_minutes": 5,
            "sequence": "1"
          },
          {
            "item_type": "DISCUSSION",
            "title": "Today's Plan",
            "time_allocation_minutes": 5,
            "sequence": "2"
          },
          {
            "item_type": "DISCUSSION",
            "title": "Blockers",
            "time_allocation_minutes": 5,
            "sequence": "3"
          }
        ]
      },
      "next_steps": [
        { "next_step": { "$ref": "ns-summary" }, "sort_order": 1, "autopilot": true }
      ]
    }
  ]
}

Key fields:

Field Purpose
name The template's display name in the template picker
title The meeting title applied to meetings using this template. Not the same as name — see below
agenda_items Structured agenda with types: DISCUSSION, ACTION_ITEM_RECAP, BREAK, ADJOURN
next_steps AI outputs that appear after the meeting
autopilot When true, next step executes automatically on meeting completion

See Manifest Format Reference for the complete field list.

Always set title. name labels the template in the picker; title names the meeting. If you omit title, applying the template never sets a meeting title — an untitled meeting stays untitled, and a meeting that already has a title keeps it. The template's name is not used as a fallback there. This is the single most common toolkit authoring mistake.

Next Steps (AI Prompts)

Next steps generate content from meeting transcripts:

{
  "next_steps": [
    {
      "spec": {
        "$id": "ns-summary",
        "name": "Meeting Summary",
        "type": "ai",
        "ai_prompt": "Create a concise summary including:\n\n**Key Discussion Points**\n- ...\n\n**Decisions Made**\n- ...\n\n**Action Items**\n| Owner | Task | Due Date |\n|-------|------|----------|",
        "icon_name": "scroll-text",
        "color": "#1E40AF"
      },
      "action_buttons": [
        { "action_button": { "$ref": "ab-email" }, "sort_order": 1 },
        { "action_button": { "$ref": "ab-copy" }, "sort_order": 2 }
      ]
    }
  ]
}

Prompt writing tips:

  • Be specific about output format (tables, bullet lists, sections)
  • State what to include and what to exclude
  • Use domain-specific terminology your users expect
  • Keep prompts under 2,000 characters

Shortcuts

Shortcuts provide quick in-meeting actions:

{
  "shortcuts": [
    {
      "spec": {
        "$id": "sc-blocker",
        "name": "🚧 Blocker",
        "description": "Flag a blocker that needs attention",
        "icon": "bolt",
        "color": "#DC2626",
        "prompt": "**🚧 BLOCKER**\n**Issue**: [describe the blocker]\n**Owner**: [who is blocked]\n**Needed**: [what would unblock this]",
        "surfaces": [
          { "surface": "MEETING_RUN", "position": 1 }
        ]
      }
    }
  ]
}

Surface options: HOME, MEETING_PREPARE, MEETING_RUN, MEETING_REVIEW, CANVAS


Testing Your Toolkit

1. Validate JSON Syntax

cat my-toolkit.json | python3 -m json.tool > /dev/null && echo "Valid JSON"

2. Test in a Development Workspace

For partner-administered toolkits:

// Create the toolkit
const toolkit = await sdk.admin.createToolkit(manifest);

// Install on a test workspace
await sdk.admin.installToolkit(toolkit.id, {
  workspace_id: 'ws_test123'
});

For customer-administered toolkits:

  1. Go to Settings → Toolkits in a test workspace
  2. Click Import Toolkit
  3. Upload your JSON file
  4. Verify entities appear correctly

3. Run Through Meeting Lifecycle

  1. Create a meeting using your template
  2. Test all shortcuts during the meeting
  3. Complete the meeting and verify next steps execute
  4. Confirm action buttons deliver content correctly

Best Practices

Naming Conventions

Element Convention Example
$id Prefix by type, lowercase with hyphens ns-meeting-summary, ab-email-notes
slug Lowercase, hyphens, globally unique acme-sales-discovery
name Title case, user-friendly Sales Discovery Call

Versioning Strategy

Use semantic versioning for your toolkit:

Change Type Version Bump Example
New entities added Minor 1.0.0 → 1.1.0
Prompt improvements Patch 1.1.0 → 1.1.1
Breaking restructure Major 1.1.1 → 2.0.0

Customization-Friendly Design

If you expect customers to customize your toolkit:

  • Use clear, descriptive $id values
  • Add usage_guidance fields explaining when to use each entity
  • Include comments in prompts (via markdown) explaining customization points
  • Provide a customization guide alongside your toolkit

Production Examples

Study these complete, production-ready toolkits for inspiration:

Toolkit Entities Use Case
Recruiting Interview Suite 4 templates, 6 next steps, 8 shortcuts Hiring workflows
Agile Ceremonies Suite 5 templates, 7 next steps, 10 shortcuts Scrum team meetings
Robert's Rules Collection 3 editions with varying complexity Parliamentary procedure

Each example includes a downloadable JSON manifest and detailed documentation.


See Also