Claude-skill-registry front-plugin
Build Front plugins using the Plugin SDK. Use when creating sidebar plugins, composer plugins, or extending Front's UI. Triggers on plugin, front plugin, sidebar plugin, composer plugin, @frontapp/plugin-sdk.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/front-plugin" ~/.claude/skills/majiayu000-claude-skill-registry-front-plugin && rm -rf "$T"
manifest:
skills/data/front-plugin/SKILL.mdsource content
Front Plugin Development
Build production-ready plugins for Front using the official Plugin SDK (
@frontapp/plugin-sdk).
When to Use This Skill
- Creating a sidebar plugin (context panel in Front)
- Creating a composer plugin (message toolbar integration)
- Extending Front's UI with custom functionality
- Working with the Plugin SDK (not the REST API)
Plugin Types
- Sidebar Plugin - Appears in Front sidebar, shows context for selected conversation(s)
- Composer Plugin - Appears in message composer toolbar, operates on draft being composed
Key Distinction
- Plugin SDK (
) - Client-side, runs in iframe embedded in Front@frontapp/plugin-sdk - REST API (
) - Server-side, webhooks and API callspackages/core/src/front/client.ts
This skill is for the Plugin SDK. For REST API operations (webhooks, drafts via API), see the
front-webhook skill.
Quick Start
// src/providers/frontContext.tsx import { createContext, useContext, useEffect, useState } from 'react' import Front from '@frontapp/plugin-sdk' const FrontContext = createContext() export function useFrontContext() { return useContext(FrontContext) } export function FrontContextProvider({ children }) { const [context, setContext] = useState() useEffect(() => { const subscription = Front.contextUpdates.subscribe(ctx => { setContext(ctx) }) return () => subscription.unsubscribe() }, []) return ( <FrontContext.Provider value={context}> {children} </FrontContext.Provider> ) }
// src/App.tsx import { useFrontContext } from './providers/frontContext' function App() { const context = useFrontContext() if (!context) return <div>Waiting for Front context...</div> switch (context.type) { case 'noConversation': return <div>Select a conversation to use this plugin.</div> case 'singleConversation': return <MainPlugin /> case 'multiConversations': return <div>Select only one conversation.</div> default: return <div>Unsupported context type</div> } }
Context Types
| Type | Description |
|---|---|
| No conversation selected |
| One conversation selected (most common) |
| Multiple conversations selected |
| Composer plugin context |
Common SDK Methods
// List messages in conversation const messages = await context.listMessages() // Create a draft reply await context.createDraft({ content: { body: 'Hello!', type: 'text' }, replyOptions: { type: 'replyAll', originalMessageId: latestMessageId } }) // Update existing draft await context.updateDraft(draftId, { updateMode: 'replace', content: { body: 'Updated content', type: 'html' } }) // Tag conversation await context.tag(['tag_123']) // Assign to teammate await context.assign('tea_456') // Open URL in popup (for modals) await context.openUrlInPopup(url, { width: 400, height: 300 })
Available Context Data
context.teammate // Current Front user context.conversation // Selected conversation (singleConversation only) context.conversations // Selected conversations (multiConversations only) context.draft // Current draft (messageComposer only)
UI Guidelines
- Support dark/light mode
- No horizontal scrolling (narrow sidebar)
- Use
for iconslucide-react - Graceful loading states (never blank screen)
- Handle missing data with fallbacks
Detailed Reference
See
rules/ directory for:
- Context types and interfaces
- All SDK methods with signatures
- Draft creation/update patterns
- Attachment handling
- Error handling patterns