Cloudsteading
Web Archive application dashboard showing saved webpage previews, folders, tags, title search and storage statistics. Author-provided screenshot from the reviewed repository; not a fresh Cloudsteading deployment.
Web Archive application dashboard showing saved webpage previews, folders, tags, title search and storage statistics. Author-provided screenshot from the reviewed repository; not a fresh Cloudsteading deployment.

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

@Ray-D-Song

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.
Check current pricing ↗
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.

Raindrop.io logoRaindrop.io ↗

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 ↗
Evernote logoEvernote ↗

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 ↗
external SaaS target
varies
→ D1 + Pages + R2
external SaaS target
varies
→ D1 + Pages + R2

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 ↗
Public interface
Configured entry points1
web-archive
packages/server/wrangler.raw.toml
↓
App
web-archive
entry
Cloudflare Pages
↓

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
packages/server/wrangler.toml ↗

Cloudflare Pages · compatibility 2024-10-21

web-archive · default

  • DB → D1
  • BUCKET → R2
  • AI → Workers AI
packages/server/wrangler.raw.toml ↗

Cloudflare Pages · compatibility 2024-10-21

web-archive · default

  • DB → D1
  • BUCKET → R2
  • AI → 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.

packages/plugin/background/background.ts ↗
  • L29 · appendAuthHeader calls (conditional paths may differ): Browser.storage.local.get, Object.assign
  • L46 · request calls (conditional paths may differ): Browser.storage.local.get, setTimeout, abortController.abort, fetch, appendAuthHeader, res.json, Browser.storage.local.set
packages/plugin/background/keepAlive.ts ↗
  • L5 · keepAlive calls (conditional paths may differ): Date.now, clearInterval, setInterval, Browser.runtime.getPlatformInfo
packages/plugin/background/login.ts ↗
  • L4 · resetLoginStatus calls (conditional paths may differ): Browser.storage.local.set
  • L8 · checkLoginStatus calls (conditional paths may differ): request, Browser.storage.local.set
  • L21 · getCacheLoginStatus calls (conditional paths may differ): Browser.storage.local.get
packages/plugin/background/processor.ts ↗
  • 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
packages/plugin/contentScripts/content.ts ↗
  • L4 · createModal calls (conditional paths may differ): document.createElement, Object.assign, modal.classList.add
packages/plugin/lib/single-file-background.js ↗
  • L1 · s calls (conditional paths may differ): s.array.slice, browser.tabs.sendMessage
  • L1 · n calls (conditional paths may differ): browser.declarativeNetRequest.updateSessionRules
  • L1 · a calls (conditional paths may differ): e.delete
packages/plugin/lib/single-file-bootstrap.js ↗
  • 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
packages/plugin/lib/single-file-extension-background.js ↗
  • 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
packages/plugin/lib/single-file-extension-bootstrap.js ↗
  • 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
packages/plugin/lib/single-file-extension-core.js ↗
  • L1 · u calls (conditional paths may differ): o, document.addEventListener, document.dispatchEvent, JSON.stringify, document.removeEventListener, r, t, d.set, l
  • L1 · h calls (conditional paths may differ): l
  • L1 · l calls (conditional paths may differ): browser.runtime.sendMessage, r.error.toString
packages/plugin/lib/single-file-extension-editor.js ↗
  • 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
packages/plugin/lib/single-file-extension-offscreen-document.js ↗
  • 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
packages/plugin/lib/single-file-extension.js ↗
  • 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
packages/plugin/lib/single-file-frames.js ↗
  • 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
packages/plugin/lib/single-file-hooks-frames.js ↗
  • 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
packages/plugin/lib/single-file-infobar.js ↗
  • 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
packages/plugin/lib/single-file-z-worker.js ↗
  • 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
packages/plugin/lib/single-file-zip.js ↗
  • 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
packages/plugin/lib/single-file-zip.min.js ↗
  • 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
packages/plugin/popup/PopupPage.tsx ↗
  • L14 · PopupContainer calls (conditional paths may differ): useState, useEffect, then, sendMessage, setActivePage
packages/plugin/popup/components/FolderCombobox.tsx ↗
  • L26 · FolderCombobox calls (conditional paths may differ): useTranslation, React.useState, options.find, t, options.map, setOpen, cn
packages/plugin/popup/components/FolderSelectWithCache.tsx ↗
  • 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
packages/plugin/popup/components/HistoryTaskList.tsx ↗
  • 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
