nowo-tech / vault-bundle
Symfony bundle for a password and secrets vault: logins, notes, cards, contacts, documents, folders, sharing, trash, and password generator
Package info
github.com/nowo-tech/VaultBundle
Type:symfony-bundle
pkg:composer/nowo-tech/vault-bundle
Fund package maintenance!
Requires
- php: >=8.2 <8.6
- composer-runtime-api: ^2.0
- ext-sodium: *
- doctrine/doctrine-bundle: ^2.10 || ^3.0
- doctrine/orm: ^3.7
- nowo-tech/form-kit-bundle: ^2.16
- nowo-tech/ui-kit-bundle: ^2.17.3
- psr/clock: ^1.0
- psr/log: ^2.0 || ^3.0
- symfony/clock: ^7.4 || ^8.0
- symfony/config: ^7.4 || ^8.0
- symfony/dependency-injection: ^7.4 || ^8.0
- symfony/form: ^7.4 || ^8.0
- symfony/framework-bundle: ^7.4 || ^8.0
- symfony/http-kernel: ^7.4 || ^8.0
- symfony/routing: ^7.4 || ^8.0
- symfony/security-bundle: ^7.4 || ^8.0
- symfony/security-csrf: ^7.4 || ^8.0
- symfony/translation: ^7.4 || ^8.0
- symfony/twig-bundle: ^7.4 || ^8.0
- symfony/validator: ^7.4 || ^8.0
- symfony/yaml: ^7.4 || ^8.0
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
Requires (Dev)
- doctrine/mongodb-odm: ^2.6
- doctrine/mongodb-odm-bundle: ^5.0
- friendsofphp/php-cs-fixer: ^3.0
- igor-php/igor-php: ^0.10.0
- nowo-tech/doctrine-encrypt-bundle: ^2.2
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^10.0
- rector/rector: ^2.0
- symfony/asset: ^7.4 || ^8.0
- symfony/browser-kit: ^7.4 || ^8.0
- symfony/dom-crawler: ^7.4 || ^8.0
- symfony/lock: ^7.4 || ^8.0
- symfony/var-exporter: ^6.4 || ^7.0 || ^8.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- doctrine/mongodb-odm-bundle: Planned future platform support when nowo_vault.database.platform is mongodb (not implemented in 1.x).
- nowo-tech/doctrine-encrypt-bundle: Encrypts vault_settings.encryption_key at rest when storing the vault master key in the database.
- nowo-tech/password-strength-bundle: Strength policy, live feedback, and generator for login password fields.
- nowo-tech/password-toggle-bundle: Show/hide toggle for login password fields (used with password-strength-bundle).
- nowo-tech/tag-input-bundle: Tagify-powered multi-tag input for item labels.
- symfony/lock: Makes the decrypted export's proof check, consume and cooldown atomic per user (export.lock_factory).
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v1.16.0
- v1.15.2
- v1.15.1
- v1.15.0
- v1.14.0
- v1.13.0
- v1.12.0
- v1.11.1
- v1.11.0
- v1.10.0
- v1.9.0
- v1.8.2
- v1.8.1
- v1.8.0
- v1.7.0
- v1.6.0
- v1.5.1
- v1.5.0
- v1.4.8
- v1.4.7
- v1.4.6
- v1.4.5
- v1.4.4
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.5
- v1.1.4
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- dev-feat/1.16.0-4-export
- dev-feat/1.16.0-3-health
- dev-feat/1.16.0-2-catalogue-reveal
- dev-feat/1.16.0-1-owner-grants
- dev-feat/1.16.0-scopes
- dev-fix/1.15.2-hardening
- dev-chore/symfony-security-2026-11-04
- dev-fix/req-twig-005
This package is auto-updated.
Last update: 2026-11-05 16:31:57 UTC
README
⭐ Found this useful? Give it a star on GitHub so more developers can find it.
Symfony bundle for a password and secrets vault: logins, secure notes, credit cards, contacts, identity documents, folders, sharing, trash, read-only events, and a built-in password generator.
This bundle is FrankenPHP worker mode friendly.
| Vault home | Items list | Password generator |
|---|---|---|
![]() |
![]() |
![]() |
Features
- Item types: login, secure note, credit card, contact, ID card, driver's license, passport, document
- Folders with share and trash; item soft-delete with restore/purge
- Tags — label items, filter and search by tag
VaultGrantfor users and teams (read / write / admin) + share UIVaultTeamMembershipResolverInterfacefor team-based grants- Scope vaults — items, folders and tags owned by a project or organization of the host (
VaultScopeAccessResolverInterface, membership checked on every request) - Catalogue — metadata-only list of a scope's items (no payload loaded) so members can request access
- On-demand reveal — Show / Copy per secret field and attachment download, audited and rate limited; no secret in the page
- Temporary grants —
grantAs()with an expiry enforced on every read,nowo:vault:grants:purge-expired, grant audit events - Password health — weak, reused, old and (optionally) breached passwords per scope, computed on demand without storing fingerprints; password policies enforced on save
- Personal data — GDPR exporter (metadata only) and ordered eraser; decrypted personal export behind a fresh, single-use re-authentication (host hook), streamed without temp files
- Browser extension — REST API + Chrome/Firefox autofill (optional)
- Runtime config — optional DB-backed settings with admin UI
- Key rotation —
nowo:vault:reencrypt;nowo:vault:extension-tokens:purgefor expired browser-extension tokens - Events: list query/result, access check, read-only resolve, extension auth
- Server-side libsodium payload encryption; CSRF on manage POST actions
- Manage UI on the UiKit page contract (dashboard, list, form and settings scaffolds; one host theme for every Nowo bundle; confirm and generator
<dialog>s, no inline JS) — see docs/TEMPLATES.md - Document attachments (encrypted in payload)
Installation
composer require nowo-tech/vault-bundle
php -r 'echo base64_encode(random_bytes(32)), PHP_EOL;'
# config/packages/nowo_vault.yaml nowo_vault: user_class: App\Entity\User encryption_key: '%env(VAULT_ENCRYPTION_KEY)%'
See Installation.
Demo
make -C demo/symfony8 up
# Demo started at: http://localhost:8023 → /tools/vault (auto-login)
The screenshot at the top of this README comes from this demo (fixture data only); refresh it with make -C demo/symfony8 demo-screenshots (make -C demo/symfony8 test-e2e runs the Playwright happy path).
Documentation
- Installation
- Configuration
- Usage
- Templates (UiKit page contract)
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release process
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
- GitHub Actions CI requirements
- PSR evaluation (REQ-CS-007)
- Browser extension
- Encryption key rotation
- Access control & read-only events
- Demo with FrankenPHP
Tests and coverage
- PHP: 100% lines (3376/3376 of
src/, PHPUnit unit + integration + kernel E2E suites; onlysrc/Resources— Twig, translations, config, built assets — is outside the measure). Gate:make test-coverage-100/ CI fail below 100%. - TS/JS: 99.69% lines (326/327; 95.28% branches) over every TypeScript source of
src/Resources/assets/srcandextension/src(Vitest + jsdom). Gate: thresholds invitest.config.ts(lines 98%), enforced bypnpm run test:coveragelocally and in CI. - Python: N/A (no Python code).
make test # PHPUnit make test-coverage # PHP coverage report (text + clover + HTML) make test-coverage-100 # Same, failing below 100% lines make test-ts # Vitest with coverage thresholds make release-check # Full pre-release QA
License
MIT — see LICENSE.



