diff --git a/CLAUDE.md b/CLAUDE.md
index 20ec08d..cf02427 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -35,6 +35,7 @@ js/argon2.js (IIFE, globalThis.NobleArgon2)
js/app.crypto.js (KDF, verifier, encrypt/decrypt — extrait §3.1)
js/app.totp.js (TOTP RFC 6238 + TOTP/custom-field crypto — extrait §3.1)
js/app.import.js (export container + import CSV/JSON — extrait §3.1)
+js/app.backup.js (auto-backup planifié — extrait §3.1)
js/app.js (le reste : state, Bridge, api, UI…)
js/app.sync.js (WebDAV + merge — extrait §3.1, APRÈS app.js car
effet de bord top-level `Bridge.onWebdavResult = …`)
@@ -103,6 +104,7 @@ seule `api()` est stubbée).
| Crypto frontend (KDF, verifier, AES-GCM) — extrait §3.1 | `js/app.crypto.js` |
| TOTP (RFC 6238) + TOTP/custom-field crypto — extrait §3.1 | `js/app.totp.js` |
| Import/export frontend (CSV/JSON parse, export container) — extrait §3.1 | `js/app.import.js` |
+| Auto-backup frontend (planifié, chiffré) — extrait §3.1 | `js/app.backup.js` |
| Sync frontend (WebDAV, snapshot, merge) — extrait §3.1 | `js/app.sync.js` |
| Argon2id vendé (bundle `@noble/hashes`, IIFE) | `js/argon2.js` |
| HTML racine | `index.html` |
diff --git a/CODE_AUDIT.md b/CODE_AUDIT.md
index f003f40..fbff5eb 100644
--- a/CODE_AUDIT.md
+++ b/CODE_AUDIT.md
@@ -236,10 +236,13 @@ réécriture des call-sites, risque quasi nul vs conversion en modules ES).
- ✅ `js/app.totp.js` extrait (TOTP RFC 6238 + crypto TOTP/custom-fields) —
byte-for-byte identique, chargé AVANT app.js. **+13 tests TOTP (vecteurs
RFC 6238)** ajoutés en même temps → extraction *et* nouvelle couverture.
-- `app.js` : 11 936 → **10 138 lignes** (crypto + totp + sync + import sortis).
+- ✅ `js/app.backup.js` extrait (auto-backup planifié) — byte-for-byte
+ identique, chargé AVANT app.js (pures déclarations).
+- `app.js` : 11 936 → **9 900 lignes** (crypto + totp + import + backup + sync
+ sortis — 5 modules).
- Suite de tests : 42 → **55 tests**.
- Reste à extraire (grosses sections cohésives) : slideover, settings,
- quicksearch, autofill, auto-backup, favicons…
+ quicksearch, autofill, favicons, vault-health…
- ✅ `node --check` en pré-étape de `BuildAssets.ps1` : **déjà fait** (cf. §3.2).
### 3.2 🟡 Aucun test automatisé — **partiellement adressé (2026-07-04)**
diff --git a/delphi-backend/assets/BuildAssets.ps1 b/delphi-backend/assets/BuildAssets.ps1
index a1745d3..e9a955b 100644
--- a/delphi-backend/assets/BuildAssets.ps1
+++ b/delphi-backend/assets/BuildAssets.ps1
@@ -55,6 +55,7 @@ $patterns = @(
'js\app.crypto.js',
'js\app.totp.js',
'js\app.import.js',
+ 'js\app.backup.js',
'js\app.js',
'js\app.sync.js',
'css\style.css'
diff --git a/delphi-backend/assets/assets.inc b/delphi-backend/assets/assets.inc
index f3742f6..13111a1 100644
--- a/delphi-backend/assets/assets.inc
+++ b/delphi-backend/assets/assets.inc
@@ -1,12 +1,13 @@
// Auto-generated by BuildAssets.ps1 - do not edit by hand.
const
- EMBEDDED_ASSET_COUNT = 8;
+ EMBEDDED_ASSET_COUNT = 9;
EMBEDDED_ASSETS: array[0..EMBEDDED_ASSET_COUNT-1] of TEmbeddedAsset = (
(UrlPath: '/index.html'; ResName: 'INDEX_HTML'),
(UrlPath: '/js/argon2.js'; ResName: 'JS_ARGON2_JS'),
(UrlPath: '/js/app.crypto.js'; ResName: 'JS_APP_CRYPTO_JS'),
(UrlPath: '/js/app.totp.js'; ResName: 'JS_APP_TOTP_JS'),
(UrlPath: '/js/app.import.js'; ResName: 'JS_APP_IMPORT_JS'),
+ (UrlPath: '/js/app.backup.js'; ResName: 'JS_APP_BACKUP_JS'),
(UrlPath: '/js/app.js'; ResName: 'JS_APP_JS'),
(UrlPath: '/js/app.sync.js'; ResName: 'JS_APP_SYNC_JS'),
(UrlPath: '/css/style.css'; ResName: 'CSS_STYLE_CSS')
diff --git a/delphi-backend/assets/assets.rc b/delphi-backend/assets/assets.rc
index a00d2ff..bd8fde6 100644
--- a/delphi-backend/assets/assets.rc
+++ b/delphi-backend/assets/assets.rc
@@ -6,6 +6,7 @@ JS_ARGON2_JS RCDATA "Z:\\password-manager\\js\\argon2.js"
JS_APP_CRYPTO_JS RCDATA "Z:\\password-manager\\js\\app.crypto.js"
JS_APP_TOTP_JS RCDATA "Z:\\password-manager\\js\\app.totp.js"
JS_APP_IMPORT_JS RCDATA "Z:\\password-manager\\js\\app.import.js"
+JS_APP_BACKUP_JS RCDATA "Z:\\password-manager\\js\\app.backup.js"
JS_APP_JS RCDATA "Z:\\password-manager\\js\\app.js"
JS_APP_SYNC_JS RCDATA "Z:\\password-manager\\js\\app.sync.js"
CSS_STYLE_CSS RCDATA "Z:\\password-manager\\css\\style.css"
diff --git a/delphi-backend/assets/assets.res b/delphi-backend/assets/assets.res
index 81c3200..337a805 100644
Binary files a/delphi-backend/assets/assets.res and b/delphi-backend/assets/assets.res differ
diff --git a/index.html b/index.html
index 38bccba..54c4579 100644
--- a/index.html
+++ b/index.html
@@ -1196,6 +1196,7 @@
+