packages/plugin/popup/components/LoginPage.tsx ↗
  • L10 · LoginPage calls (conditional paths may differ): useTranslation, useServerUrl, useToken, then, sendMessage, setActivePage, toast.error, t
  • L15 · checkAuth calls (conditional paths may differ): then, sendMessage, setActivePage, toast.error, t
packages/plugin/popup/components/NewFolderDialog.tsx ↗
  • L16 · createFolder calls (conditional paths may differ): sendMessage
  • L24 · NewFolderDialog calls (conditional paths may differ): useTranslation, useState, useRequest, toast.success, t, setOpen, setName, afterSubmit, toast.error, run, handleSubmit
packages/plugin/popup/components/PluginHomePage.tsx ↗
  • 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
packages/plugin/popup/components/SavedPageList.tsx ↗
  • 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
packages/plugin/popup/components/SettingPage.tsx ↗
  • 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
packages/plugin/popup/components/TagInputWithCache.tsx ↗
  • 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
packages/plugin/popup/components/ThemeToggle.tsx ↗
  • L16 · ThemeToggle calls (conditional paths may differ): useTheme, setTheme, getNextTheme
  • L19 · toggleTheme calls (conditional paths may differ): setTheme, getNextTheme
packages/plugin/popup/components/UploadPageForm.tsx ↗
  • 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
packages/plugin/popup/composable/server.ts ↗
  • 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
packages/plugin/popup/utils/screenshot.ts ↗
  • L6 · getImageSize calls (conditional paths may differ): resolve
  • L22 · compressImage calls (conditional paths may differ): getImageSize, base64ToBlob, Math.min, resolve, blobToBase64
  • L40 · takeScreenshot calls (conditional paths may differ): isNil, Browser.tabs.captureVisibleTab, compressImage
packages/plugin/popup/utils/singleFile.ts ↗
  • L4 · getSingleFileSetting calls (conditional paths may differ): localStorage.getItem, isNil, JSON.parse
  • L27 · setSingleFileSetting calls (conditional paths may differ): localStorage.setItem, JSON.stringify
packages/plugin/popup/utils/tab.ts ↗
  • L3 · getCurrentTab calls (conditional paths may differ): Browser.tabs.query
packages/plugin/utils/file.ts ↗
  • 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
packages/plugin/utils/singleFile.ts ↗
  • L52 · getCurrentPageData calls (conditional paths may differ): extension.getPageData, document.getElementsByName
  • L84 · saveCurrentPage calls (conditional paths may differ): getCurrentPageData, saveFile
packages/server/src/api/config.ts ↗
  • 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

packages/server/src/api/data.ts ↗
  • L8 · app.get("/page_chart_data")
  • L14 · app.get("/r2_usage")

Environment references: c.env.DB · c.env.BUCKET

packages/server/src/api/folders.ts ↗
  • 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

packages/server/src/api/pages.ts ↗
  • 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

packages/server/src/api/showcase.ts ↗
  • L12 · app.post("/query")
  • L42 · app.get("/content")
  • L72 · app.get("/detail")
  • L96 · app.get("/next_id")

Environment references: c.env.DB · c.env.BUCKET

packages/server/src/api/tags.ts ↗
  • 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

packages/server/src/middleware/token.ts ↗
  • L4 · tokenMiddleware calls (conditional paths may differ): next, c.req.header, authHeader.startsWith, c.json, authHeader.split, verifyAdminToken

Environment references: c.env.DB

packages/server/src/model/data.ts ↗
  • L5 · getHomeChartData calls (conditional paths may differ): selectAllFolders, Promise.all, folderList.map, selectPageTotalCount, slice, folderPageCountList.sort, selectAllPageCount
packages/server/src/model/folder.ts ↗
  • 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
packages/server/src/model/page.ts ↗
  • 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
packages/server/src/model/showcase.ts ↗
  • 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
packages/server/src/model/store.ts ↗
  • 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
packages/server/src/model/tag.ts ↗
  • 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
packages/server/src/server.ts ↗
  • L14 · app.get("/")
  • L34 · api.route("/showcase")
  • L38 · api.route("/pages")
  • L39 · api.route("/auth")
  • L40 · api.route("/folders")
  • L41 · api.route("/tags")
  • L42 · api.route("/data")
  • L43 · api.route("/config")
  • L44 · app.route("/api")
packages/server/src/utils/file.ts ↗
  • 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
packages/server/src/utils/sleep.ts ↗
  • L1 · sleep calls (conditional paths may differ): setTimeout
