Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Keep the display awake during archive operations - #17

Merged
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup
Jul 14, 2026
Merged

Keep the display awake during archive operations#17
vrtmrz merged 3 commits into
mainfrom
keep-display-awake-during-backup

Conversation

@vrtmrz

@vrtmrzvrtmrz commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • add one lifecycle-aware screen wake-lock manager for DiffZip
  • protect backup, archive restore, and selective-sync Fetch and Send operations with closure-scoped leases
  • wait for every selected archive file to finish writing before restore completion is reported
  • add App-free lifecycle tests, a local real-Obsidian backup/restore E2E, and user and developer documentation
  • prepare the BRAT review version as 0.1.9-wakelock.1

Why

Long-running mobile archive operations can allow the display to sleep. Restore and selective sync have the same requirement as backup, so all archive-operation entry points share one manager. Nested Fetch and Restore leases share the underlying platform wake lock.

While adding Restore coverage, the real-Obsidian E2E exposed that Extractor.finalise() did not wait for its asynchronous file callbacks. Consequently, extract() could resolve, and its wake-lock lease could be released, before Vault writes had completed. The Extractor now tracks selected files, waits for their callbacks, and propagates write failures.

The Screen Wake Lock API remains best effort. Unsupported or rejected requests do not prevent the operation from running, and this change does not provide background execution. Confirmation dialogues do not hold a lease.

Validation

  • npm ci
  • deno task test — 67 passed
  • deno task test:coveragesrc/wakeLock.ts at 100% branch, function, and line coverage
  • npm run test:ui — 11 passed
  • npm run lint
  • npm run prettyCheck
  • npm run check:e2e:obsidian
  • npm run build
  • exact published octagonal-wheels@0.1.51: clean install, unit/UI/build checks, and local real-Obsidian E2E passed
  • local real-Obsidian E2E: backup lease 1 → 0, restore lease 1 → 0, TOC entry present, and restored content matched
  • manifest.json, package.json, and package-lock.json agree on 0.1.9-wakelock.1
  • maintainer BRAT review on mobile — every 0.1.9-wakelock.1 release checklist item passed

The existing unrelated Svelte initialItems build warning remains unchanged.

Before merge

  • prepare the 0.1.9-wakelock.1 tag, Draft Release, release notes, and release assets
  • publish 0.1.9-wakelock.1 as a prerelease without replacing latest
  • install 0.1.9-wakelock.1 through BRAT and complete the mobile review
  • replace the immutable preview dependency with exact octagonal-wheels@0.1.51
  • review physical display behaviour during backup and restore on mobile
  • review physical display behaviour during selective-sync Fetch and Send on mobile

@vrtmrz
vrtmrz marked this pull request as ready for review July 14, 2026 16:50
@vrtmrz
vrtmrz merged commit 29d349e into mainJul 14, 2026
1 check passed
@vrtmrzvrtmrz mentioned this pull request Jul 14, 2026
10 tasks
@vrtmrz
vrtmrz deleted the keep-display-awake-during-backup branch July 14, 2026 17:28
Sign up for freeto 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.

1 participant

@vrtmrz