Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 45 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Document Manager
# DocVault

Private, encrypted document storage for Android. No cloud, no accounts, no compromises.
Private, encrypted document vault for Android. No cloud, no accounts, no compromises.

## Why this exists

I needed a place to keep passport scans, insurance docs, and travel papers on my phone where:
I needed a secure place to keep passport scans, insurance docs, and travel papers on my phone where:
- They're encrypted and locked behind biometrics
- Nothing gets uploaded anywhere without me explicitly doing it
- I can find stuff fast with tags and search
Expand Down Expand Up @@ -76,6 +76,9 @@ Pre-built APKs are available from [GitHub Releases](https://github.com/sethusrin

No build tools required — just download and install.

### App Name
This app is called **DocVault** — a secure vault for your important documents.


## Installing on Your Android Device

Expand Down Expand Up @@ -105,6 +108,11 @@ For general use, download the **release** APK.
3. When prompted, tap **Open** or find it in your Downloads app
4. Tap **Install** → **Done**

### Notes
- **App Name:** This app is called **DocVault**
- **Package Name:** `com.app.traveldocs`
- When installing, you'll see it as "DocVault" on your app drawer

### Option B — Install via USB from your computer

Requires [Android Platform Tools](https://developer.android.com/tools/releases/platform-tools) (includes `adb`).
Expand Down Expand Up @@ -135,15 +143,15 @@ adb install document-manager-release.apk

### After Installing

1. Launch **Document Manager** from your app drawer
1. Launch **DocVault** from your app drawer
2. Read and accept the End User License Agreement
3. The app uses your device's **biometric authentication** (fingerprint/face/PIN) — no separate app password needed
4. Start importing documents via **Import** button on the home screen

## Quick start

```bash
# You need JDK 17 and Android SDK (API 34)
# You need JDK 17 and Android SDK (API 36 for Play Store compliance)

# On Ubuntu/Linux, run the setup script
bash scripts/setup.sh
Expand Down Expand Up @@ -196,6 +204,10 @@ The domain layer has zero Android imports. Data implements domain interfaces. Pr
| Hilt | Standard Android DI. ViewModels get auto-scoped. |
| Kotest property tests | Domain invariants verified with random inputs, not just cherry-picked examples |

## App Name: DocVault

This app is called **DocVault** — a secure vault for your important documents. The name reflects its purpose as an encrypted storage location for sensitive documents.

## Feature flags

All experimental stuff is behind toggles in Settings → Experimental Features:
Expand Down Expand Up @@ -251,6 +263,34 @@ export ANDROID_HOME=$HOME/android-dev-tools/android-sdk
echo "sdk.dir=$ANDROID_HOME" > local.properties
```

### Build & Deploy

```bash
# Build only
./gradlew assembleDebug # debug APK
./gradlew assembleRelease # release APK (unsigned)

# Build both APK and AAB for Play Store
./scripts/build-release.sh

# One-command build + deploy (default: release)
./scripts/deploy.sh

# Or specify variant
./scripts/deploy.sh release # production build (minified, no debug logs)
./scripts/deploy.sh debug # development build (debug logs, diagnostics)
```

### App Signing for Play Store

Before publishing to Google Play Store, you need to generate a release keystore:

```bash
./scripts/release_keystore.sh
```

This creates `~/release.keystore` used for signing release builds.

### Build & deploy

```bash
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ plugins {

android {
namespace = "com.app.traveldocs"
compileSdk = 34
compileSdk = 36

defaultConfig {
applicationId = "com.app.traveldocs"
minSdk = 26
ndk {
abiFilters += listOf("arm64-v8a")
}
targetSdk = 34
targetSdk = 36
versionCode = 2
versionName = "1.0.1"

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/app/traveldocs/debug/CrashHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class CrashHandler(
}

companion object {
private const val DEVELOPER_EMAIL = "developer@documentmanager.app"
private const val DEVELOPER_EMAIL = "support@docvault.app"

fun install(context: Context) {
val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@

<!-- Privacy & Crash Feedback (Play Store compliance) -->
<string name="privacy_policy_title">Privacy Policy</string>
<string name="privacy_policy_url">https://documentmanager.app/privacy</string>
<string name="privacy_policy_url">https://github.com/sethusrinivasan/document-manager/blob/main/docs/PRIVACY_POLICY.md</string>
<string name="send_crash_report">Send Crash Report</string>
<string name="crash_report_sent">Crash report ready to send</string>
<string name="no_crash_report">No crash reports available</string>
Expand Down
2 changes: 1 addition & 1 deletion docs/PRIVACY_POLICY.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,4 @@ We may update this policy. Changes will be noted in the app's About section.

## Contact

For questions about this privacy policy, contact: developer@documentmanager.app
For questions about this privacy policy, contact via: https://github.com/sethusrinivasan/document-manager/issues
59 changes: 59 additions & 0 deletions scripts/build-release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/bin/bash
# Script to build release APK and AAB for Play Store

set -e

echo "========================================"
echo " DocVault Release Build"
echo "========================================"
echo ""

# Check for release keystore
if [ ! -f "$HOME/release.keystore" ]; then
echo -e "\033[0;31mERROR: Release keystore not found!\033[0m"
echo "Generate it first with: ./scripts/release_keystore.sh"
exit 1
fi

echo "✓ Release keystore found"
echo ""

# Build release APK
echo "Building release APK..."
./gradlew assembleRelease
if [ $? -eq 0 ]; then
echo -e "\033[0;32m✓ Release APK built successfully\033[0m"
echo ""
ls -lh app/build/outputs/apk/release/*.apk
else
echo -e "\033[0;31m✗ Release APK build failed\033[0m"
exit 1
fi

echo ""

# Build release App Bundle (for Play Store)
echo "Building release App Bundle..."
./gradlew bundleRelease
if [ $? -eq 0 ]; then
echo -e "\033[0;32m✓ Release App Bundle built successfully\033[0m"
echo ""
ls -lh app/build/outputs/bundle/release/*.aab
else
echo -e "\033[0;31m✗ Release App Bundle build failed\033[0m"
exit 1
fi

echo ""
echo "========================================"
echo " Build Complete!"
echo "========================================"
echo ""
echo "APK location: app/build/outputs/apk/release/"
echo "AAB location: app/build/outputs/bundle/release/"
echo ""
echo "To deploy APK:"
echo " adb install app/build/outputs/apk/release/app-release.apk"
echo ""
echo "To upload to Play Store:"
echo " Upload app/build/outputs/bundle/release/app-release.aab"
2 changes: 1 addition & 1 deletion scripts/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ if [ "$VARIANT" = "debug" ]; then
APK="$PROJECT_DIR/app/build/outputs/apk/debug/app-debug.apk"
else
"$PROJECT_DIR/gradlew" -p "$PROJECT_DIR" assembleRelease --no-daemon
APK="$PROJECT_DIR/app/build/outputs/apk/release/app-release-unsigned.apk"
APK="$PROJECT_DIR/app/build/outputs/apk/release/app-release.apk"
fi

if [ ! -f "$APK" ]; then
Expand Down
Loading