Open
Conversation
🦋 Changeset detectedLatest commit: 4e3649c The changes in this PR will be included in the next version bump. This PR includes changesets to release 18 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
9fe515d to
d89302e
Compare
varlock
@varlock/astro-integration
@varlock/cloudflare-integration
@varlock/expo-integration
@varlock/nextjs-integration
@varlock/vite-integration
@varlock/1password-plugin
@varlock/aws-secrets-plugin
@varlock/azure-key-vault-plugin
@varlock/bitwarden-plugin
@varlock/dashlane-plugin
@varlock/google-secret-manager-plugin
@varlock/hashicorp-vault-plugin
@varlock/infisical-plugin
@varlock/keepass-plugin
@varlock/pass-plugin
@varlock/passbolt-plugin
@varlock/proton-pass-plugin
commit: |
5fb2d57 to
48f4feb
Compare
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
7de0e68 to
10d20b2
Compare
10d20b2 to
17081fd
Compare
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
varlock-website | ae17eaa | Commit Preview URL Branch Preview URL |
Apr 14 2026, 04:21 AM |
Member
gnu-linked binaries require GLIBC_2.39 which isn't available in most WSL2 distros. musl produces fully static binaries that work everywhere. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
WSL2 support: detect WSL environment and use the Windows .exe binary for DPAPI key protection and Windows Hello biometric. The .exe handles its own daemon lifecycle via --via-daemon flag, avoiding TCP complexity. Size logging: add binary size reporting to Rust and macOS build workflows, and a release archive size summary to build-binaries.ts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Each package's vitest config now has a name so the GitHub Actions test summary shows which package each "Vitest Test Report" belongs to. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ux SEA - Bundle Windows .exe in Linux SEA archives for WSL2 support - Add VARLOCK_DEBUG=1 stderr logging through binary resolution + backend detection - Warn on stderr when falling back to file-based encryption - Add isFileFallback flag to BackendInfo for CLI display Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Cache resolveNativeBinary() result (was called 6x per invocation) - Reuse keys from status response in keyExists() to skip key-exists .exe spawn - Fix daemon spawn polling: simpler pipe_exists check at 50ms intervals - Increase timeout to 60s for WSL2 decrypt (includes Windows Hello prompt) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ping - Restrict named pipe to current user via SECURITY_ATTRIBUTES with DACL (prevents other users from connecting to the daemon) - Pass ciphertext and TTY ID via stdin JSON instead of CLI args (prevents exposure in process listings via tasklist/procfs) - Forward TTY ID to daemon for per-terminal biometric session scoping (extracted from /proc/self/fd/0 symlink in WSL2) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Security: - Verify connecting client process via GetNamedPipeClientProcessId + QueryFullProcessImageName — only allow varlock/node/bun binaries - Add SecureBytes wrapper: VirtualLock/mlock prevents key material from being swapped to disk, zeroize-on-drop clears secrets from memory - Apply SecureBytes to private keys in daemon decrypt and one-shot decrypt Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix regex in writeBackEncryptedValue to match any varlock() call, not just varlock(prompt), so prompt=1 works when a value already exists - Use singleton DaemonClient in prompt path to avoid redundant spawn attempts - Handle cross-process daemon spawn race by retrying connect on spawn failure Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…provements - Add peer identity verification and process validation for IPC connections (Swift + Rust) - Strengthen memory protection for key material with zeroize on drop - Add entitlements file for macOS sandbox/hardened runtime - Update build scripts for universal binary support - Fix CI workflow to use build:universal command Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5677f89 to
7a31401
Compare
…etup - Use PSECURITY_DESCRIPTOR wrapper instead of raw pointers - Use MULTIPLE_TRUSTEE_OPERATION instead of TRUSTEE_FORM for MultipleTrusteeOperation - Replace removed SECURITY_DESCRIPTOR_REVISION and NO_INHERITANCE with literal values Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Member
On WSL2, arguments passed to Windows .exe binaries can get mangled across the interop boundary. Add --data-stdin support for encrypt (matching decrypt), and use it on WSL2 to pass base64 data via stdin. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a new `keychain()` resolver function that reads secrets from the macOS
Keychain via the Swift daemon binary. Supports IT-managed credentials pushed
via MDM, as well as user-created secure notes.
Syntax:
keychain("com.company.service")
keychain(service="com.company.db", account="admin")
keychain(service="com.company.db", keychain="System")
keychain(service="com.company.db", field="account")
keychain(prompt) — interactive picker with create-new flow
Swift binary changes:
- KeychainManager: search, get, add (secure notes), ACL management
- KeychainPickerDialog: native picker with search, ACL auto-fix, create-new
- KeychainLegacy module: isolates deprecated SecKeychain ACL APIs
- IPC actions: keychain-get (biometric-gated), keychain-search, keychain-pick
- Build script auto-detects APPLE_SIGNING_IDENTITY env var
TypeScript changes:
- keychain-resolver.ts: keychain() resolver with get/prompt modes
- daemon-client.ts: keychainGet, keychainSearch, keychainPick methods
- types.ts: keychain action types and interfaces
- env-graph.ts: register KeychainResolver as built-in
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Moves Linux's default private-key protection from TPM2-or-plaintext to the Secret Service (GNOME Keyring / KWallet), with TPM2 automatically layered on top when available for defense-in-depth. Falls back to TPM2-alone on headless hosts with a TPM, and plaintext as a last resort. This makes "just works" the common path on desktop Linux, since Secret Service is available on virtually all mainstream distros while working TPM2 setups are rare. Also adds opt-in biometric unlock via polkit. A new `setup --linux-biometrics` subcommand installs a polkit policy so decrypt prompts go through PAM — picking up whatever factors the user has configured (fingerprint via fprintd, face via Howdy, YubiKey via pam_u2f, or password). The daemon's existing TTY-scoped session cache wraps the polkit check, mirroring the Windows Hello flow. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…mons A .exe launched via WSL2 interop runs in WSL's interop session, which lacks the interactive window-station access UserConsentVerifier needs. Spawning the daemon directly via CreateProcess inherits that broken session and the Windows Hello prompt hangs forever — manifesting as a 60s ETIMEDOUT on the TS side. Route the spawn through `cmd.exe /c start "" /B` so the daemon child lands in the user's interactive desktop session. Also clean up any stale daemon before respawning: when spawn_daemon() runs we already know the pipe was unresponsive, so any process in the pid file (e.g. a hung WSL2-context daemon) needs to go. Verify the PID actually points to varlock-local-encrypt.exe via QueryFullProcessImageName before taskkill, to avoid killing an unrelated process if Windows recycled the PID. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
With DETACHED_PROCESS on cmd.exe, cmd has no console for `start /B` to inherit, so start allocates a visible console for the daemon child. CREATE_NO_WINDOW alone gives cmd a hidden console that /B can use. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…elper A .exe launched via WSL2 interop runs in WSL's interop session, which lacks the interactive Windows desktop access UserConsentVerifier needs. Spawning the daemon from that context produces a hung daemon whose Hello prompt never renders, manifesting as a 60s ETIMEDOUT. Detect WSL2 invocation via inherited env vars (WSL_DISTRO_NAME / WSL_INTEROP) and bail with a clear, copy-pasteable PowerShell command instead of attempting the doomed spawn. The new `start-daemon` subcommand spawns the daemon detached and exits, so users can seed a properly-sessioned daemon from a native Windows terminal in one step. Also: - Bump Windows daemon idle timeout from 30 min to 24 h so WSL2 users rarely need to re-seed the daemon. - Call AllowSetForegroundWindow(ASFW_ANY) before the Hello prompt so it foregrounds itself instead of just flashing in the taskbar (the daemon is windowless, so focus-stealing prevention would otherwise hide the prompt). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sion Replace the WSL2 "run this PowerShell command yourself" workaround with an automatic schtasks-based spawn. `schtasks /Run` launches the task in the user's interactive desktop session, escaping the WSL interop scope that was preventing the Hello prompt from rendering. Zero user intervention in the happy path. Flow: - Detect WSL2 invocation (env vars). - On first run with no daemon, idempotently register a never-firing scheduled task (/SC ONCE /ST 23:59 /F) that invokes the daemon. - Trigger it via /Run, poll the pipe. - On schtasks failure (locked-down corporate machines, etc.) fall back to a clear error with the manual `start-daemon` PowerShell command. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keeps secrets out of shell history by allowing piped input (e.g. `printf '%s' "$SECRET" | varlock encrypt`). Falls back to the interactive hidden-input prompt when stdin is a TTY. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Summary
Adds built-in device-local encryption to varlock via a new
varlock()resolver function and native platform binaries. Encrypted secrets can be stored directly in.envfiles and are automatically decrypted at load time — no external secret manager required.Encryption backends
The best available backend is selected automatically at runtime:
All backends use the same ECIES wire format (P-256 ECDH + HKDF-SHA256 + AES-256-GCM), so encrypted payloads are portable across implementations.
On macOS, the Secure Enclave provides hardware-backed keys that cannot be extracted, with optional biometric gating via Touch ID. On Windows, DPAPI protects keys scoped to the current user with optional Windows Hello biometric verification. On Linux, private keys live in the user's Secret Service keyring (GNOME Keyring / KWallet) and are additionally sealed to the TPM2 chip when one is available — so the "just works" path covers mainstream desktop distros, with defense-in-depth on hardware that supports it. TPM2-alone and plaintext tiers handle headless and minimal environments. A daemon process manages biometric sessions and IPC on all native platforms.
Linux biometric unlock (opt-in)
A new `setup --linux-biometrics` subcommand installs a polkit policy that gates decrypts behind a PAM auth prompt. PAM picks up whatever factors the user has configured — fingerprint via fprintd, face via Howdy, YubiKey via pam_u2f, or just the login password. The daemon's existing TTY-scoped session cache wraps the polkit check, mirroring the Windows Hello flow (prompt on first decrypt per terminal, cached for 5 minutes).
New CLI commands
The `varlock()` resolver
Two modes:
New packages
Local encryption library (`src/lib/local-encrypt/`)
CI/CD
Documentation
Test plan