@unoff/cli
v0.2.1
Published
A CLI tool to create plugins for Figma, Penpot, Sketch, and Framer
Maintainers
Readme
Unoff CLI
A CLI tool to quickly scaffold plugins for Figma, Penpot, Sketch, and Framer with built-in development tools and best practices.
Prerequisites
- Node.js ≥ 18
- npm ≥ 9
- git — required for
unoff create(initializes a git repository) and for allunoff addcommands (workers, skills, specs use git submodules)
Installing Prerequisites
Homebrew (macOS only)
If you don't have Homebrew installed, open Terminal and install it:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Then verify:
brew --versionNode.js and npm
On macOS: Open Terminal and run:
# Using Homebrew (requires Homebrew to be installed)
brew install nodeOn Windows:
- Download the installer from nodejs.org
- Run the installer and follow the setup wizard
- Open Command Prompt (cmd.exe) or PowerShell and verify installation:
node --version npm --version
On Linux (Ubuntu/Debian): Open Terminal and run:
sudo apt update
sudo apt install nodejs npmOn Linux (Fedora/CentOS): Open Terminal and run:
sudo dnf install nodejs npmGit
On macOS: Open Terminal and run:
# Using Homebrew
brew install gitOn Windows:
- Download the installer from git-scm.com
- Run the installer and follow the setup wizard
- Open Command Prompt (cmd.exe) or PowerShell and verify installation:
git --version
On Linux (Ubuntu/Debian): Open Terminal and run:
sudo apt update
sudo apt install gitOn Linux (Fedora/CentOS): Open Terminal and run:
sudo dnf install gitInstallation
A global install is recommended — it makes every unoff command available directly in any plugin project:
npm install -g @unoff/cliIf you prefer not to install globally, every command works with npx @unoff/cli as a drop-in replacement:
# Instead of: unoff create figma-plugin
npx @unoff/cli create figma-plugin
# Instead of: unoff dev
npx @unoff/cli dev
# Instead of: unoff build
npx @unoff/cli buildQuick Example
# Scaffold a plugin (global install)
unoff create figma-plugin
# Or without global install
npx @unoff/cli create figma-plugin
# Navigate to the plugin directory
cd my-plugin
# Install dependencies
npm install
# Start development (or: npx @unoff/cli dev)
unoff dev
# Figma: Plugins > Development > Import plugin from manifest...
# Penpot: Plugins > Add custom plugin > http://localhost:4400/manifest.jsonCLI Commands
unoff help
Show all commands, available platforms, and workers.
unoff create <platform>
Scaffold a new plugin project with an interactive prompt.
| Platform | Status |
| --------------- | -------------- |
| figma-plugin | ✅ Available |
| penpot-plugin | ✅ Available |
| sketch-plugin | 🚧 Coming soon |
| framer-plugin | 🚧 Coming soon |
The interactive prompt will ask for plugin name, output directory, GitHub username, author, license, and which external services to enable:
| Service | Default | | ------------------------------------ | ------- | | Supabase (Database & Authentication) | ✅ | | Mixpanel (Analytics) | ✅ | | Sentry (Error Monitoring) | ✅ | | Notion (Announcements & Onboarding) | ✅ |
Selected services update the is*Enabled flags in global.config.ts. All environment variable placeholders are always generated in .env.local.
unoff dev
Start development mode (npm run start:dev).
unoff build
Build for production (npm run build:prod).
unoff check
Run lint and type checking sequentially.
unoff format
Format source code with Prettier.
unoff add worker <name>
Add a Cloudflare Worker as a git submodule. Automatically updates package.json workspaces and injects the corresponding start script. You will be prompted for the destination path.
| Worker | Script | Port |
| -------------- | --------------------- | ---- |
| announcement | start:announcements | 8888 |
| auth | start:token | 8787 |
| cors | start:cors | 8989 |
unoff add worker announcement
npm install
npm run start:announcementsunoff add skills
Add the unoff-skills repository as a git submodule. You will be prompted for the destination path (default: skills/).
unoff add skills
git submodule update --init --recursiveunoff add specs
Create a local specs/ folder (or any path you choose) with an empty skill template in Markdown. Useful for documenting project-specific conventions in the same format as unoff-skills.
unoff add specs
# prompts for folder path and spec name
# creates specs/my-spec.md with frontmatter skeletonunoff remove worker <name>
Remove a worker submodule and clean up package.json (workspaces + scripts).
unoff remove worker announcementunoff remove skills
Remove the skills submodule from the project.
unoff remove skillsunoff remove specs
Remove the local specs folder and all its contents.
unoff remove specsFeatures
- 🚀 Quick setup with interactive CLI
- 📦 Multiple platform support (Figma ✅, Penpot ✅, Sketch 🚧, Framer 🚧)
- 🔧 Built-in development server with hot reload
- 🏗️ Production-ready build system
- 🎛️ Toggleable external services (Supabase, Mixpanel, Sentry, Notion)
- 🔐 Authentication scaffolding (Supabase)
- 💳 License management (LemonSqueezy)
- 📊 Analytics and monitoring (Mixpanel, Sentry)
- 🌍 Internationalization (Tolgee)
- 📢 Announcement & onboarding system (Notion + Cloudflare Workers)
- ⚙️ Worker management via git submodules (
add worker/remove worker) - 📚 Skills library integration via git submodule (
add skills/remove skills) - 📝 Project specs scaffolding (
add specs/remove specs) - 📚 Comprehensive AI-assistant documentation
What's included in the template?
UI & Components
- @unoff/ui — Pre-built UI components for design tool plugins
Authentication & Database
- Supabase — Backend as a Service for authentication and database
Licensing & Payments
- LemonSqueezy — License management and payments
Monitoring & Analytics
Content & Communication
- Notion — CMS for announcements and onboarding
- Cloudflare Workers — Proxy layer for Notion API (auth + CORS)
Localization
- Tolgee — Translation management and i18n
Documentation
For detailed usage instructions, see USAGE.md.
Contributing
Contributions are welcome! Please open an issue or pull request on GitHub.
License
MPL-2.0
