{"schema_version":2,"product":{"name":"JobOfferMaster","site":"https://joboffermaster.com","trust_page":"https://joboffermaster.com/trust","machine_readable_manifest":"https://joboffermaster.com/trust.json"},"review":{"last_reviewed":"2026-10-18","assurance":"implementation-evidence","independent_security_audit_completed":false,"statement":"These claims reflect the current implementation and browser verification tooling. They are not an independent security audit."},"defaults":{"new_account_storage_mode":"PRIVATE","existing_accounts":"Existing standard-mode accounts may require an explicit migration before all supported records use the private vault."},"cryptography":{"record_encryption":"AES-256-GCM","nonce_bits":96,"authenticated_additional_data":"recordType:logicalId:schemaVersion","account_master_key":"Generated in the browser with Web Crypto","local_key_storage":"Origin-scoped IndexedDB CryptoKey","recovery_key_derivation":{"algorithm":"PBKDF2-HMAC-SHA-256","iterations":250000,"salt_bits":128},"recovery_key_wrapping":"AES-256-GCM","recovery_code_entropy_bits":128},"claims":[{"id":"browser-encryption-before-vault-storage","status":"implemented","statement":"Supported private-vault payloads are encrypted in the browser before they are uploaded for storage.","limitations":["The encrypted payload boundary does not include every metadata field.","User-invoked AI and parsing features can transmit selected plaintext for transient processing.","When server-side practice tracing is enabled, LangSmith retains full job descriptions and PII-redacted resume, prompt, generated question, and preparation content for evaluation."]},{"id":"server-held-data-cannot-unwrap-vault-key","status":"implemented","statement":"The server stores a recovery-wrapped account key, not the raw account master key or recovery code.","limitations":["A compromised browser, extension, unlocked device, or malicious client deployment is outside this storage threat model."]},{"id":"private-mode-default-for-new-sign-ins","status":"implemented","statement":"The current new-account sign-in and setup flow selects Private Mode by default.","limitations":["Existing accounts can contain legacy standard-mode data until migration completes."]},{"id":"ai-plaintext-boundary-disclosed","status":"disclosed","statement":"Private-vault data remains encrypted at rest, but selected decrypted content is processed transiently when a user invokes AI or parsing features.","limitations":["These requests are not end-to-end encrypted from the browser to the model provider.","Enabled practice-generation evaluation traces are retained outside the encrypted vault. Rule-based PII redaction is not a guarantee of anonymity; professional history can remain identifying."]}],"data_boundaries":{"encrypted_before_storage":["Structured profile contents","Application record contents, including descriptions, notes, contacts, and timelines","Resume and cover-letter contents","Quick-note contents","Interview-preparation answers and practice history","Uploaded document contents"],"stored_as_plaintext_or_operational_metadata":["Account identity, provider, session, and storage-mode state","AI token/call counts, estimated costs, feature/model labels, timestamps, and authenticated account ID when available (admin-only usage reports)","When practice tracing is enabled: LangSmith evaluation traces with full job descriptions, PII-redacted resumes/prompts/generated questions and preparation content, opaque generation IDs, model/prompt versions, and usage metrics; retention follows the LangSmith project settings, separately from vault deletion","Record type, opaque logical ID, schema version, and timestamps","Recovery-wrapped key, wrapping nonce, KDF salt, and KDF parameters","Profile has-resume and has-cover-letter flags","Application company, role, status, applied date, job URLs, and record timestamps","Resume name, version, filenames, file type, master and active flags, parent ID, tailoring job and company, usage and outcome counters, and timestamps","Document filename, file type, size counters, source URL, content preview, custom metadata, and timestamps","Quick-note label, type, has-description flag, and timestamps","Interview-question type, category, difficulty, importance, companies, tags, practice counters, and practice timestamps"],"transient_plaintext_processing":["Selected resume and job-description text sent for user-invoked AI analysis or tailoring","Uploaded document contents sent for user-invoked parsing","Selected decrypted vault excerpts sent for user-invoked assistant requests"],"device_only_unless_the_user_exports_or_shares_it":["Raw account master key","Recovery code"]},"threat_model":{"protects_against":["Reading encrypted vault payloads from a database or backup without the account key","Direct plaintext storage of supported private-vault payload fields in encrypted record and blob rows","Undetected ciphertext modification through AES-GCM authentication"],"does_not_protect_against":["Compromise of an unlocked browser, extension, or device","A malicious or compromised client deployment","Plaintext metadata explicitly listed in this manifest","Plaintext selected for a user-invoked AI or parsing request","Loss of both every local key copy and the recovery code"]},"verification":{"browser_self_test":"https://joboffermaster.com/trust#self-test","self_test_scope":["AES-GCM ciphertext differs from the encoded plaintext","Correct-key decryption restores the original payload","Recovery-code unwrapping restores a working account key","Wrong-key decryption fails authentication"],"caveat":"The browser self-test verifies the shipped cryptographic implementation in the current client. It does not prove the absence of every application, infrastructure, or supply-chain vulnerability."}}