<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TWA — Trusted Web Activity (PWA to Play Store)</title>
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{
font-family:system-ui,-apple-system,sans-serif;
background:#0a0a0f;
color:#e2e8f0;
padding:24px;
line-height:1.6;
}
.card{
background:rgba(255,255,255,0.03);
border:1px solid rgba(255,255,255,0.08);
border-radius:12px;
padding:28px;
max-width:720px;
margin:0 auto;
}
h1{
font-size:1.5rem;
font-weight:700;
margin-bottom:4px;
color:#fff;
}
.subtitle{
color:#94a3b8;
font-size:0.875rem;
margin-bottom:24px;
}
.section-title{
font-size:0.75rem;
font-weight:600;
text-transform:uppercase;
letter-spacing:0.08em;
color:#22d3ee;
margin-bottom:12px;
margin-top:24px;
}
.prereqs{
list-style:none;
margin-bottom:16px;
}
.prereqs li{
font-size:0.82rem;
color:#e2e8f0;
padding:5px 0;
}
.prereqs li::before{
content:"\25B8 ";
color:#3b82f6;
margin-right:6px;
}
.cli{
font-family:'SF Mono',SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;
font-size:0.8rem;
background:rgba(34,211,238,0.08);
color:#22d3ee;
padding:8px 12px;
border-radius:6px;
margin-bottom:8px;
overflow-x:auto;
white-space:nowrap;
}
.cli-label{
font-size:0.72rem;
color:#64748b;
margin-bottom:4px;
margin-top:10px;
}
.tree{
font-family:'SF Mono',SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;
font-size:0.78rem;
color:#94a3b8;
background:rgba(255,255,255,0.02);
border:1px solid rgba(255,255,255,0.06);
border-radius:8px;
padding:14px 18px;
line-height:1.7;
margin-bottom:16px;
}
.tree .folder{color:#3b82f6}
.tree .file{color:#e2e8f0}
.tree .comment{color:#64748b;font-style:italic}
.flow{
display:flex;
align-items:center;
gap:0;
flex-wrap:wrap;
margin-bottom:16px;
padding:16px;
background:rgba(255,255,255,0.02);
border:1px solid rgba(255,255,255,0.06);
border-radius:8px;
}
.flow-step{
background:rgba(34,211,238,0.08);
border:1px solid rgba(34,211,238,0.2);
border-radius:6px;
padding:8px 12px;
font-size:0.78rem;
color:#22d3ee;
font-weight:500;
white-space:nowrap;
}
.flow-arrow{
color:#64748b;
font-size:0.85rem;
padding:0 6px;
}
.code-block{
font-family:'SF Mono',SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;
font-size:0.73rem;
color:#94a3b8;
background:rgba(255,255,255,0.02);
border:1px solid rgba(255,255,255,0.06);
border-radius:8px;
padding:14px 18px;
line-height:1.65;
margin-bottom:16px;
overflow-x:auto;
white-space:pre;
}
.code-block .kw{color:#22d3ee}
.code-block .str{color:#3b82f6}
.code-block .comment{color:#64748b;font-style:italic}
.asset-note{
font-size:0.8rem;
color:#94a3b8;
background:rgba(59,130,246,0.06);
border-left:3px solid #3b82f6;
padding:10px 14px;
border-radius:0 6px 6px 0;
margin-bottom:16px;
}
.asset-note strong{color:#e2e8f0}
.links{
display:flex;
gap:12px;
flex-wrap:wrap;
margin-top:20px;
padding-top:16px;
border-top:1px solid rgba(255,255,255,0.06);
}
.links a{
font-size:0.78rem;
color:#3b82f6;
text-decoration:none;
padding:4px 10px;
border:1px solid rgba(59,130,246,0.3);
border-radius:6px;
transition:background 0.2s;
}
.links a:hover{background:rgba(59,130,246,0.1)}
</style>
</head>
<body>
<div class="card">
<h1>TWA — Trusted Web Activity</h1>
<p class="subtitle">Wrap any PWA as an Android app and publish to Google Play Store. No Java/Kotlin required.</p>
<div class="section-title">Prerequisites</div>
<ul class="prereqs">
<li>PWA with a valid web app manifest</li>
<li>HTTPS hosting</li>
<li>Android SDK installed (or let Bubblewrap download it)</li>
</ul>
<div class="section-title">Bubblewrap CLI Commands</div>
<div class="cli-label">Initialize from your PWA manifest:</div>
<div class="cli">bubblewrap init --manifest=https://your-pwa.com/manifest.webmanifest</div>
<div class="cli-label">Build the signed APK/AAB:</div>
<div class="cli">bubblewrap build</div>
<div class="section-title">Generated Project</div>
<div class="tree">
<span class="folder">app/</span><br/>
<span class="folder">src/main/</span><br/>
<span class="file">AndroidManifest.xml</span><br/>
<span class="folder">res/</span><br/>
<span class="folder">mipmap-*/</span> <span class="comment"># Launcher icons</span><br/>
<span class="folder">values/</span><span class="file">strings.xml</span><br/>
<span class="folder">gradle/</span><br/>
<span class="file">build.gradle</span><br/>
<span class="file">twa-manifest.json</span> <span class="comment"># Bubblewrap config</span><br/>
</div>
<div class="section-title">Setup Flow</div>
<div class="flow">
<span class="flow-step">PWA</span>
<span class="flow-arrow">→</span>
<span class="flow-step">bubblewrap init</span>
<span class="flow-arrow">→</span>
<span class="flow-step">Build APK</span>
<span class="flow-arrow">→</span>
<span class="flow-step">Asset Links</span>
<span class="flow-arrow">→</span>
<span class="flow-step">Play Store</span>
</div>
<div class="section-title">Digital Asset Links</div>
<div class="asset-note">
<strong>Required:</strong> Place <code>assetlinks.json</code> at <code>/.well-known/assetlinks.json</code> on your domain to prove ownership and hide browser chrome.
</div>
<div class="code-block"><span class="comment">// .well-known/assetlinks.json</span>
[{
<span class="str">"relation"</span>: [<span class="str">"delegate_permission/common.handle_all_urls"</span>],
<span class="str">"target"</span>: {
<span class="str">"namespace"</span>: <span class="str">"android_app"</span>,
<span class="str">"package_name"</span>: <span class="str">"com.your.package"</span>,
<span class="str">"sha256_cert_fingerprints"</span>: [<span class="str">"AA:BB:CC:..."</span>]
}
}]</div>
<div class="links">
<a href="https://developer.android.com/develop/ui/views/layout/webapps/guide-trusted-web-activities-version2" target="_blank" rel="noopener">TWA Docs</a>
<a href="https://github.com/GoogleChromeLabs/bubblewrap" target="_blank" rel="noopener">Bubblewrap CLI</a>
<a href="https://developers.google.com/digital-asset-links" target="_blank" rel="noopener">Digital Asset Links</a>
</div>
</div>
</body>
</html>