Copyright © 2026 Made by Windmill, LLC.
Review your app’s UI copy.
String Into Action is a native macOS dev tool for finding and reviewing user-facing text in apps and web projects. It presents each string alongside its source context, lets you edit in place, and remembers exactly what you approved.
All local. String Into Action has no network features, analytics, accounts, or third-party runtime dependencies.
- Add projects from the open panel or by dragging them from Finder, then switch between them from a compact project sidebar.
- Browse matches by folder and file.
- Review each string with its source location and surrounding code.
- Approve one string or hold Option to approve the current file.
- Mark false positives as Not User-Facing.
- Automatically return changed text to the Review queue.
- Remember approvals and ignored matches without modifying the reviewed project.
- Uses an Xcode project’s app icon in the project sidebar when one is available.
String Into Action scans:
| Project type | Files |
|---|---|
| Apple platforms | Swift, Objective-C, .strings, .xcstrings, storyboards, and XIBs |
| Web | JavaScript, JSX, TypeScript, TSX, HTML, Vue, and Svelte |
| Localization | Translation-oriented JSON files |
The scanner uses practical heuristics to favor useful review candidates. It skips common dependency/build folders, comments, logs and print statements, resource identifiers, image names, standard macOS main-menu strings, one-word literals, and other code-shaped values.
- Open a project folder with File → Open Project, or just drag it into the sidebar.
- Select a string in the Review queue.
- Read it in context and edit it if needed.
- Approve it, or mark it Not User-Facing.
- Refresh after source changes. Newly discovered and changed text returns to Review.
Approved and ignored strings remain available from their respective filters. The All filter shows every discovered string.
| Action | Shortcut |
|---|---|
| Open a project | ⌘O |
| Refresh strings | ⌘R |
| Focus the string editor | ⌘E |
| Approve | Return |
| Approve while editing | ⌘Return |
| Approve all queued strings in the file | Hold ⌥ and choose Approve All in File |
| Approve all in the file with the keyboard | ⌥Return, or ⌘⌥Return while editing |
| Mark Not User-Facing | ⇧⌘I |
Project history and sidebar preferences use UserDefaults. Review decisions are human-readable JSON files stored in:
~/Library/Application Support/StringIntoAction/Reviews/
Each project gets a separate file named from a SHA-256 hash of its standardized path. Strings have persistent IDs, and approvals store a fingerprint of the exact literal content. After a scan, the app matches strings within the same file using their code structure, content, and, for duplicates, nearby code. Line numbers are used for identity only when the entire file is unchanged.
Inserting lines above a uniquely identifiable string or changing its indentation preserves its approval. A matched string whose text changes returns as Changed. Ignored strings also survive line shifts, but changed text returns to Review.
Important
Matching is conservative and heuristic. Indistinguishable duplicates, file renames, changes to surrounding code, or major refactors may require reviewing strings again.
Review files use a versioned schema and store matching fingerprints, not source text. On the first conversion from the older line-based format, the original JSON is preserved beside the review file with a .v1-backup extension. Only unique approvals whose exact text and location still match are migrated. Older ignored matches and other unmatched entries require review again because the old format lacks the context needed to match them safely. Old records remain in storage but do not apply to new IDs.
The reviewed project is never changed unless you explicitly save a supported text edit.
Before writing, String Into Action verifies that the source file has not changed since it was scanned and that the original literal still occupies the expected range. Writes are atomic and preserve supported escaping and source encoding.
Complex Swift literals, interpolation, tagged JavaScript templates, unfamiliar escapes or HTML entities, and String Catalog keys can be reviewed but may be read-only. String Catalog scanning currently reviews source keys rather than translated values. UTF-8 source and BOM-marked UTF-16 .strings files are supported.
Symlinks are not followed. Files of 2 MB or larger and common dependency/build directories are skipped.
- macOS 14 or later
- Xcode 16 or later for development
Open StringIntoAction.xcodeproj in Xcode and run the StringIntoAction scheme, or build from Terminal:
xcodebuild \
-project StringIntoAction.xcodeproj \
-scheme StringIntoAction \
-destination 'platform=macOS' \
buildRun the complete test suite with:
xcodebuild \
-project StringIntoAction.xcodeproj \
-scheme StringIntoAction \
-destination 'platform=macOS' \
testCore scanner, editor, persistence, and model tests can also run through Swift Package Manager:
swift testIssues and human-generated pull requests are welcome. Please include regression coverage for scanner, persistence, or editing changes and run the test suite before opening a pull request.
