{"id":14978457,"url":"https://github.com/passwall/passwall-desktop","last_synced_at":"2026-04-17T08:01:05.231Z","repository":{"id":37183709,"uuid":"276635610","full_name":"passwall/passwall-desktop","owner":"passwall","description":"PassWall Desktop is the desktop client for PassWall Server written with Electron Vue.","archived":false,"fork":false,"pushed_at":"2026-04-15T07:02:47.000Z","size":3804,"stargazers_count":168,"open_issues_count":7,"forks_count":30,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-15T08:13:28.615Z","etag":null,"topics":["electron-vue","electronjs","hacktoberfest","js","open-source","password-manager"],"latest_commit_sha":null,"homepage":"https://passwall.io/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/passwall.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"patreon":"yakuter"}},"created_at":"2020-07-02T12:05:18.000Z","updated_at":"2026-04-15T07:02:51.000Z","dependencies_parsed_at":"2023-02-18T08:31:31.387Z","dependency_job_id":null,"html_url":"https://github.com/passwall/passwall-desktop","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/passwall/passwall-desktop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwall%2Fpasswall-desktop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwall%2Fpasswall-desktop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwall%2Fpasswall-desktop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwall%2Fpasswall-desktop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/passwall","download_url":"https://codeload.github.com/passwall/passwall-desktop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passwall%2Fpasswall-desktop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31920518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"online","status_checked_at":"2026-04-17T02:00:06.879Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["electron-vue","electronjs","hacktoberfest","js","open-source","password-manager"],"created_at":"2024-09-24T13:57:43.695Z","updated_at":"2026-04-17T08:01:05.215Z","avatar_url":"https://github.com/passwall.png","language":"TypeScript","funding_links":["https://patreon.com/yakuter"],"categories":[],"sub_categories":[],"readme":"# Passwall Desktop\n\nCross-platform password manager desktop application built with Tauri 2, React 19, and TypeScript.\n\n## Tech Stack\n\n| Layer | Technology |\n|---|---|\n| Runtime | Tauri 2 (Rust + WebView) |\n| Frontend | React 19, TypeScript, Vite 7 |\n| Styling | Tailwind CSS 4 |\n| State | Zustand 5 |\n| Routing | React Router 7 (hash-based) |\n| i18n | i18next (English, Turkish) |\n| Icons | Lucide React |\n| Crypto | Web Crypto API — PBKDF2, HKDF, AES-CBC + HMAC-SHA-256 |\n| Keychain | Rust `keyring` crate — macOS Keychain, Windows Credential Manager, Linux Secret Service |\n\n---\n\n## Prerequisites\n\n- [Node.js](https://nodejs.org/) 22+\n- [pnpm](https://pnpm.io/) 9+\n- [Rust](https://www.rust-lang.org/tools/install) stable\n\n### macOS\n\n```bash\nxcode-select --install\n```\n\n### Linux (Debian/Ubuntu)\n\n```bash\nsudo apt-get install -y \\\n  libwebkit2gtk-4.1-dev \\\n  libappindicator3-dev \\\n  librsvg2-dev \\\n  patchelf \\\n  libgtk-3-dev \\\n  libsoup-3.0-dev \\\n  libjavascriptcoregtk-4.1-dev\n```\n\n### Windows\n\n- [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)\n- [WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) — pre-installed on Windows 11\n\n---\n\n## Development\n\n### Install dependencies\n\n```bash\npnpm install\n```\n\n### Run in development mode\n\n```bash\npnpm tauri dev\n```\n\nOpens a native Tauri window. The frontend dev server runs at `http://localhost:1420` with Hot Module Replacement. Changes to the Rust backend trigger an automatic recompile.\n\nTo run only the frontend in isolation (no Tauri, in a browser):\n\n```bash\npnpm dev\n```\n\n\u003e Tauri APIs are not available in this mode.\n\n### Type checking\n\n```bash\npnpm typecheck\n```\n\n---\n\n## Build\n\n### Production binary\n\n```bash\npnpm tauri build\n```\n\nOutput is placed under `src-tauri/target/release/bundle/`:\n\n| Platform | Format | Location |\n|---|---|---|\n| macOS | `.dmg`, `.app` | `bundle/dmg/`, `bundle/macos/` |\n| Linux | `.AppImage`, `.deb` | `bundle/appimage/`, `bundle/deb/` |\n| Windows | `.exe` (NSIS), `.msi` | `bundle/nsis/`, `bundle/msi/` |\n\n### Build for a specific target\n\n```bash\n# macOS Apple Silicon\npnpm tauri build --target aarch64-apple-darwin\n\n# macOS Intel\npnpm tauri build --target x86_64-apple-darwin\n\n# Linux x64\npnpm tauri build --target x86_64-unknown-linux-gnu\n\n# Windows x64\npnpm tauri build --target x86_64-pc-windows-msvc\n```\n\nFor cross-compilation, the target Rust toolchain must be installed first:\n\n```bash\nrustup target add aarch64-apple-darwin\n```\n\n---\n\n## Project Structure\n\n```\npasswall-desktop/\n├── src/                          # React frontend\n│   ├── main.tsx                  # App entry point\n│   ├── App.tsx                   # Router and route guards\n│   ├── types/                    # TypeScript types and enums\n│   ├── lib/\n│   │   ├── crypto.ts             # Zero-knowledge encryption (PBKDF2, AES-CBC-HMAC)\n│   │   ├── http-client.ts        # API client with token refresh\n│   │   └── schemas/              # Item data normalizers\n│   ├── api/                      # API service classes\n│   ├── stores/                   # Zustand state management\n│   │   ├── auth-store.ts         # Auth, login, keychain\n│   │   ├── vault-store.ts        # Vault item CRUD\n│   │   └── ui-store.ts           # UI state, notifications\n│   ├── components/\n│   │   ├── layout/               # AppShell, Sidebar, ItemList, ItemDetail\n│   │   ├── common/               # Button, FormInput, Notifications, etc.\n│   │   ├── auth/                 # LoginForm, TwoFactorForm\n│   │   └── items/                # Password/Note/Card/Bank/Address forms\n│   ├── pages/                    # Route pages\n│   ├── hooks/                    # Custom hooks\n│   └── i18n/                     # Translations (en, tr)\n├── src-tauri/                    # Rust backend\n│   ├── src/\n│   │   ├── lib.rs                # Tauri commands and plugin registration\n│   │   └── keystore.rs           # OS keychain integration\n│   ├── capabilities/             # Permission definitions\n│   ├── tauri.conf.json           # Tauri app configuration\n│   └── Cargo.toml                # Rust dependencies\n└── .github/workflows/\n    └── build.yml                 # CI/CD: build, sign, upload to DO Spaces\n```\n\n---\n\n## Environment Variables\n\nNo `.env` file is needed during development — all configuration lives in `src-tauri/tauri.conf.json`.\n\nThe following environment variables are used for production builds:\n\n| Variable | Description |\n|---|---|\n| `TAURI_SIGNING_PRIVATE_KEY` | Minisign private key for updater signing |\n| `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | Private key password |\n| `APPLE_CERTIFICATE` | Base64-encoded `.p12` certificate |\n| `APPLE_CERTIFICATE_PASSWORD` | Certificate password |\n| `APPLE_ID` | Apple ID for notarization |\n| `APPLE_PASSWORD` | App-specific password for notarization |\n| `APPLE_TEAM_ID` | Apple Developer Team ID |\n\n---\n\n## Release\n\n### Cutting a new release\n\n```bash\n# 1. Update the version in both files\n#    - package.json → \"version\"\n#    - src-tauri/tauri.conf.json → \"version\"\n\n# 2. Commit and tag\ngit add package.json src-tauri/tauri.conf.json\ngit commit -m \"release: v0.2.0\"\ngit tag v0.2.0\ngit push \u0026\u0026 git push --tags\n```\n\nPushing the tag triggers the GitHub Actions workflow, which:\n\n1. Builds binaries for macOS (arm64 + x64), Linux (x64), and Windows (x64)\n2. Signs and notarizes macOS binaries with the Apple certificate\n3. Signs updater bundles with minisign\n4. Uploads all artifacts to DigitalOcean Spaces\n5. Generates `latest.json` with per-platform download URLs and signatures\n6. Creates a GitHub Release\n\n### Required GitHub Secrets\n\n| Secret | Description |\n|---|---|\n| `TAURI_SIGNING_PRIVATE_KEY` | Updater private key |\n| `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | Updater private key password |\n| `APPLE_ID` | Apple ID |\n| `APPLE_APP_SPECIFIC_PASSWORD` | Apple app-specific password |\n| `APPLE_TEAM_ID` | Apple Team ID |\n| `CSC_LINK` | Base64-encoded `.p12` certificate |\n| `CSC_KEY_PASSWORD` | Certificate password |\n| `DO_SPACES_KEY` | DigitalOcean Spaces access key |\n| `DO_SPACES_SECRET` | DigitalOcean Spaces secret key |\n| `DO_SPACES_BUCKET` | Spaces bucket name |\n| `DO_SPACES_REGION` | Spaces region (e.g. `nyc3`) |\n| `DO_SPACES_ENDPOINT` | Spaces endpoint (e.g. `nyc3.digitaloceanspaces.com`) |\n\nSee [SETUP.md](SETUP.md) for the full setup guide.\n\n---\n\n## Generating the Updater Signing Key\n\n```bash\npnpm tauri signer generate -w ~/.tauri/passwall.key\n```\n\nCopy the printed public key into `plugins.updater.pubkey` in `src-tauri/tauri.conf.json`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpasswall%2Fpasswall-desktop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpasswall%2Fpasswall-desktop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpasswall%2Fpasswall-desktop/lists"}