
Web Archive
Save webpages into your own Cloudflare archive, with folders, tags, search and optional AI classification.
Web Archive is a self-hosted Evernote/Raindrop.io alternative built on Cloudflare (D1, Pages, R2, Workers, Workers AI). Free tier eligible within limits. Inspect the source and license in the linked repository.
Source & license
Upstream license: GPL-3.0
License TL;DR
You can run it and change it privately. If you give others copies of the program or a modified version, provide the corresponding source under the GPL. You can charge money. Running it as a web service alone doesn’t trigger that source-sharing requirement.
Explain GPL v3 in plain English →Summary of the main license. Separate packages and assets can have different terms.
Inspect repository ↗Read this project’s actual license ↗Repository owner
See the upstream repository for the original creator and contributors.
Maintain this project? Maintainer verification →Cloudflare hosting
Free tier eligible within limits
A modest personal archive can fit Cloudflare Pages/Workers, D1 and R2 Standard free allowances; optional AI depends on the chosen model and daily usage. Initialise the owner token before exposing a fresh service publicly. Free-tier eligibility is source-reviewed, not a fresh deployment or load test.
Hosting requirements
- Pages Functions share Workers Free allowances: 100,000 dynamic requests per day and 10 ms CPU per invocation. Static asset requests are free when they do not invoke Functions.
- D1 Free includes 5 million rows read and 100,000 rows written per day with 5 GB total storage. Queries and imports consume allowances; title search is not a promise of full-text search across saved pages.
- R2 Standard includes 10 GB-month of storage, 1 million Class A operations and 10 million Class B operations per month. Saved HTML, embedded resources and previews consume storage; Infrequent Access has different terms.
- R2 must be enabled for the account before the documented deployment workflow runs. Account onboarding or payment details may be required, even when usage stays inside the free allocation.
- The AI binding is declared, but auto-tagging is a separate user-triggered workflow. Workers AI lists a 10,000-neuron daily free allocation; some models require paid billing or credits, and external OpenAI-compatible providers charge separately.
- The deployment generates dist/service/wrangler.toml from packages/server/wrangler.raw.toml and replaces its D1 ID. Use resources and credentials from your own account, then apply the remote migrations.
- Before public access, choose a strong private administrator token and complete the first-login bootstrap. The first accepted token is stored as administrator credentials; a publicly reachable uninitialised deployment can be claimed by someone else.
- No browser extension installation, upstream build, fresh app deployment, capture, token bootstrap, sharing or AI execution was performed in this source review.
Review findings & limitations
- Source review at immutable commit c8c89b7df933cd0145854bf66243710f3e61d17a. No fresh upstream installation, build, capture, migration, credential setup or AI execution was tested.
- Both Wrangler files, all five GitHub Actions workflows and 175 JavaScript/TypeScript source files were ingested. Two larger bundled SingleFile browser libraries were separately collected under a 1 MiB per-file bound rather than silently omitted.
- The selected production build input is packages/server/wrangler.raw.toml. Vite copies it into the generated service directory; GitHub Actions replaces its D1 ID and deploys Pages from that directory. The other Wrangler file is visible as separate evidence.
- The initial administrator token is first-claim bootstrap, not email or OAuth verification. The source stores a SHA-256 hash and accepts existing matching bearer tokens. Keep an uninitialised instance private and establish ownership before exposing it.
- The root LICENSE is GPL v3; package.json contains an ISC metadata field. The catalog identifies the collected root GPL-3.0 text and links it directly; do not assume the shorter package field removes GPL obligations. Confirm upstream intent for any licensing-sensitive redistribution.
- The screenshot is the author-supplied application view from the pinned README; its exact application runtime version and live-deployment date are not established.
- Cloudflare AI model choices and external providers can add cost. The baseline archive and manual tags are distinct from the optional generated-tag route.
- Comparison scopes are editorial assessments of shared web-clipping workflows. No Raindrop.io or Evernote migration, complete feature comparison or monthly savings was verified.
- Sharing routes are public by design for explicitly showcased pages. Review captured content and sharing settings before exposing private webpage snapshots.
Sources checked 01/10/2026
Repository snapshot: c8c89b7. Hosting eligibility reflects the deployment documentation and listed assumptions.
- raindrop-io ↗
Web Archive is a free web archiving and sharing service based on Cloudflare, including the following parts:
- evernote ↗
- Folder classification - Page preview image - Title keyword search
- pages ↗
name = "web-archive" pages_build_output_dir = "./src"
- workers ↗
The server is based on the full set of services of Cloudflare Worker, including D1 database and R2 storage bucket.
- d1 ↗
[[d1_databases]] binding = "DB" database_name = "web-archive"
- r2 ↗
[[r2_buckets]] binding = "BUCKET" bucket_name = "web-archive"
- workers-ai ↗
[ai] binding = "AI"
- free-tier-eligible ↗
| **Free** | 100,000 per day | No charge for duration | 10 milliseconds of CPU time per invocation |
- free-tier-eligible ↗
Requests to your Functions are billed as Cloudflare Workers requests.
- free-tier-eligible ↗
| Rows read | 5 million / day | First 25 billion / month included + $0.001 / million rows |
- free-tier-eligible ↗
| Storage | 10 GB-month / month | | Class A Operations | 1 million requests / month | | Class B Operations | 10 million requests / month |
- free-tier-eligible ↗
Our free allocation allows anyone to use a total of **10,000 Neurons per day at no charge**.
- GPL-3.0 ↗
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
- architecture ↗
name = "web-archive" pages_build_output_dir = "./src"
- architecture ↗
honoBuild({ entry: 'src/server.ts', minify: false, external: ['/static'], outputDir: '../../dist/service/src',
- architecture ↗
src: ['./wrangler.raw.toml'], dest: '../', rename: 'wrangler.toml',
- architecture ↗
run: cd dist/service && wrangler pages deploy
- architecture ↗
- Browser plugin: Save the webpage as a single html file and upload it to the server.
Upstream screenshot · Ray-D-Song/web-archive repository contributors ↗. Depicts the upstream project. We have not deployed and tested a fresh installation here.
What it can replace
Compare the workflow you need. These mappings describe overlap; full feature parity requires a separate comparison.
For saving webpage snapshots into your own searchable, folder-organised archive. This overlap is an editorial assessment of the documented workflow, not an upstream parity claim. It does not promise Raindrop apps, collaboration, its full search capabilities or automated migration.
See supporting source ↗For the narrower web-clipping workflow: keep captured webpages, organise them with folders and tags, and search titles. This is not a replacement for Evernote notes, OCR, tasks, document editing or team features; no Evernote archive migration was verified.
See supporting source ↗How it works
The shape of Web Archive on Cloudflare, and how it stacks up against the rented tools it replaces.
Diagram target: packages/server/wrangler.raw.toml. Other repository deployments are listed in the source evidence below; they are not required by this target.
Architecture
Diagram of deployment declarations at the reviewed commit. Each app has its own entrypoint; declared resources do not prove runtime calls. Follow file and line sources below.
View upstream source ↗Configuration and workflow sources
Reviewed commit c8c89b7df933. This configuration evidence comes from reading source files. Execution checks, when available, appear in the project's runtime review.
Deployment configuration · 2 files
Cloudflare Pages · compatibility 2024-10-21
web-archive · default
DB→ D1BUCKET→ R2AI→ Workers AI
Cloudflare Pages · compatibility 2024-10-21
web-archive · default
DB→ D1BUCKET→ R2AI→ Workers AI
Named environments are separate deployments. Bindings are shown only where declared. Configured routes are URL patterns, not verified application endpoints.
Runtime source · handlers, binding usage and workflow steps
Observed TypeScript/JavaScript declarations from Worker entrypoints and resolved relative imports. Calls and workflow steps may run conditionally; their listed order is not a proven end-to-end request flow. Router declarations may be mounted under a prefix or may not be registered. This shows code wiring, not a successful deployment or runtime test. Dynamic wiring, aliases and generated code may not resolve.
- L5 · keepAlive calls (conditional paths may differ): Date.now, clearInterval, setInterval, Browser.runtime.getPlatformInfo
- L24 · markUnfinishedTasksAsFailed calls (conditional paths may differ): getTaskList, tasks.forEach, Date.now, saveTaskList
- L45 · getTaskList calls (conditional paths may differ): Browser.storage.local.get
- L50 · saveTaskList calls (conditional paths may differ): Browser.storage.local.set
- L54 · saveTask calls (conditional paths may differ): getTaskList, tasks.findIndex, tasks.push, Browser.storage.local.set
- L67 · clearFinishedTaskList calls (conditional paths may differ): getTaskList, tasks.filter, saveTaskList
- L88 · scrapePageData calls (conditional paths may differ): Browser.scripting.executeScript, sendMessage
- L97 · uploadPageData calls (conditional paths may differ): form.append, JSON.stringify, base64ToBlob, keepAlive, request
- L120 · createAndRunTask calls (conditional paths may differ): crypto.randomUUID, Date.now, saveTask, scrapePageData, uploadPageData, run, console.error
- L140 · run calls (conditional paths may differ): saveTask, scrapePageData, uploadPageData, Date.now
- L4 · createModal calls (conditional paths may differ): document.createElement, Object.assign, modal.classList.add
- L1 · y calls (conditional paths may differ): h.addEventListener, Object.assign, b.set, E.stringify, b.delete
- L1 · de calls (conditional paths may differ): forEach, e.querySelectorAll, e.setAttribute, e.removeAttribute, e.head.querySelectorAll, Array.from, e.remove, t.forEach, e.appendChild, e.createElement, s.setAttribute, s.content.appendChild, t.cloneNode, o.set, t.replaceWith, ce, be, he, n.markedElements.push, b.values
- L1 · ce calls (conditional paths may differ): forEach, filter, Array.from, be, s.closest, J.includes, s.tagName.toUpperCase, he, $.includes, s.setAttribute, n.markedElements.push, l.getPropertyValue, e.startsWith, ue, n.canvases.push, s.toDataURL, i.getPropertyValue, s.getAttribute, n.images.push, s.removeAttribute
- L1 · me calls (conditional paths may differ): map, Array.from, join
- L1 · ue calls (conditional paths may differ): e.getPropertyValue, forEach, split, ge, t.loadedFonts.find, trim, a.toLowerCase, s.set, ie.stringify
- L1 · pe calls (conditional paths may differ): t.dom.openOrClosedShadowRoot
- L1 · ge calls (conditional paths may differ): toLowerCase, e.match, e.replace, e.trim, t.replace, String.fromCharCode
- L1 · he calls (conditional paths may differ): t.getPropertyValue, e.getBoundingClientRect, Boolean
- L1 · fe calls (conditional paths may differ): forEach, e.querySelectorAll, e.getAttribute, e.removeAttribute, e.setAttribute, e.head.querySelectorAll, join, s.map, t.forEach, s.forEach, e.replaceWith
- L1 · Ee calls (conditional paths may differ): forEach, e.querySelectorAll, e.createElement, e.body.appendChild, n.remove, join, map, Array.from, s.setAttribute
- L1 · Te calls (conditional paths may differ): endsWith, t.getPropertyValue, parseFloat
- L1 · be calls (conditional paths may differ): e.getComputedStyle
- L1 · Pe calls (conditional paths may differ): Re.clear, Math.max, t.filter, e.target.setAttribute, e.target.addEventListener, e.target.tagName.toUpperCase, e.target.classList.contains, Me, _e, Oe, De, c, Ce, t.removeAttribute, t.removeEventListener, i.add, i.delete, l.disconnect, ve.removeEventListener, s
- L1 · c calls (conditional paths may differ): Oe, De, c, Math.max, Ce
- L1 · p calls (conditional paths may differ): t.removeAttribute, t.removeEventListener
- L1 · f calls (conditional paths may differ): Me, _e, i.add
- L1 · E calls (conditional paths may differ): Me, _e, i.delete
- L1 · T calls (conditional paths may differ): l.disconnect, ve.removeEventListener, s
- L1 · _e calls (conditional paths may differ): Oe, Ce
- L1 · Me calls (conditional paths may differ): Oe, De, Ce
- L1 · Ce calls (conditional paths may differ): De, h.dispatchEvent, Oe, o, e.disconnect
- L1 · Oe calls (conditional paths may differ): Re.get, Re.set, Ae.runtime.sendMessage, Le
- L1 · Le calls (conditional paths may differ): Re.get, globalThis.clearTimeout, Re.set, globalThis.setTimeout
- L1 · De calls (conditional paths may differ): Ae.runtime.sendMessage, xe
- L1 · xe calls (conditional paths may differ): Re.get, Re.delete, globalThis.clearTimeout
- L1 · ot calls (conditional paths may differ): globalThis.addEventListener, e.data.startsWith, e.preventDefault, e.stopPropagation, $e.parse, e.data.substring, pt, globalThis.stop, Pe, at, dt, ct, it, st.get, rt
- L1 · nt calls (conditional paths may differ): join, globalThis.crypto.getRandomValues
- L1 · at calls (conditional paths may differ): lt, s, ut, gt
- L1 · it calls (conditional paths may differ): mt, ht
- L1 · rt calls (conditional paths may differ): e.frames.forEach, dt, st.get, t.frames.find, t.frames.push, t.frames.filter, t.frames.sort, t.windowId.split, e.windowId.split, t.frames.forEach, t.resolve
- L1 · lt calls (conditional paths may differ): ht, st.get, st.set, t.forEach, e.setAttribute, a.push, ut, pt, globalThis.setTimeout, l.stop, e.getAttribute, parseFromString, dt, lt, gt
- L1 · dt calls (conditional paths may differ): st.get, globalThis.clearTimeout
- L1 · ct calls (conditional paths may differ): st.get, globalThis.setTimeout, ut
- L1 · mt calls (conditional paths may differ): e.forEach, e.removeAttribute, pt, mt, ht
- L1 · ut calls (conditional paths may differ): Xe.singlefile.processors.frameTree.initResponse, pt
- L1 · pt calls (conditional paths may differ): Ke.runtime.sendMessage, e.postMessage, $e.stringify, s.port1.postMessage
- L1 · gt calls (conditional paths may differ): Fe.preProcessDoc, Fe.serialize, Fe.postProcessDoc, e.baseURI.split
- L1 · ht calls (conditional paths may differ): Array.from, e.querySelectorAll, forEach, Fe.getShadowRoot, t.concat, s.querySelectorAll
- L1 · At calls (conditional paths may differ): St, wt.includes, replace, e.textContent.replace, yt.find, t.accept, o.toLowerCase, forEach, Array.from, o.match, join, map, e.trim, i.replace, i.includes, i.match, At, It.find, ft.includes
- L1 · vt calls (conditional paths may differ): Boolean, e.match
- L1 · n calls (conditional paths may differ): mo, uo, e.setObject, n
- L1 · o calls (conditional paths may differ): a, browser.tabs.onRemoved.removeListener
- L1 · s calls (conditional paths may differ): catch, i, l, a
- L1 · p calls (conditional paths may differ): browser.downloads.download, a.message.toLowerCase, n.includes, e.filename.startsWith, p, e.filename.includes, e.filename.replace, e.filename.match, browser.downloads.onChanged.addListener, catch, then, browser.downloads.search, e, browser.downloads.onChanged.removeListener, t
- L1 · k calls (conditional paths may differ): T, x
- L1 · T calls (conditional paths may differ): browser.storage.local.get, browser.tabs.query, forEach, filter, Object.keys, e.find, browser.storage.local.set
- L1 · x calls (conditional paths may differ): browser.storage.local.set
- L1 · _ calls (conditional paths may differ): browser.storage.local.get, U.get, U.remove, Object.keys, J, U.set, map, $, K, forEach, e.replaceAll
- L1 · N calls (conditional paths may differ): U.get, a.filter, j, find, n.sort, e.match, t.url.split, e.includes
- L1 · B calls (conditional paths may differ): U.get, G, z
- L1 · j calls (conditional paths may differ): startsWith, e.url.toLowerCase
- L1 · q calls (conditional paths may differ): e.method.endsWith, G, U.set, t.filter, X, includes, $, K, JSON.parse, JSON.stringify, J, T, a.includes, x, o.forEach, U.remove, t.includes, n.forEach, H, _
- L1 · z calls (conditional paths may differ): H, U.get, forEach, Object.keys, e.substring
- L1 · V calls (conditional paths may differ): Promise.all, N, T, K, Object.assign
- L1 · G calls (conditional paths may differ): U.get
- L1 · $ calls (conditional paths may differ): map, filter, Object.keys, U.get, e.startsWith, e.substring
- L1 · H calls (conditional paths may differ): filter, Object.keys, U.get, e.startsWith
- L1 · K calls (conditional paths may differ): U.get
- L1 · J calls (conditional paths may differ): U.set
- L1 · X calls (conditional paths may differ): G, n.find, n.push, U.set
- L1 · Z calls (conditional paths may differ): G, o.find, U.set
- L1 · Q calls (conditional paths may differ): U.get
- L1 · Y calls (conditional paths may differ): U.get
- L1 · ee calls (conditional paths may differ): U.set
- L1 · te calls (conditional paths may differ): U.set
- L1 · ae calls (conditional paths may differ): Q, ee, U.remove
- L1 · ne calls (conditional paths may differ): Y, te, U.remove
- L1 · oe calls (conditional paths may differ): Promise.all, T, N, Boolean
- L1 · de calls (conditional paths may differ): browser.tabs.create, ie.set
- L1 · fe calls (conditional paths may differ): sort, browser.tabs.query
- L1 · me calls (conditional paths may differ): browser.tabs.onUpdated.addListener, r.url.startsWith, browser.tabs.onUpdated.removeListener, get, browser.tabs.remove, t, a
- L1 · he calls (conditional paths may differ): browser.tabs.create, browser.tabs.onRemoved.addListener, browser.tabs.onRemoved.removeListener, a
- L1 · De calls (conditional paths may differ): e.method.endsWith, A, Ne, _e, Ue, console.error, We, Fe, Promise.resolve
- L1 · We calls (conditional paths may differ): Be, je
- L1 · Ue calls (conditional paths may differ): Be, je
- L1 · Fe calls (conditional paths may differ): Ne
- L1 · _e calls (conditional paths may differ): Math.max, Math.min, Math.floor, je, Be
- L1 · Ne calls (conditional paths may differ): je, oe, Be
- L1 · Be calls (conditional paths may differ): A, forEach, Object.keys, JSON.stringify, Oe
- L1 · Oe calls (conditional paths may differ): JSON.parse, JSON.stringify
- L1 · y calls (conditional paths may differ): g, forEach, document.querySelectorAll, e.remove, document.createElement, toString, document.body.appendChild, test, parseFromString, document.replaceChild, e.parentElement.replaceChild, y
- L1 · g calls (conditional paths may differ): n.open, n.send, e, document.getElementById, n.remove, o.set, browser.runtime.sendMessage
- L1 · E calls (conditional paths may differ): globalThis.addEventListener, b, setTimeout, E, S, w, M, D, o.get, t.reject, o.delete, t.array.concat, o.set, t.resolve
- L1 · S calls (conditional paths may differ): document.querySelector, e.remove, catch, browser.runtime.sendMessage, M
- L1 · b calls (conditional paths may differ): setTimeout, b, t.processors.frameTree.getAsync, o, e.preProcessDoc, A, t.processors.frameTree.cleanup, e.postProcessDoc
- L1 · w calls (conditional paths may differ): globalThis.addEventListener, document.addEventListener, globalThis.removeEventListener, document.removeEventListener
- L1 · T calls (conditional paths may differ): C
- L1 · R calls (conditional paths may differ): C
- L1 · C calls (conditional paths may differ): t.processors.frameTree.getSync, s, A, r.preProcessDoc
- L1 · A calls (conditional paths may differ): t.pageInfo.visitDate.getTime, forEach, Object.keys, browser.runtime.sendMessage, c.serialize
- L1 · D calls (conditional paths may differ): g, O, t.helper.serialize, decodeURIComponent, location.href.match, Array.from, n.subarray, n.substring, I, browser.runtime.sendMessage
- L1 · I calls (conditional paths may differ): URL.createObjectURL, drawImage, a.getContext, a.convertToBlob, t.arrayBuffer, Array.from
- L1 · M calls (conditional paths may differ): Boolean, e.querySelector, n.textContent.includes
- L1 · O calls (conditional paths may differ): forEach, e.querySelectorAll, t.helper.getShadowRoot, O, document.createElement, t.setAttribute, Array.from, t.appendChild, e.appendChild
- L43 · getSharePageBar calls (conditional paths may differ): displayBar, document.querySelector, barElement.remove, hide, resolvePromise
- L70 · displayBar calls (conditional paths may differ): document.querySelector, createElement, barElement.attachShadow, document.createElement, shadowRoot.appendChild, containerElement.classList.add, textElement.classList.add, message.split, textElement.appendChild, document.createTextNode, buttonOnclick, containerElement.appendChild, closeElement.classList.add, barElement.remove, document.documentElement.appendChild
- L181 · createElement calls (conditional paths may differ): document.createElement, parentElement.appendChild, CSS_PROPERTIES.forEach, element.style.setProperty
- L250 · serializeValue calls (conditional paths may differ): types.findIndex, test, data.addObject, data.append, serialize, testObject, serializeSymbols, serializeOwnProperties
- L264 · serializeSymbols calls (conditional paths may differ): Object.getOwnPropertySymbols, ownPropertySymbols.map, serializeArray
- L270 · serializeOwnProperties calls (conditional paths may differ): ArrayBuffer.isView, Object.entries, testArray, entries.filter, testInteger, Number, serializeValue, serializeString
- L286 · serializeCircularReference calls (conditional paths may differ): data.objects.indexOf, serializeValue
- L291 · serializeArray calls (conditional paths may differ): serializeValue, map, filter, Object.keys, testInteger, Number, array.entries
- L305 · serializeString calls (conditional paths may differ): textEncoder.encode, serializeValue, data.append
- L311 · serializeTypedArray calls (conditional paths may differ): serializeValue, data.append
- L316 · serializeArrayBuffer calls (conditional paths may differ): serializeValue, data.append
- L321 · serializeNumber calls (conditional paths may differ): data.append
- L326 · serializeUint32 calls (conditional paths may differ): data.append
- L331 · serializeInt32 calls (conditional paths may differ): data.append
- L336 · serializeUint16 calls (conditional paths may differ): data.append
- L341 · serializeInt16 calls (conditional paths may differ): data.append
- L346 · serializeUint8 calls (conditional paths may differ): data.append
- L351 · serializeInt8 calls (conditional paths may differ): data.append
- L356 · serializeBoolean calls (conditional paths may differ): Number, data.append
- L361 · serializeMap calls (conditional paths may differ): map.entries, serializeValue
- L370 · serializeSet calls (conditional paths may differ): serializeValue
- L377 · serializeDate calls (conditional paths may differ): serializeNumber, date.getTime
- L381 · serializeError calls (conditional paths may differ): serializeString
- L386 · serializeRegExp calls (conditional paths may differ): serializeString
- L391 · serializeStringObject calls (conditional paths may differ): serializeString, string.valueOf
- L395 · serializeNumberObject calls (conditional paths may differ): serializeNumber, number.valueOf
- L399 · serializeBooleanObject calls (conditional paths may differ): serializeBoolean, boolean.valueOf
- L403 · serializeSymbol calls (conditional paths may differ): serializeString
- L418 · parseValue calls (conditional paths may differ): data.consume, data.getObjectId, parse, testObject, parseSymbols, parseOwnProperties, data.resolveObject
- L432 · parseSymbols calls (conditional paths may differ): parseArray, data.setObject, symbols.forEach
- L437 · parseOwnProperties calls (conditional paths may differ): parseValue, parseNextProperty, parseString, data.setObject
- L443 · parseNextProperty calls (conditional paths may differ): parseString, parseValue, data.setObject, parseNextProperty
- L453 · parseCircularReference calls (conditional paths may differ): parseValue
- L463 · parseArray calls (conditional paths may differ): parseValue, parseNextSlot, testEmptySlot, data.setObject
- L471 · parseNextSlot calls (conditional paths may differ): parseValue, testEmptySlot, data.setObject, parseNextSlot
- L486 · parseString calls (conditional paths may differ): parseValue, data.consume, textDecoder.decode
- L492 · parseFloat64Array calls (conditional paths may differ): parseValue, data.consume
- L498 · parseFloat32Array calls (conditional paths may differ): parseValue, data.consume
- L504 · parseUint32Array calls (conditional paths may differ): parseValue, data.consume
- L510 · parseInt32Array calls (conditional paths may differ): parseValue, data.consume
- L1 · f calls (conditional paths may differ): o, c
- L1 · w calls (conditional paths may differ): y
- L1 · y calls (conditional paths may differ): browser.runtime.sendMessage, n.error.toString
- L1 · U calls (conditional paths may differ): i, catch, s, u, e, o, S, t.executeSetters, n, c, n.next
- L1 · i calls (conditional paths may differ): catch, s, u, e
- L1 · s calls (conditional paths may differ): o, S, t.executeSetters, n
- L1 · v calls (conditional paths may differ): g.findIndex, e, t.addObject, t.append, r, M, Object.getOwnPropertySymbols, e.map, j, ArrayBuffer.isView, v, Object.entries, T, e.filter, z, Number, O
- L1 · j calls (conditional paths may differ): v, map, filter, Object.keys, z, Number, n.entries
- L1 · O calls (conditional paths may differ): m.encode, v, t.append
- L1 · I calls (conditional paths may differ): v, t.append
- L1 · E calls (conditional paths may differ): t.append
- L1 · L calls (conditional paths may differ): Number, t.append
- L1 · S calls (conditional paths may differ): t.consume, t.getObjectId, e, M, N, t.setObject, t.forEach, S, r, P, t.resolveObject
- L1 · r calls (conditional paths may differ): P, S, t.setObject, r
- L1 · N calls (conditional paths may differ): S, C, t.setObject, r
- L1 · P calls (conditional paths may differ): S, t.consume, b.decode
- L1 · F calls (conditional paths may differ): t.consume
- L1 · q calls (conditional paths may differ): t.consume, Boolean
- L1 · M calls (conditional paths may differ): Object
- L1 · z calls (conditional paths may differ): k, Number.isInteger
- L1 · J calls (conditional paths may differ): r, e, a.getResponseHeader, a.open, Object.entries, a.setRequestHeader, a.send
- L1 · c calls (conditional paths may differ): getSelection, t.getRangeAt, t.removeRange
- L1 · l calls (conditional paths may differ): remove, Yt, removeEventListener, t, Boolean, setTimeout, document.removeEventListener
- L1 · u calls (conditional paths may differ): getSelection, getRangeAt, e.push
- L1 · m calls (conditional paths may differ): f, map, filter, Object.keys, k, Number, e.entries
- L1 · p calls (conditional paths may differ): o.encode, f, t.append
- L1 · h calls (conditional paths may differ): f, t.append
- L1 · y calls (conditional paths may differ): t.append
- L1 · f calls (conditional paths may differ): i.findIndex, e, t.addObject, t.append, o, R, Object.getOwnPropertySymbols, n.map, m, ArrayBuffer.isView, f, Object.entries, L, n.filter, k, Number, p
- L1 · g calls (conditional paths may differ): Number, t.append
- L1 · E calls (conditional paths may differ): catch, i, v, t.executeSetters, e, n, a
- L1 · i calls (conditional paths may differ): removeAllRanges, getSelection, l
- L1 · s calls (conditional paths may differ): d, document.createRange, n.selectNodeContents, c, addRange, getSelection, u, l
- L1 · v calls (conditional paths may differ): t.consume, t.getObjectId, r, R, S, t.setObject, t.forEach, v, T, t.resolveObject
- L1 · r calls (conditional paths may differ): n.getBoundingClientRect, ee, te, requestAnimationFrame, Yt, t.style.setProperty
- L1 · S calls (conditional paths may differ): v, U, t.setObject, r
- L1 · T calls (conditional paths may differ): v, t.consume, a.decode
- L1 · I calls (conditional paths may differ): t.consume
- L1 · C calls (conditional paths may differ): t.consume, Boolean
- L1 · x calls (conditional paths may differ): R, e.objects.includes
- L1 · R calls (conditional paths may differ): Object
- L1 · k calls (conditional paths may differ): D, Number.isInteger
- L1 · N calls (conditional paths may differ): R, O
- L1 · Z calls (conditional paths may differ): console.error, Q
- L1 · Q calls (conditional paths may differ): document.querySelector, document.createElement, e.appendChild, V.forEach, n.style.setProperty, a.attachShadow, i.appendChild, c.classList.add, l.classList.add, e.split, l.appendChild, document.createTextNode, o, c.appendChild, u.classList.add, a.remove, document.documentElement.appendChild
- L1 · nt calls (conditional paths may differ): Array.from, l, URL.createObjectURL, browser.runtime.sendMessage, URL.revokeObjectURL, a.slice, t.content.substring, e.clipboardData.setData, e.preventDefault, document.addEventListener, document.execCommand, document.removeEventListener, rt, open
- L1 · n calls (conditional paths may differ): s, t.preventDefault
- L1 · rt calls (conditional paths may differ): Array.isArray, ot, document.createElement, URL.createObjectURL, e.dispatchEvent, setTimeout, URL.revokeObjectURL, t
- L1 · ot calls (conditional paths may differ): Q, document.querySelector, t.remove, hide, t, et.display, navigator.share, et.hide, ot
- L1 · ht calls (conditional paths may differ): ut, document.addEventListener, document.dispatchEvent, JSON.stringify, document.removeEventListener, n, r, pt.set, yt
- L1 · yt calls (conditional paths may differ): browser.runtime.sendMessage, e.error.toString
- L1 · _t calls (conditional paths may differ): prompt
- L1 · jt calls (conditional paths may differ): document.querySelector, e.style.setProperty, Ft.style.setProperty
- L1 · Gt calls (conditional paths may differ): document.querySelector, document.documentElement.appendChild, ne, t.attachShadow, document.createElement, e.appendChild, r.classList.add, r.style.setProperty, t.shadowRoot.querySelector, e.classList.add, t.shadowRoot.appendChild, n.classList.add
- L1 · Ht calls (conditional paths may differ): document.querySelector, t.remove, Ft.remove, Kt
- L1 · Wt calls (conditional paths may differ): document.querySelector, n.shadowRoot.querySelector, Math.floor, r.style.getPropertyValue, r.style.setProperty
- L1 · qt calls (conditional paths may differ): $t
- L1 · zt calls (conditional paths may differ): $t
- L1 · Vt calls (conditional paths may differ): getSelection, n.getRangeAt, document.createTreeWalker, e.push, n.nextNode, forEach, n.currentNode.querySelectorAll, Array.from
- L1 · Xt calls (conditional paths may differ): Zt, s, t.preventDefault, n.getBoundingClientRect, ee, te, requestAnimationFrame, Yt, t.style.setProperty, t.stopPropagation, i, removeAllRanges, getSelection, l, d, document.createRange, n.selectNodeContents, c, addRange, u
- L1 · o calls (conditional paths may differ): t.preventDefault, t.stopPropagation, s, i
- L1 · y calls (conditional paths may differ): p.addEventListener, Object.assign, T.set, b.stringify, T.delete
- L1 · ie calls (conditional paths may differ): forEach, filter, Array.from, he, s.closest, J.includes, s.tagName.toUpperCase, ce, K.includes, s.setAttribute, n.markedElements.push, l.getPropertyValue, e.startsWith, ae, n.canvases.push, s.toDataURL, r.getPropertyValue, s.getAttribute, n.images.push, s.removeAttribute
- L1 · re calls (conditional paths may differ): map, Array.from, join
- L1 · ae calls (conditional paths may differ): e.getPropertyValue, forEach, split, de, t.loadedFonts.find, trim, i.toLowerCase, s.set, oe.stringify
- L1 · le calls (conditional paths may differ): t.dom.openOrClosedShadowRoot
- L1 · de calls (conditional paths may differ): toLowerCase, e.match, e.replace, e.trim, t.replace, String.fromCharCode
- L1 · ce calls (conditional paths may differ): t.getPropertyValue, e.getBoundingClientRect, Boolean
- L1 · ue calls (conditional paths may differ): forEach, e.querySelectorAll, e.createElement, e.body.appendChild, n.remove, join, map, Array.from, s.setAttribute
- L1 · me calls (conditional paths may differ): endsWith, t.getPropertyValue, parseFloat
- L1 · he calls (conditional paths may differ): e.getComputedStyle
- L1 · Ie calls (conditional paths may differ): ye.clear, Math.max, t.filter, e.target.setAttribute, e.target.addEventListener, e.target.tagName.toUpperCase, e.target.classList.contains, Ae, ve, Re, Me, c, Se, t.removeAttribute, t.removeEventListener, r.add, r.delete, l.disconnect, Ee.removeEventListener, s
- L1 · c calls (conditional paths may differ): Re, Me, c, Math.max, Se
- L1 · h calls (conditional paths may differ): t.removeAttribute, t.removeEventListener
- L1 · f calls (conditional paths may differ): Ae, ve, r.add
- L1 · b calls (conditional paths may differ): Ae, ve, r.delete
- L1 · E calls (conditional paths may differ): l.disconnect, Ee.removeEventListener, s
- L1 · ve calls (conditional paths may differ): Re, Se
- L1 · Ae calls (conditional paths may differ): Re, Me, Se
- L1 · Se calls (conditional paths may differ): Me, p.dispatchEvent, Re, o, e.disconnect
- L1 · Re calls (conditional paths may differ): ye.get, ye.set, be.runtime.sendMessage, _e
- L1 · _e calls (conditional paths may differ): ye.get, globalThis.clearTimeout, ye.set, globalThis.setTimeout
- L1 · Me calls (conditional paths may differ): be.runtime.sendMessage, Pe
- L1 · Pe calls (conditional paths may differ): ye.get, ye.delete, globalThis.clearTimeout
- L1 · $e calls (conditional paths may differ): globalThis.addEventListener, e.data.startsWith, e.preventDefault, e.stopPropagation, Ye.parse, e.data.substring, at, globalThis.stop, Ie, Qe, ot, nt, et, Ke.get, tt
- L1 · Xe calls (conditional paths may differ): join, globalThis.crypto.getRandomValues
- L1 · Qe calls (conditional paths may differ): st, s, rt, lt
- L1 · et calls (conditional paths may differ): it, dt
- L1 · tt calls (conditional paths may differ): e.frames.forEach, ot, Ke.get, t.frames.find, t.frames.push, t.frames.filter, t.frames.sort, t.windowId.split, e.windowId.split, t.frames.forEach, t.resolve
- L1 · st calls (conditional paths may differ): dt, Ke.get, Ke.set, t.forEach, e.setAttribute, i.push, rt, at, globalThis.setTimeout, l.stop, e.getAttribute, parseFromString, ot, st, lt
- L1 · ot calls (conditional paths may differ): Ke.get, globalThis.clearTimeout
- L1 · nt calls (conditional paths may differ): Ke.get, globalThis.setTimeout, rt
- L1 · it calls (conditional paths may differ): e.forEach, e.removeAttribute, at, it, dt
- L1 · rt calls (conditional paths may differ): ze.singlefile.processors.frameTree.initResponse, at
- L1 · at calls (conditional paths may differ): He.runtime.sendMessage, e.postMessage, Ye.stringify, s.port1.postMessage
- L1 · lt calls (conditional paths may differ): Ne.preProcessDoc, Ne.serialize, Ne.postProcessDoc, e.baseURI.split
- L1 · dt calls (conditional paths may differ): Array.from, e.querySelectorAll, forEach, Ne.getShadowRoot, t.concat, s.querySelectorAll
- L1 · w calls (conditional paths may differ): a.addEventListener, F, b, a.documentElement.style.getPropertyValue, a.documentElement.style.getPropertyPriority, a.documentElement.style.setProperty, a.documentElement.style.removeProperty, P, a.__defineGetter__, e.__defineGetter__, a.dispatchEvent, h.parse, e.fetch, t.arrayBuffer, e.toString
- L1 · F calls (conditional paths may differ): Math.max, forEach, a.querySelectorAll, e.setAttribute, o.__defineGetter__, c.__defineGetter__, e.__defineGetter__, e._singleFile_getBoundingClientRect.call, t.__defineGetter__, r.__defineSetter__, a.dispatchEvent, r.__defineGetter__, e.decode, r.dispatchEvent, Math.min, a.documentElement.style.getPropertyValue, a.documentElement.style.getPropertyPriority, a.documentElement.style.setProperty, G, o.getBoundingClientRect
- L1 · b calls (conditional paths may differ): forEach, a.querySelectorAll, e.removeAttribute, G
- L1 · S calls (conditional paths may differ): e.stopPropagation, t.addEventListener, t.removeEventListener, map, Array.from, join, t.dispatchEvent
- L1 · B calls (conditional paths may differ): forEach, Object.keys, t.readAsDataURL, t.addEventListener, e
- L1 · G calls (conditional paths may differ): e.dispatchEvent
- L1 · i calls (conditional paths may differ): i.querySelector, replace, r.infobarContent.replace, n.createElement, o.appendChild, forEach, Array.from, getComputedStyle, i.style.setProperty, d.attachShadow, i.createElement, n.setAttribute, d.appendChild, o.replace, f.appendChild, g.classList.add, u.classList.add, g.appendChild, h.classList.add, m.classList.add
- L1 · t calls (conditional paths may differ): e.evaluate, i.textContent.includes, i.textContent.split, e.match, split, o.shift, trim, e.trim
- L1 · A calls (conditional paths may differ): n.querySelector, t.querySelector
- L1 · a calls (conditional paths may differ): t, e.runtime.sendMessage, i, A
- L1 · K calls (conditional paths may differ): p.getRandomValues, A.getRandomValues
- L1 · se calls (conditional paths may differ): ie, set, ce, oe, l.update, o.update, n.set, le
- L1 · re calls (conditional paths may differ): q.importKey, G.importKey, q.pbkdf2, G.deriveBits, t.assign, ce, oe, e.from
- L1 · ae calls (conditional paths may differ): unescape, encodeURIComponent, e.charCodeAt, encode
- L1 · ie calls (conditional paths may differ): n.set
- L1 · oe calls (conditional paths may differ): e.subarray
- L1 · le calls (conditional paths may differ): e.fromBits
- L1 · ce calls (conditional paths may differ): e.toBits
- L1 · ue calls (conditional paths may differ): we, ge
- L1 · pe calls (conditional paths may differ): we, ge
- L1 · de calls (conditional paths may differ): t.assign, ge, n.charCodeAt
- L1 · ge calls (conditional paths may differ): e.crcKey0.append, e.crcKey0.get, ve, s.imul, ye, e.crcKey2.append, e.crcKey2.get
- L1 · we calls (conditional paths may differ): ye, s.imul
- L1 · Se calls (conditional paths may differ): De, t.enqueue
- L1 · ke calls (conditional paths may differ): De, t.defineProperty
- L1 · ze calls (conditional paths may differ): De
- L1 · De calls (conditional paths may differ): e.pipeThrough
- L1 · Be calls (conditional paths may differ): importScripts.apply, Ke, self.initCodec, Ae.set, Ve, e.enqueue, e.close, qe.set, pipeTo, pipeThrough, i.pipeThrough, close, o.getWriter, Ee
- L1 · Ve calls (conditional paths may differ): d
- L1 · Ee calls (conditional paths may differ): d
- L1 · e calls (conditional paths may differ): e.dictionary.subarray, o.set
- L1 · It calls (conditional paths may differ): t.hasOwn, o.hasOwnProperty, t.assign, s, n.set, codec.push, r
- L1 · fe calls (conditional paths may differ): a.max
- L1 · de calls (conditional paths may differ): he, e.isArray
- L1 · we calls (conditional paths may differ): ge
- L1 · ge calls (conditional paths may differ): t.hasOwn, i.hasOwnProperty, t.assign, s, n.set, codec.push, r
- L1 · ze calls (conditional paths may differ): unescape, encodeURIComponent, e.charCodeAt, encode
- L1 · We calls (conditional paths may differ): z.getRandomValues, De.getRandomValues
- L1 · et calls (conditional paths may differ): st, set, it, rt, o.update, i.update, n.set, at
- L1 · tt calls (conditional paths may differ): Ce.importKey, Ve.importKey, Ce.pbkdf2, Ve.deriveBits, t.assign, it, rt, e.from
- L1 · nt calls (conditional paths may differ): ze
- L1 · st calls (conditional paths may differ): n.set
- L1 · rt calls (conditional paths may differ): e.subarray
- L1 · at calls (conditional paths may differ): e.fromBits
- L1 · it calls (conditional paths may differ): e.toBits
- L1 · ut calls (conditional paths may differ): pt, ht
- L1 · ft calls (conditional paths may differ): pt, ht
- L1 · dt calls (conditional paths may differ): t.assign, ht, n.charCodeAt
- L1 · ht calls (conditional paths may differ): e.crcKey0.append, e.crcKey0.get, gt, a.imul, wt, e.crcKey2.append, e.crcKey2.get
- L1 · pt calls (conditional paths may differ): wt, a.imul
- L1 · zt calls (conditional paths may differ): kt, t.enqueue
- L1 · St calls (conditional paths may differ): kt, t.defineProperty
- L1 · vt calls (conditional paths may differ): kt
- L1 · kt calls (conditional paths may differ): e.pipeThrough
- L1 · Pt calls (conditional paths may differ): e
- L1 · qt calls (conditional paths may differ): pipeTo, t.pipeThrough, s
- L1 · Bt calls (conditional paths may differ): e, i.addEventListener, t.assign, w, c.read, Lt, l.write, h, u, l.releaseLock, p, qt, e.getWriter, n.write, n.releaseLock, t, abort, c.slice, i.getReader, l.getWriter
- L1 · w calls (conditional paths may differ): Vt.splice, t, Zt, s.isFinite, setTimeout, Ot.filter, e.terminate
- L1 · Lt calls (conditional paths may differ): n.buffer.slice, i.push, t.postMessage, n.releaseLock, s
- L1 · $t calls (conditional paths may differ): run, Ot.find, Zt, Ot.push, Vt.push, Vt.splice, t, s.isFinite, setTimeout, Ot.filter, e.terminate
- L1 · Zt calls (conditional paths may differ): clearTimeout
- L1 · Gt calls (conditional paths may differ): m.allSettled, Ot.map, Zt, e.terminate
- L1 · mn calls (conditional paths may differ): t.assign
- L1 · yn calls (conditional paths may differ): ue, t, zn, r.headers.get, r.arrayBuffer, split, i.trim, s, Dn
- L1 · bn calls (conditional paths may differ): s, zn, r.arrayBuffer, r, e.data.subarray
- L1 · zn calls (conditional paths may differ): t.assign, Sn
- L1 · Sn calls (conditional paths may differ): t.fromEntries
- L1 · vn calls (conditional paths may differ): xn
- L1 · kn calls (conditional paths may differ): xn
- L1 · xn calls (conditional paths may differ): t, Sn, n.arrayBuffer
- L1 · Dn calls (conditional paths may differ): n, headers.get, t, Sn, s
- L1 · _n calls (conditional paths may differ): fetch, t.assign
- L1 · e calls (conditional paths may differ): e.dictionary.subarray, o.set
- L1 · Fe calls (conditional paths may differ): n.hasOwn, i.hasOwnProperty, n.assign, r, n.set, codec.push, s
- L1 · s calls (conditional paths may differ): je, a.slice
- L1 · Ee calls (conditional paths may differ): Re, t.isArray
- L1 · c calls (conditional paths may differ): i.write
- L1 · l calls (conditional paths may differ): i.close
- L1 · Ke calls (conditional paths may differ): y.resolve, e.init
- L1 · Ze calls (conditional paths may differ): t.isArray
- L1 · je calls (conditional paths may differ): e.readUint8Array
- L1 · it calls (conditional paths may differ): S.getRandomValues, et.getRandomValues
- L1 · Ft calls (conditional paths may differ): Wt, set, Lt, Ut, o.update, i.update, n.set, At
- L1 · Ct calls (conditional paths may differ): tt.importKey, mt.importKey, tt.pbkdf2, mt.deriveBits, n.assign, Lt, Ut, t.from
- L1 · Tt calls (conditional paths may differ): unescape, encodeURIComponent, e.charCodeAt, encode
- L1 · Wt calls (conditional paths may differ): n.set
- L1 · Ut calls (conditional paths may differ): e.subarray
- L1 · At calls (conditional paths may differ): e.fromBits
- L1 · Lt calls (conditional paths may differ): e.toBits
- L1 · Bt calls (conditional paths may differ): It, Ot
- L1 · Mt calls (conditional paths may differ): It, Ot
- L1 · Pt calls (conditional paths may differ): n.assign, Ot, t.charCodeAt
- L1 · Ot calls (conditional paths may differ): e.crcKey0.append, e.crcKey0.get, Vt, i.imul, Nt, e.crcKey2.append, e.crcKey2.get
- L1 · It calls (conditional paths may differ): Nt, i.imul
- L1 · Zt calls (conditional paths may differ): Jt, t.enqueue
- L1 · jt calls (conditional paths may differ): Jt, n.defineProperty
- L1 · Gt calls (conditional paths may differ): Jt
- L1 · Jt calls (conditional paths may differ): e.pipeThrough
- L1 · sn calls (conditional paths may differ): e
- L1 · an calls (conditional paths may differ): pipeTo, t.pipeThrough, r
- L1 · on calls (conditional paths may differ): e, i.addEventListener, n.assign, w, c.read, un, l.write, h, u, l.releaseLock, p, an, e.getWriter, n.write, n.releaseLock, t, abort, c.slice, i.getReader, l.getWriter
- L1 · w calls (conditional paths may differ): fn.splice, t, pn, s.isFinite, setTimeout, hn.filter, e.terminate
- L1 · un calls (conditional paths may differ): r.buffer.slice, o.push, t.postMessage, n.releaseLock, r
- L1 · pn calls (conditional paths may differ): clearTimeout
- L1 · mn calls (conditional paths may differ): toLowerCase, t.trim, decode
- L1 · In calls (conditional paths may differ): jn, Gn, n.assign, Hn
- L1 · Nn calls (conditional paths may differ): Qn, jn, l.set, i.slice, n.assign, Gn, l.get, Mn.filter, r.getValue, Vn, Zn, e.data.slice, r.getBigUint64, Kn, a.push, i.push, a.forEach
- L1 · Vn calls (conditional paths may differ): Qn, o.append, c.setUint32, o.get, Gn, n.assign, Zn, mn, e.data.subarray
- L1 · Kn calls (conditional paths may differ): s, a
- L1 · Zn calls (conditional paths may differ): e.getUint8
- L1 · jn calls (conditional paths may differ): e.getUint16
- L1 · Gn calls (conditional paths may differ): e.getUint32
- L14 · PopupContainer calls (conditional paths may differ): useState, useEffect, then, sendMessage, setActivePage
- L26 · FolderCombobox calls (conditional paths may differ): useTranslation, React.useState, options.find, t, options.map, setOpen, cn
- L15 · getAllFolders calls (conditional paths may differ): sendMessage, setTimeout
- L21 · getLastChooseFolderId calls (conditional paths may differ): localStorage.getItem
- L25 · FolderSelectWithCache calls (conditional paths may differ): getLastChooseFolderId, useRequest, localStorage.setItem, JSON.stringify, localStorage.getItem, JSON.parse, isNotNil, data.some, folder.id.toString, onValueChange, localStorage.removeItem, useState, setFolderList, refreshFolderList, map, setNewFolderDialogVisible
- L45 · handleNewFolderAdded calls (conditional paths may differ): setFolderList, onValueChange, folder.id.toString, localStorage.setItem, refreshFolderList
- L55 · handleFolderSelect calls (conditional paths may differ): localStorage.setItem, onValueChange
- L12 · HistoryTaskList calls (conditional paths may differ): useRequest, sendMessage, taskList.reverse, setActivePage, taskList.map
- L44 · ClearHistoryTaskListButton calls (conditional paths may differ): useTranslation, sendMessage, t
- L46 · handleClick calls (conditional paths may differ): sendMessage
- L70 · TaskListItem calls (conditional paths may differ): Browser.tabs.create
- L71 · openOriginalPage calls (conditional paths may differ): Browser.tabs.create
- L87 · TaskDetailText calls (conditional paths may differ): useTranslation, Date.now, toFixed, t
- L17 · PluginHomePage calls (conditional paths may differ): useTranslation, sendMessage, setActivePage, window.open, useRequest, getCurrentTab, isNil, t
- L19 · logout calls (conditional paths may differ): sendMessage, setActivePage
- L24 · openServerPage calls (conditional paths may differ): sendMessage, window.open
- L29 · openShowCasePage calls (conditional paths may differ): sendMessage, window.open
- L8 · getSavedPages calls (conditional paths may differ): getCurrentTab, isNil, sendMessage
- L21 · formatTime calls (conditional paths may differ): Date.parse, dateObj.toLocaleString
- L27 · SavedPageList calls (conditional paths may differ): useTranslation, useRequest, sendMessage, window.open, t, handlePageClick, formatTime
- L31 · handlePageClick calls (conditional paths may differ): sendMessage, window.open
- L12 · SettingPage calls (conditional paths may differ): useTranslation, setActivePage, t
- L37 · SingleFileSettings calls (conditional paths may differ): useTranslation, useState, getSingleFileSetting, setSettings, setSingleFileSetting, t, handleChange, Number.parseInt
- L181 · handleChange calls (conditional paths may differ): onCheckedChange
- L180 · SettingCheckBox calls (conditional paths may differ): onCheckedChange
- L14 · getAllTags calls (conditional paths may differ): sendMessage
- L19 · getAITagConfig calls (conditional paths may differ): sendMessage
- L24 · doGenerateTag calls (conditional paths may differ): toast.error, sendMessage, generateTagByOpenAI
- L42 · TagInputWithCache calls (conditional paths may differ): useTranslation, useRef, useRequest, localStorage.setItem, JSON.stringify, localStorage.getItem, JSON.parse, console.error, toast.error, onValueChange, generateTagRun, t
- L25 · scrapePageData calls (conditional paths may differ): getCurrentTab, Promise.all, sendMessage, takeScreenshot
- L50 · UploadPageForm calls (conditional paths may differ): useState, getLastChooseFolderId, setUploadPageData, useRequest, setActivePage, useTranslation, isNil, toast.error, t, getCurrentTab, sendMessage, getSingleFileSetting, toast.success
- L61 · handleChange calls (conditional paths may differ): setUploadPageData
- L69 · handleFolderSelect calls (conditional paths may differ): setUploadPageData
- L76 · handleTagSelect calls (conditional paths may differ): setUploadPageData
- L95 · handleCancel calls (conditional paths may differ): setActivePage
- L100 · handleSavePage calls (conditional paths may differ): isNil, toast.error, t, getCurrentTab, sendMessage, getSingleFileSetting, toast.success, setActivePage
- L5 · useServerUrl calls (conditional paths may differ): useState, useEffect, then, sendMessage, setServerUrl, console.log
- L13 · saveServerUrl calls (conditional paths may differ): setServerUrl, then, sendMessage, console.log
- L27 · useToken calls (conditional paths may differ): useState, useEffect, then, sendMessage, setToken, console.log
- L35 · saveToken calls (conditional paths may differ): setToken, then, sendMessage, console.log
- L3 · getCurrentTab calls (conditional paths may differ): Browser.tabs.query
- L1 · saveFile calls (conditional paths may differ): URL.createObjectURL, document.createElement, a.click, URL.revokeObjectURL
- L12 · base64ToBlob calls (conditional paths may differ): atob, base64.split, map, Array.from, byteCharacters.charCodeAt
- L20 · blobToBase64 calls (conditional paths may differ): resolve, reader.readAsDataURL
- L7 · app.post("")
- L11 · app.get("/should_show_recent")
- L22 · app.post("/should_show_recent")
- L46 · app.get("/ai_tag")
- L57 · app.post("/ai_tag")
Environment references: c.env.DB
Environment references: c.env.DB · c.env.BUCKET
- L11 · app.get("/all")
- L17 · app.post("/create")
- L44 · app.delete("/delete")
- L79 · app.put("/update")
- L112 · app.post("/query_deleted")
Environment references: c.env.DB
- L15 · app.post("/upload_new_page")
- L93 · app.post("/query")
- L134 · app.post("/query_all_page_ids")
- L158 · app.post("/query_by_url")
- L185 · app.get("/recent_save")
- L190 · app.get("/detail")
- L215 · app.delete("/delete_page")
- L236 · app.put("/update_page")
- L289 · app.post("/query_deleted")
- L297 · app.post("/restore_page")
- L343 · app.delete("/clear_deleted")
- L352 · app.get("/content")
- L383 · app.put("/update_showcase")
- L407 · app.get("/screenshot")
Environment references: c.env.BUCKET · c.env.DB
Environment references: c.env.DB · c.env.BUCKET
- L11 · app.get("/all")
- L17 · app.post("/create")
- L40 · app.post("/update")
- L67 · app.delete("/delete")
- L88 · app.post("/generate_tag")
Environment references: c.env.DB · c.env.AI
- L4 · tokenMiddleware calls (conditional paths may differ): next, c.req.header, authHeader.startsWith, c.json, authHeader.split, verifyAdminToken
Environment references: c.env.DB
- L5 · getHomeChartData calls (conditional paths may differ): selectAllFolders, Promise.all, folderList.map, selectPageTotalCount, slice, folderPageCountList.sort, selectAllPageCount
- L5 · checkFolderExists calls (conditional paths may differ): first, bind, DB.prepare, isNotNil
- L16 · insertFolder calls (conditional paths may differ): run, bind, DB.prepare
- L28 · updateFolder calls (conditional paths may differ): run, bind, DB.prepare
- L38 · selectAllFolders calls (conditional paths may differ): all, DB.prepare
- L52 · deleteFolderById calls (conditional paths may differ): DB.batch, bind, DB.prepare
- L76 · getFolderById calls (conditional paths may differ): first, bind, DB.prepare, isNotNil, Number
- L91 · queryDeletedFolders calls (conditional paths may differ): all, DB.prepare
- L103 · selectDeletedFolderTotalCount calls (conditional paths may differ): first, DB.prepare
- L114 · restoreFolder calls (conditional paths may differ): run, bind, DB.prepare
- L7 · selectPageTotalCount calls (conditional paths may differ): isNotNil, bindParams.push, first, bind, DB.prepare
- L34 · selectAllPageCount calls (conditional paths may differ): first, DB.prepare
- L43 · queryPage calls (conditional paths may differ): isNotNil, console.log, bindParams.push, all, bind, DB.prepare
- L93 · queryPageByUrl calls (conditional paths may differ): all, bind, DB.prepare
- L99 · selectDeletedPageTotalCount calls (conditional paths may differ): first, DB.prepare
- L108 · queryDeletedPage calls (conditional paths may differ): all, DB.prepare
- L128 · deletePageById calls (conditional paths may differ): run, bind, DB.prepare
- L140 · restorePage calls (conditional paths may differ): run, bind, DB.prepare
- L152 · getPageById calls (conditional paths may differ): first, bind, DB.prepare, isNotNil, Number
- L177 · insertPage calls (conditional paths may differ): run, bind, DB.prepare
- L188 · clearDeletedPage calls (conditional paths may differ): all, DB.prepare, filter, flat, deletePageResult.results.map, removeBucketFile, run
- L209 · queryRecentSavePage calls (conditional paths may differ): all, DB.prepare
- L228 · updatePage calls (conditional paths may differ): bind, DB.prepare, generateUpdateTagSql, DB.batch, result.every
- L246 · queryAllPageIds calls (conditional paths may differ): all, bind, DB.prepare, result.results.map
- L8 · queryShowcase calls (conditional paths may differ): Promise.all, all, bind, DB.prepare, first
- L32 · updateShowcase calls (conditional paths may differ): run, bind, DB.prepare
- L41 · getShowcaseDetailById calls (conditional paths may differ): first, bind, DB.prepare
- L53 · getNextShowcasePageId calls (conditional paths may differ): first, bind, DB.prepare
- L4 · hashToken calls (conditional paths may differ): digest, update, createHash
- L8 · checkAdminExist calls (conditional paths may differ): first, DB.prepare
- L13 · verifyAdminToken calls (conditional paths may differ): hashToken, first, bind, DB.prepare, checkAdminExist, setAdminToken
- L29 · setAdminToken calls (conditional paths may differ): checkAdminExist, run, bind, DB.prepare
- L38 · getShouldShowRecent calls (conditional paths may differ): all, DB.prepare
- L49 · setShouldShowRecent calls (conditional paths may differ): run, bind, DB.prepare
- L59 · getAITagConfig calls (conditional paths may differ): all, DB.prepare, JSON.parse
- L75 · setAITagConfig calls (conditional paths may differ): JSON.stringify, run, bind, DB.prepare
- L4 · selectAllTags calls (conditional paths may differ): all, DB.prepare, sqlResult.results.map, JSON.parse, Object.values
- L24 · getTagById calls (conditional paths may differ): first, bind, DB.prepare, JSON.parse, Object.values
- L39 · insertTag calls (conditional paths may differ): run, bind, DB.prepare
- L49 · updateTag calls (conditional paths may differ): isNil, bindParams.push, sql.slice, run, bind, DB.prepare
- L76 · deleteTagById calls (conditional paths may differ): run, bind, DB.prepare
- L90 · generateUpdateTagSql calls (conditional paths may differ): DB.prepare, bindList.map, pageIdsToBindDictString, updateStmt.bind, unbindList.map, pageIdsToUnbindDictString, bindCommands.concat
- L112 · updateBindPageByTagName calls (conditional paths may differ): generateUpdateTagSql, DB.batch, updateResult.every
- L126 · pageIdsToBindDictString calls (conditional paths may differ): pageIds.reduce, cur.toString, JSON.stringify
- L134 · pageIdsToUnbindDictString calls (conditional paths may differ): pageIds.reduce, cur.toString, JSON.stringify
- L4 · formFileToArrayBuffer calls (conditional paths may differ): encoder.encode, file.arrayBuffer
- L14 · removeBucketFile calls (conditional paths may differ): isNil, BUCKET.delete
- L22 · saveFileToBucket calls (conditional paths may differ): isNil, crypto.randomUUID, formFileToArrayBuffer, BUCKET.put
- L35 · getFileFromBucket calls (conditional paths may differ): BUCKET.get
- L39 · getBase64FileFromBucket calls (conditional paths may differ): getFileFromBucket, isNil, file.blob, blobToBase64
- L48 · blobToBase64 calls (conditional paths may differ): blob.arrayBuffer, toString, Buffer.from
- L1 · sleep calls (conditional paths may differ): setTimeout
- L21 · toTagList calls (conditional paths may differ): tags.map, tag.id.toString
- L27 · useChart calls (conditional paths may differ): React.useContext
- L166 · ContextMenuShortcut calls (conditional paths may differ): cn
- L3 · useIsMobile calls (conditional paths may differ): useState, useEffect, clearTimeout, setTimeout, setIsMobile, window.addEventListener, window.removeEventListener
- L8 · LanguageCombobox calls (conditional paths may differ): useState, console.log, supportedLanguages.find, supportedLanguages.map, setLanguage, setOpen, i18n.changeLanguage
- L39 · useSidebar calls (conditional paths may differ): React.useContext
- L3 · Skeleton calls (conditional paths may differ): cn
- L23 · ThemeProvider calls (conditional paths may differ): useState, localStorage.getItem, useEffect, root.classList.remove, window.matchMedia, root.classList.add, localStorage.setItem, setTheme
- L13 · ThemeToggle calls (conditional paths may differ): useTheme, useTranslation, t, setTheme
- L27 · buildGenerateTagMessage calls (conditional paths may differ): generateChatCompletion, JSON.stringify
- L48 · generateChatCompletion calls (conditional paths may differ): preferredTags.join
- L62 · generateTagByOpenAI calls (conditional paths may differ): fetch, JSON.stringify, buildGenerateTagMessage, res.json, JSON.parse, tagJson.tags.slice
- L4 · cn calls (conditional paths may differ): twMerge, clsx
- L20 · AITagSettingCollapsible calls (conditional paths may differ): useTranslation, useState, z.discriminatedUnion, z.object, z.literal, z.enum, min, z.string, t, z.array, url, useForm, zodResolver, useRequest, form.reset, toast.success, toast.error, form.trigger, useContext, form.handleSubmit
- L72 · validateForm calls (conditional paths may differ): form.trigger
- L17 · generateTagByConfig calls (conditional paths may differ): generateTagByOpenAI, generateTag
- L24 · AITagTestConnectionButton calls (conditional paths may differ): useTranslation, useState, useRequest, onValidate, testConnection, setStatus, setError, t
- L33 · handleTest calls (conditional paths may differ): onValidate, testConnection, setStatus, setError
- L28 · Comp calls (conditional paths may differ): useTranslation, useOutletContext, useRequest, z.object, min, z.string, t, z.number, z.array, useForm, form.reset, useContext, tag.pageIds.includes, form.setValue, useEffect, getPageDetailRun, pageId.toString, getAllFolderRun, toast.success, refreshTagCache
- L6 · CardView calls (conditional paths may differ): useMediaQuery, useMemo, Array.from, result.map, reorganizedPages.map
- L21 · EditFolderDialog calls (conditional paths may differ): useTranslation, useState, useEffect, setFolderName, useRequest, setOpen, toast.success, t, afterSubmit, toast.error, isNil, run, handleSubmit
- L22 · EditTagDialog calls (conditional paths may differ): useTranslation, useContext, useState, useEffect, setTagName, useRequest, setOpen, toast.success, t, afterSubmit, toast.error, isNil, run, handleSubmit
- L15 · Folder calls (conditional paths may differ): useTranslation, useRef, useState, t
- L9 · Hamburger calls (conditional paths may differ): useSidebar, setOpenMobile
- L15 · SearchBar calls (conditional paths may differ): useTranslation, useLocation, location.pathname.startsWith, t, setKeyword, handleSearch
- L14 · ListView calls (conditional paths may differ): useMouse, useState, setPrevScreenshotId, handleClickPage, handleHoverPage, page.createdAt.toLocaleString, children
- L17 · NewFolderDialog calls (conditional paths may differ): useTranslation, useState, useRequest, setOpen, setName, afterSubmit, toast.error, t, run, handleSubmit
- L19 · Comp calls (conditional paths may differ): useTranslation, useContext, tag.pageIds.includes, bindTags.map, useLocation, location.pathname.startsWith, e.stopPropagation, window.open, window.confirm, t, useState, useRequest, toast.success, setShowcaseState, refreshTagCache, setOpenCardEditDialog, page.id.toString, handleClickPageUrl, updateShowcase
- L11 · TotalPieCard calls (conditional paths may differ): useTranslation, useRequest, useMemo, pageChartData.folders.forEach, data.push, t
- L8 · ReadabilityPageContent calls (conditional paths may differ): parse, parseFromString, useRef, useEffect
- L13 · SettingDialog calls (conditional paths may differ): useTranslation, useTheme, useShouldShowRecent, t
- L35 · SidebarFolderMenu calls (conditional paths may differ): useTranslation, useNavigate, useState, useRequest, emitter.on, isNil, confirm, t, deleteFolder, folders.findIndex, getNextFolderId, setFolders, folders.filter, setOpenedFolder, navigate, toast.success, toast.error, setEditFolder, setEditFolderDialogOpen, cn
- L31 · TagBadge calls (conditional paths may differ): useTranslation, t
- L66 · SidebarTagMenu calls (conditional paths may differ): useTranslation, useContext, useState, setSelectedTag, useRequest, refreshTagCache, toast.error, setEditTagDialogOpen, setEditTag, useEffect, setShowTagList, then, queryAllPageIds, tags.filter, tag.pageIds.some, data.includes, t, cn, e.preventDefault, handleClickTag
- L18 · Component calls (conditional paths may differ): useTranslation, useNavigate, useState, useParams, useLocation, useEffect, pathname.startsWith, isNumberString, setOpenedFolder, Number, localStorage.removeItem, navigate, t, setSettingDialogOpen, handleLogout
- L6 · ViewToggle calls (conditional paths may differ): useContext, setView
- L4 · getAllFolder calls (conditional paths may differ): fetcher
- L10 · deleteFolder calls (conditional paths may differ): fetcher, id.toString
- L19 · createFolder calls (conditional paths may differ): fetcher
- L28 · updateFolder calls (conditional paths may differ): fetcher
- L38 · queryDeletedFolder calls (conditional paths may differ): fetcher
- L45 · restoreFolder calls (conditional paths may differ): fetcher
- L5 · getPageDetail calls (conditional paths may differ): fetcher
- L14 · deletePage calls (conditional paths may differ): fetcher, page.id.toString
- L23 · queryPage calls (conditional paths may differ): fetcher
- L42 · queryDeletedPage calls (conditional paths may differ): fetcher
- L48 · restorePage calls (conditional paths may differ): fetcher
- L57 · updatePage calls (conditional paths may differ): fetcher
- L71 · updatePageShowcase calls (conditional paths may differ): fetcher
- L81 · clearDeletedPage calls (conditional paths may differ): fetcher
- L87 · getPageScreenshot calls (conditional paths may differ): isNil, fetch, localStorage.getItem, res.blob
- L102 · getRecentSavePage calls (conditional paths may differ): fetcher
- L108 · queryAllPageIds calls (conditional paths may differ): fetcher
- L22 · useMediaQuery calls (conditional paths may differ): useState, useEffect, window.matchMedia, setMatches, clearTimeout, setTimeout, mediaQuery.addEventListener, mediaQuery.removeEventListener, map, Object.entries, mediaQueries.reduce, setBreakpoints, updateBreakpoints, mediaQueries.forEach, mq.addEventListener, mq.removeEventListener
- L11 · useObjectURL calls (conditional paths may differ): useState, useEffect, URL.createObjectURL, setObjectURL, URL.revokeObjectURL
- L5 · useShouldShowRecent calls (conditional paths may differ): useRequest, console.log, localStorage.setItem, JSON.stringify, JSON.parse, localStorage.getItem, mutate, setShouldShowRecent, toast.error
- L11 · Routes calls (conditional paths may differ): useLocalStorageState, useMemo
- L11 · Layout calls (conditional paths may differ): useState, setSearchTrigger, useRequest, setSelectedTag, handleSearch, useMemo
- L21 · FolderPage calls (conditional paths may differ): useParams, useRef, useOutletContext, useInfiniteScroll, queryPage, Math.ceil, useEffect, reload, useRequest, setPageData, useNavigate, window.open, navigate, String, useContext, isNil, e.stopPropagation, handleDeletePage
- L20 · RecentSavePageView calls (conditional paths may differ): useRequest, useShouldShowRecent, useState, setPages, useMediaQuery, useMemo, pages.filter, Array.from, result.map, map, reorganizedPages.map
- L89 · SearchiPageView calls (conditional paths may differ): useRef, useOutletContext, useInfiniteScroll, queryPage, Math.ceil, useEffect, reload, useWhyDidYouUpdate, useRequest, setPageData
- L141 · ArchiveHome calls (conditional paths may differ): useOutletContext, useState, isNil, setShowSearchView, handleSearch, useEffect, isNotNil
- L14 · getPageContent calls (conditional paths may differ): fetch, localStorage.getItem, res.text
- L28 · ArchivePage calls (conditional paths may differ): useTranslation, useNavigate, useParams, useEffect, navigate, useRequest, String, window.history.back, useObjectURL, getPageContent, setObject, window.confirm, t, runDeletePage, goBack, useContext, setReadMode
- L11 · Trash calls (conditional paths may differ): useTranslation, useRequest, toast.success, t, fetchPage, window.confirm, runClearDeletedPage, useEffect, e.stopPropagation, runRestorePage
- L3 · ErrorPage calls (conditional paths may differ): useParams
- L11 · LoginPage calls (conditional paths may differ): useTranslation, useState, e.preventDefault, toast.error, t, setLoading, finally, catch, then, fetch, localStorage.setItem, router.navigate, toast.success, res.json, setKey, setShowPassword
- L12 · ShowcaseFolderPage calls (conditional paths may differ): useRef, useInfiniteScroll, queryShowcase, Math.ceil
- L9 · getPageContent calls (conditional paths may differ): fetch, res.text
- L22 · ShowcasePage calls (conditional paths may differ): useNavigate, useParams, useEffect, navigate, useRequest, String, window.history.back, useKeyPress, goBack, goNext, Number, getPageContent, URL.createObjectURL, URL.revokeObjectURL
- L13 · fetcher calls (conditional paths may differ): processQueryString, fetch, JSON.stringify, localStorage.getItem, logOut, Promise.reject, processResponse
- L34 · processQueryString calls (conditional paths may differ): toString
- L42 · processResponse calls (conditional paths may differ): toast.error, res.json, logOut
- L6 · logOut calls (conditional paths may differ): localStorage.removeItem, router.navigate
- L1 · l calls (conditional paths may differ): a
- L1 · d calls (conditional paths may differ): n.tagName.toUpperCase
- L1 · h calls (conditional paths may differ): m, c, l.releaseLock, d
- L1 · p calls (conditional paths may differ): n.join, X, e.callFunction, e.getVariableValue, Q, $, Number, n.substring, n.charCodeAt, nn, Y.push, on, rn, e.push, r, tn, cn, sn, n.push, ln
- L1 · $ calls (conditional paths may differ): n.substring
- L1 · nn calls (conditional paths may differ): n.charCodeAt
- L1 · en calls (conditional paths may differ): nn
- L1 · tn calls (conditional paths may differ): Y.push
- L1 · an calls (conditional paths may differ): on
- L1 · on calls (conditional paths may differ): rn, e.push, r
- L1 · rn calls (conditional paths may differ): n.charCodeAt, tn, cn, on, sn, n.push, ln, b, j, mn, e.push, E
- L1 · sn calls (conditional paths may differ): n.charCodeAt, tn, on, c
- L1 · ln calls (conditional paths may differ): n.charCodeAt, tn, D.test, n.charAt, t.push, B, n.substr, L
- L1 · cn calls (conditional paths may differ): T.test, n.charAt, tn, t.push, E
- L1 · mn calls (conditional paths may differ): n.charCodeAt, tn, n.substr, n.charAt
- L1 · o calls (conditional paths may differ): o, r, ik.includes, t.push
- L1 · i calls (conditional paths may differ): i, n.data.name.includes, n.data.name.substring, n.data.name.lastIndexOf
- L1 · j calls (conditional paths may differ): e
- L1 · L calls (conditional paths may differ): n.replaceAll, e.replace, n.replace
- L1 · A calls (conditional paths may differ): e.filename.localeCompare
- L1 · I calls (conditional paths may differ): n.querySelector, o.querySelector
- L1 · T calls (conditional paths may differ): A, I
- L1 · wn calls (conditional paths may differ): forEach, n.querySelectorAll, n.setAttribute, n.removeAttribute, n.head.querySelectorAll, Array.from, n.remove, e.forEach, n.appendChild, n.createElement, t.setAttribute, t.content.appendChild, e.cloneNode, a.set, e.replaceWith, bn, In, vn, o.markedElements.push, v.values
- L1 · bn calls (conditional paths may differ): forEach, filter, Array.from, In, t.closest, tn.includes, t.tagName.toUpperCase, vn, an.includes, t.setAttribute, o.markedElements.push, l.getPropertyValue, n.startsWith, kn, o.canvases.push, t.toDataURL, r.getPropertyValue, t.getAttribute, o.images.push, t.removeAttribute
- L1 · fn calls (conditional paths may differ): map, Array.from, join
- L1 · kn calls (conditional paths may differ): n.getPropertyValue, forEach, split, yn, e.loadedFonts.find, Cn, t.set, dn.stringify
- L1 · yn calls (conditional paths may differ): toLowerCase, xn, n.trim, e.replace, String.fromCharCode
- L1 · vn calls (conditional paths may differ): e.getPropertyValue, n.getBoundingClientRect, Boolean
- L1 · jn calls (conditional paths may differ): forEach, n.querySelectorAll, n.createElement, n.body.appendChild, o.remove, join, map, Array.from, t.setAttribute
- L1 · Sn calls (conditional paths may differ): endsWith, e.getPropertyValue, parseFloat
- L1 · xn calls (conditional paths may differ): trim, n.match, n.replace
- L1 · Cn calls (conditional paths may differ): trim, n.toLowerCase
- L1 · Ln calls (conditional paths may differ): slice, toString, t.getUint32, e.push, e.join, hn.subtle.digest, encode
- L1 · An calls (conditional paths may differ): n.flat, n.reduce, n.concat, Array.isArray, An
- L1 · In calls (conditional paths may differ): n.getComputedStyle
- L1 · qn calls (conditional paths may differ): Un, a.trim, _n.forEach, Hn, e.forEach, n.replace, replace, a.replace, zn, a.match, Kn, a.substring, a.startsWith
- L1 · Un calls (conditional paths may differ): Wn, Array.from, e.bookmarkFolders.join, Fn.find, i.hostname.endsWith, i.hostname.substring, d.lastIndexOf, d.substring, u.startsWith, u.substring, i.hash.substring, i.host.replace, i.hostname.replace, Ln, replace, i.search.substring, String, Vn, y, n.pop
- L1 · y calls (conditional paths may differ): n.toISOString, split, n.toLocaleDateString, n.toLocaleTimeString, padStart, String, n.getDate, n.getMonth, n.getFullYear, n.toLocaleString, n.toUTCString, n.getUTCDate, n.getUTCMonth, n.getUTCFullYear, n.getHours, n.getMinutes, n.getSeconds, n.getUTCHours, n.getUTCMinutes, n.getUTCSeconds
- L1 · Hn calls (conditional paths may differ): n.replaceAll, e.replace, n.replace
- L1 · Gn calls (conditional paths may differ): n, r.replace, Kn, r.substring
- L1 · pn calls (conditional paths may differ): r.max
- L1 · un calls (conditional paths may differ): gn, e.isArray
- L1 · wn calls (conditional paths may differ): t.hasOwn, r.hasOwnProperty, t.assign, a, t.set, codec.push, o
- L1 · o calls (conditional paths may differ): replace, n.replace, a
- L1 · kn calls (conditional paths may differ): unescape, encodeURIComponent, n.charCodeAt, encode
- L1 · Rn calls (conditional paths may differ): v.getRandomValues, Cn.getRandomValues
- L1 · ne calls (conditional paths may differ): ae, set, re, oe, s.update, r.update, t.set, ie
- L1 · ee calls (conditional paths may differ): Ln.importKey, Wn.importKey, Ln.pbkdf2, Wn.deriveBits, t.assign, re, oe, e.from
- L1 · te calls (conditional paths may differ): kn
- L1 · ae calls (conditional paths may differ): t.set
- L1 · oe calls (conditional paths may differ): n.subarray
- L1 · ie calls (conditional paths may differ): n.fromBits
- L1 · re calls (conditional paths may differ): n.toBits
- L1 · me calls (conditional paths may differ): ue, pe
- L1 · de calls (conditional paths may differ): ue, pe
- L1 · he calls (conditional paths may differ): t.assign, pe, e.charCodeAt
- L1 · pe calls (conditional paths may differ): n.crcKey0.append, n.crcKey0.get, we, r.imul, ge, n.crcKey2.append, n.crcKey2.get
- L1 · ue calls (conditional paths may differ): ge, r.imul
- L1 · ke calls (conditional paths may differ): Se, e.enqueue
- L1 · ve calls (conditional paths may differ): Se, t.defineProperty
- L1 · je calls (conditional paths may differ): Se
- L1 · Se calls (conditional paths may differ): n.pipeThrough
- L1 · Ne calls (conditional paths may differ): n
- L1 · Be calls (conditional paths may differ): pipeTo, e.pipeThrough, a
- L1 · Oe calls (conditional paths may differ): n, r.addEventListener, t.assign, g, l.read, qe, c.write, d, m, c.releaseLock, u, Be, n.getWriter, t.write, t.releaseLock, e, abort, l.slice, r.getReader, c.getWriter
- L1 · g calls (conditional paths may differ): We.splice, e, Ke, o.isFinite, setTimeout, He.filter, n.terminate
- L1 · qe calls (conditional paths may differ): t.buffer.slice, r.push, e.postMessage, t.releaseLock, a
- L1 · Ge calls (conditional paths may differ): run, He.find, Ke, He.push, We.push, We.splice, e, o.isFinite, setTimeout, He.filter, n.terminate
- L1 · Ke calls (conditional paths may differ): clearTimeout
- L1 · ht calls (conditional paths may differ): t.assign
- L1 · pt calls (conditional paths may differ): hn, e, gt, a.headers.get, a.arrayBuffer, split, r.trim, o, kt
- L1 · ut calls (conditional paths may differ): a, gt, o.arrayBuffer, o, n.data.subarray
- L1 · gt calls (conditional paths may differ): t.assign, wt
- L1 · wt calls (conditional paths may differ): t.fromEntries
- L1 · bt calls (conditional paths may differ): yt
- L1 · ft calls (conditional paths may differ): yt
- L1 · yt calls (conditional paths may differ): e, wt, t.arrayBuffer
- L1 · kt calls (conditional paths may differ): t, headers.get, e, wt, o
- L1 · vt calls (conditional paths may differ): fetch, t.assign
- L1 · jt calls (conditional paths may differ): r.addEventListener, forEach, split, trim, r.getAllResponseHeaders, e.trim, replace, n.toUpperCase, n.push, o, i, r.open, t.entries, r.setRequestHeader, r.send
Build and deployment pipeline · 5 GitHub Actions workflows
Repository CI declarations, separate from runtime request processing. Job dependencies and conditions are shown as written; long commands are shortened with an ellipsis; a workflow file does not prove a recent successful run.
Triggers: push, workflow_dispatch
build · no job dependencies declared
- Checkout code
actions/checkout@v4 - Set up Docker Buildx
docker/setup-buildx-action@v3 - Log in to GitHub Container Registry
docker/login-action@v3 - Docker metadata
docker/metadata-action@v5 - Build and push
docker/build-push-action@v6
Triggers: push, repository_dispatch, workflow_dispatch
Deploy · no job dependencies declared
- actions/checkout@v4
actions/checkout@v4 - Setup Node
actions/setup-node@v4 - Install pnpm
npm install -g pnpm - Install dependencies
pnpm install - Build Service
pnpm build:service - Install wrangler
npm install -g wrangler - Verify Cloudflare API Token
echo "Verifying Cloudflare API Token..." wrangler whoami - Check and Create D1 Database
set -x DB_LIST=$(wrangler d1 list --json) DB_ID=$(echo $DB_LIST | jq -r '.[] | select(.name == "web-archive") | .uuid') if [ -z "$DB_ID" ]; then CREATE_OUTPUT=$(wrangler d1 create web-archive) JSON_OUTPUT=$(echo "$CREATE_OUTPUT" | sed -n '/^{/,$p') DB_ID=$(echo "$JSON_OUTPUT" | jq -r '.d1_databases[0].database_id') else echo "Found existing web-archive database" fi echo "Database ID: $DB_ID" echo "DB_ID=$DB_ID" >> $GITHUB_ENV - update wrangler.toml
cd dist/service sed -i 's/database_id = ".*"/database_id = "'$DB_ID'"/' wrangler.toml - Apply D1 Migrations
cd dist/service wrangler d1 migrations apply web-archive --remote rm -rf ./src/sql - Check and Create R2 Bucket
BUCKET_LIST=$(wrangler r2 bucket list) if echo "$BUCKET_LIST" | grep -q "web-archive"; then echo "Bucket already exists" else echo "Creating new bucket" wrangler r2 bucket create web-archive fi - Create Pages project if not exists
if ! wrangler pages project list | grep -q "web-archive"; then wrangler pages project create web-archive --production-branch=main fi - Deploy
cd dist/service && wrangler pages deploy
Triggers: push, workflow_dispatch
build · no job dependencies declared
- Checkout code
actions/checkout@v4 - Setup node
actions/setup-node@v4 - Install pnpm
npm install -g pnpm - Install dependencies
pnpm install - Build plugin
pnpm build:plugin - Zip extension folder
cd dist/extension zip -r ../../extension.zip . - Upload extension
actions/upload-artifact@v4
Triggers: push
Deploy · no job dependencies declared
- actions/checkout@v4
actions/checkout@v4 - Setup Node
actions/setup-node@v4 - Install pnpm
npm install -g pnpm - Install dependencies
pnpm install - Build Service
pnpm build:service - Install wrangler
npm install -g wrangler - Verify Cloudflare API Token
echo "Verifying Cloudflare API Token..." wrangler whoami - Check and Create D1 Database
set -x DB_LIST=$(wrangler d1 list --json) DB_ID=$(echo $DB_LIST | jq -r '.[] | select(.name == "web-archive") | .uuid') if [ -z "$DB_ID" ]; then CREATE_OUTPUT=$(wrangler d1 create web-archive) DB_ID=$(echo "$CREATE_OUTPUT" | sed -n 's/.*database_id = "\([^"]*\)".*/\1/p') else echo "Found existing web-archive database" fi echo "Database ID: $DB_ID" echo "DB_ID=$DB_ID" >> $GITHUB_ENV - update wrangler.toml
cd dist/service sed -i 's/database_id = ".*"/database_id = "'$DB_ID'"/' wrangler.toml - Apply D1 Migrations
cd dist/service wrangler d1 migrations apply web-archive --remote rm -rf ./src/sql - Check and Create R2 Bucket
BUCKET_LIST=$(wrangler r2 bucket list) if echo "$BUCKET_LIST" | grep -q "web-archive"; then echo "Bucket already exists" else echo "Creating new bucket" wrangler r2 bucket create web-archive fi - Create Pages project if not exists
if ! wrangler pages project list | grep -q "web-archive"; then wrangler pages project create web-archive --production-branch=main fi - Deploy
cd dist/service wrangler pages deploy --project-name=web-archive --branch=${{ github.ref_name }}
Triggers: push, workflow_dispatch
build · no job dependencies declared
- Checkout code
actions/checkout@v4 - Setup node
actions/setup-node@v4 - Install pnpm
npm install -g pnpm - Install dependencies
pnpm install - Build plugin
pnpm build:plugin - Build service
pnpm build:service - Zip extension folder
cd dist/extension zip -r ../../extension.zip . - Zip service folder
cd dist/service zip -r ../../service.zip . - Upload extension
actions/upload-artifact@v4 - Upload service
actions/upload-artifact@v4 - Create Release
softprops/action-gh-release@v1
build:service: pnpm --filter=server build && pnpm --filter=web build && node scripts/build_clear.mjsbuild:plugin: pnpm --filter=plugin buildbuild:plugin-firefox: pnpm --filter=plugin build:firefox
build: vite build --config vite.production.config.tsbuild:firefox: vite build --config vite.production.config.ts -- --firefox
build: vite builddeploy: $npm_execpath run build && wrangler pages deploy
build: vite build
Repository README
View original on GitHub ↗Full upstream document by @Ray-D-Song · README.md · snapshot c8c89b7
Directory
Web Archive

Web Archive is a free web archiving and sharing service based on Cloudflare, including the following parts:
- Browser plugin: Save the webpage as a single html file and upload it to the server.
- Server: Receive the html file uploaded by the browser plugin and store it in the database and storage bucket.
- Web client: Query the html file and display it.
The server is based on the full set of services of Cloudflare Worker, including D1 database and R2 storage bucket.
Features
- Web archiving, search, sharing
- Folder classification
- Mobile adaptation
- AI generated tag classification
- Reading mode
Deploy
Cloudflare (Recommended)
You can refer to the deploy document to deploy on Cloudflare.
Docker
Run locally with a single command:
docker run -d -p 8787:8787 -v web-archive-data:/app/service/.wrangler/state ghcr.io/ray-d-song/web-archive:latest
For more details, see the Docker deployment guide.
After deployment, in the browser plugin, enter the service address and key to use.
Plugin download:
Frequently asked about Web Archive
What is Web Archive?+
Web Archive is a self-hosted Evernote/Raindrop.io alternative built on the Cloudflare developer platform. Save webpages into your own Cloudflare archive, with folders, tags, search and optional AI classification.
What does Web Archive replace?+
Web Archive is listed as an alternative to Evernote, Raindrop.io. Compare the features and tradeoffs before migrating.
What Cloudflare primitives does Web Archive use?+
Web Archive is built on D1, Pages, R2, Workers, Workers AI.
How much does Web Archive cost to run?+
A modest personal archive can fit Cloudflare Pages/Workers, D1 and R2 Standard free allowances; optional AI depends on the chosen model and daily usage. Initialise the owner token before exposing a fresh service publicly. Free-tier eligibility is source-reviewed, not a fresh deployment or load test. Pages Functions share Workers Free allowances: 100,000 dynamic requests per day and 10 ms CPU per invocation. Static asset requests are free when they do not invoke Functions. D1 Free includes 5 million rows read and 100,000 rows written per day with 5 GB total storage. Queries and imports consume allowances; title search is not a promise of full-text search across saved pages. R2 Standard includes 10 GB-month of storage, 1 million Class A operations and 10 million Class B operations per month. Saved HTML, embedded resources and previews consume storage; Infrequent Access has different terms. R2 must be enabled for the account before the documented deployment workflow runs. Account onboarding or payment details may be required, even when usage stays inside the free allocation. The AI binding is declared, but auto-tagging is a separate user-triggered workflow. Workers AI lists a 10,000-neuron daily free allocation; some models require paid billing or credits, and external OpenAI-compatible providers charge separately. The deployment generates dist/service/wrangler.toml from packages/server/wrangler.raw.toml and replaces its D1 ID. Use resources and credentials from your own account, then apply the remote migrations. Before public access, choose a strong private administrator token and complete the first-login bootstrap. The first accepted token is stored as administrator credentials; a publicly reachable uninitialised deployment can be claimed by someone else. No browser extension installation, upstream build, fresh app deployment, capture, token bootstrap, sharing or AI execution was performed in this source review. Check current Cloudflare pricing before deploying.
Is Web Archive open source?+
The upstream repository declares the GPL-3.0 license. Read its terms at https://raw.githubusercontent.com/Ray-D-Song/web-archive/c8c89b7df933cd0145854bf66243710f3e61d17a/LICENSE. Source code and contributor credit are available at https://github.com/Ray-D-Song/web-archive.
Community rating
No ratings yet. Tried this project? Share your experience.
One rating per verified account. You can change or remove yours. Accounts are email verified; use of the software is self-reported.



Discussion · 0
sign in to comment →