Set up Ply in an Angular 22 project, add your first component, and use it.
128 components are free under MIT, with no account or license key. See them at work in a dashboard built only from free components (live demo, source), or duplicate the Figma kit.
Add Tailwind with its Angular guide. Then install the Angular CDK, which Ply's dialogs, menus, and tooltips build on:
npm install @angular/cdk
Keep Tailwind in its own src/tailwind.css, since Tailwind 4 doesn't run through Sass. @source paths are relative to this file, so ./ scans everything in src/:
@import "tailwindcss";
@source "./**/*.{html,ts}";List it in angular.json, before your global stylesheet:
"styles": ["src/tailwind.css", "src/styles.scss"]
npx ply-ui-cli init
It asks for your components folder, global stylesheet, and Tailwind file. --yes accepts the defaults. Then it writes:
ply-ui.json: where components go, src/app/components by default.ply-ui.css: Ply's global styles and brand tokens, imported at the top of your global stylesheet.icons.svg and icons-filled.svg: icon sprites, in your assets folder.ply-ui-lock.json: a record of installed files, so update can tell your edits from upstream changes.It doesn't install npm packages or change src/tailwind.css.
npx ply-ui-cli add button
The source lands in src/app/components/button/. It's your code now, so edit it like any other file. If the component needs an npm package you don't have, add prints the install command.
Run add without a name to pick from the catalog. In scripts and CI, pass names and --yes.
Import it from the local folder, for example in src/app/app.ts:
import { Component } from '@angular/core';
import { BaseButtonDirective } from './components/button/ply-button.directive';
@Component({
selector: 'app-root',
imports: [BaseButtonDirective],
template: `<button ply-button color="primary">Save changes</button>`,
})
export class App {}npx ply-ui-cli doctor
If a component looks unstyled or icons are missing, doctor checks ply-ui.json, the Angular CDK, Tailwind and its @source paths, the ply-ui.css import, and the icon sprites, then tells you what to fix. It doesn't change any files.
Ply ships an MCP server for agents that can install components, and editor rules for assistants that only write code.
ply-ui-mcp lets your agent search the catalog and run the CLI for you. Pick your tool:
Save as .cursor/mcp.json in your app, then reload the window:
{
"mcpServers": {
"ply": {
"command": "npx",
"args": ["-y", "ply-ui-mcp"],
"env": { "PLY_CWD": "${workspaceFolder}" }
}
}
}Then ask your agent
Add the Ply dialog and card components to this project.
Run npx ply-ui-cli init --yes first, so the agent has somewhere to write. Free components need no key. For Pro, set PLY_LICENSE_KEY where the server runs. Using DeepSeek or another model? Add the server to the editor or CLI you run it in. All tools and options are on the npm page.
The catalog, CLI, and hosted MCP connector are public. Ply does not issue agent identities or access tokens. auth.md is the discovery file agents fetch. It points at llms.txt and the MCP URL, and it records that registration is not enabled.
These files teach assistants to write Ply the way the docs do. init adds the Cursor rule, snippets, and design skill to your project. Get them here if you skipped init or use Windsurf.
Cursor rule
.cursor/rules/ply-ui.mdc
Windsurf rule
.windsurf/rules/ply-ui.md
Same content as the Cursor rule. init doesn't write it.
Snippets for VS Code and Cursor
.vscode/ply-ui.code-snippets
UI design skill
.cursor/skills/ply-ui-design/
.agents/skills/ply-ui-design/
Snippets expand usage markup such as ply-card and ply-dialog. They don't install anything, so run add first. npx ply-ui-cli init --refresh-editor-kit replaces a rule, snippet pack, or design skill that is already in the project. What the design skill changes on a card is in Why Ply installs a UI design skill when you run init.
Ply Pro adds 90 items: page layouts, the app shell, blog, ecommerce, and media blocks, and advanced widgets such as the data table, rich text editor, file upload, and command palette. One license covers every Pro item, with lifetime updates.
See pricingYour key arrives by email after purchase. Set it as an environment variable wherever you run the CLI:
export PLY_LICENSE_KEY=your-license-key
On Windows, use setx PLY_LICENSE_KEY your-license-key. In CI, store it as a secret.
Use the same CLI. Pro items also show up in the add picker.
npx ply-ui-cli add layout-dashboard data-table
Components are your code, so they never change on their own. See what changed upstream, then pull it in:
npx ply-ui-cli diff npx ply-ui-cli update
--overwrite-local resets them to upstream.update asks whether to merge, keep yours, or take upstream. --merge runs a 3-way merge, --force takes upstream, and with --yes your version stays. Name components to update only those, as in npx ply-ui-cli update dialog. npx ply-ui-cli changelog dialog lists one component's changes, and the changelog has everything. Free and Pro items update the same way.
add command, and a prompt for your agent.form() and [formField] on inputs, selects, and toggles.ply-skeleton as the placeholder.Ask questions in GitHub Discussions. For license keys and invoices, email [email protected].
Fixes to free components are welcome on GitHub. Good first changes are a test, a keyboard fix, or a translated string. Open a discussion before proposing a new component, and see the contributing guide.