Skip to content

feat: improve first interaction workflow#274

Merged
vitonsky merged 79 commits into
masterfrom
273-improve-first-interaction-workflow
Apr 30, 2026
Merged

feat: improve first interaction workflow#274
vitonsky merged 79 commits into
masterfrom
273-improve-first-interaction-workflow

Conversation

@vitonsky

@vitonsky vitonsky commented Apr 20, 2026

Copy link
Copy Markdown
Member

Closes #273

Changes

  • Implemented Welcome Screen
  • The encryption config and encryption initialization is moved into VaultEncryptionController. Now we have single entrypoint to manage the encryption. Added tests against the encryption pipeline and the encryption material zeroing
  • Introduced "in-memory storage" mode for debugging. To enable run localStorage.noStorage = true and reload the window.
  • Implemented the UI to setup the encryption parameters
  • Added the docs page with encryption scheme

TODO

  • Hide the encryption config for spoiler
  • Introduce the control to manage encryption parameters like Argon memory
  • Publish the docs page with the encryption scheme
  • (optional) Split locales in features.json into a many scoped namespaces
  • Translate locales

Summary by CodeRabbit

  • New Features

    • Welcome screen for first-time users featuring language and theme selection.
    • Password strength indicator with visual feedback during vault creation.
    • Advanced encryption configuration with adjustable key derivation memory and operations parameters.
  • Improvements

    • Enhanced vault encryption system with improved security controls.
    • Added success state colors and Progress component theme variants.
    • Expanded localization with new namespaces for encryption and onboarding flows across all supported languages.
  • Tests

    • Comprehensive test coverage for encryption and vault storage operations.

@vitonsky vitonsky linked an issue Apr 20, 2026 that may be closed by this pull request
@coderabbitai

coderabbitai Bot commented Apr 20, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR implements comprehensive vault encryption infrastructure with an onboarding flow, replacing the previous vault management system with a new storage-backed VaultsList design. It introduces password entropy calculation, configurable Argon2 KDF parameters, a first-run welcome screen, multi-language localization updates, theme enhancements, and migrates translation tooling from transmart to transly.

Changes

