sketchplugins/plugin-directory
Official Sketch Plugin directory
Missing license — unclear to depend on
worst of 4 axesno license — legally unclear; no tests detected
no license — can't legally use code; no tests detected
Documented and popular — useful reference codebase to read through.
no license — can't legally use code
- ✓Last commit today
- ✓11 active contributors
- ✓CI configured
Show 3 more →Show less
- ⚠Concentrated ownership — top contributor handles 60% of recent commits
- ⚠No license — legally unclear to depend on
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: publish a permissive license (MIT, Apache-2.0, etc.)
- →Fork & modify Concerns → Mixed if: add a LICENSE file
- →Deploy as-is Concerns → Mixed if: add a LICENSE file
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/sketchplugins/plugin-directory)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/sketchplugins/plugin-directory on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: sketchplugins/plugin-directory
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/sketchplugins/plugin-directory shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Missing license — unclear to depend on
- Last commit today
- 11 active contributors
- CI configured
- ⚠ Concentrated ownership — top contributor handles 60% of recent commits
- ⚠ No license — legally unclear to depend on
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live sketchplugins/plugin-directory
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/sketchplugins/plugin-directory.
What it runs against: a local clone of sketchplugins/plugin-directory — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in sketchplugins/plugin-directory | Confirms the artifact applies here, not a fork |
| 2 | Default branch master exists | Catches branch renames |
| 3 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 4 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of sketchplugins/plugin-directory. If you don't
# have one yet, run these first:
#
# git clone https://github.com/sketchplugins/plugin-directory.git
# cd plugin-directory
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of sketchplugins/plugin-directory and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "sketchplugins/plugin-directory(\\.git)?\\b" \\
&& ok "origin remote is sketchplugins/plugin-directory" \\
|| miss "origin remote is not sketchplugins/plugin-directory (artifact may be from a fork)"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "plugins.json" \\
&& ok "plugins.json" \\
|| miss "missing critical file: plugins.json"
test -f "lib/plugin-directory-utils.rb" \\
&& ok "lib/plugin-directory-utils.rb" \\
|| miss "missing critical file: lib/plugin-directory-utils.rb"
test -f "Rakefile" \\
&& ok "Rakefile" \\
|| miss "missing critical file: Rakefile"
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f ".github/workflows/update-readme.yml" \\
&& ok ".github/workflows/update-readme.yml" \\
|| miss "missing critical file: .github/workflows/update-readme.yml"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/sketchplugins/plugin-directory"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
The official Sketch Plugin Directory is a curated, community-driven registry of Sketch design plugins hosted on GitHub, published as plugins.json and displayed on sketchapp.com/extensions/plugins. It solves the discovery problem for Sketch users by maintaining an alphabetically-organized, single-source-of-truth list that auto-syncs plugin metadata (name, description, author, repo URL) from GitHub, with automated workflows to keep plugin lastUpdated timestamps and README documentation in sync. Flat structure: plugins.json is the core data store; lib/plugin-directory-utils.rb contains the Ruby utility functions for parsing/validating plugin entries; Rakefile orchestrates build tasks; .github/workflows/ contains two automation scripts that periodically fetch metadata from GitHub and update the registry. No monorepo complexity—this is a single-concern registry system.
👥Who it's for
Plugin developers who want their Sketch plugins discoverable on the official Sketch marketplace, and Sketch users searching for vetted, community-maintained plugins. Contributors are maintainers who review pull requests to add new plugins and ensure data quality in plugins.json.
🌱Maturity & risk
This is a mature, production-deployed project serving as the official Sketch plugin registry. The codebase is Ruby-based (22,314 lines) with established GitHub Actions workflows (.github/workflows/) for automated updates. However, commit recency and test coverage data are not visible in the provided structure, so verification of active maintenance status would require checking GitHub directly.
Low operational risk as a static/semi-static registry with CI-driven updates, but maintenance depends on the core maintainers reviewing PRs. Single points of potential friction: the plugins.json file is the source of truth with no apparent version control branching strategy visible; automated workflows (update-lastupdated.yml, update-readme.yml) could fail silently if GitHub API rate limits are hit or if plugin repos become inaccessible. No test suite visible in file structure suggests limited regression detection.
Active areas of work
Automated synchronization workflows are configured to run periodically: update-lastupdated.yml refreshes the lastUpdated field for plugins, and update-readme.yml regenerates the README.md with the current plugin list. The CONTRIBUTING.md file guides contributors to either submit PRs directly or use skpm (Sketch Plugin Manager) for automatic publishing. No specific active feature development is visible, suggesting this is in maintenance/operations mode.
🚀Get running
Clone the repo: git clone https://github.com/sketchplugins/plugin-directory.git && cd plugin-directory. Install dependencies: bundle install (Ruby Gemfile is implied by Rakefile/lib structure). Review the project: cat README.md and cat CONTRIBUTING.md for submission guidelines. To add a plugin: follow CONTRIBUTING.md to submit a PR that adds/edits an entry in plugins.json.
Daily commands: This is not a server/app to 'run' locally in the traditional sense. Instead: bundle exec rake -T (list all available Rake tasks); bundle exec rake (likely default task, probably validates/builds plugins.json or README). The GitHub Actions workflows run automatically on schedule; to trigger locally, examine .github/workflows/*.yml for what commands they execute (likely rake tasks) and invoke them manually.
🗺️Map of the codebase
plugins.json— The source of truth containing all registered Sketch plugins with metadata—this is what gets published to the plugin directory website.lib/plugin-directory-utils.rb— Core Ruby utilities for validating, parsing, and transforming plugin data; essential for understanding the data pipeline.Rakefile— Build automation and task definitions (likely includes data validation, README generation, and deployment steps).README.md— Documents the plugin submission process and directory purpose; all contributors must understand the contribution guidelines..github/workflows/update-readme.yml— GitHub Actions workflow that automatically generates or updates the README from plugins.json on each merge..github/workflows/update-lastupdated.yml— GitHub Actions workflow that tracks plugin update timestamps; critical for maintaining freshness metadata.CONTRIBUTING.md— Detailed contribution guidelines for adding new plugins to the directory.
🧩Components & responsibilities
- plugins.json (JSON) — Master registry of all approved Sketch plugins with metadata (GitHub URL, author, description).
- Failure mode: If corrupted or missing, no plugins can be indexed; directory becomes blank or broken.
- lib/plugin-directory-utils.rb (Ruby) — Provides validation, parsing, and transformation logic for plugin data throughout the build pipeline.
- Failure mode: If validation is incomplete or buggy, invalid plugin entries slip into the published directory or valid entries are rejected.
- Rakefile build tasks (Ruby/Rake) — Orchestrates data validation, README generation, and artifact publishing; entry point for local and CI builds.
- Failure mode: If tasks are broken or removed, the build pipeline stalls and updates cannot be published.
- GitHub Actions workflows (GitHub Actions YAML) — Automates validation, README regeneration, and timestamp tracking on each PR and on schedule.
- Failure mode: If workflows fail silently or are disabled, PRs are not validated and plugin updates may not be committed.
- README.md (Markdown) — Human-readable, browsable directory listing served from the GitHub repository; primary user-facing artifact.
- Failure mode: If out of sync with plugins.json, users see stale or missing plugins; confusion about what is actually registered.
🔀Data flow
Developer pull request→plugins.json— Contributor submits new or modified plugin entry in JSON format via Git PR.plugins.json→lib/plugin-directory-utils.rb— Validation layer reads and checks each plugin entry for completeness and correctness.lib/plugin-directory-utils.rb→Rakefile— Build tasks invoke utility functions to validate data and generate artifacts.plugins.json→README.md— Alphabetically sorted plugin list is rendered as markdown and committed to the repository.README.md & plugins.json→sketchapp.com/extensions/plugins— Sketch website consumes plugins.json (or reads from the repository) and displays the directory to end users.GitHub API→plugins.json (timestamps)— Scheduled workflow polls GitHub for latest commits on each registered plugin repository and updates metadata.
🛠️How to make changes
Add a New Plugin to the Directory
- Create or edit an entry in plugins.json with plugin metadata (name, GitHub URL, author, description) (
plugins.json) - Run validation via Rakefile to ensure the JSON entry is well-formed and meets submission criteria (
Rakefile) - Submit a pull request; the update-readme.yml workflow will automatically regenerate README.md with the new plugin listed alphabetically (
.github/workflows/update-readme.yml) - Once merged, the plugin appears in the public directory and will be indexed on sketchapp.com/extensions/plugins within the next deploy cycle (
README.md)
Update Plugin Last-Modified Timestamp
- The update-lastupdated.yml workflow runs on a schedule (likely daily or weekly) to check GitHub for recent plugin commits (
.github/workflows/update-lastupdated.yml) - Pulls plugin metadata and refresh timestamps via GitHub API, updating internal tracking (
lib/plugin-directory-utils.rb) - Commits timestamp updates back to the repository if any plugins have new activity (
plugins.json)
Validate and Lint Plugin Entries
- Run Rake tasks defined in Rakefile to validate all entries in plugins.json against a schema (
Rakefile) - The plugin-directory-utils library provides validation functions that check for required fields, valid URLs, and proper formatting (
lib/plugin-directory-utils.rb) - CI workflows automatically run validation on every PR to prevent malformed entries from being merged (
.github/workflows/update-readme.yml)
🔧Why these technologies
- Ruby + Rake — Lightweight scripting language ideal for data transformation, validation, and build automation in a simple, maintainable way.
- JSON — Human-readable, version-control-friendly format for the plugin registry that can be easily parsed and transformed by downstream systems.
- GitHub Actions — Native CI/CD platform for GitHub-hosted projects; enables automatic README generation, timestamp updates, and deployment triggers without external infrastructure.
- Git + Pull Requests — Decentralized, community-friendly contribution model; PRs provide review gates and audit trails for all plugin submissions.
⚖️Trade-offs already made
-
Plugins stored as a flat JSON file rather than a database
- Why: Simplicity, version control, and transparency; all data is human-readable and auditable in Git history.
- Consequence: Scales well for hundreds of plugins but would become unwieldy for millions of entries; no real-time querying capability.
-
README generated and committed to Git rather than rendered dynamically
- Why: Ensures the browsable file on GitHub always reflects the current directory state without runtime dependencies.
- Consequence: README is a build artifact that can become stale if automation fails; requires explicit regeneration on each change.
-
Rely on GitHub webhooks/scheduled workflows instead of server-side indexing
- Why: No backend infrastructure needed; all processing is event-driven and runs in GitHub's free or included tier.
- Consequence: Limited ability to enforce real-time consistency; updates can lag if workflow execution is delayed.
🚫Non-goals (don't propose these)
- Real-time plugin search or discovery—the directory is published as a static list, not a live API.
- User authentication or plugin ownership verification—submissions are community-curated via pull requests.
- Plugin rating, review, or analytics collection—the directory does not track usage metrics or user feedback.
- Automated plugin testing or security scanning—no validation of plugin code integrity or malware detection.
- Multi-language or localized plugin directory—all content is in English.
🪤Traps & gotchas
GitHub API rate limiting: the update-lastupdated.yml and update-readme.yml workflows make API calls to GitHub repos to fetch metadata; if many plugins exist and rate limits are low, workflows could fail or skip updates silently. No error alerting visible in the file structure. Plugin URL validation: there is no visible schema enforcement in plugins.json—malformed URLs or dead repos could be committed. Timezone handling in lastUpdated timestamps may vary if the workflows run in different timezone contexts. The Rakefile likely has implicit dependencies on Ruby version and Bundler; no .ruby-version file visible means version management could be unclear.
🏗️Architecture
💡Concepts to learn
- GitHub API pagination and rate limiting — The update-lastupdated.yml and update-readme.yml workflows fetch metadata from potentially hundreds of plugin repos via GitHub API; understanding rate limits (60 req/hr unauthenticated, 5000 req/hr authenticated) is critical to avoid silent workflow failures.
- GitHub Actions scheduled workflows (cron triggers) — The update-*.yml files use cron syntax to run on schedule; understanding how to configure, debug, and monitor scheduled jobs is essential for maintaining the automated sync pipeline.
- JSON as a data format vs. JSONL (JSON Lines) — plugins.json likely uses either flat JSON array or newline-delimited JSON; choosing the right format affects parsing performance and git diff readability when the file grows.
- Source-of-truth pattern in distributed systems — This registry maintains a single source of truth (plugins.json) that is auto-synced with external GitHub repos; understanding conflicts, eventual consistency, and reconciliation strategies prevents data divergence.
- Rake tasks and Ruby build automation — The Rakefile defines custom build/validation tasks that are likely called by GitHub Actions; understanding Ruby's task automation pattern is needed to extend or debug the build pipeline.
- Git workflow for community-driven registries — This repo accepts plugin additions via pull requests to a shared plugins.json file; handling concurrent edits, merge conflicts, and validation in a community context requires clear branching and review strategies.
- Semantic versioning and plugin metadata — Plugins track lastUpdated timestamps; understanding how to version plugin entries and detect breaking changes in plugin APIs helps the directory stay relevant as Sketch evolves.
🔗Related repos
skpm/skpm— Official Sketch Plugin Manager that automates plugin publishing to this directory; developers use skpm to auto-submit plugins instead of manual PRs.sketch-hq/sketch-api— Sketch's official JavaScript API and SDK; plugin developers use this to build plugins that are registered in this directory.BohemianCoding/awesome-sketch— Community-maintained curated list of Sketch resources and plugins; provides alternative discovery mechanism and complements the official directory.sketchplugins/plugin-scripts— Companion repo with reusable Sketch plugin boilerplate and utilities; helps developers build plugins that meet the quality standards for inclusion in this directory.sketch-hq/sketch-cli— Sketch's command-line interface; some plugins integrate with or depend on the CLI for headless design automation workflows.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add validation tests for plugins.json schema in CI
The repo has a plugins.json file that's critical for the plugin directory, but there's no apparent CI validation to ensure new entries follow the correct schema (required fields, URL format, author name format, etc.). This prevents malformed entries from being merged and causing issues when the website consumes this data.
- [ ] Create lib/plugins_validator.rb to validate plugins.json schema (author, url, description fields)
- [ ] Add test file test/test_plugins_validator.rb with test cases for valid/invalid entries
- [ ] Create .github/workflows/validate-plugins-json.yml workflow to run validator on PRs
- [ ] Update CONTRIBUTING.md with validation requirements for new plugin submissions
Add automated duplicate detection for plugin entries in CI
With a growing list of plugins, duplicate entries (same repository URL or plugin name) could be accidentally submitted. Currently, this appears to be caught only through manual review. Automating this check would catch errors early and improve the contributor experience.
- [ ] Extend lib/plugin-directory-utils.rb with a duplicate detection method (check GitHub URLs and plugin names)
- [ ] Add test cases in test/ directory for duplicate detection logic
- [ ] Add duplicate check step to .github/workflows/validate-plugins-json.yml workflow
- [ ] Document in CONTRIBUTING.md that duplicates will be auto-detected
Add Rakefile tasks to verify plugin accessibility and metadata
The Rakefile currently exists but its tasks aren't documented. Contributors should be able to locally validate their contributions (test that GitHub URLs are accessible, plugin metadata is complete) before submitting PRs, reducing back-and-forth.
- [ ] Add rake task 'rake validate:plugins' to check plugins.json against schema
- [ ] Add rake task 'rake validate:urls' to verify GitHub URLs are reachable (optional, best-effort)
- [ ] Add rake task 'rake validate:all' to run all validations
- [ ] Update CONTRIBUTING.md with instructions: 'Run
rake validate:allbefore submitting your PR'
🌿Good first issues
- Add automated tests for lib/plugin-directory-utils.rb: write unit tests (e.g., in spec/ or test/) that validate JSON parsing, plugin filtering, and README generation logic, since no test suite is visible in the file structure.
- Add JSON schema validation: create a JSON schema file (e.g., plugins.schema.json) that defines the required fields (name, URL, description, author) and validate all entries in plugins.json against it in the Rakefile; this catches malformed submissions early.
- Document the Rake tasks in README.md: add a 'Development' section explaining which rake tasks are available (bundle exec rake -T output), what each does, and how to run them locally for contributors.
⭐Top contributors
Click to expand
Top contributors
- [@Sketch Developer](https://github.com/Sketch Developer) — 60 commits
- @danielcpereira11 — 23 commits
- @funk4d — 4 commits
- @whiteuistore — 4 commits
- @vladanvukmanov — 3 commits
📝Recent commits
Click to expand
Recent commits
dc37f6c— content: Update README (Sketch Developer)4c97f6b— content: Update lastUpdated (Sketch Developer)c1637a5— content: Update README (Sketch Developer)242ca86— content: Update UI Color Palette plugin details and formatting (#1448) (a-ng-d)c8fb95b— content: Update README (Sketch Developer)a657e24— content: Add the bergside/design-md-sketch plugin (#1449) (zoltanszogyenyi)34ddcb4— content: Update README (Sketch Developer)668332f— content: Update lastUpdated (Sketch Developer)c91a87d— content: Update README (Sketch Developer)4c51e4a— content: Update lastUpdated (Sketch Developer)
🔒Security observations
The Sketch Plugin Directory repository shows moderate security posture. Primary concerns involve automated GitHub workflows with potential for privilege escalation, lack of comprehensive input validation for community-contributed plugin metadata, and the inherent risks of accepting arbitrary external plugin references. No hardcoded secrets were detected in visible files. The main risks stem from the pull-request-driven contribution model and automated processing of untrusted data. Implementation of strict input validation schemas, workflow permission reviews, and a documented security policy would significantly improve the security score.
- Medium · Potential Ruby Code Injection in Rakefile —
Rakefile, lib/plugin-directory-utils.rb. The repository contains a Rakefile which may execute arbitrary Ruby code during build/deploy tasks. Without examining the actual Rakefile content, there's a risk that user-supplied input (from plugins.json or GitHub PRs) could be processed without proper sanitization, leading to code injection during the automated plugin addition workflow. Fix: Review Rakefile for any dynamic code execution. Ensure all external inputs (plugin metadata from PRs) are validated and sanitized before being processed. Use allowlists for plugin fields and avoid eval() or similar dangerous constructs. - Medium · Automated GitHub Workflow with Elevated Permissions —
.github/workflows/update-lastupdated.yml, .github/workflows/update-readme.yml. The repository contains GitHub Actions workflows (update-lastupdated.yml, update-readme.yml) that may have overly permissive permissions or access tokens. If these workflows accept external input from pull requests without proper validation, they could be exploited for unauthorized modifications to the repository. Fix: Review workflow permissions and ensure they follow the principle of least privilege. Use 'pull_request_target' carefully with explicit permission scoping. Validate all external inputs, use GITHUB_TOKEN with minimal required permissions, and consider using branch protection rules. - Low · Public Plugin Directory Lacks Input Validation Framework —
plugins.json, CONTRIBUTING.md. As a plugin directory that accepts community contributions via pull requests, there's potential for malicious plugin entries or metadata injection. While plugins themselves are hosted externally, the directory metadata (plugin names, URLs, descriptions) should be validated to prevent XSS or other injection attacks when rendered on the website. Fix: Implement strict schema validation for plugins.json entries. Define and enforce allowed fields, URL format validation (https only), and sanitize all user-provided text fields. Document security requirements in CONTRIBUTING.md. - Low · No Visible Security Policy or Vulnerability Disclosure Process —
Repository root. The repository does not appear to have a SECURITY.md file or documented vulnerability disclosure process, making it difficult for security researchers to responsibly report issues. Fix: Create a SECURITY.md file documenting how to responsibly report security vulnerabilities. Include contact information and expected response timeframes.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.