Official agent skill

Implementing iOS Code

by bitwarden in bitwarden/ios

Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS.

OfficialGPL-3.0Auto-check passedMobile

Install Implementing iOS Code

skills CLI
$ npx skills add bitwarden/ios --skill implementing-ios-code -a claude-code

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

GitHub CLI
$ gh skill install bitwarden/ios implementing-ios-code --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/bitwarden/ios.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/implementing-ios-code .claude/skills/implementing-ios-code && 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
implementing-ios-code
GitHub stars
694
Token cost
~1.9k tokens
SKILL.md length
893 words
Files
2
Skills in repo
11
Repo updated
First seen
Licence
GPL-3.0

At a glance

Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS.

  • Works in 7 steps: Determine Scope → Core Layer First → UI Layer (File-Set Pattern) → …
  • Asked to implement
  • SKILL.md covers Prerequisites, Step 1: Determine Scope, Step 2: Core Layer First and Step 3: UI Layer (File-Set…, plus 5 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Implementing iOS Code is an agent skill from bitwarden/ios, published by the product's own GitHub organization. Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS. Use when asked to "implement", "write code", "add screen", "create feature", "new view", "new processor", "add service", or when translating a design doc into actual Swift code.

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `templates.md`).

It sits in Mobile, covering iOS development, Architecture decision records and Translation. It works with iOS. The repository describes itself as: Bitwarden mobile apps (Password Manager and Authenticator) for iOS. The licence is GPL-3.0.

When your agent uses it

  • Asked to implement
  • Translating a design doc into actual Swift code

Example prompts

  • “implement”
  • “write code”
  • “add screen”
  • “/implementing-ios-code”

Workflow steps

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

  1. Determine Scope
  2. Core Layer First
  3. UI Layer (File-Set Pattern)
  4. Wire Dependency Injection
  5. Security Check
  6. Documentation
  7. Verify — Lint, Format, and Regenerate

What it can do on your machine

Read from SKILL.md and the folder at commit 59bbfb3. 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 bash).

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

  • Network

    No URLs in SKILL.md.

    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

Implementing iOS Code loads about 1.9k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 893 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~82
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

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 bitwarden/ios at commit 59bbfb3, republished under its GPL-3.0 licence (© bitwarden). 893 words, ~1,900 tokens.

Download SKILL.mdSave it as .claude/skills/implementing-ios-code/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
implementing-ios-code
description
Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS. Use when asked to "implement", "write code", "add screen", "create feature", "new view", "new processor", "add service", or when translating a design doc into actual Swift code.

Implementing iOS Code

Use this skill to implement Bitwarden iOS features following established patterns.

Prerequisites

  • A plan should exist in .claude/outputs/plans/<ticket-id>.md. If not, invoke planning-ios-implementation first.
  • Read Docs/Architecture.md — it is the authoritative source for all patterns. This skill references it, not replaces it.

Step 1: Determine Scope

From the plan, identify:

  • Is this a new feature (full file-set) or modification of existing code?
  • Which framework: BitwardenShared, AuthenticatorShared, or BitwardenKit?
  • Which domain: Auth/, Autofill/, Platform/, Tools/, Vault/?

See templates.md for file-set skeletons.

Step 2: Core Layer First

Implement from the bottom up:

Data Models (if needed)

  • Request/Response types in Core/<Domain>/Models/Request/ and Response/
    • Alphabetize stored properties and initializer parameters (parameters with default values go last). When you add one to an existing type, insert it at its alphabetical position and update the synthesized initializer and every call site to match — don't append.
  • Enum types in Core/<Domain>/Models/Enum/
    • Keep cases alphabetical. When you add a case to an existing enum, insert it at its alphabetical position in every switch over that enum (across all layers) rather than appending it — match the surrounding order.

Persistence (if needed)

  • Vault sync data → CoreData via DataStore (add entities to Bitwarden.xcdatamodeld)
  • Non-sensitive settings → AppSettingsStore (backed by UserDefaults)
  • Credentials/keys → KeychainRepository
  • All three are exposed through StateService. Prefer adding a separate protocol over extending StateService, AppSettingsStore, or KeychainRepository directly, to maintain interface segregation.

Services / Repositories

  • Define protocol with // sourcery: AutoMockable
  • Implement Default<Name>Service / Default<Name>Repository
  • Add Has<Name> protocol
  • See templates.md for service skeleton

Step 3: UI Layer (File-Set Pattern)

For new screens, create all required files together (see templates.md):

  1. Route — Add case to the parent Coordinator's route enum
  2. Coordinator — Navigation logic, screen instantiation, Services typealias
  3. State — Value type (struct) holding all view-observable data
  4. Action — Enum of user interactions handled synchronously in receive(_:)
  5. Effect — Enum of async work handled in perform(_:)
  6. Processor — StateProcessor subclass, business logic only
  7. View — SwiftUI view using store.binding, store.perform, @ObservedObject