Cohort / File(s) Summary
Encryption Core
packages/app/src/core/storage/VaultEncryptionController.ts, packages/app/src/core/storage/VaultEncryptionConfig.ts, packages/app/src/core/storage/cryptography.ts
New encryption coordination system with VaultEncryptionController managing vault init/unlock, VaultEncryptionConfig persisting encrypted master keys and KDF parameters, and disposable factories for encryption/KDF operations.
Cryptography Updates
packages/app/src/core/features/encryption/worker/CryptographyUtils.ts, .../CryptographyUtils.worker.ts, .../CryptographyUtils.test.ts, .../index.ts
Extended deriveBits to accept optional Argon2 config (memory/ops), added determinism tests, updated worker and type definitions.
Vault Management Replacement
packages/app/src/core/storage/VaultsList.ts, packages/app/src/core/storage/VaultsList.test.ts, packages/app/src/core/storage/VaultsManager.ts (deleted)
New VaultsList with Zod-backed CRUD operations and state-file persistence, replacing the removed VaultsManager.
State & Serialization
packages/app/src/core/features/files/StateFile.ts, .../StateFile.test.ts, packages/app/src/core/storage/hex.ts, .../hex.test.ts
Updated StateFile to use Zod encode/decode; added hex conversion utilities for binary-to-string serialization in configs.
Legacy Cleanup
packages/app/src/core/encryption/utils/keys.ts (emptied), packages/app/docker/transmart/Dockerfile (deleted), packages/app/compose.yml
Removed deriveBitsFromPassword (replaced by VaultEncryptionController), deleted transmart Docker container setup.
Password Entropy & KDF UI
packages/app/src/features/App/VaultCreator/calculatePasswordEntropy.ts, .../calculatePasswordEntropy.test.ts, .../math.ts, .../math.test.ts, packages/app/src/features/App/VaultCreator/index.tsx
New password entropy calculator with strength classification, UI components for password input with debounced feedback, and collapsible KDF advanced config (memory/ops sliders).
Welcome & Onboarding
packages/app/src/features/App/WelcomeScreen.tsx, packages/app/src/features/App/index.tsx
New WelcomeScreen component for first-run flow with language/theme selection; updated app routing to show welcome before vault creation/selection.
Component Refactoring
packages/app/src/features/App/ChooseVaultScreen.tsx, .../Settings/sections/GeneralSettings.tsx, .../Settings/sections/appearance/Appearance.tsx, packages/app/src/features/App/CenterBox.tsx, packages/app/src/features/App/VaultLoginForm/index.tsx
Extracted LanguagePicker, ThemePicker, AccentColorPicker components; updated vault type references from VaultObjectVaultSummary; added maxWidth prop to CenterBox.
Vault Container & Hook Updates
packages/app/src/features/App/Vaults/hooks/useVaultContainers.ts, packages/app/src/features/App/useVaultsList.ts
Delegated encryption handling to VaultEncryptionController; updated vault types and encryption init logic to use disposable KDF/encryption factories.
Theme & UI
packages/app/src/components/theme/base.ts, packages/app/src/components/theme/color-schemes/generic/dark.ts, .../generic/light.ts, .../zen.ts
Added Progress component theme with success/alert variants; extended typography with accent color; added message.success color to all theme variants.
Localization System
packages/app/src/i18n/index.ts, packages/app/src/i18n/i18n-utils.test.ts, packages/app/src/i18n/DeprecatedKeys.md, packages/app/src/LocalesProvider.tsx
New namespaces (about, encryption, introduction); getPreferredLanguage helper; deprecated keys documentation; updated i18next backend retry config.
Locale Files (Multi-language)
packages/app/src/locales/{ar,bg,ca,cs,da}/*, packages/app/src/locales/ar/settings.json, .../bg/settings.json, .../ca/settings.json, .../cs/settings.json
New translation files for about.json, encryption.json, introduction.json across multiple languages; updated vault.json, features.json, settings.json, menu.json, common.json, workspace.json with revised terminology and new KDF/password descriptions.
Config & Build
eslint.config.ts, package.json, packages/app/package.json, packages/app/.gitignore, packages/app/scripts/webpack/app.ts
Added eslint-plugin-i18next plugin; added transly and bytes dependencies; added .transly to gitignore; updated webpack to filter .transly files from output.
Tests
packages/app/src/core/features/encryption/worker/CryptographyUtils.test.ts, packages/app/src/core/storage/VaultEncryptionController.test.ts, packages/app/src/core/storage/VaultsList.test.ts, packages/app/src/features/App/VaultCreator/calculatePasswordEntropy.test.ts, .../math.test.ts, packages/app/src/i18n/i18n-utils.test.ts
Comprehensive test coverage for encryption determinism, vault CRUD, vault encryption init/unlock, password entropy calculation, and locale utilities.

Sequence Diagram

sequenceDiagram
    participant User
    participant UI as VaultCreator UI
    participant VEC as VaultEncryptionController
    participant KDF as CryptographyUtils (KDF)
    participant Enc as EncryptionController
    participant CFG as VaultEncryptionConfig

    User->>UI: Enter password & KDF params
    User->>UI: Confirm vault creation
    
    UI->>VEC: init({password, keyDerivation, algorithm})
    
    VEC->>KDF: Create disposable KDF
    KDF-->>VEC: deriveBits function (with memory/ops config)
    
    VEC->>KDF: Derive password bits
    KDF-->>VEC: passwordKey
    
    VEC->>Enc: Create disposable encryption
    Enc-->>VEC: EncryptionController instance
    
    VEC->>Enc: Generate random masterKey
    Enc-->>VEC: masterKey bytes
    
    VEC->>Enc: Encrypt masterKey
    Enc-->>VEC: encryptedMasterKey
    
    VEC->>CFG: Write config (algorithm, encryptedMasterKey, salts, KDF params)
    CFG-->>VEC: Config persisted
    
    VEC-->>UI: Init complete
    
    VEC->>KDF: Dispose KDF
    VEC->>Enc: Dispose Encryption
    
    UI-->>User: Vault created successfully
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: Remember opened notes #217: Introduces VaultOpenError and VaultOpenErrorCode enums for vault opening failures; both PRs share encryption/vault-opening error handling patterns at the code level.

Poem

🐰 A vault of secrets, strong and true,
With entropy's dance and ciphers new,
Welcome, dear user, to encrypt your way,
KDF parameters guide the play,
Transly translates, the locales align—
A burrow secure, by design. 🔐

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 63.41% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: improve first interaction workflow' accurately summarizes the main change in this PR, which introduces a Welcome Screen, encryption setup UI, and related features for the first-time user experience.
Linked Issues check ✅ Passed The PR fulfills all primary requirements from #273: implements a Welcome Screen for first-time users with language and appearance configuration, adds UI for advanced encryption parameter setup (Argon memory/ops controls), and updates locales. Guide notes remain as optional/nice-to-have.
Out of Scope Changes check ✅ Passed All changes align with PR objectives. Modifications to core encryption (VaultEncryptionController, CryptographyUtils), storage abstractions (VaultsList, StateFile), UI components, locale files, and configuration are all directly related to implementing the first-interaction workflow and encryption setup requirements.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 273-improve-first-interaction-workflow

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (2)
packages/transly/.env.example (1)

2-5: Align .env.example with dotenv-linter ordering and EOF newline.

This file currently triggers ordering and trailing-newline warnings from static analysis.

Proposed fix
-TEST_E2E_LLM=enabled
-TEST_E2E_LLM_MODELS=openai/gpt-4o-mini,amazon/nova-micro-v1
-OPENAI_API_URL=https://openrouter.ai/api/v1
 OPENAI_API_KEY=
+OPENAI_API_URL=https://openrouter.ai/api/v1
+TEST_E2E_LLM=enabled
+TEST_E2E_LLM_MODELS=openai/gpt-4o-mini,amazon/nova-micro-v1
+
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/transly/.env.example` around lines 2 - 5, Reorder the environment
variables in .env.example into dotenv-linter's canonical ordering and ensure the
file ends with a single EOF newline: sort the keys alphabetically (e.g.,
OPENAI_API_KEY, OPENAI_API_URL, TEST_E2E_LLM, TEST_E2E_LLM_MODELS or follow your
project's configured ordering) remove any trailing spaces, and add a final
newline character so the file ends with one blank line; reference the variable
names TEST_E2E_LLM, TEST_E2E_LLM_MODELS, OPENAI_API_URL, and OPENAI_API_KEY to
locate and update the entries.
packages/transly/README.md (1)

79-84: Add language identifiers to fenced code blocks to satisfy markdownlint (MD040).

Several fenced blocks are unlabeled. Mark them as text (or a specific language) to keep docs lint-clean.

Proposed fix
-```
+```text
 src/locales/
   en/
     common.json
     features.json

- +text
src/locales/
en/
common.json ← source (unchanged)
de/
@@


-```
+```text
.transly-cache/
  common.de.json
  common.fr.json
  common.ja.json

- +text
Usage: transly [options]
@@


-```
+```text
.transly-cache/
  features.de.json
  features.fr.json
  common.de.json
</details>


Also applies to: 113-123, 127-132, 191-200, 247-252

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @packages/transly/README.md around lines 79 - 84, The README.md contains
unlabeled fenced code blocks (directory listings and usage examples) that
trigger markdownlint MD040; update each fenced block (e.g., the blocks showing
"src/locales/ ...", ".transly-cache/ ...", "Usage: transly [options]" and
similar listings) to add a language identifier such as text or bash so the
blocks are explicitly labeled; search for the unlabeled blocks around the
examples and replace the opening backticks with ```text (or a more specific
language) to satisfy MD040 without changing the block contents.


</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against the current code and only fix it if needed.

Inline comments:
In @packages/transly/README.md:

  • Around line 166-173: Update the README field documentation to match the actual
    config schema: replace the outdated "prompt: string" entry with the two config
    keys used in code, "systemPrompt" and "contextPrompt", and describe their
    purposes and expected formats (e.g. systemPrompt = system-level instruction sent
    before each batch, contextPrompt = optional contextual/template text appended or
    prepended to the user payload), including the same example structure used
    elsewhere ({ targetLang, items: [...] }) and the expected JSON response shape;
    reference the identifiers systemPrompt and contextPrompt so readers can map docs
    to the implemented types.

In @packages/transly/src/cache.ts:

  • Around line 41-46: The current readCache logic swallows all fs.access errors
    and treats them as "cache missing"; change the catch in the block that calls
    fs.access(filePath) inside readCache so it only returns {} when the error code
    is 'ENOENT' (file not found) and rethrows any other errors (e.g., EACCES or
    other I/O errors); locate the try/catch around fs.access in readCache (and use
    the caught error's .code property) to implement this selective handling.

In @packages/transly/src/chunker.ts:

  • Around line 21-26: The validation for maxBatchSize only checks <= 0 but allows
    NaN and non-integer values; update the guard to reject NaN and non-integers
    (e.g., use Number.isInteger(maxBatchSize) && maxBatchSize > 0) and throw when
    that fails so chunking (the loop that slices items into chunks) receives a valid
    positive integer; also add a minimal unit test that calls the chunking function
    with decimals and NaN to assert it throws for non-integer maxBatchSize.

In @packages/transly/src/config.ts:

  • Around line 27-28: The config schema currently allows arbitrary values for the
    optional translateChunk and fetch fields; update the schema (configSchema) to
    validate these as functions when present (e.g., use z.function() or an
    equivalent zod validator for callables) so that invalid types are rejected at
    parse time; ensure the validators are applied to the translateChunk and fetch
    entries so code in llm.ts and runner.ts that calls translateChunk(...) and
    fetch(...) will only receive validated functions.
  • Line 29: The configSchema's debug field uses z.coerce.boolean() which treats
    non-empty strings like "false" as true; replace that with explicit parsing that
    accepts booleans and string values ("true"/"false", "1"/"0") and converts them
    deterministically to true/false (e.g., use a union of z.boolean() and z.string()
    with a transform that lowercases and matches explicit strings), update the debug
    schema entry (refer to configSchema and the debug property) accordingly, and add
    a unit test that parses a config object with debug: 'false' and asserts
    parsed.debug === false to prevent regression.

In @packages/transly/src/flatten.ts:

  • Around line 18-25: The flattenJson function currently leaves primitive leaf
    values (numbers, booleans, null, undefined) uncoerced which allows non-string
    values into downstream runTranslation and hashing; update flattenJson (and its
    leaf-handling logic around the current value-coercion code paths) to coerce all
    primitive leaves to strings before storing them in result (or explicitly
    throw/fail-fast on non-stringable values) and add a minimal unit test that
    reproduces flattening a JsonObject with leaves like 3, false, and null to assert
    they become "3", "false", and "null" (or that the function throws as chosen) so
    the translator always receives string values.

In @packages/transly/src/llm.ts:

  • Around line 154-155: The zod schema usage for parsing translations is using
    the removed single-argument form z.record(z.string()), which will fail under Zod
    4; update the validation in llm.ts where translations is created (the const
    translations = ... line) to use the two-argument form z.record(z.string(),
    z.string()) so the schema explicitly validates both keys and values as strings,
    then re-run tests like the provided 'rejects non-string translated values' case
    to confirm it throws for non-string values.

In @packages/transly/src/runner.ts:

  • Around line 64-73: The current catch around fs.access/fs.readFile/JSON.parse
    swallows all errors and treats a corrupted target file as missing; update the
    logic in the block referencing targetPath, existingFlat, flattenJson so that
    only a missing-file error (error.code === 'ENOENT' from fs.access/fs.readFile)
    is treated as "start fresh", while any read/parse errors are rethrown; e.g.,
    first check existence with fs.access or fs.stat and handle the ENOENT case, then
    perform fs.readFile + JSON.parse in a try that rethrows parsing/read errors so
    corrupted JSON is not silently replaced.

In @packages/transly/src/scanner.ts:

  • Around line 51-55: The code naively casts JSON.parse(raw) to Record<string,
    unknown> which can be an array, null, or primitive; update the try block that
    reads and parses the file so after const raw = await fs.readFile(filePath,
    'utf-8'); and const parsed = JSON.parse(raw), you validate that parsed is a
    non-null object and not an array (e.g., typeof parsed === 'object' && parsed !==
    null && !Array.isArray(parsed') ) before assigning to content or throwing a
    clear error; ensure the logic around the NamespaceFile.content consumer uses
    this validated object, and add a minimal unit test (PoC) that feeds an
    array/null/primitive JSON file to the scanner to assert it rejects/throws a
    descriptive error rather than miscasting.

In @packages/transly/tests/e2e/translation.e2e.test.ts:

  • Line 16: The E2E gate boolean is inverted: the variable isE2EEnabled (used by
    describe.skipIf) is computed as process.env.TEST_E2E_LLM !== 'enabled' &&
    process.env.OPENAI_API_KEY which ends up truthy when keys are missing, so tests
    run by default; change to a positive flag (e.g., shouldRunE2E) that checks for
    both TEST_E2E_LLM === 'enabled' or presence of OPENAI_API_KEY as appropriate,
    then pass !shouldRunE2E into skipIf (update all uses: isE2EEnabled,
    describe.skipIf and the later guard before process.env.OPENAI_API_KEY!) so the
    suite is skipped when shouldRunE2E is false and only runs when the environment
    explicitly enables it.

In @packages/transly/tests/translateChunk.test.ts:

  • Line 3: The test suite fails because beforeEach is used but not imported;
    update the top import in translateChunk.test.ts to also import beforeEach from
    'vitest' (the same import line that currently brings in describe, expect, it,
    vi) so the call to beforeEach in the suite (around the block using
    translateChunk/its mocks) is defined.

Nitpick comments:
In @packages/transly/.env.example:

  • Around line 2-5: Reorder the environment variables in .env.example into
    dotenv-linter's canonical ordering and ensure the file ends with a single EOF
    newline: sort the keys alphabetically (e.g., OPENAI_API_KEY, OPENAI_API_URL,
    TEST_E2E_LLM, TEST_E2E_LLM_MODELS or follow your project's configured ordering)
    remove any trailing spaces, and add a final newline character so the file ends
    with one blank line; reference the variable names TEST_E2E_LLM,
    TEST_E2E_LLM_MODELS, OPENAI_API_URL, and OPENAI_API_KEY to locate and update the
    entries.

In @packages/transly/README.md:

  • Around line 79-84: The README.md contains unlabeled fenced code blocks
    (directory listings and usage examples) that trigger markdownlint MD040; update
    each fenced block (e.g., the blocks showing "src/locales/ ...", ".transly-cache/
    ...", "Usage: transly [options]" and similar listings) to add a language
    identifier such as text or bash so the blocks are explicitly labeled;
    search for the unlabeled blocks around the examples and replace the opening
    backticks with ```text (or a more specific language) to satisfy MD040 without
    changing the block contents.

</details>

<details>
<summary>🪄 Autofix (Beta)</summary>

Fix all unresolved CodeRabbit comments on this PR:

- [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended)
- [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: defaults

**Review profile**: CHILL

**Plan**: Pro

**Run ID**: `d7b5da89-f1a7-465f-b859-4ca8588ab6d9`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 682d7c7beea42ac5cc3a675d5da6e887864eef8a and fdae90fdf970112ce8f640ea9d736d0797f475eb.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `package-lock.json` is excluded by `!**/package-lock.json`

</details>

<details>
<summary>📒 Files selected for processing (34)</summary>

* `eslint.config.ts`
* `packages/app/package.json`
* `packages/transly/.env.example`
* `packages/transly/README.md`
* `packages/transly/package.json`
* `packages/transly/src/cache.ts`
* `packages/transly/src/chunker.ts`
* `packages/transly/src/cli.ts`
* `packages/transly/src/config.ts`
* `packages/transly/src/flatJson.test.ts`
* `packages/transly/src/flatten.ts`
* `packages/transly/src/index.ts`
* `packages/transly/src/llm.ts`
* `packages/transly/src/runner.ts`
* `packages/transly/src/scanner.ts`
* `packages/transly/src/types.ts`
* `packages/transly/tests/cache.test.ts`
* `packages/transly/tests/chunker.test.ts`
* `packages/transly/tests/config.test.ts`
* `packages/transly/tests/e2e/translation.e2e.test.ts`
* `packages/transly/tests/filesystem.test.ts`
* `packages/transly/tests/flatten.test.ts`
* `packages/transly/tests/integrational/llm-integration.test.ts`
* `packages/transly/tests/partial-failure.test.ts`
* `packages/transly/tests/pipeline.test.ts`
* `packages/transly/tests/stubs/makeConfig.ts`
* `packages/transly/tests/stubs/makeFetchStub.ts`
* `packages/transly/tests/stubs/makeMemFs.ts`
* `packages/transly/tests/stubs/makeTranslate.ts`
* `packages/transly/tests/translateChunk.test.ts`
* `packages/transly/tsconfig.json`
* `packages/transly/tsdown.config.ts`
* `packages/transly/vitest.config.ts`
* `words.txt`

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (7)</summary>

* packages/app/package.json
* words.txt
* packages/transly/tests/stubs/makeConfig.ts
* packages/transly/tsconfig.json
* packages/transly/vitest.config.ts
* packages/transly/tests/config.test.ts
* packages/transly/package.json

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* eslint.config.ts

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment thread packages/transly/README.md Outdated
Comment thread packages/transly/src/cache.ts Outdated
Comment thread packages/transly/src/chunker.ts Outdated
Comment thread packages/transly/src/config.ts Outdated
Comment thread packages/transly/src/config.ts Outdated
Comment thread packages/transly/src/llm.ts Outdated
Comment thread packages/transly/src/runner.ts Outdated
Comment thread packages/transly/src/scanner.ts Outdated
Comment thread packages/transly/tests/e2e/translation.e2e.test.ts Outdated
Comment thread packages/transly/tests/translateChunk.test.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
packages/app/src/locales/de/vault.json (1)

99-99: Prefer standard German crypto term for KDF label.

“Schlüsselerzeugungsfunktion” on Line 99 is understandable, but “Schlüsselableitungsfunktion” is the more common technical term for KDF in German security docs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/app/src/locales/de/vault.json` at line 99, Replace the German label
for the KDF entry to use the standard technical term: change the value of the
"label" for the KDF/key-derivation entry from "Schlüsselerzeugungsfunktion" to
"Schlüsselableitungsfunktion" so the localization uses the common German crypto
term (locate the JSON object containing the KDF label string and update its
"label" value accordingly).
packages/app/src/locales/ar/vault.json (1)

