Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
forcedotcom avatar

Configuring Webapp Metadata

  • 4 installs
  • 787 repo stars
  • Updated August 5, 2026
  • forcedotcom/afv-library

Configures Salesforce WebApplication metadata, the webapplication.json file, bundle layout, meta XML, and build output directory.

About

Documents WebApplication bundle rules including folder layout, matching meta XML filename, build output directory, and webapplication.json settings. A developer uses it when configuring a Salesforce web app bundle's metadata structure.

  • Bundle must live under webapplications/<AppName>/ with matching meta XML
  • Build output defaults to dist/ unless overridden by webapplication.json.outputDir

Configuring Webapp Metadata by the numbers

  • 4 all-time installs (skills.sh)
  • Ranked #1,101 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/forcedotcom/afv-library --skill configuring-webapp-metadata

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs4
repo stars787
Last updatedAugust 5, 2026
Repositoryforcedotcom/afv-library

What it does

Configures Salesforce WebApplication metadata, the webapplication.json file, bundle layout, meta XML, and build output directory.

Files

SKILL.mdMarkdownGitHub ↗

WebApplication Requirements

Bundle Rules

  • A WebApplication bundle must live under webapplications/<AppName>/
  • The bundle must contain <AppName>.webapplication-meta.xml
  • The metadata filename must exactly match the folder name
  • A build output directory must exist and contain at least one file
  • Default build output directory: dist/
  • If webapplication.json.outputDir is set, it overrides dist/

Valid example:

webapplications/
  MyApp/
    MyApp.webapplication-meta.xml
    webapplication.json
    dist/
      index.html

Metadata XML

Required fields:

  • masterLabel
  • version (max 20 chars)
  • isActive (boolean)

Optional fields:

  • description (max 255 chars)

webapplication.json

webapplication.json is optional.

Allowed top-level keys only:

  • outputDir
  • routing
  • headers

File Constraints

  • Must be valid UTF-8 JSON
  • Max size: 100 KB
  • Root must be a non-empty object
  • Never allow {}, arrays, or primitives as the root

Path Safety

Applies to:

  • outputDir
  • routing.fallback

Reject:

  • backslashes
  • leading / or \
  • .. segments
  • null or control characters
  • globs: *, ?, **
  • %

All resolved paths must stay within the application bundle.

outputDir

  • Must be a non-empty string
  • Must reference a subdirectory only
  • Reject . and ./
  • The directory must exist in the bundle
  • The directory must contain at least one file

routing

  • If present, must be a non-empty object
  • Allowed keys only:
  • rewrites
  • redirects
  • fallback
  • trailingSlash
  • fileBasedRouting
routing.trailingSlash
  • Must be one of: "always", "never", "auto"
routing.fileBasedRouting
  • Must be a boolean
routing.fallback
  • Must be a non-empty string
  • Must satisfy Path Safety rules
  • Target file must exist
routing.rewrites
  • Must be a non-empty array
  • Each item must be a non-empty object
  • Allowed keys: route, rewrite
  • rewrite must be a non-empty string
  • route, if present, must be a non-empty string

Example:

{
  "routing": {
    "rewrites": [
      { "route": "/app/:path*", "rewrite": "/index.html" }
    ]
  }
}
routing.redirects
  • Must be a non-empty array
  • Each item must be a non-empty object
  • Allowed keys: route, redirect, statusCode
  • redirect must be a non-empty string
  • route, if present, must be a non-empty string
  • statusCode, if present, must be one of: 301, 302, 307, 308

Example:

{
  "routing": {
    "redirects": [
      { "route": "/old-page", "redirect": "/new-page", "statusCode": 301 }
    ]
  }
}

headers

  • If present, must be a non-empty array
  • Each item must be a non-empty object
  • Allowed keys: source, headers
  • headers must be a non-empty array

Each header entry must contain:

  • key: non-empty string
  • value: non-empty string

Example:

{
  "headers": [
    {
      "source": "/assets/**",
      "headers": [
        { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }
      ]
    }
  ]
}

Never Suggest

  • {} as the JSON root
  • "routing": {}
  • empty arrays
  • empty array items such as [{}]
  • "outputDir": "."
  • "outputDir": "./"

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.