Skip to content
work/pwa2play

pwa2play

LIVE

A Claude Code plugin that ships PWAs to the Play Store.

Packages a web app into a signed, Play-Store-ready Android bundle and bakes in the rules that get uploads rejected, so it passes review the first time.

Visit pwa2playDesign, build, docs.
3
Commands
1
Skill
2 lines
Install
MIT
License
The problem

Why it exists.

Wrapping a PWA for Android is a solved problem, but the default tools quietly set you up to fail and Google's rejection messages never say what actually went wrong, a wrong signing key, a stale target API, a missing asset-link fingerprint. I lost a weekend to it once, so I wrote everything I learned into a plugin that walks you past each trap before you hit it.

pwa2play is an open-source Claude Code plugin that turns a Progressive Web App into a Trusted Web Activity ready for the Google Play Store. It wraps Bubblewrap with a skill and three commands that walk the whole path, init, build, Digital Asset Links, and the first upload, and it carries the hard-won rules that usually cause rejections: reuse the signing key, put the app-signing fingerprint in assetlinks.json, bump the version code, and keep targeting the current API level. A companion script reads the real target API and version straight out of a built APK before you upload.

Architecture

How the pieces fit.

The whole system, end to end. Trace any node to see its role and connections.

architecture --interactive
Client
Edge / API
Data
External
Jobs

Hover or focus any node to trace its role and connections.

What's inside

Every surface, shipped.

01

Guided first release

The package command walks from Bubblewrap init to the first upload, stopping at each place people usually slip and refusing to skip the assetlinks fingerprint or the test track.

02

Safe updates

The update command keeps the original signing key and a rising version code, the two things that silently get an app update rejected, so shipping a new version is boring instead of scary.

03

Reads the real APK

A small script reports the package id, version code, target and min SDK straight from a built .apk, so you verify the actual bytes rather than trusting what the build tool printed.

04

The rejection rules, encoded

Key reuse, the app-signing SHA-256 in assetlinks.json, version-code bumps, current API level, and the personal-versus-organization testing path, written down once so nobody relearns them the hard way.

Hard decisions

The calls that mattered.

01

Encode the traps, not just the steps

problem · Anyone can copy the Bubblewrap commands; the real value is knowing what gets an upload rejected.

call · The skill leads with the five rules that actually cause rejections, and the command flows won't let you skip the assetlinks fingerprint or the test track, so the knowledge is enforced, not just documented.

02

Read the artifact, don't trust the tool

problem · Build tools report what they intended to produce, not what the file actually contains, and a stale target API is invisible until Google bounces it.

call · A companion script reads the target SDK and version code out of the built APK, so verification happens against the real bytes before anything is uploaded.

Stack
Claude Code pluginNode.jsBubblewrap / TWAadbkit-apkreaderGoogle Play Console
Outcome

An installable, open-source plugin that gets a PWA onto the Play Store the right way, published under my own marketplace and installable by anyone in two lines. The kind of small, sharp tool I like leaving behind for other builders.

Next case study

Sellnudge

open
Available now

Want one of these for your product?