agentsclimarketplace

Ios secrets setup

Skill patrickserrano/lacquer/profiles/ios/skills/ios-secrets-setup

Use when wiring a new app-runtime service key (RevenueCat, Aptabase, …) into a project — setting up `Secrets.xcconfig`, surfacing a key through `project.yml` into `Info.plist`, and reading it at runtime. Distinct from CI/server secrets, which live in GitHub Actions secrets and never touch an xcconfig — see the project's `CLAUDE.md` Secrets section for that split.From its SKILL.md

Install
npx -y skills add patrickserrano/lacquer --skill ios-secrets-setup

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • reads credentialsReads from 1 credential source: `Secrets.xcconfig`.
  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 1 command, including `cp Secrets.xcconfig.example Secrets.xcconfig`.

SKILL.md

2.6 KB, 582 tokens by cl100k_base, as published. Nobody here has run it

iOS App-Runtime Secrets Setup

App-runtime keys (RevenueCat, Aptabase, …) live in a gitignored Secrets.xcconfig, never in source or the committed project.yml. The lacquer syncs a Secrets.xcconfig.example template into the component dir.

  1. Copy & ignore: cp Secrets.xcconfig.example Secrets.xcconfig, fill in real values, and add Secrets.xcconfig to .gitignore. The example is committed; the real file never is. (The committed project.yml must also stay key-free.)
  2. Wire into the build (project.yml): point the target's configs at the xcconfig and surface each key into Info.plist:
    targets:
      <App>:
        configFiles:
          Debug: Secrets.xcconfig
          Release: Secrets.xcconfig
        info:
          path: App/Info.plist
          properties:
            REVENUECAT_API_KEY: $(REVENUECAT_API_KEY)
            APTABASE_APP_KEY: $(APTABASE_APP_KEY)
    
  3. Read at runtime from the Info dictionary — fail loud if a required key is blank rather than shipping a broken SDK init:
    enum Secrets {
        static func required(_ key: String) -> String {
            guard let v = Bundle.main.object(forInfoDictionaryKey: key) as? String,
                  !v.isEmpty else {
                fatalError("Missing \(key) — copy Secrets.xcconfig.example to Secrets.xcconfig and fill it in")
            }
            return v
        }
        static var revenueCatAPIKey: String { required("REVENUECAT_API_KEY") }
        static var aptabaseAppKey: String { required("APTABASE_APP_KEY") }
    }
    

Secrets.xcconfig values are build-time — they are baked into the binary, so treat them as obfuscated, not secret. A truly sensitive secret belongs on a server, never in the app.

RevenueCat ships two different keys — do not confuse them. The REVENUECAT_API_KEY above is the public SDK key (appl_…), safe to compile into the app. RevenueCat's REST API uses a separate secret key (sk_…) that grants full account access — it must never go in Secrets.xcconfig or the binary. That's a CI/server secret (REVENUECAT_REST_API_KEY), set via gh secret set per the project's CLAUDE.md Secrets section.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.