CLAUDE LABJP
MCP — Support for the 2026-07-28 spec is rolling out across Claude. The protocol moves from bidirectional and stateful to request/response, so MCP servers can now live on serverless and edge infrastructureEXTENSIONS — Three official extensions have landed: MCP Apps for server-rendered UI, Tasks for async and long-running work, and Enterprise Managed Auth for IdP-based org-wide provisioningADOPTION — MCP passed 400 million monthly SDK downloads, roughly 4x growth this year, settling into its role as the standard way to connect agents to applicationsQUOTA — Today, August 19, is the last day of the 50 percent weekly usage boost for Claude Code subscribers. If you have long agent runs queued, this is the windowPRICING — Claude Sonnet 5's introductory rate of $2 per million input tokens and $10 output ends August 31; standard pricing of $3 and $15 takes over on September 1, twelve days outFIX — A bug where MCP v2 connections endlessly reopened subscriptions against servers with fixed timeouts is resolved, and a forward_user_identity setting was added for user attributionMCP — Support for the 2026-07-28 spec is rolling out across Claude. The protocol moves from bidirectional and stateful to request/response, so MCP servers can now live on serverless and edge infrastructureEXTENSIONS — Three official extensions have landed: MCP Apps for server-rendered UI, Tasks for async and long-running work, and Enterprise Managed Auth for IdP-based org-wide provisioningADOPTION — MCP passed 400 million monthly SDK downloads, roughly 4x growth this year, settling into its role as the standard way to connect agents to applicationsQUOTA — Today, August 19, is the last day of the 50 percent weekly usage boost for Claude Code subscribers. If you have long agent runs queued, this is the windowPRICING — Claude Sonnet 5's introductory rate of $2 per million input tokens and $10 output ends August 31; standard pricing of $3 and $15 takes over on September 1, twelve days outFIX — A bug where MCP v2 connections endlessly reopened subscriptions against servers with fixed timeouts is resolved, and a forward_user_identity setting was added for user attribution
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 Store8Google 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 →