Releases: ddagunts/pwagen
Release list
pwagen 1.4
Back works again in generated apps
On Android 15 and newer, Back was leaving a generated app instead of going back a
page.
onBackPressed is deprecated because back moved to OnBackInvokedDispatcher for
predictive back, and that is on by default for apps targeting API 35 and up —
which the shell does. So the system routed Back through a dispatcher that had
nothing registered with it, and the override was never called at all.
Nothing failed loudly, which is how it survived: the code was still correct, just
no longer reachable.
Back now walks the page's history again, on every supported version.
Camera cutout, per site
Full screen stops the page below the display cutout and fills that strip with the
site's theme colour — hiding the system bars does not move the camera, and unlike
a status bar there is no swipe that reveals what the lens covers.
New per-site switch Draw under the camera cutout hands that strip back to the
page. Worth it for a site whose top edge is empty, and not otherwise.
The window now also asks for the whole display in every orientation, rather than
letting the platform letterbox the cutout edge with a black bar in some
orientations and not others.
Important
Regenerate your apps. All of this lives in the template APK, not in the
config your generated apps already carry — the Back fix included. Regenerating
installs as an in-place upgrade and keeps cookies, logins and firewall rules.
Verifying this build
sha256 2713074953dad2c12f9d0ed46c927a78858460e0154cfdb3c9689783c28c05d9
Same signing key as every release so far, so this updates in place:
813d6225f1c3bedeafd47e33775e7c0f5390cdedf259bd883c0e26b6d04b9dee
pwagen 1.3
Announce blocked requests
Domain rules could refuse a request and say so only in logcat, which is no help
on a phone. Each site can now opt in to having refusals surface in the app.
Off by default on purpose: a rule that is working refuses things constantly, and
a page whose analytics are blocked would otherwise complain forever. It earns its
keep while a list is being tuned, which is when the question is usually what did
I forget to allow?
Each refused host is named once per launch, with a Mute button that silences
it for good — remembered inside the generated app, and reset by clearing that
app's storage in Android Settings.
Pull to refresh
Dragging down with the page already at its top reloads it.
The gesture is only claimed while the page has nowhere left to scroll, and is
abandoned the moment the page moves or a second finger lands, so it cannot
swallow a swipe or a pinch the site wanted. It is hand-rolled rather than taken
from SwipeRefreshLayout: that would have put an AndroidX dependency into the
network-facing module, and the short dependency list there is worth more than the
code it saves.
Larger controls
Import, export and Back were text glyphs sized at the Material minimum. A glyph
renders visually smaller than an icon of the same nominal size, which left them
as fine print in the corner of the screen. They are now 56dp targets with
correspondingly larger labels.
Note
Regenerate your apps to pick up the blocked-request notices and pull to
refresh — both live in the template APK, not in the config your generated apps
already carry. Regenerating installs as an in-place upgrade and keeps cookies,
logins and firewall rules.
Verifying this build
sha256 728ec84a1027928058216faa4de799d4f14287d80394da7c07302d71f598d72c
Same signing key as every release so far, so this updates in place:
813d6225f1c3bedeafd47e33775e7c0f5390cdedf259bd883c0e26b6d04b9dee
pwagen 1.2
Fixes generated apps crashing on launch in 1.1. If you are on 1.1, update and
regenerate your apps.
What broke
The system-bar work added in 1.1 asked the window for its insets controller
before setContentView had created the decor view that answers for it, so every
generated app died in onCreate — in both bar modes:
java.lang.NullPointerException: Attempt to invoke virtual method
'android.view.WindowInsetsController
com.android.internal.policy.DecorView.getWindowInsetsController()'
on a null object reference
at com.android.internal.policy.PhoneWindow.getInsetsController
at dev.pwagen.shell.MainActivity.applyThemeColor
The generator itself was unaffected — only the apps it generates.
The fix
Window setup now runs after setContentView. Hiding the bars and choosing their
icon colour moved into onWindowFocusChanged, since the insets controller is not
wired up until the window is attached. That also fixes a bar the user swipes in
transiently never being put back.
Important
Regenerate your apps after updating. The fix is in the template APK that
pwagen embeds, so apps generated by 1.1 keep crashing until they are rebuilt.
Regenerating bumps the version code, so each installs as an in-place upgrade
and keeps its cookies, logins and firewall rules.
Verifying this build
sha256 da43885eeb4e1d1816b9f5146060069395b8e19c4da4f6b63c4a6a43d14ad0b7
Same signing key as 1.0 and 1.1, so this updates in place:
813d6225f1c3bedeafd47e33775e7c0f5390cdedf259bd883c0e26b6d04b9dee
pwagen 1.1
Caution
Do not use this release. Every app generated by 1.1 crashes on launch with
a NullPointerException in onCreate, in both bar modes. Fixed in
v1.2 — update and
regenerate your apps.
Fixes generated apps drawing underneath the status bar.
The problem
Edge-to-edge is mandatory from API 35 on, so a generated app's WebView extended
under the status bar with nothing holding it clear. The top band of every site
looked live but sent its taps to the system, so any control a site puts up there
could not be pressed at all.
The fix
A generated app now takes one of two positions, chosen per site in the editor:
- Full screen (default) — the system bars are hidden and the site genuinely
uses the whole screen. Swipe from the top edge to bring the status bar back. - Full screen off — the bars stay visible and the page starts below them,
with the strip behind them filled in the site's theme colour.
There is deliberately no in-between: a page drawn under a visible status bar is
exactly the broken state this release removes.
Bar icons now also follow the theme colour's luminance, so a light theme colour
no longer swallows the clock and battery.
Important
Regenerate your existing apps to pick this up. The fix is in the template
APK that pwagen embeds, not in the config your generated apps already carry.
Regenerating bumps the version code, so each one installs as an in-place
upgrade and keeps its cookies, logins and firewall rules.
Verifying this build
sha256 f394c1adf5f22050f24c9aa0147ab4da61b97123716f709c3f4a6c146842111f
Same signing key as 1.0, so this updates in place:
813d6225f1c3bedeafd47e33775e7c0f5390cdedf259bd883c0e26b6d04b9dee
pwagen 1.0
First public release.
pwagen builds each web app you add into its own signed, installable APK. Android
gives every installed package exactly one UID, so each site ends up with its own
identity to any per-app firewall, its own kernel-enforced data sandbox, its own
runtime permissions, and its own launcher entry — with nothing to configure in
pwagen itself.
Notable properties
- The generator has no
INTERNETpermission at all. Icons and names come
from local input only; there is no web-app-manifest fetching. This is an
auditable property of the manifest, not a promise. - The signing key used for generated apps is hardware-backed (AndroidKeyStore,
EC P-256, StrongBox where available) and non-exportable. It survives app
updates and is destroyed on uninstall. - Backups contain config and icon bytes, never the key.
- Generated apps use hardened WebView defaults; permissions you do not opt into
are stripped from the generated manifest entirely rather than gated in code.
Requirements
Android 11 (API 30) or newer. Targets Android 16 (API 36). Developed against
GrapheneOS, where Vanadium is the system WebView; degrades gracefully on stock AOSP.
Verifying this build
sha256 8ed7848b8a80e40f33fc9cd6bd5564fa31c0d7bd4628a470ca66178c968ecc12
Signing certificate SHA-256 (all future releases will use this same key):
813d6225f1c3bedeafd47e33775e7c0f5390cdedf259bd883c0e26b6d04b9dee
Check it yourself with apksigner verify --print-certs pwagen-1.0.apk.