SwiftUI previews:

  • Use #Preview macros for new views — the modern default across the codebase. Do not add new PreviewProvider structs. Because the snapshot harness cannot enumerate #Preview macros, such a view's snapshot coverage comes from a test that instantiates the view directly; see the testing-ios-code skill for how to choose between that and iterating PreviewProvider._allPreviews when a view exposes both.

New localization keys (BitwardenResources/.../Localizable.strings):

  • Key name mirrors the English string: Archive for "Archive", not MoveToArchive or ArchiveTitle.
    • Exception: long descriptive strings (~70-80+ chars) use a DescriptionLong suffix on a shortened opening phrase. Example: PassphrasesAreOftenEasierToRememberDescriptionLong.
  • Translator-facing /* … */ comments describe meaning, placement, or constraints that affect translation — translators are the audience, not internal engineers.

Step 4: Wire Dependency Injection

After creating a new service/repository:

  • Add Has<Name> conformance to ServiceContainer via extension
  • Add Has<Name> to the Services typealias of any processor that needs it

Step 5: Security Check

Before finishing:

  • Vault data? → Must use BitwardenSdk for all encryption/decryption
  • Storing credentials? → Must use KeychainRepository, not AppSettingsStore
  • User input? → Must validate via InputValidator
  • Surfacing errors? → Sensitive errors must implement NonLoggableError
  • Running in an extension? → Check Argon2id memory if KDF is involved

Step 6: Documentation