96-107: Polish Arabic phrasing in advanced encryption descriptions for clarity.

The new keys are good, but a few expressions read non-native/awkward (الأسس للتشفير, المعادة الاستخدام). Consider a light wording pass to improve readability.

Suggested copy refinement
-				"description": "قم بتكوين الأسس للتشفير التي تحمي مساحة التخزين الخاصة بك — تسلسل تشفير، معلمات KDF، والمزيد. لمراجعة كاملة للإعدادات الافتراضية وآثارها، اطلع على <link>كيفية حماية مساحة التخزين الخاصة بك</link>."
+				"description": "قم بتكوين إعدادات التشفير التي تحمي مساحة التخزين الخاصة بك — خوارزمية التشفير، ومعلمات KDF، والمزيد. لمراجعة كاملة للإعدادات الافتراضية وآثارها، اطلع على <link>كيفية حماية مساحة التخزين الخاصة بك</link>."

-				"description": "تساعد في حماية كلمات المرور الضعيفة أو المعادة الاستخدام عن طريق جعل كل تخمين أبطأ وأكثر تكلفة. قم بزيادة هذه الإعدادات للحصول على حماية أقوى، أو احتفظ بالإعدادات الافتراضية للحصول على تجربة متوازنة.",
+				"description": "تساعد في حماية كلمات المرور الضعيفة أو المُعاد استخدامها عبر جعل كل محاولة تخمين أبطأ وأكثر تكلفة. زد هذه الإعدادات للحصول على حماية أقوى، أو اترك الإعدادات الافتراضية للحصول على تجربة متوازنة."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/app/src/locales/ar/vault.json` around lines 96 - 107, Polish several
Arabic copy strings in the vault locale: update the top-level "description"
(under the encryption settings block) to replace the awkward phrase "الأسس
للتشفير" with more natural phrasing like "إعدادات التشفير" and smooth the
sentence flow; in the "kdf" block adjust "المعادة الاستخدام" to "المعاد
استخدامها" and rephrase any clunky constructions in "kdf.description",
"kdf.memory.description", and "kdf.ops.description" to read more natively and
concisely while preserving meaning about memory use, iterations, and tradeoffs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/app/src/locales/ar/vault.json`:
- Line 70: The Arabic string for the "description" key in the locales file is
grammatically awkward ("عبر هذه كلمة المرور"); update the value of the
"description" entry in packages/app/src/locales/ar/vault.json (the "description"
JSON key shown in the diff) to a natural phrasing such as "سيتم تشفير جميع
البيانات في مساحة التخزين عبر كلمة المرور هذه" or "سيتم تشفير جميع البيانات في
مساحة التخزين باستخدام كلمة المرور هذه" so the UI copy reads correctly.