packages/shared/components/auto-complete-tag-input.tsx ↗
  • L21 · toTagList calls (conditional paths may differ): tags.map, tag.id.toString
packages/shared/components/badge.tsx ↗
  • L30 · Badge calls (conditional paths may differ): cn, badgeVariants
  • L36 · BadgeSpan calls (conditional paths may differ): cn, badgeVariants
packages/shared/components/chart.tsx ↗
  • L27 · useChart calls (conditional paths may differ): React.useContext
packages/shared/components/context-menu.tsx ↗
  • L166 · ContextMenuShortcut calls (conditional paths may differ): cn
packages/shared/components/hooks/use-mobile.ts ↗
  • L3 · useIsMobile calls (conditional paths may differ): useState, useEffect, clearTimeout, setTimeout, setIsMobile, window.addEventListener, window.removeEventListener
packages/shared/components/language-combobox.tsx ↗
  • L8 · LanguageCombobox calls (conditional paths may differ): useState, console.log, supportedLanguages.find, supportedLanguages.map, setLanguage, setOpen, i18n.changeLanguage
packages/shared/components/side-bar.tsx ↗
  • L39 · useSidebar calls (conditional paths may differ): React.useContext
packages/shared/components/skeleton.tsx ↗
  • L3 · Skeleton calls (conditional paths may differ): cn
packages/shared/components/theme-provider.tsx ↗
  • L23 · ThemeProvider calls (conditional paths may differ): useState, localStorage.getItem, useEffect, root.classList.remove, window.matchMedia, root.classList.add, localStorage.setItem, setTheme
packages/shared/components/theme-toggle.tsx ↗
  • L13 · ThemeToggle calls (conditional paths may differ): useTheme, useTranslation, t, setTheme
packages/shared/utils/ai.ts ↗
  • 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
packages/shared/utils/helper.ts ↗
  • L4 · cn calls (conditional paths may differ): twMerge, clsx
packages/shared/utils/validate.ts ↗
  • L9 · isNumberString calls (conditional paths may differ): isNotNil, Number.isNaN, Number
  • L13 · isNotEmptyArray calls (conditional paths may differ): isNotNil, Array.isArray
packages/web/src/components/ai-tag-setting-collapsible.tsx ↗
  • 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
packages/web/src/components/ai-tag-test-connection-button.tsx ↗
  • 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
packages/web/src/components/card-edit-dialog.tsx ↗
  • 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
packages/web/src/components/card-view.tsx ↗
  • L6 · CardView calls (conditional paths may differ): useMediaQuery, useMemo, Array.from, result.map, reorganizedPages.map
packages/web/src/components/edit-folder-dialog.tsx ↗
  • L21 · EditFolderDialog calls (conditional paths may differ): useTranslation, useState, useEffect, setFolderName, useRequest, setOpen, toast.success, t, afterSubmit, toast.error, isNil, run, handleSubmit
packages/web/src/components/edit-tag-dialog.tsx ↗
  • L22 · EditTagDialog calls (conditional paths may differ): useTranslation, useContext, useState, useEffect, setTagName, useRequest, setOpen, toast.success, t, afterSubmit, toast.error, isNil, run, handleSubmit
packages/web/src/components/folder.tsx ↗
  • L15 · Folder calls (conditional paths may differ): useTranslation, useRef, useState, t
packages/web/src/components/hamburger.tsx ↗
  • L9 · Hamburger calls (conditional paths may differ): useSidebar, setOpenMobile
packages/web/src/components/header.tsx ↗
  • L15 · SearchBar calls (conditional paths may differ): useTranslation, useLocation, location.pathname.startsWith, t, setKeyword, handleSearch
packages/web/src/components/list-view.tsx ↗
  • L14 · ListView calls (conditional paths may differ): useMouse, useState, setPrevScreenshotId, handleClickPage, handleHoverPage, page.createdAt.toLocaleString, children
packages/web/src/components/new-folder-dialog.tsx ↗
  • L17 · NewFolderDialog calls (conditional paths may differ): useTranslation, useState, useRequest, setOpen, setName, afterSubmit, toast.error, t, run, handleSubmit
packages/web/src/components/page-card.tsx ↗
  • 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
packages/web/src/components/page-data-pie-card.tsx ↗
  • L11 · TotalPieCard calls (conditional paths may differ): useTranslation, useRequest, useMemo, pageChartData.folders.forEach, data.push, t
packages/web/src/components/readability-page-content.tsx ↗
  • L8 · ReadabilityPageContent calls (conditional paths may differ): parse, parseFromString, useRef, useEffect
