Agent skill

Platform Custom Object Generate

by forcedotcom in forcedotcom/sf-skills

A skill your agent uses when users create, generate, or validate Salesforce Custom Object metadata.

Apache-2.0Auto-check passedSales & Support

Install Platform Custom Object Generate

skills CLI
$ npx skills add forcedotcom/sf-skills --skill platform-custom-object-generate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install forcedotcom/sf-skills platform-custom-object-generate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/platform-custom-object-generate .claude/skills/platform-custom-object-generate && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
platform-custom-object-generate
GitHub stars
1.1k
Token cost
~3.5k tokens
SKILL.md length
1,454 words
Files
2 (incl. references)
Skills in repo
251
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses when users create, generate, or validate Salesforce Custom Object metadata.

  • Works in 5 steps: Overview and Purpose → Syntactic Essentials (Tier 1) → Smart Defaults & Decision Logic (Tier 2) → …
  • Validate Salesforce Custom Object metadata
  • SKILL.md covers When to Use This Skill, Specification, 1. Overview and Purpose and 2. Syntactic Essentials (Tier 1), plus 4 more sections
  • Reaches soap.sforce.com

What it does

Platform Custom Object Generate is an agent skill from forcedotcom/sf-skills. Use when users create, generate, or validate Salesforce Custom Object metadata. Trigger on custom objects, .object files, sharing models, name fields, or validation rules — e.g. "create a custom object" — and deployment errors around sharing models and Master-Detail relationships. Also keep the object's <description current when its fields or validation rules change. Do NOT use for non-Custom-Object metadata (Apex, Flows, LWC, Permission Sets, Custom Metadata Types) or standard objects.

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/description-enrichment.md`).

It sits in Sales & Support, covering CRM management and Deployment. It works with Salesforce. The repository describes itself as: Salesforce's curated collection of agent skills for building applications. Optimized for Agentforce Vibes, compatible with all AI tools. The licence is Apache-2.0.

When your agent uses it

  • Validate Salesforce Custom Object metadata
  • Validation rules — e.g
  • Non-Custom-Object metadata (Apex
  • Permission Sets

Example prompts

  • “create a custom object”
  • “/platform-custom-object-generate”

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Overview and Purpose
  2. Syntactic Essentials (Tier 1)
  3. Smart Defaults & Decision Logic (Tier 2)
  4. Critical Constraints & Common Failures
  5. Verification Checklist

What it can do on your machine

Read from SKILL.md and the folder at commit e5164d9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are xml).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • soap.sforce.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Platform Custom Object Generate loads about 3.5k tokens when it runs, and up to ~5.5k if it reads all its reference files. Until then it costs about 131 tokens; SKILL.md has 1,454 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~131
When it runs · the whole SKILL.md, loaded when a task matches
~3.5k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from forcedotcom/sf-skills at commit e5164d9, republished under its Apache-2.0 licence (© forcedotcom). 1,454 words, ~3,504 tokens.

Download SKILL.mdSave it as .claude/skills/platform-custom-object-generate/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
platform-custom-object-generate
description
Use when users create, generate, or validate Salesforce Custom Object metadata. Trigger on custom objects, .object files, sharing models, name fields, or validation rules — e.g. "create a custom object" — and deployment errors around sharing models and Master-Detail relationships. Also keep the object's <description> current when its fields or validation rules change. Do NOT use for non-Custom-Object metadata (Apex, Flows, LWC, Permission Sets, Custom Metadata Types) or standard objects.
metadata.version
1.1
metadata.domains
Platform
metadata.minApiVersion
60.0

When to Use This Skill

Use this skill when you need to:

  • Create new custom objects
  • Generate custom object metadata XML
  • Configure object sharing and security settings
  • Set up object features and capabilities
  • Troubleshoot deployment errors related to custom objects
  • Add, update, or delete a field OR a validation rule on an existing object — any of these may make the object's <description> stale, so you must refresh it (propose + confirm). This applies equally to validation-rule changes, not just fields. See Section 3.B.

Specification

1. Overview and Purpose

This document defines the mandatory constraints for generating CustomObject metadata XML (.object-meta.xml file). The agent must verify these constraints before outputting XML to prevent Metadata API deployment errors.

File extension: .object-meta.xml

Description freshness — applies to EVERY object change, fields AND validation rules: Whenever you add, update, or delete a field or a validation rule on an object, the <description> may now be stale. Before finishing, refresh it per Section 3.B (propose, confirm with the user, write). A validation-rule change counts exactly like a field change — the change is not done until the description has been reconciled. This is easy to forget on validation-rule edits/deletes — don't.


2. Syntactic Essentials (Tier 1)

The following constraints must be true for the XML body to deploy successfully.

Note: The API Name (fullName) is NOT a tag; it is the filename (e.g., Vehicle__c.object-meta.xml).

Required Elements
ElementRequirementNotes
<label>RequiredSingular UI name
<pluralLabel>RequiredPlural UI name
<sharingModel>RequiredSee Sharing Model Rules below
<deploymentStatus>RequiredAlways set to Deployed
<nameField>RequiredPrimary record identifier (requires <label> and <type>)
<visibility>RequiredAlways set to Public
Sharing Model Rules

Default: Set <sharingModel> to ReadWrite.

Exception: If this object contains a Master-Detail relationship field, <sharingModel> MUST be ControlledByParent.

Decision Logic:

  • IF object has NO Master-Detail field → use ReadWrite
  • IF object has Master-Detail field → use ControlledByParent
  • IF a Master-Detail field is being added to an existing child object → that existing object's <sharingModel> must also be updated to ControlledByParent

INCORRECT — Will cause error: Cannot set sharingModel to ReadWrite on a CustomObject with a MasterDetail relationship field

xml
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
  <label>Order Line Item</label>
  <pluralLabel>Order Line Items</pluralLabel>
  <sharingModel>ReadWrite</sharingModel>  <!-- WRONG: Object has a M-D field -->
  <deploymentStatus>Deployed</deploymentStatus>
</CustomObject>

CORRECT:

xml
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
  <label>Order Line Item</label>
  <pluralLabel>Order Line Items</pluralLabel>
  <sharingModel>ControlledByParent</sharingModel>  <!-- CORRECT -->
  <deploymentStatus>Deployed</deploymentStatus>
</CustomObject>

3. Smart Defaults & Decision Logic (Tier 2)

The agent must choose which features to enable based on the object's intended use case.

A. The Name Field Decision
TypeWhen to UseAdditional Requirements
TextDefault for human-named entities (Projects, Locations, Teams)None
AutoNumberUse for transactions, logs, or IDs (Invoices, Requests, Tickets)Must include <displayFormat> (e.g., INV-{0000}) and <startingNumber>1</startingNumber>

Text Name Field Example:

xml
<nameField>
  <label>Project Name</label>
  <type>Text</type>
</nameField>

AutoNumber Name Field Example:

xml
<nameField>
  <label>Invoice Number</label>
  <type>AutoNumber</type>
  <displayFormat>INV-{0000}</displayFormat>
  <startingNumber>1</startingNumber>
</nameField>
B. Object Description (Enrichment)

<description>: Mandatory — every Custom Object MUST have one. It must read like human-written documentation, never a generic template ("Object used to track and manage...") or a metadata dump ("Contains 8 fields including Project_Name__c...").

Always compose an enriched description — when creating the object, and again on any change to it: adding, updating, or deleting a field or a validation rule (so it never goes stale). The change — field or validation rule — is never "done" until you've refreshed the object's description. This is not optional; do not ask whether to add a description.

Confirm per change — every time. Propose and confirm on each field/rule change separately. A previous "keep current" applies only to that one change; it is never standing permission to skip the proposal on a later change. Do not infer a preference from an earlier answer — re-propose and re-ask for every new change.

Compose the description (steps below). If the object already has one, use it as a strong signal — preserve the business context it carries (domain, team, intent the schema can't reveal) and fold the new field/rule in rather than discarding it.

Then branch on whether a description already exists:

  • No existing description (brand-new object): there is nothing to overwrite — just write the composed description. Do not prompt.

  • An existing description (update, delete, or any re-enrichment): never overwrite it silently — you can't tell from the file whether it was hand-written by an admin or generated earlier. Show the proposal, ask, and STOP — wait for the user's reply before writing:

    Proposed description for {Object}: <the enriched description> Current: <the existing description> Use this? (yes / keep current / edit)

    You MUST NOT write the <description> until the user replies — showing the diff is not approval, even when the change looks obvious or minor. Then act: yes → write the proposed text · keep current → leave the existing one untouched (this applies to this change only — re-propose on the next one) · edit → use the user's wording.

Always end with a <description> written.

Composing the description:

  1. Classify each field by how it appears in the description:
    • Constrained (required, unique, externalId, restricted picklist) → selective parenthetical: VIN (required, external ID), Color (Red/Green only)
    • Behavioral (formula, roll-up) → describe what it computes: "the Age Years field auto-calculates vehicle age"
    • Relationship (master-detail, lookup) → woven context: "as a child of Account" (never "(Master-Detail to Account)")
    • Standard → label only
  2. Compose in this order, using field labels not API names:

    Purpose → key fields → computed fields → validation rules (as business rules) → "Commonly used for {use cases}."

  3. Count and trim before writing (required): count the words; aim ~45, hard ceiling 50. If over, tighten wording first, then drop whole sentences in priority order (use cases → rules → computed; never drop sentences 1–2). Recount. Do not write until ≤ 50.

Example (Car, 46 words):

xml
<description>The Car object tracks vehicle inventory and maintenance. It captures Year, VIN (required, external ID), Color (Red/Green only), and Location; the Age Years field auto-calculates vehicle age. VIN is required and Black cars cannot be sold. Commonly used for fleet management, inventory tracking, and service scheduling.</description>

→ For the full workflow and examples, read references/description-enrichment.md.

Show full SKILL.md (571 more words)Show less
C. Junction Object Naming

If the object is a many-to-many link between two parents, name the object by combining the two parent entities to ensure the schema remains intuitive.

Examples:

  • Position_Candidate__c (links Position and Candidate)
  • Job_Application__c (links Job and Application)
D. Feature Enablement (Clean XML)

To maintain "Clean XML," only include optional tags when deviating from the Salesforce platform default of false.

Scenario A: User-Facing Objects (Apps, Trackers, Business Entities)

  • Trigger: The object is intended for direct user interaction
  • Action: Set <enableSearch>, <enableReports>, <enableActivities>, and <enableHistory> to true

Scenario B: System-Facing Objects (Junctions, Background Logs)

  • Trigger: The object exists for technical associations or background data
  • Action: Omit these tags to keep the UI clean and the XML lean

4. Critical Constraints & Common Failures

Reserved Words

Never use reserved words as API names for Custom Objects or Custom Fields:

CategoryReserved Words (Do Not Use as API Names)
SOQL/SQLSelect, From, Where, Limit, Order, Group
SystemUser, External, View, Type
TemporalDate, Number
Relationship Cap

Do not create more than 2 Master-Detail relationships for a single object. If a third relationship is required, use a Lookup instead.

XML Root Element

Do NOT include the <fullName> tag at the root of the .object-meta.xml file. The API name is derived from the filename.

INCORRECT:

xml
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
  <fullName>Vehicle__c</fullName>  <!-- WRONG: Remove this -->
  <label>Vehicle</label>
</CustomObject>

CORRECT:

xml
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
  <label>Vehicle</label>
  <!-- fullName comes from filename: Vehicle__c.object-meta.xml -->
</CustomObject>
Validation Rule Naming Convention

Validation rule names follow different conventions than custom fields.

Rules:

  • Must contain only alphanumeric characters and underscores
  • Must begin with a letter
  • Cannot end with an underscore
  • Cannot contain two consecutive underscores
  • Must NOT end with __c (unlike custom fields)

INCORRECT:

xml
<validationRules>
  <fullName>Require_Start_Date__c</fullName>  <!-- WRONG: Has __c suffix -->
  <active>true</active>
  <errorMessage>Start Date is required.</errorMessage>
  <formula>ISBLANK(Start_Date__c)</formula>
</validationRules>

Error: The validation name can only contain alphanumeric characters, must begin with a letter, cannot end with an underscore...

CORRECT:

xml
<validationRules>
  <fullName>Require_Start_Date</fullName>  <!-- CORRECT: No __c suffix -->
  <active>true</active>
  <errorMessage>Start Date is required.</errorMessage>
  <formula>ISBLANK(Start_Date__c)</formula>
</validationRules>

Naming Pattern Reference:

Metadata TypeNaming PatternExample
Custom FieldsEnds with __cStart_Date__c
Validation RulesNo suffixRequire_Start_Date
Custom ObjectsEnds with __cVehicle__c

5. Verification Checklist

Before generating the Custom Object XML, verify:

Syntactic Checks
  • Are both <label> and <pluralLabel> present?
  • Is <deploymentStatus> set to Deployed?
  • Is <visibility> set to Public?
  • Does <nameField> include both <label> and <type>?
  • If <type> is AutoNumber, are <displayFormat> and <startingNumber> included?
Sharing Model Check (Critical)
  • Does this object have a Master-Detail relationship field?
    • If YES → <sharingModel> MUST be ControlledByParent
    • If NO → <sharingModel> should be ReadWrite
Constraint Checks
  • Is the API name free of reserved words?
  • Are there 2 or fewer Master-Detail relationships?
  • Is <fullName> absent from the XML root?
Validation Rule Checks (if applicable)
  • Do validation rule names NOT end with __c?
  • Do validation rule names follow alphanumeric + underscore pattern?
Description Enrichment Quality Checks
  • Opens with "The {Object} object..." + business purpose (not "Object used to track and manage...")
  • Uses field labels, never API names; no "Contains N fields including" dump
  • Formulas/rollups described by behavior; validations stated as business rules; relationships as context
  • Includes common use cases ("Commonly used for...") and is under 50 words
  • Folded any current description's business context into the proposed one (didn't discard it)
  • For an existing description (update/delete/re-enrich), STOPPED and waited for the user's reply before writing — did not treat showing the diff as approval
Architectural Checks
  • Is <description> present? (Enriched per Section B — proposed and confirmed with the user before writing.)
  • Are <enableSearch> and <enableReports> set to true if user-facing?
  • Does the filename match the intended API name?

Reference File Index

FileWhen to read
references/description-enrichment.mdComposing or refreshing an object's <description> (on create, or when a field/rule changes) — full enrichment workflow, field-prioritization tiers, junction/child handling, edge cases, and more examples

© forcedotcom, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in skills/platform-custom-object-generate of forcedotcom/sf-skills.

  • SKILL.md
  • references/description-enrichment.md

Open the folder on GitHubat commit e5164d9

Compare with similar skills

Platform Custom Object Generate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Platform Custom Object Generate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Platform Custom Object Generate this skillforcedotcom/sf-skills1.1k—~3.5kAutomated safety check: PassApache-2.0
Salesforce Deploy Integrationjeremylongshore/tons-of-skills-marketplace2.8k—~1.1kAutomated safety check: PassMIT
Salesforce Prod Checklistjeremylongshore/tons-of-skills-marketplace2.8k—~1.1kAutomated safety check: PassMIT
Soql Lib Query Builderbeyond-the-cloud-dev/soql-lib154—~4.3kAutomated safety check: PassMIT
Sf DatacloudJaganpro/sf-skills424—~2.7kAutomated safety check: PassMIT
Soql Lib Selectorbeyond-the-cloud-dev/soql-lib154—~2kAutomated safety check: PassMIT

Similar skills

  • Salesforce Deploy Integration

    jeremylongshore/tons-of-skills-marketplace

    Deploy a Salesforce-connected application through immutable artifacts, environment binding, canary traffic, reconciliation, and rollback.

    2.8k GitHub stars~1.1k tokensUpdated today
    Sales & SupportAuto-check passed
  • Salesforce Prod Checklist

    jeremylongshore/tons-of-skills-marketplace

    Gate a Salesforce integration or metadata change for production with contract, security, capacity, validation, canary, reconciliation, and rollback evidence.

    2.8k GitHub stars~1.1k tokensUpdated today
    Sales & SupportAuto-check passed
  • Soql Lib Query Builder

    beyond-the-cloud-dev/soql-lib

    Builds Salesforce SOQL queries using the SOQL Lib fluent builder API (SOQL.cls).

    154 GitHub stars~4.3k tokensUpdated 4 days ago
    Sales & SupportAuto-check passed
  • Sf Datacloud

    Jaganpro/sf-skills

    Salesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows.

    424 GitHub stars~2.7k tokensUpdated 5 mo ago
    Sales & SupportAuto-check passed
  • Soql Lib Selector

    beyond-the-cloud-dev/soql-lib

    Creates Salesforce Apex selector classes using the SOQL Lib selector pattern.

    154 GitHub stars~2k tokensUpdated 4 days ago
    Sales & SupportAuto-check passed
  • Dev Setup

    Portwood-Global-Solutions/Portwood

    Get from a fresh clone of Portwood to a working, fully-tested Salesforce org.

    125 GitHub stars~1.1k tokensUpdated today
    Sales & SupportAuto-check passed

More from forcedotcom/sf-skills

All 251 skills in this repo
  • Agentforce Architecture Analyze

    forcedotcom/sf-skills

    Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA plugins.

    1.1k GitHub stars~4.5k tokensUpdated today
    Auto-check passed
  • Agentforce D360 Analyze

    forcedotcom/sf-skills

    Data Cloud 360° view of a single Agentforce session. An agent skill from forcedotcom/sf-skills.

    1.1k GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Apply a Salesforce sandbox post-copy automation JSON config against a target org.

    1.1k GitHub stars~5.3k tokensUpdated today
    Auto-check: notes
  • Apply a Salesforce sandbox post-copy automation JSON config against a target org.

    1.1k GitHub stars~5.4k tokensUpdated today
    Auto-check: notes
  • Design Systems Slds Apply

    forcedotcom/sf-skills

    Apply SLDS-compliant UI using the correct blueprints, styling hooks, utility classes, and icons.

    1.1k GitHub stars~3.7k tokensUpdated today
    Auto-check passed
  • Experience Lwc Generate

    forcedotcom/sf-skills

    Lightning Web Components with PICKLES methodology and 165-point scoring.

    1.1k GitHub stars~2.4k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Platform Custom Object Generate

What does Platform Custom Object Generate do?

A skill your agent uses when users create, generate, or validate Salesforce Custom Object metadata. Platform Custom Object Generate is an agent skill from forcedotcom/sf-skills. Use when users create, generate, or validate Salesforce Custom Object metadata.

When should I use Platform Custom Object Generate?

Platform Custom Object Generate fits situations like: validate Salesforce Custom Object metadata; validation rules — e.g; non-Custom-Object metadata (Apex; permission Sets.

How do I install Platform Custom Object Generate in Claude Code?

Run `npx skills add forcedotcom/sf-skills --skill platform-custom-object-generate -a claude-code`. Or copy the skill folder (skills/platform-custom-object-generate in forcedotcom/sf-skills) into .claude/skills/platform-custom-object-generate in your project. Claude Code loads it when a task matches its description.

How do I install Platform Custom Object Generate in Codex?

Run `npx skills add forcedotcom/sf-skills --skill platform-custom-object-generate -a codex`. Or copy the skill folder (skills/platform-custom-object-generate in forcedotcom/sf-skills) into .agents/skills/platform-custom-object-generate in your project. Codex loads it when a task matches its description.

Can I use Platform Custom Object Generate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add forcedotcom/sf-skills --skill platform-custom-object-generate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/platform-custom-object-generate, .gemini/skills/platform-custom-object-generate, .github/skills/platform-custom-object-generate and .opencode/skills/platform-custom-object-generate in your project.

What does Platform Custom Object Generate need to run?

SKILL.md names no scripts, command-line tools or credentials: Platform Custom Object Generate is instructions for the agent only.

Does Platform Custom Object Generate access the network?

SKILL.md names 1 domain. In commands or code: soap.sforce.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Platform Custom Object Generate safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Platform Custom Object Generate use?

Platform Custom Object Generate is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Platform Custom Object Generate use?

About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.9k tokens, read only when the agent opens those files.

What are the alternatives to Platform Custom Object Generate?

Skills that share tags, products or a category with Platform Custom Object Generate: Salesforce Deploy Integration (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Salesforce Prod Checklist (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Soql Lib Query Builder (beyond-the-cloud-dev/soql-lib, 154 stars) and Sf Datacloud (Jaganpro/sf-skills, 424 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Platform Custom Object Generate?

forcedotcom (a GitHub organization) maintains it in forcedotcom/sf-skills, which has 1,060 GitHub stars. The repository holds 251 skills in this directory. The repository was last updated on October 7, 2026.

Source: forcedotcom/sf-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.