In `@packages/app/src/locales/de/vault.json`:
- Line 70: The German locale uses mixed terminology ("Tresor" vs "Vault") in the
localized strings; update the string value for the "description" key (and the
other occurrence where "Tresor" appears) to use the same product term as the
rest of the file (replace "Tresor" with "Vault" in those JSON values) so the de
vault locale consistently uses "Vault".

---

Nitpick comments:
In `@packages/app/src/locales/ar/vault.json`:
- Around line 96-107: Polish several Arabic copy strings in the vault locale:
update the top-level "description" (under the encryption settings block) to
replace the awkward phrase "الأسس للتشفير" with more natural phrasing like
"إعدادات التشفير" and smooth the sentence flow; in the "kdf" block adjust
"المعادة الاستخدام" to "المعاد استخدامها" and rephrase any clunky constructions
in "kdf.description", "kdf.memory.description", and "kdf.ops.description" to
read more natively and concisely while preserving meaning about memory use,
iterations, and tradeoffs.

In `@packages/app/src/locales/de/vault.json`:
- Line 99: Replace the German label for the KDF entry to use the standard
technical term: change the value of the "label" for the KDF/key-derivation entry
from "Schlüsselerzeugungsfunktion" to "Schlüsselableitungsfunktion" so the
localization uses the common German crypto term (locate the JSON object
containing the KDF label string and update its "label" value accordingly).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1fb7bf78-263b-4e76-acf4-2f3d1e99a7c7

📥 Commits

Reviewing files that changed from the base of the PR and between fdae90f and f30f62f.