All new public types and methods require DocC (///) documentation. Exceptions: protocol property/function implementations (docs live in the protocol), mock classes. Use pragma marks to organize code. // MARK: - is used to denote different objects in the same file; // MARK: is used to denote different sections within an object.

Show full SKILL.md (341 more words)Show less

Step 7: Verify — Lint, Format, and Regenerate

Run these checks after all code and tests are written, before handing back. Fix every violation found — do not leave warnings for the commit phase.

If new localization strings were added, regenerate first so SwiftGen picks them up:

bash
mint run swiftgen config run --config swiftgen-bwr.yml   # BitwardenResources (most common)
# Run the appropriate swiftgen-*.yml if strings landed in a different target

Then run the pre-commit checks:

bash
./Scripts/pre-commit

This runs spell-check, SwiftFormat, and SwiftLint on changed files — the same checks that run at commit time. If violations are reported, fix them and re-run until it passes cleanly.

For SwiftLint violations that require manual fixes, prefer fixing the root cause over suppressing with // swiftlint:disable comments. Suppression is appropriate when the violation is structural and fixing it would require an artificial or non-idiomatic refactor. Common cases:

  • line_length — wrap long lines using Xcode's ⌃M style (each argument on its own indented line); fix rather than suppress
  • file_length — if a #if DEBUG preview section pushed a file over the limit, add // swiftlint:disable file_length at the top of the file (this is the established pattern — do NOT move previews to a separate file)
  • type_body_length — split large types using // MARK: extensions in separate files if needed; suppress only if the type is inherently large and splitting would hurt readability

Only hand back once ./Scripts/pre-commit passes cleanly for files touched in this session.

Conventions

  • Member ordering — within a // MARK: section, keep members in a single alphabetical order (stored properties, computed properties, methods, and static members share that order), and alphabetize function and initializer parameters the same way (default-valued, variadic, then trailing-closure parameters last). Insert new members and parameters at their alphabetical position rather than appending. Exceptions: UI objects (views, view modifiers) follow visual layout order, not alphabetical; and protocol conformance ordering is not enforced.
  • No file-scope globals — prefer a static member on the relevant type or extension over a file-scope global function or property, even a private one.
  • Prefer typed over stringly-typed — model values with their natural types (enums, Date, etc.) rather than raw strings, unless deliberately mirroring an external contract (e.g. an SDK model that stores ISO date strings) where typed conversion is intentionally deferred.

© bitwarden, GPL-3.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 in .claude/skills/implementing-ios-code of bitwarden/ios.

  • SKILL.md
  • templates.md

Open the folder on GitHubat commit 59bbfb3

Compare with similar skills

Implementing iOS Code 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.

Implementing iOS Code compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Implementing iOS Code this skillbitwarden/ios694—~1.9kAutomated safety check: PassGPL-3.0
Apple Crash Log .NET Symbolicationdotnet/skills5.6k1 repos~2.4kAutomated safety check: PassMIT
iOS Memgraph Analysisdpearson2699/swift-ios-skills1.2k—~2.4kAutomated safety check: PassCustom licence
iOS Reviewplayer-ui/player101—~1.6kAutomated safety check: PassMIT
Releasevaayne/mori303—~1.2kAutomated safety check: PassMIT
Anishelf Releasesamuelhe52/AniShelf140—~2kAutomated safety check: PassApache-2.0

Similar skills

  • Official

    Resolves .NET runtime frames in Apple .ips crash logs to function names, source files and line numbers using dSYM symbols, atos and the Microsoft symbol server.

    5.6k GitHub starsUsed in 1 repo~2.4k tokens
    MobileAuto-check passed
  • iOS Memgraph Analysis

    dpearson2699/swift-ios-skills

    A skill your agent uses when capturing or analyzing an iOS .memgraph, especially when the task mentions a memory leak, heap growth, persistent memory increase, ownership path, or matched-capture…

    1.2k GitHub stars~2.4k tokensUpdated 2 mo ago
    MobileAuto-check passed
  • iOS Review

    player-ui/player

    Review Swift/iOS code against team conventions. An agent skill from player-ui/player.

    101 GitHub stars~1.6k tokensUpdated today
    MobileAuto-check passed
  • Release

    vaayne/mori

    Release workflow for Mori macOS workspace terminal and MoriRemote iOS app.

    303 GitHub stars~1.2k tokensUpdated 2 mo ago
    MobileAuto-check passed
  • Anishelf Release

    samuelhe52/AniShelf

    Prepare and publish AniShelf source-control releases through validation, release commits, annotated tags, and the main-to-release pull request.

    140 GitHub stars~2k tokensUpdated today
    MobileAuto-check passed
  • Swift Expert

    Jeffallan/claude-skills

    Builds Swift apps for Apple platforms with SwiftUI, protocol-oriented design, async/await, actors and Sendable checks, verified with swift build and swift test.

    12k GitHub stars~1.5k tokensUpdated 4 days ago
    MobileAuto-check passed

More from bitwarden/ios

All 11 skills in this repo
  • Testing iOS Code

    bitwarden/ios

    Official

    Write tests, add test coverage, unit test, or add missing tests for Bitwarden iOS.

    694 GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Official

    Build the Bitwarden iOS app, capture all compiler and lint warnings, categorize them into Swift 6 concurrency vs actionable, and interactively fix the actionable ones.

    694 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Build Test Verify

    bitwarden/ios

    Official

    Build the project, run tests, lint, format, spell check, generate mocks, or verify the build passes for Bitwarden iOS.

    694 GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • Official

    Convert a hand-written bespoke mock to a Sourcery AutoMockable-generated mock.

    694 GitHub stars~3.5k tokensUpdated today
    Auto-check passed
  • Official

    Evaluates a bitwarden/ios "Update SDK to" PR against the sdk-swift commit range for compile-time, runtime and serialization breaking changes, maps affected symbols to iOS call sites, and applies…

    694 GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Fixing Flaky Tests

    bitwarden/ios

    Official

    Diagnose and fix flaky (intermittently failing) tests in Bitwarden iOS.

    694 GitHub stars~2.3k tokensUpdated today
    Auto-check passed

Works with

Questions about Implementing iOS Code

What does Implementing iOS Code do?

Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS. Implementing iOS Code is an agent skill from bitwarden/ios, published by the product's own GitHub organization. Implement, write code, add a new screen, create a feature, new view, new processor, or wire up a new service in Bitwarden iOS.

When should I use Implementing iOS Code?

Implementing iOS Code fits situations like: asked to implement; translating a design doc into actual Swift code.

How do I install Implementing iOS Code in Claude Code?

Run `npx skills add bitwarden/ios --skill implementing-ios-code -a claude-code`. Or copy the skill folder (.claude/skills/implementing-ios-code in bitwarden/ios) into .claude/skills/implementing-ios-code in your project. Claude Code loads it when a task matches its description.

How do I install Implementing iOS Code in Codex?

Run `npx skills add bitwarden/ios --skill implementing-ios-code -a codex`. Or copy the skill folder (.claude/skills/implementing-ios-code in bitwarden/ios) into .agents/skills/implementing-ios-code in your project. Codex loads it when a task matches its description.

Can I use Implementing iOS Code 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 bitwarden/ios --skill implementing-ios-code -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/implementing-ios-code, .gemini/skills/implementing-ios-code, .github/skills/implementing-ios-code and .opencode/skills/implementing-ios-code in your project.

What does Implementing iOS Code need to run?

SKILL.md names no scripts, command-line tools or credentials: Implementing iOS Code is instructions for the agent only.

Does Implementing iOS Code access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Implementing iOS Code 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 Implementing iOS Code use?

Implementing iOS Code is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Implementing iOS Code use?

About 1.9k tokens (SKILL.md is roughly 7.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Implementing iOS Code?

Skills that share tags, products or a category with Implementing iOS Code: Apple Crash Log .NET Symbolication (dotnet/skills, 5.6k stars), iOS Memgraph Analysis (dpearson2699/swift-ios-skills, 1.2k stars), iOS Review (player-ui/player, 101 stars) and Release (vaayne/mori, 303 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Implementing iOS Code?

bitwarden (a GitHub organization, an official publisher) maintains it in bitwarden/ios, which has 694 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 6, 2026.

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