packages/web/src/components/setting-dialog.tsx ↗
  • L13 · SettingDialog calls (conditional paths may differ): useTranslation, useTheme, useShouldShowRecent, t
packages/web/src/components/side-bar-folder-menu.tsx ↗
  • 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
packages/web/src/components/side-bar-tag-menu.tsx ↗
  • 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
packages/web/src/components/side-bar.tsx ↗
  • L18 · Component calls (conditional paths may differ): useTranslation, useNavigate, useState, useParams, useLocation, useEffect, pathname.startsWith, isNumberString, setOpenedFolder, Number, localStorage.removeItem, navigate, t, setSettingDialogOpen, handleLogout
packages/web/src/components/view-toggle.tsx ↗
  • L6 · ViewToggle calls (conditional paths may differ): useContext, setView
packages/web/src/data/config.ts ↗
  • L4 · getShouldShowRecent calls (conditional paths may differ): fetcher
  • L10 · setShouldShowRecent calls (conditional paths may differ): fetcher
  • L17 · getAITagConfig calls (conditional paths may differ): fetcher
  • L23 · setAITagConfig calls (conditional paths may differ): fetcher
packages/web/src/data/data.ts ↗
  • L12 · getPageChartData calls (conditional paths may differ): fetcher
  • L23 · getR2Usage calls (conditional paths may differ): fetcher
packages/web/src/data/folder.ts ↗
  • 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
packages/web/src/data/page.ts ↗
  • 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
packages/web/src/data/showcase.ts ↗
  • L4 · queryShowcase calls (conditional paths may differ): fetcher
  • L20 · getNextShowcasePageId calls (conditional paths may differ): fetcher, String
packages/web/src/data/tag.ts ↗
  • L4 · getAllTag calls (conditional paths may differ): fetcher
  • L10 · deleteTag calls (conditional paths may differ): fetcher, tagId.toString
  • L17 · updateTag calls (conditional paths may differ): fetcher
  • L24 · generateTag calls (conditional paths may differ): fetcher
packages/web/src/hooks/useMediaQuery.ts ↗
  • 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
packages/web/src/hooks/useObjectUrl.ts ↗
  • L11 · useObjectURL calls (conditional paths may differ): useState, useEffect, URL.createObjectURL, setObjectURL, URL.revokeObjectURL
packages/web/src/hooks/useShouldShowRecent.ts ↗
  • L5 · useShouldShowRecent calls (conditional paths may differ): useRequest, console.log, localStorage.setItem, JSON.stringify, JSON.parse, localStorage.getItem, mutate, setShouldShowRecent, toast.error
packages/web/src/index.tsx ↗
  • L11 · Routes calls (conditional paths may differ): useLocalStorageState, useMemo
packages/web/src/pages/(layout)/_layout.tsx ↗
  • L11 · Layout calls (conditional paths may differ): useState, setSearchTrigger, useRequest, setSelectedTag, handleSearch, useMemo
packages/web/src/pages/(layout)/folder.[slug].tsx ↗
  • 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
packages/web/src/pages/(layout)/index.tsx ↗
  • 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
packages/web/src/pages/(layout)/page.[slug].tsx ↗
  • 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
packages/web/src/pages/(layout)/trash.tsx ↗
  • L11 · Trash calls (conditional paths may differ): useTranslation, useRequest, toast.success, t, fetchPage, window.confirm, runClearDeletedPage, useEffect, e.stopPropagation, runRestorePage
packages/web/src/pages/error.[slug].tsx ↗
  • L3 · ErrorPage calls (conditional paths may differ): useParams
packages/web/src/pages/login.tsx ↗
  • 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
packages/web/src/pages/showcase/folder.tsx ↗
  • L12 · ShowcaseFolderPage calls (conditional paths may differ): useRef, useInfiniteScroll, queryShowcase, Math.ceil
packages/web/src/pages/showcase/page.[slug].tsx ↗
  • 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
packages/web/src/utils/fetcher.ts ↗
  • 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
packages/web/src/utils/router.ts ↗
  • L6 · logOut calls (conditional paths may differ): localStorage.removeItem, router.navigate
packages/plugin/lib/single-file-extension-editor-helper.js ↗
  • 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
packages/plugin/lib/single-file.js ↗
  • 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.

Build and Push Container · .github/workflows/container.yml ↗

Triggers: push, workflow_dispatch

build · no job dependencies declared

  1. Checkout codeactions/checkout@v4
  2. Set up Docker Buildxdocker/setup-buildx-action@v3
  3. Log in to GitHub Container Registrydocker/login-action@v3
  4. Docker metadatadocker/metadata-action@v5
  5. Build and pushdocker/build-push-action@v6
Deploy · .github/workflows/deploy.yml ↗

Triggers: push, repository_dispatch, workflow_dispatch

Deploy · no job dependencies declared

  1. actions/checkout@v4actions/checkout@v4
  2. Setup Nodeactions/setup-node@v4
  3. Install pnpmnpm install -g pnpm
  4. Install dependenciespnpm install
  5. Build Servicepnpm build:service
  6. Install wranglernpm install -g wrangler
  7. Verify Cloudflare API Tokenecho "Verifying Cloudflare API Token..." wrangler whoami
  8. Check and Create D1 Databaseset -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
  9. update wrangler.tomlcd dist/service sed -i 's/database_id = ".*"/database_id = "'$DB_ID'"/' wrangler.toml
  10. Apply D1 Migrationscd dist/service wrangler d1 migrations apply web-archive --remote rm -rf ./src/sql
  11. Check and Create R2 BucketBUCKET_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
  12. Create Pages project if not existsif ! wrangler pages project list | grep -q "web-archive"; then wrangler pages project create web-archive --production-branch=main fi
  13. Deploycd dist/service && wrangler pages deploy
Build and Release · .github/workflows/preview-plugin.yml ↗

Triggers: push, workflow_dispatch

build · no job dependencies declared

  1. Checkout codeactions/checkout@v4
  2. Setup nodeactions/setup-node@v4
  3. Install pnpmnpm install -g pnpm
  4. Install dependenciespnpm install
  5. Build pluginpnpm build:plugin
  6. Zip extension foldercd dist/extension zip -r ../../extension.zip .
  7. Upload extensionactions/upload-artifact@v4
Deploy-Preview · .github/workflows/preview-service.yml ↗

Triggers: push

Deploy · no job dependencies declared

  1. actions/checkout@v4actions/checkout@v4
  2. Setup Nodeactions/setup-node@v4
  3. Install pnpmnpm install -g pnpm
  4. Install dependenciespnpm install
  5. Build Servicepnpm build:service
  6. Install wranglernpm install -g wrangler
  7. Verify Cloudflare API Tokenecho "Verifying Cloudflare API Token..." wrangler whoami
  8. Check and Create D1 Databaseset -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
  9. update wrangler.tomlcd dist/service sed -i 's/database_id = ".*"/database_id = "'$DB_ID'"/' wrangler.toml
  10. Apply D1 Migrationscd dist/service wrangler d1 migrations apply web-archive --remote rm -rf ./src/sql
  11. Check and Create R2 BucketBUCKET_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
  12. Create Pages project if not existsif ! wrangler pages project list | grep -q "web-archive"; then wrangler pages project create web-archive --production-branch=main fi
  13. Deploycd dist/service wrangler pages deploy --project-name=web-archive --branch=${{ github.ref_name }}
Build and Release · .github/workflows/release.yml ↗

Triggers: push, workflow_dispatch

build · no job dependencies declared

  1. Checkout codeactions/checkout@v4
  2. Setup nodeactions/setup-node@v4
  3. Install pnpmnpm install -g pnpm
  4. Install dependenciespnpm install
  5. Build pluginpnpm build:plugin
  6. Build servicepnpm build:service
  7. Zip extension foldercd dist/extension zip -r ../../extension.zip .
  8. Zip service foldercd dist/service zip -r ../../service.zip .
  9. Upload extensionactions/upload-artifact@v4
  10. Upload serviceactions/upload-artifact@v4
  11. Create Releasesoftprops/action-gh-release@v1
package.json ↗
  • build:service: pnpm --filter=server build && pnpm --filter=web build && node scripts/build_clear.mjs
  • build:plugin: pnpm --filter=plugin build
  • build:plugin-firefox: pnpm --filter=plugin build:firefox
packages/plugin/package.json ↗
  • build: vite build --config vite.production.config.ts
  • build:firefox: vite build --config vite.production.config.ts -- --firefox
packages/server/package.json ↗
  • build: vite build
  • deploy: $npm_execpath run build && wrangler pages deploy

Full upstream document by @Ray-D-Song · README.md · snapshot c8c89b7

Directory

Web Archive

showcase

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

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:

Powered by DartNode

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.

Discuss your experience ↓
Sign in to rate

Discussion · 0

sign in to comment →
No comments yet — be the first.