⛔ Files ignored due to path filters (211)
  • package-lock.json is excluded by !**/package-lock.json
  • packages/app/src/locales/.cache/000f382715ba00318ee3f904feaac28b8e9edf3d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/02a505193f2c71f9814d5b51692d91157d6ba1db is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/037a9ecf5f53561d1e3c414273f1b2d9351e2e9b is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/03f4df87ab4dbefc991e7301560c59bb1b75c77c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/056ffd8fa923abe5c28b496467b5f39055422586 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0903dd3d06f77c3e8b47d90fc3f77f102f649ba3 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/095de6f0dca259af83e06601e7a58965c61d10dd is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0ac5b763735c151fd317f98290e0e11fcf28bdbd is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0b043b45a5a1157e2042c509092724023bda3430 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0b5ed5e31f23e5dfd7624a4d87c3dadf5f2c07d5 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0c11616b6bdeee8cc49fac43c35800e73bc391af is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0d3a91e0f3892d34f64caa163924abad8a9f64eb is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0e007ebad58e4ce9110e0a26831cb2fbb7fad24c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/0eeb7d05f9501fb5488429dcf88e5b8dab284d94 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/10ec2cc1fe6b92a5acb60bf865b678c821385f7f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/113ee65da4526a32bdb03fc4f053fcb7973c0391 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/12a64e526d24710825429ff1b676fc9a5a0c0178 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/12eb83a9e335774893e37182eefd64e1ecbb769d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/131e2feba558b8b5fe71e973b6c23e015d97cac1 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/158d839695955879b535ac99baa7cbb9a8fbbe1e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/15f3a672244c80b3b633bbf330c8208251a2ced6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/17539a45715d3a6d9d4941c5cb939edc9e5bae15 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/1794476b385b5a17af58eb93ff8c90df9b04b876 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/19cfe5e64c2dfe1d40a656e2ed8409acaf29413d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/1bd71a0c284022f34150e96f1b93194c67ade961 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/1d3aeec3f98a244695b1d017de7578ec21cf19f0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/1fbfe0cb9ef15cb48c586ad3830c08444e143168 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/20876391f79b03d650b187b81eb1f21e40a9676c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/223142b2d32675aba3a5c916159cb484df1e4378 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/23174cabe7acc22d491c9977edf8b1e6f5fd15f9 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2543cf30458b176ee543a50e4074ddffd8414fbb is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/26953924daef4dcf46ae3dbe8f756704a58b6a0d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/290980252c988f8aaf0cc9cb9c8323ee915166a3 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/293679e78ba7c9621f7a216b6d7347dbf9aa0322 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2974ff823984f325ea98bd23408d532d803b2bd0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2acb2637250fea136f4d4669e13a55bcb6e5857f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2b863b51a4a8c804e62d0fec2332453c7f5fd389 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2b93f7dde7f8e9f56d33f178c581cb61def1c008 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2c7463f1e30938551ce79609836e4524e96505d6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2c9d2d0076af8306f89b930670cafd0e796cd13c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2d63c75ab5dda34b792f2e6b2099907f823808fc is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/2e9b3d0c993e3c7792ee0793227ecf83f4221a26 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/303c15769837a9b6fcb3a91b99000e6b01ee6910 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/30a88a2167ba40b7dbd2efd09d7e18c59eb5f462 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/30ee3470cee74b0caa58a320eb2e1c0e63b46276 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/31a1b3d97b53ab10e52d5ea3cc592db62e6ee032 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/335f73bd898d7537c38259de93551e5904de6f3c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/34f29f969f39fa5de790d15d202fd007b998c3de is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/35ad616d804e276e119179e76d85a41b36cf869b is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/36c083ff5aa97b712e5bbb6c754f6773b904a330 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3731fa647c6ae1fc9c4055d57171c27432e7880a is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3952a4eb50a53ba41632dc84ac8f32cea64d9cf0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3b60a13e6cc1d4f11f99be56429cbc9eb70101aa is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3c8700501962db15a9a50012beabb01ee91f20a6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3d8d909bb88868ae5a0fa6e84405d6e3bc83a3c9 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3e65e1dc2c53188fce9e2fd6fc4d306ebb8baac7 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/3ff67607c395923cbeb1b6d423945ca349023e86 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/411c96a6351b3d1c3886ab80b6b440136676faba is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/41b5a6d20de9a029cecb8323b4b59987656e95f8 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/41f0c196e12fb36996ae2e560ebc8da17559f7ca is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/43ade612e3a21c0b826b41e88742bb10cac9426e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/462ba11e1c9850af1e0e2eaa114320f93c493718 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/467aff8ed174044b8a4fe0e9a6bb4b5e43e60553 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/46bb7c725c98593f6cc0b37ad59d1e8411a83f1c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/48a8ec18769090d7ef3b36a59f7c4d73cd7be09c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/48bdba186c3c91a757ab00713a89485e3fecc1b4 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/499bbf3be2efdaacbb26a71898ec622b71c0ab6c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/4a3cea3fc97fb8a7a5715f694aee2ab43e04f94d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/4d97abdf2d7bef412db0468fcac916afbdbc2df0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/4df5cdd1d1e5cf6ce62c9ecfbbfdd2fefda61590 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/502cbec0a01c781377c051906d3420a01f4b7aed is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/5473594c14e9eb79b0fcf185e97b4deb2e4cfb9f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/55f9d36d1667558949f16403e8a9eb1907fa05d5 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/564fdb4cbd8a74b60f4d5228be0a46ac5e62b16d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/5705bfd880ab4a522914cd6db0e56339a3ee5c51 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/5972127782aedf244dcea7d12e30fdad66c3e2d7 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/5a4acf5e17277dccef11b54a533e4ea420d2ec9c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/5d0a6c399e834db0086886ff0f42ee733469c883 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/5eb83c6c602f819739b263db095aa2e6560a8ece is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/604d64463557ea00204a2a1fee2e18cd68c055c6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/62792abdc27f88ad7e27a9e1b2be9ed57db1d87e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/63980de9319a148c4dfffca7ca17bf54588da633 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/64fccd6c670186ebf67405ed2580c1d92c4898bc is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/66056705e3a6db74383a23532fb270ab313fd2ec is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6628168ebab11c6a6702db5d9850a08df7a921ab is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/66768920fccb9a1f6831197aa28039d70fd8a984 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6791810b05676b18779e1909fd29c19a77fd3cd6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6a3da933a182bd2e7c0a718f7cef01b0aa34f7e2 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6b4ac9a8ec1f052b2c84bc17fc3347fae5df0f25 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6bfbf5b7dff94c109c47ffa4ac37f295b1d7ba1e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6dfa382ab09d3270af19dd6822467e89bf11b89f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6e5a8cf14c78d74ca603a88ea84712e8be9d5143 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/6f8ac32c0bf849ac9fdbf1c32df3384bebcd7777 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7245627312738513cf6c1eb4ec6c9d5ff42a2065 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/74a5fec3acd065f4de8a24ee4a3212fed0d008e8 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/75be221e38d3624b7e5bbfa896fa4234361626f5 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/77c0b3c9cdcfbf3d3447b9d458d0e31e139b8466 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/798113fd04ad22bd817addce4ef4577855d3332f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7a4d4579910615b449ab9361b6924e049291b8ec is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7c07c40f70c900b892311d45922f6bf34ab3e22d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7cf10a6a883420ad077efabb82d50441d984a4d8 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7e632c30226e82690813a769e3506ed6e31286dd is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7ed649bad6c0c3c8e172135ff7779f0829473f2c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7eebb7af355121ff74356ac8e06ba5e3b9d91073 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7f203784fc2ffbd7755662b82b5ed8d5233ef1d6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7f2dd9b5b605c8286e41299968e2af20fb2ad10d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/7fcee17ed32367a9817ac7edd24eee955dc372f0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/8020290fe0057eb53be199544b89d2b7b6e2928c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/80300f445915388f65b306d03f3886ac9a791d09 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/805ea4ed27af0abf8cb93a2c5acf2214ccbde6ea is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/812ecc391ac9ab62e7c44c585ba7c41463721ad7 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/837fd9f2b0592092824abf38a75cafbdb6d31518 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/845080e14c7c41b46abba5490d3ea6b5f5ead77b is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/84e1acc0e6f531f53af7cf4a0ae5a0d32b702f8a is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/86e7de4d0bf20c08c8c481e101d85884f8e835bf is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/87108a673e6116968b3a4354eefbc1006c68024c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/889c8c609f71dd9f3b0ea04e59d3398db5655702 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/88ea1811fcac2f824fa78045cec09a167731f87b is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/89bfce65016e74403bdb912acb46e1724e29ef3c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/8c45c03a950112bd27acc62c1a6acabaa29adecc is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/8fc61384fa3bc4d1cb2c4365915c6319daee476f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9084089d415128235b50b61479866ffb838ee8b0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/90d8336db9a88e1092f21d8731323a7f6a49ac02 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9658b635b7a22e1c984878a19f11aafb758352aa is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/96c043b12b50079fda16713c8da2689116594ee2 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9736c79747bbe06615489c1865132aa927515884 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/97f5b885a26c97495c1cd1f08d9440e8b7a16b45 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/98367ecd1b1a48f50b1cacd78d2a128956c52672 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/98d148d19fdbf5cb55c383202d912c10dedcfd0d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/990b92ec3771aa8bed7da9ed828f52f8d804d1e8 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9b495579e20c0916d23aa94a4a8fdb6430f4296f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9c6190ea91db45c710be41fc02d6eba801e48fe4 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9d049f8e7163c77e0b0f3cd55331a4c15cb53cec is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9e82f0795aa6becc386e9f5d00acdd006397ffef is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/9f5f5234a63509d52e9b10124402b5de522bea7c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/a28319364659b63d74f8a9ffe2334cccad0616b0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/a4361d08ce241278a1bb1ba63226b8e6eb2435c8 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/a6dd7a67b97bd01ae1d2f05bf1e79afdee3c1140 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/a86f908cfc860d32ab0e25ffcc670db7bc49ad7f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/a8dd21006fc22ab432135ad9b38f8dc6d0279871 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/a93923d3107a7068fb8c37834c03c6ead9ec9dfa is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/aa4b3a5a97af0e0070ae27ec8a85cd3594ffafeb is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ab0fa1a55156f91919c35f044b6c683472892ac3 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/abe1e82a3ef314496a4b0a5fcae712eb9c894466 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ad3b247a76d5037bbd92716f481171c9243509a6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/adfca0b33fec2feebed6fc2b04c8bbcf4be8f7ab is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b187aa7a9cbb0cbd609dbd8221029b6f0bbb8758 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b324b5045d39a10bbb8c13120a20187776e80289 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b3df997618857851b9a343ac02ebd10093b8ac1b is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b44e8f74e7ba120de1d832024820fecfe8e0c236 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b5f0e630367d5c1a26cad288378fd2c38aa2c078 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b63d519358af9c4aed1b7fbcbd4a2e426b97931a is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b71088bd26a5e07753fe69d791d1be70068b559d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b7baa8c93e02e9f000a261ee024c0e191dc8564f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b8dd12ff950dab772b0f1ffab13855ac7844ff56 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/b94f09295a97d2d479a3b28f4de5670fe8d3c74d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ba4a3365fc01fcb9a0822db992d98505349725c2 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/bb35d3b857506ce3989fb557dae537395973b164 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/bbebab58aea1d2b995f218456e36b7df6ec7d39e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/bc506d5fe1f2b180db90e5c22340cf965f635c81 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/be2f1418acd4ea2195a94810e62efcd674ca3608 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/bf2ea01d1a93aec785762290bd2cd11aa3c13bae is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c046bd5ace6d4391df8f8d30a8afda43ce24deb6 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c0ea8bdaaa2fff5633642537329c4a9ecf614f53 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c113339aaf8783ef8a22d0c41c29ab773b19061d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c2d81e38ad4e2e991ab78988a919b62496a7cbec is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c31512f51550b60f73ecd5696865eb1696767af4 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c449563fb0eb089596470657007806c1ff638823 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c58ed661e0ed9795d9f1ee91a832a2b8c8a2e00c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c606a8834e58d3dde0b14be0b4e933ad1c82998d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c898dade1013c39e69c7923932308c15dd9a82f7 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/c9b6a313c6ae58a22300f0ce5898300092840bde is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ca5fbe3526cfc70641c49d3edffb62d62b69c8e0 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/cd15a609ee9136b21e96263f06a156e350891db2 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d312ba3233641288b8627f6eea19b9c590a9c87f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d3d891e242b6259fa7c20f9bdf50e5fc136844cd is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d420d83826b5e2964104d1a170dfb0969cbae2bd is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d46a83a57a741e0aa6b170d0fd56731e3fa0fe1f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d74e30ef84c3f0c77fc330b0965d30b0cb83c6df is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d7b8aa9b9a49b7a7d622b578be499513eed50e32 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/d812e260b310bfd0a668e580e73223c0f688c90e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/da3e9c24ac42d195c382e95cace300f0f21b2943 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/db6f286eb210d9d4a79c512f9f2fe84f269d61d8 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/dc5e0d76ce5171e92a93f5f4380f94029d571868 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/dd17734bfec2edab14686d3bf70ac7134699c606 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e02e29045206a420484d9a740b413903bf543d8b is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e095eb28ce90498d93f2dd2e21f326ffcb950429 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e0fe957cac111570d4a0af02cf60301489041b9e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e297ce85f2c94e53550ed58fba94785fb3e5a927 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e4f8b0dcb755d26b4e3621f6977b795a411be59d is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e53c90433403e2fc2f1c63f0dde82f8450d93fb3 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e6e39df2eb9e9c3ee2a77e9d5f8ad4f1fe6a909f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/e9b119f2f84ff9a07539f53026da0aacf107e0f5 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ea81cf5a2d92ab64855522ab1020be2608363e70 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/eaa95d25918b1bf6f885aaaa6c830cfb10396084 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/eb554f0d82cb743d58f79ad076ea33a29da71fac is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ebf116495baaddbb2ef3444b6d75361dc5a93c3c is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/ecc9288384691ff36690bb69836227926264ddeb is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/f253c5f626705b4e2edeb73358dfaf6f7a85c015 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/f43973cc8c54606502a1bb23005f5e7fe56ed068 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/f4d5380d6cd5d11dbcfc52a0d6f03c3681837c62 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/f7753e841ad6edb4419344650df556484f2c56a9 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/f89b16398463e504893b4461d5a6a6f0953c6f88 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fc4aa342da0c7bef9e1c111f1c9fd131143fda00 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fcb50d39f71537c566942502a98f0d52bcbc657e is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fcbefc81927df9e1acab8639442ce17d7ea16a5f is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fcd1921260359f153f4506c891356e7d95da3706 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fcd73ab67d5aafca358e1d950be4b98aff1f7086 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fd8d31659f7a8942a5e40afd7e6eead7fb9fec26 is excluded by !**/.cache/**
  • packages/app/src/locales/.cache/fe5d7b5d83980faa4ee6d2e4aae7f169f01ef492 is excluded by !**/.cache/**
📒 Files selected for processing (39)
  • packages/app/.gitignore
  • packages/app/compose.yml
  • packages/app/docker/transmart/Dockerfile
  • packages/app/package.json
  • packages/app/src/locales/ar/about.json
  • packages/app/src/locales/ar/encryption.json
  • packages/app/src/locales/ar/features.json
  • packages/app/src/locales/ar/introduction.json
  • packages/app/src/locales/ar/vault.json
  • packages/app/src/locales/bg/about.json
  • packages/app/src/locales/bg/encryption.json
  • packages/app/src/locales/bg/features.json
  • packages/app/src/locales/bg/introduction.json
  • packages/app/src/locales/bg/vault.json
  • packages/app/src/locales/ca/about.json
  • packages/app/src/locales/ca/encryption.json
  • packages/app/src/locales/ca/features.json
  • packages/app/src/locales/ca/introduction.json
  • packages/app/src/locales/ca/vault.json
  • packages/app/src/locales/cs/about.json
  • packages/app/src/locales/cs/encryption.json
  • packages/app/src/locales/cs/features.json
  • packages/app/src/locales/cs/introduction.json
  • packages/app/src/locales/cs/vault.json
  • packages/app/src/locales/da/about.json
  • packages/app/src/locales/da/encryption.json
  • packages/app/src/locales/da/features.json
  • packages/app/src/locales/da/introduction.json
  • packages/app/src/locales/da/vault.json
  • packages/app/src/locales/de/about.json
  • packages/app/src/locales/de/encryption.json
  • packages/app/src/locales/de/features.json
  • packages/app/src/locales/de/introduction.json
  • packages/app/src/locales/de/vault.json
  • packages/app/src/locales/el/about.json
  • packages/app/src/locales/el/encryption.json
  • packages/app/src/locales/el/features.json
  • packages/app/src/locales/el/introduction.json
  • packages/app/src/locales/el/vault.json
💤 Files with no reviewable changes (2)
  • packages/app/compose.yml
  • packages/app/docker/transmart/Dockerfile
✅ Files skipped from review due to trivial changes (33)
  • packages/app/.gitignore
  • packages/app/src/locales/da/about.json
  • packages/app/src/locales/bg/encryption.json
  • packages/app/src/locales/de/encryption.json
  • packages/app/src/locales/ar/about.json
  • packages/app/src/locales/ca/about.json
  • packages/app/src/locales/bg/introduction.json
  • packages/app/src/locales/ar/introduction.json
  • packages/app/src/locales/ar/encryption.json
  • packages/app/src/locales/de/about.json
  • packages/app/src/locales/el/introduction.json
  • packages/app/src/locales/bg/about.json
  • packages/app/src/locales/el/features.json
  • packages/app/src/locales/ca/encryption.json
  • packages/app/src/locales/da/encryption.json
  • packages/app/src/locales/da/introduction.json
  • packages/app/src/locales/de/features.json
  • packages/app/src/locales/cs/features.json
  • packages/app/src/locales/ca/introduction.json
  • packages/app/src/locales/de/introduction.json
  • packages/app/src/locales/cs/encryption.json
  • packages/app/src/locales/bg/features.json
  • packages/app/src/locales/el/about.json
  • packages/app/src/locales/ar/features.json
  • packages/app/src/locales/cs/vault.json
  • packages/app/src/locales/ca/features.json
  • packages/app/src/locales/ca/vault.json
  • packages/app/src/locales/da/features.json
  • packages/app/src/locales/da/vault.json
  • packages/app/src/locales/bg/vault.json
  • packages/app/src/locales/cs/about.json
  • packages/app/src/locales/el/encryption.json
  • packages/app/src/locales/cs/introduction.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/app/package.json

Comment thread packages/app/src/locales/ar/vault.json Outdated
Comment thread packages/app/src/locales/de/vault.json Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
packages/app/src/features/App/VaultCreator/index.tsx (1)

436-442: Keep the docs link from kicking users out of the setup flow.

Opening this help link in the current tab can discard the vault name/password/KDF values the user already entered. Please open it separately.

Small tweak
 								components={{
 									encryption: (
-										<Link href="https://deepink.io/introduction/encryption/" />
+										<Link
+											href="https://deepink.io/introduction/encryption/"
+											target="_blank"
+											rel="noopener noreferrer"
+										/>
 									),
 								}}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/app/src/features/App/VaultCreator/index.tsx` around lines 436 - 442,
The docs Link inside the Trans component currently opens in the same tab and can
discard form state; update the Link element used in VaultCreator (the Link
passed as the "encryption" component in Trans) to open in a new tab by adding
target="_blank" and rel="noopener noreferrer" (or the framework-equivalent
props) so the help URL opens separately and doesn't interrupt the setup flow.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/app/src/features/App/VaultCreator/index.tsx`:
- Around line 244-255: The create handler can be invoked twice before
setIsPending(true) re-renders, causing duplicate onCreateVault calls; add a
synchronous submission lock (e.g., a ref like isSubmittingRef or a module-level
boolean) checked at start of the submit flow and set to true immediately before
awaiting onCreateVault, then reset only after the async completes/fails; update
the submit function that calls onCreateVault (and references setIsPending,
vaultName, usePassword, algorithm, password, argonOps, argonMemory) to bail
early if the lock is set so rapid double-clicks only trigger one onCreateVault
invocation.

In `@packages/app/src/locales/de/vault.json`:
- Around line 95-96: The German description string for the "description" key
contains an English/typoed term "Verschlüsselungscascade" — replace it with the
correct German term "Verschlüsselungskaskade" (or "Verschlüsselungskaskaden" if
plural) inside the same "description" JSON value so the sentence remains fully
German and grammatically correct while preserving the surrounding markup like
<encryption>.

---

Nitpick comments:
In `@packages/app/src/features/App/VaultCreator/index.tsx`:
- Around line 436-442: The docs Link inside the Trans component currently opens
in the same tab and can discard form state; update the Link element used in
VaultCreator (the Link passed as the "encryption" component in Trans) to open in
a new tab by adding target="_blank" and rel="noopener noreferrer" (or the
framework-equivalent props) so the help URL opens separately and doesn't
interrupt the setup flow.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bfb559b3-38e2-46b9-bc5c-c1855aa396cd

📥 Commits

Reviewing files that changed from the base of the PR and between f30f62f and 0c97696.

📒 Files selected for processing (18)
  • packages/app/scripts/webpack/app.ts
  • packages/app/src/core/features/files/StateFile.ts
  • packages/app/src/features/App/ChooseVaultScreen.tsx
  • packages/app/src/features/App/VaultCreator/index.tsx
  • packages/app/src/features/App/Vaults/hooks/useVaultContainers.ts
  • packages/app/src/i18n/index.ts
  • packages/app/src/locales/ar/settings.json
  • packages/app/src/locales/ar/vault.json
  • packages/app/src/locales/bg/settings.json
  • packages/app/src/locales/bg/vault.json
  • packages/app/src/locales/ca/settings.json
  • packages/app/src/locales/ca/vault.json
  • packages/app/src/locales/cs/settings.json
  • packages/app/src/locales/cs/vault.json
  • packages/app/src/locales/da/settings.json
  • packages/app/src/locales/da/vault.json
  • packages/app/src/locales/de/settings.json
  • packages/app/src/locales/de/vault.json
✅ Files skipped from review due to trivial changes (8)
  • packages/app/scripts/webpack/app.ts
  • packages/app/src/locales/ar/settings.json
  • packages/app/src/locales/bg/settings.json
  • packages/app/src/locales/ca/settings.json
  • packages/app/src/locales/cs/settings.json
  • packages/app/src/locales/cs/vault.json
  • packages/app/src/locales/da/settings.json
  • packages/app/src/locales/de/settings.json
🚧 Files skipped from review as they are similar to previous changes (7)
  • packages/app/src/locales/ar/vault.json
  • packages/app/src/locales/ca/vault.json
  • packages/app/src/locales/bg/vault.json
  • packages/app/src/locales/da/vault.json
  • packages/app/src/i18n/index.ts
  • packages/app/src/features/App/ChooseVaultScreen.tsx
  • packages/app/src/core/features/files/StateFile.ts

Comment thread packages/app/src/features/App/VaultCreator/index.tsx
Comment thread packages/app/src/locales/de/vault.json Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/app/src/locales/ca/menu.json`:
- Line 10: Update the Catalan translation for the "paste" key in menu.json:
replace the misspelled value "Enganxer" with the correct infinitive "Enganxar"
to match the neighboring action labels and maintain consistent infinitive-style
verbs for menu actions (key: "paste").

In `@packages/app/src/locales/cs/vault.json`:
- Line 100: Update the Czech KDF description string (the "description" JSON
value for the KDF entry) to correct the grammar by replacing "každou pokus" with
"každý pokus" so the sentence reads correctly; keep the rest of the text
unchanged.
- Around line 48-57: Update the two Czech vault name strings: replace the value
for key "32" currently "Měkká atlas" with the grammatically correct "Měkký
atlas", and replace the value for key "41" currently "Nevypowídaný archiv" with
the corrected spelling "Nevypovídaný archiv"; edit the JSON entries for keys
"32" and "41" accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bc6035ea-c64c-4af5-b200-04955395cc44

📥 Commits

Reviewing files that changed from the base of the PR and between 0c97696 and 8b82280.

📒 Files selected for processing (35)
  • packages/app/src/locales/ar/about.json
  • packages/app/src/locales/ar/common.json
  • packages/app/src/locales/ar/encryption.json
  • packages/app/src/locales/ar/features.json
  • packages/app/src/locales/ar/introduction.json
  • packages/app/src/locales/ar/menu.json
  • packages/app/src/locales/ar/settings.json
  • packages/app/src/locales/ar/vault.json
  • packages/app/src/locales/ar/workspace.json
  • packages/app/src/locales/bg/about.json
  • packages/app/src/locales/bg/common.json
  • packages/app/src/locales/bg/encryption.json
  • packages/app/src/locales/bg/features.json
  • packages/app/src/locales/bg/introduction.json
  • packages/app/src/locales/bg/menu.json
  • packages/app/src/locales/bg/settings.json
  • packages/app/src/locales/bg/vault.json
  • packages/app/src/locales/bg/workspace.json
  • packages/app/src/locales/ca/common.json
  • packages/app/src/locales/ca/encryption.json
  • packages/app/src/locales/ca/features.json
  • packages/app/src/locales/ca/introduction.json
  • packages/app/src/locales/ca/menu.json
  • packages/app/src/locales/ca/settings.json
  • packages/app/src/locales/ca/vault.json
  • packages/app/src/locales/ca/workspace.json
  • packages/app/src/locales/cs/common.json
  • packages/app/src/locales/cs/encryption.json
  • packages/app/src/locales/cs/features.json
  • packages/app/src/locales/cs/introduction.json
  • packages/app/src/locales/cs/menu.json
  • packages/app/src/locales/cs/settings.json
  • packages/app/src/locales/cs/vault.json
  • packages/app/src/locales/cs/workspace.json
  • packages/app/src/locales/da/about.json
✅ Files skipped from review due to trivial changes (21)
  • packages/app/src/locales/bg/encryption.json
  • packages/app/src/locales/ca/encryption.json
  • packages/app/src/locales/cs/common.json
  • packages/app/src/locales/cs/workspace.json
  • packages/app/src/locales/bg/common.json
  • packages/app/src/locales/ar/workspace.json
  • packages/app/src/locales/ar/encryption.json
  • packages/app/src/locales/ar/common.json
  • packages/app/src/locales/bg/about.json
  • packages/app/src/locales/cs/introduction.json
  • packages/app/src/locales/ar/about.json
  • packages/app/src/locales/da/about.json
  • packages/app/src/locales/cs/encryption.json
  • packages/app/src/locales/ca/common.json
  • packages/app/src/locales/ar/introduction.json
  • packages/app/src/locales/bg/workspace.json
  • packages/app/src/locales/ca/workspace.json
  • packages/app/src/locales/cs/menu.json
  • packages/app/src/locales/bg/menu.json
  • packages/app/src/locales/bg/introduction.json
  • packages/app/src/locales/ar/menu.json
🚧 Files skipped from review as they are similar to previous changes (11)
  • packages/app/src/locales/ca/introduction.json
  • packages/app/src/locales/ar/vault.json
  • packages/app/src/locales/ca/vault.json
  • packages/app/src/locales/ca/settings.json
  • packages/app/src/locales/cs/features.json
  • packages/app/src/locales/cs/settings.json
  • packages/app/src/locales/ar/settings.json
  • packages/app/src/locales/ar/features.json
  • packages/app/src/locales/bg/settings.json
  • packages/app/src/locales/ca/features.json
  • packages/app/src/locales/bg/features.json

Comment thread packages/app/src/locales/ca/menu.json
Comment thread packages/app/src/locales/cs/vault.json
Comment thread packages/app/src/locales/cs/vault.json
@vitonsky vitonsky merged commit 5aef233 into master Apr 30, 2026
6 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request May 15, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve first interaction workflow

1 participant