CLAUDE LABJP
FORK — Claude Code 2.1.212 changes what /fork does: it copies your conversation into a new background session with its own row in claude agents, so you can keep working. The old in-session subagent is now /subtaskLIMITS — WebSearch calls are now capped at 200 per session by default, and subagent spawns get the same 200 ceiling, so a runaway search or delegation loop stops on its ownMCPBG — MCP tool calls running past two minutes now move to the background automatically, keeping the session usable. Tune the threshold with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSPLANFIX — Fixed plan mode auto-running file-modifying Bash commands such as touch and rm without a permission prompt or an SDK canUseTool callbackSONNET5 — Claude Sonnet 5 is running on introductory pricing of $2 per million input tokens and $10 per million output. After August 31 it moves to $3 and $15IPO — Bankers are reportedly lining up investor meetings for Anthropic ahead of a possible public listing as soon as OctoberFORK — Claude Code 2.1.212 changes what /fork does: it copies your conversation into a new background session with its own row in claude agents, so you can keep working. The old in-session subagent is now /subtaskLIMITS — WebSearch calls are now capped at 200 per session by default, and subagent spawns get the same 200 ceiling, so a runaway search or delegation loop stops on its ownMCPBG — MCP tool calls running past two minutes now move to the background automatically, keeping the session usable. Tune the threshold with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSPLANFIX — Fixed plan mode auto-running file-modifying Bash commands such as touch and rm without a permission prompt or an SDK canUseTool callbackSONNET5 — Claude Sonnet 5 is running on introductory pricing of $2 per million input tokens and $10 per million output. After August 31 it moves to $3 and $15IPO — Bankers are reportedly lining up investor meetings for Anthropic ahead of a possible public listing as soon as October
Articles/Cowork
Cowork/2026-05-30Advanced

Localizing an App Store Screenshot PSD into 15 Languages Overnight with Cowork

A work log of localizing the store screenshots for the Android wallpaper app 'Beautiful Wallpapers' into many languages with Cowork: extracting text with psd-tools, pouring translations into layer names, and the real walls I hit with Thai and Korean glyphs.

Cowork33psd-toolsLocalizationApp Store7Google Play2PhotoshopMultilingualASO2

Premium Article

The moment I opened the PSD from my designer, I froze. 1440x13333px, 220MB. It held the store screenshots for my Android wallpaper app "Beautiful Wallpapers," with Japanese headline copy scattered across five artboards. I wanted to expand it into at least ten, ideally fifteen languages — and I wanted to start swapping the store assets the next morning.

Translating and replacing the Photoshop text layers by hand would mean 5 boards x 15 languages, or 75 screens of copy-paste, where mix-ups are guaranteed. So I handed the PSD itself to Cowork and let it process the file mechanically.

Doing so, I ran straight into an obvious truth: fonts and glyphs are far more stubborn than translation. This is the log of that one night.

Why screenshot localization can be cleanly separated from making art

The first thing I settled in my own mind was where to draw the line on letting AI help. I make contemporary art alongside indie development, and I have consistently kept AI out of the artwork itself. Making things by hand carries meaning of its own, and I want to preserve that.

But putting a work or an app "out into the world" is a different job from making it. A store screenshot is not the substance of the wallpaper product; it is closer to the price tag or the point-of-sale display that puts it on the shelf. So screenshot layout and localization fall, without hesitation, into the designer work I am happy to delegate to AI.

Keeping creation and promotion consciously separate lets me make this call in an instant. When that line stays blurry, you end up relitigating "how far should I automate this?" on every single task.

Count what the PSD is made of, first

Before localizing, I need to know exactly what the PSD is built from. The Cowork environment can install the Python edition of psd-tools, so I opened the file and dumped its structure.

One caveat: pip in that environment is protected by PEP 668, so a plain install stops with externally-managed-environment. I covered that in When pip install stops with externally-managed-environment in Cowork's Bash, and reading it first will save you a detour.

from psd_tools import PSDImage
 
psd = PSDImage.open("screenshot.psd")
print(f"canvas: {psd.width} x {psd.height}")
 
for layer in psd.descendants():
    kind = layer.kind  # 'type' / 'pixel' / 'group', etc.
    if kind == "type":
        print(f"[text] {layer.name!r} @ {layer.bbox} -> {layer.text!r}")
    elif kind == "group":
        print(f"[group] {layer.name!r} children={len(list(layer))}")

The output showed that each of the five artboards was a group, with roughly 40 layers per board (two text streams: headline and description).

One thing mattered here: the PSD that had been sitting in my workspace and the uploaded one had different resolutions. The canonical file was the uploaded 1440x13333px, 220MB version, so I pinned the script to extract and render from that file. When you receive several copies, deciding which one is canonical exactly once, up front, saves you from rebuilds later.

If the PSD arrives through a cloud-synced folder, you can hit a stranger problem: bash claims the file does not exist while Finder shows it plainly. I wrote about that in Why Cowork's bash says "no such file" when Finder can see it. With a 220MB file, materialize it before you touch it.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Follow the full hands-on flow of taking a 1440x13333px, 220MB store PSD, counting its artboards and text layers mechanically with psd-tools, and pouring 15 languages into it
See working code for the mac_roman trap, where psd-tools fails to save non-ASCII layer names, and how writing the luni block directly resolves it
Take away an auto-shrink implementation for translations that overflow the canvas, plus a clear line for where automation should stop and hand back to a human
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Cowork2026-07-11
Make Your Nightly MCP Connectors' Health Visible — A Lightweight Ledger for Solo Operators
You don't need Enterprise connector observability to see your MCP connectors' error rate and latency. Append one line per tool call, roll it up weekly, and let regressions ring a bell. A working health ledger for anyone running scheduled tasks solo.
Cowork2026-07-02
How Many Tasks Fire in the Same Minute — Flattening Cowork Scheduled-Task Collisions from Cron
When Cowork scheduled tasks bunch up at the same time and fight over shared resources, you can expand every cron expression into fire times, count collisions and true concurrency, and shave the peak with a greedy offset that never moves your premium slots. With working code and measured before/after numbers.
Cowork2026-07-01
Let the Downstream Task Verify the Upstream Actually Ran Today: A Completion Ledger and Dependency Barrier for Unattended Schedulers
Unattended schedulers have no notion of dependencies, so when a morning data-refresh task fails silently, the noon generation task keeps running on yesterday's leftovers. This is a design for recording upstream completion atomically and having downstream assert its preconditions before running, with working TypeScript and lessons from my own operations.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →