Evidence
Verify a BitGab download
You can check the artifact you downloaded. You cannot check the server's behaviour from that artifact. This page separates the two and gives the exact commands.
Step 01
Check the SHA-256
Download the APK and the published checksums file, then hash the bytes you actually received.
curl -O https://dl.bitgab.app/app-libre-release.apk
curl -O https://bitgab.app/SHA256SUMS
sha256sum -c SHA256SUMS
sha256sum -c prints app-libre-release.apk: OK when the file matches. To see the digest without the check, run sha256sum app-libre-release.apk.
Expected SHA-256 for this release:
{{RELEASE_SHA256}}The checksums file currently reads RELEASE_PENDING when no release metadata is published. That is a placeholder, not a digest. Do not install a file that only matches a placeholder.
The full checksums file is at /SHA256SUMS. It covers the libre APK. The gms APK is a separate artifact and carries its own published checksum with the release.
Step 02
Check the signing certificate
The APK must be signed by the BitGab release key. Android will also refuse to update an install with a different signer.
apksigner verify --print-certs app-libre-release.apk
The expected certificate SHA-256 fingerprint is:
77:57:E7:BB:2D:2F:8A:4D:5D:0E:86:B9:0E:FB:C0:CF:89:B6:AE:2B:30:A2:D9:D3:27:82:FB:B3:51:CA:78:B3apksigner prints the digest without colons. Compare it with:
7757e7bb2d2f8a4d5d0e86b90efbc0cf89b6ae2b30a2d9d32782fbb351ca78b3
A matching signature proves the APK was signed by this key. It does not prove the code is safe, and it does not prove what the server does. There is no third-party audit.
Step 03
Check the response headers
The site is served with a strict policy that forbids scripts, third-party origins, forms, and framing. Request the headers without downloading the page:
curl -sI https://bitgab.app/
The response must include the headers below. Cloudflare may add others; these must be present and must not be weakened.
Content-Security-Policy: default-src 'none'; script-src 'none'; style-src 'self'; img-src 'self'; font-src 'none'; connect-src 'none'; form-action 'none'; frame-ancestors 'none'; base-uri 'none'; upgrade-insecure-requests
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: accelerometer=(), camera=(), display-capture=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()
Cross-Origin-Opener-Policy: same-origin
X-Frame-Options: DENY
The policy is generated in _headers and applied to every path. script-src 'none' means no executable script can run, including inline handlers. The two JSON-LD data blocks are not JavaScript; they are inert data and are not executable.
Step 04
Check the TLS pinning scope
Certificate pinning is in the Android client, not in this website. A browser uses its own trust store, so a browser padlock does not test the app's pins.
The app pins explicit hosts, not a wildcard subtree:
bitgab-api.bitgab.workers.devbitgab-api-development.bitgab.workers.devbitgab.appapi.bitgab.appdl.bitgab.app
www.bitgab.app is deliberately not pinned.
The pin set expires on 2027-06-30. After that date Android ignores the pins and falls back to public CA validation. An installed app is not bricked by the expiry; the pin guarantee ends.
Pinning raises the cost of a misissued certificate. It does not protect against a CA that can issue for a pinned CA, and it does not hide traffic timing or volume.
Step 05
What you cannot verify from the APK
The artifact is the client. It cannot prove the server's code, retention, or logging behaviour.
The source is not published. BitGab does not commission third-party audits, and there is no SOC 2 report or ISO 27001 certificate. A customer may commission an assessment of its own deployment at its own expense, with an assessor of its choosing.
The server claims in privacy and limitations are documented against the private repository. They are not independently audited. If a claim matters to your decision, ask for dated evidence under NDA as part of a pilot.
The machine-readable claim index is at /claims.json. Its evidence paths refer to the private repository; they are listed for traceability, not as public source.
Mismatch
If something does not match
Do not install the file. A mismatch is worth reporting even if you are not certain it is an attack.
Send the URL you downloaded from, the file name, the SHA-256 you computed, the signer output from apksigner, and the headers you observed to security@bitgab.app.
See the security and disclosure policy for scope and what to include. BitGab does not promise response times.