Skip to content

Releases: ddagunts/pwagen

pwagen 1.4

Choose a tag to compare

@ddagunts ddagunts released this 04 Aug 02:59

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

Choose a tag to compare

@ddagunts ddagunts released this 04 Aug 02:20

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

Choose a tag to compare

@ddagunts ddagunts released this 04 Aug 01:21

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

Choose a tag to compare

@ddagunts ddagunts released this 04 Aug 00:40

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

Choose a tag to compare

@ddagunts ddagunts released this 03 Aug 23:40

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 INTERNET permission 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.