Native desktop viewer for .pweb bundles. Built with Tauri.
Opens .pweb files via double-click, drag-and-drop, or the pweb open CLI command. Also provides a home screen for packing, unpacking, validating, and scaffolding bundles.
# 1. Install Rust (if not already installed)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 2. Install npm dependencies
npm install
# 3. Generate all icon sizes from the SVG
npx tauri icon src-tauri/icons/icon.svg
# 4. Run in dev mode
npm run tauri dev
# 5. Build for distribution
npm run tauri buildcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shXcode Command Line Tools:
xcode-select --install- Microsoft C++ Build Tools
- WebView2 (included with Windows 11; download for Windows 10)
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libssl-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-devnpm install
npx tauri icon src-tauri/icons/icon.svg # generate icon sizes from SVG
npm run tauri devnpm run tauri buildOutput is written to src-tauri/target/release/bundle/:
| Platform | Artifacts |
|---|---|
| macOS | .dmg, .app |
| Windows | .msi, .exe (NSIS) |
| Linux | .AppImage, .deb |
rustup target add x86_64-apple-darwin aarch64-apple-darwin
npm run tauri build -- --target universal-apple-darwinWithout signing, macOS Gatekeeper will warn users on first launch. To sign and notarize:
- Enroll in the Apple Developer Program ($99/year).
- Export your Developer ID certificate as a
.p12file from Keychain Access. - Set the following environment variables before building:
export APPLE_CERTIFICATE="$(base64 -i path/to/certificate.p12)"
export APPLE_CERTIFICATE_PASSWORD="your-p12-password"
export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)"
export APPLE_ID="your@apple.id"
export APPLE_PASSWORD="app-specific-password" # generated at appleid.apple.com
export APPLE_TEAM_ID="YOURTEAMID"
npm run tauri buildFor CI, store these as GitHub Actions secrets — the release workflow reads them automatically if present.
Unsigned Windows builds work but show a SmartScreen warning. To sign:
- Obtain a code signing certificate from a trusted CA (e.g. DigiCert, Sectigo).
- Set before building:
export TAURI_SIGNING_PRIVATE_KEY="path/to/key.pem"
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD="your-key-password"Linux builds do not require signing.
Requires macOS with Xcode installed.
# Add iOS Rust targets (one-time)
rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim
# Initialize the Xcode project (one-time, commit the generated gen/apple/ directory)
npm run tauri ios init
# Run on simulator
npm run tauri ios dev
# Build IPA for distribution
npm run tauri ios build -- --export-method app-store-connectOutput: src-tauri/gen/apple/build/arm64/PortableWeb.ipa
Requires an Apple Developer Program membership ($99/year).
- Create a Distribution certificate in Xcode → Settings → Accounts.
- Create an App ID and Provisioning Profile in the Apple Developer portal.
- For CI, store the following as GitHub Actions secrets:
| Secret | Description |
|---|---|
IOS_CERTIFICATE |
Base64-encoded .p12 distribution certificate |
IOS_CERTIFICATE_PASSWORD |
Password for the .p12 file |
IOS_PROVISIONING_PROFILE |
Base64-encoded .mobileprovision file |
KEYCHAIN_PASSWORD |
Any password — used to create a temp keychain in CI |
APPLE_TEAM_ID |
Your 10-character Apple Team ID |
Requires Android Studio, JDK 17, and Android NDK.
# Install Android NDK via Android Studio SDK Manager or sdkmanager:
sdkmanager "ndk;27.0.12077973"
export NDK_HOME=$ANDROID_SDK_ROOT/ndk/27.0.12077973
# Add Android Rust targets (one-time)
rustup target add \
aarch64-linux-android \
armv7-linux-androideabi \
i686-linux-android \
x86_64-linux-android
# Initialize the Android project (one-time, commit the generated gen/android/ directory)
npm run tauri android init
# Run on emulator or connected device
npm run tauri android dev
# Build APK + AAB for distribution
npm run tauri android buildOutput: src-tauri/gen/android/app/build/outputs/
- Generate a keystore (one-time):
keytool -genkey -v \
-keystore portableweb.jks \
-alias portableweb \
-keyalg RSA -keysize 2048 \
-validity 10000- For CI, store the following as GitHub Actions secrets:
| Secret | Description |
|---|---|
ANDROID_KEYSTORE |
Base64-encoded .jks keystore file |
ANDROID_KEYSTORE_PASSWORD |
Keystore password |
ANDROID_KEY_ALIAS |
Key alias (e.g. portableweb) |
ANDROID_KEY_PASSWORD |
Key password |
Push a version tag to trigger the GitHub Actions release workflow, which builds for all five platforms in parallel (macOS, Windows, Linux, iOS, Android) and creates a draft GitHub Release:
git tag v0.1.0
git push origin v0.1.0Review the draft release on GitHub, then publish when ready.
Note: Before the first mobile release, run
npm run tauri ios initandnpm run tauri android initlocally and commit the generatedsrc-tauri/gen/directory. The CI workflow depends on these files being present.