Browse, inspect and download every asset a web page loads — images, SVG, video, audio, JS, CSS, fonts, JSON, WASM and more — from inside Chrome DevTools, as individual files or a folder-structured ZIP. Zero dependencies, 100% hand-written code, no build step.
4
stars
4
commits
JavaScript
primary language
Aug 24, 2026
updated
The everything-downloader for web developers, QA engineers and researchers.
Browse, inspect and download every asset a web page loads — images, SVG, video, audio, JS, CSS, fonts, JSON, WASM, manifests and more — one by one or all at once as a tidy, folder-structured ZIP.
For years I built automations for web scraping, data analysis and QA workflows. Then SPAs took over the web — and I kept hitting the same wall: as an end user you can't easily grab the things you see on screen, and as a developer the Chrome DevTools area often feels either insufficient or overwhelming. That frustration is exactly why I built Source Download.
This is my first open-source project, so your feedback means the world to me — it's the single biggest driver for making this thing better. And please, don't forget to connect with me on LinkedIn — I'd love to hear how you use it and chat about what else we could build together. Enjoy!
Live on the Chrome Web Store: Install Source Download
A confession: almost every "download this page's assets" tool you'll find on the store is a wrapper around a pile of third-party libraries. This one is different. Every byte of Source Download — including the ZIP writer, the XLSX builder, the HLS merger and the code formatters — is hand-written from scratch. No frameworks, no dependencies, no build step, no telemetry. Just vanilla JavaScript, readable and auditable in a sitting.
| DevTools panel | Inspector & lightbox | Toolbar popup |
|---|---|---|
![]() | ![]() | ![]() |
F12) on any page and switch to the Source Download tab.git clone https://github.com/turanburakyesilyurt/source-download.git
cd source-download
chrome://extensions.The toolbar icon opens the extension popup, which shows a live per-category resource counter and the quick-start instructions. (Chrome doesn't let extensions programmatically open DevTools, so the icon leads you here instead.)
onRequestFinished events) and from scanning the live page DOM — <img>, <video>,
<audio>, <script>, <link>, <source>, <iframe>, <embed>, <object>, <track>,
srcset, Open Graph images, favicons and more.url(...) and @import rules inside stylesheets
(backgrounds, fonts, sprites) are parsed out and listed automatically — imported stylesheets are
followed recursively, so font @font-face sources buried two levels deep are still found.width and get every stylesheet that references it; wrap a
query in /…/ for regex, e.g. /\.svg$/.createImageBitmap). Images also
get duplicate detection and a Hide duplicates filter. Sort by name, size, type or time.<table> on the page (with snapshot history) and exports to Markdown, CSV, HTML or a real
multi-sheet XLSX workbook.This is where Source Download really shines. Each category below has its own dedicated view, filters and export options — and its own set of killer use cases.
What it captures. Every raster image on the page — <img>, srcset, background images inside
CSS, Open Graph thumbnails, favicons, blob: images created by the page, everything.
How the tools help.
Use cases.
images/ folder, ready for your competitive research board.Screenshot slot
What it captures. Every inline-rendered and linked SVG — logos, icons, charts, illustrations.
How the tools help.
/logo.*\.svg$/ finds every logo asset instantly.Use cases.
viewBoxes and strokes.Screenshot slot
What it captures. Video files from <video>/<source> tags, dynamically created players,
blob: streams and CDN URLs.
How the tools help.
blob: sources.m3u8, mpd, .ts,
unknown codecs) never leave you with a black box: a fallback explains why and offers
Merge segments & download (my hand-written lib/hls.js downloads the master/media playlists
and every segment in order, then concatenates them into a single .ts/.mp4 file) or
Download original for VLC. Encrypted (AES-128) streams are detected and reported instead of
failing silently.Use cases.
blob: or HLS streams — get
the real bytes, not screen recordings.Screenshot slot
What it captures. MP3, OGG, WAV, AAC, M4A and streamed audio from players and <audio> tags.
How the tools help.
Use cases.
Screenshot slot
What it captures. WebVTT, SRT, TTML and other caption files, including <track src> on video.
How the tools help.
Use cases.
.vtt on a course or news page in one ZIP.What it captures. .map files and JSON bodies that look like source maps (mappings +
sources), instead of dumping them into the JSON tab.
How the tools help.
Use cases.
What it captures. @font-face sources (woff, woff2, ttf, otf) referenced from stylesheets —
including fonts buried inside @import-ed stylesheets (e.g. Google Fonts' CSS2 responses).
How the tools help.
blob:.Use cases.
Screenshot slot
What it captures. Every stylesheet — <link rel="stylesheet">, dynamically injected styles,
inline <style> blocks, and stylesheets pulled in via @import.
How the tools help.
url(...) and @import references are followed recursively, so
background images, sprites, fonts and imported themes are all discovered and categorized.Use cases.
Screenshot slot
What it captures. Script files, module bundles, dynamic chunks and inlined scripts.
How the tools help.
Use cases.
Screenshot slot
What it captures. Every XHR/fetch request, extension-less GETs with query strings, and JSON responses — the "live table behind the dashboard" traffic that other tools bury.
How the tools help.
Use cases.
Screenshot slot
What it captures. PDFs, XML, and other text documents the page loads or links to.
How the tools help.
Use cases.
Screenshot slot
What it captures. Compiled WebAssembly modules and PWA/extension manifest.json / .webmanifest
files.
How the tools help.
.wasm-looking binaries are recognized even without a file extension.Use cases.
Screenshot slot
What it captures. Not a resource list — a live content viewer. Every element that carries text
(headings, paragraphs, list items, div, span, a, button, …) is captured in DOM order, plus
every real <table> / ARIA grid on the page.
How the tools help.
count(//a), //@href, string(//title). Whatever the page says about a broken query
is shown right under the box, so you are never guessing.8 snapshots · 124 unique rows. Press Show all rows to
merge every snapshot into one deduplicated table so you can see the full harvest instead of
trusting the export.text/table-N.csv inside a ZIP.<table> page inside a ZIP.lib/xlsx.js (an XLSX is just a ZIP of XML — no spreadsheet library involved).Use cases.
Screenshot slot
What it captures. Everything that doesn't fit a neat category yet — unknown extensions, no extension, exotic formats.
How the tools help.
Use case. Whenever you find an odd file in Other, click it — the inspector tells you what it really is, and it's one keystroke away from being re-categorized and downloaded correctly.
Screenshot slot
The panel ships with a built-in, searchable guide — click the ? button in the top-right
toolbar (it also opens automatically on first run). A quick orientation:
The extension cannot open DevTools by itself (Chrome restriction). Press F12 (or
Ctrl/Cmd+Shift+I) and pick the Source Download tab in the DevTools toolbar. The toolbar
icon's popup shows per-category counts and lets you choose which categories feed the icon badge.
/…/ for regex,
e.g. /\.(png|jpg)$/.Click a resource to open it in the inspector; each opened file becomes a tab, and the newest lands
on the left so you can compare several at once. Specialized viewers handle images (lightbox with
zoom/pan), video, audio, fonts, SVG, code (with line numbers + Beautify) and API calls (response
| request split view). Esc closes the current overlay.
The Text category swaps the pane for a live, readable copy of the page: everything that holds text is captured in DOM order and kept updated while Live is on. Query it with plain text, a regular expression, a CSS selector or an XPath expression, and narrow it further to a single element type. Dynamic tables store a bounded snapshot history — press Show all rows to merge every snapshot into one deduplicated view. Export as TXT or Markdown, or the tables as CSV, HTML, or a real multi-sheet XLSX workbook. Checked items win; otherwise everything currently visible is exported.
Streams the browser can't render natively (HLS .m3u8, DASH .mpd, unknown codecs) show a fallback
instead of a black player: Merge segments & download produces a single playable file for HLS, or
Download original saves the manifest for VLC.
┌────────────────────────────────────────────────────────────────────────┐
│ toolbar icon popup (per-category counts + toggles) │
│ │ ▲ │
│ ▼ │ counts (storage) │
│ background service worker ────┘ │
│ ▲ │
│ │ counts (Resource Timing + DOM scan) │
│ │ │
│ content script (injected into every page) │
│ │
│ DevTools panel (chrome.devtools.*) │
│ ├─ HAR + live network events ──► resource list │
│ ├─ DOM + CSS scan ► resource list │
│ └─ getContent() / fetch() / inspectedWindow.eval() ──► bytes ──► ZIP│
└────────────────────────────────────────────────────────────────────────┘
chrome.devtools.network events and scans the page DOM and
stylesheets.request.getContent()), which ignores CORS,
with fetch() and in-page blob: readback as fallbacks.lib/filetype.js checks the bytes and repairs the file
name. Extension-less CDN URLs (YouTube thumbnails and the like) and dynamic endpoints such as
/photo.aspx end up as .jpg, .webp or whatever they actually are, instead of a file the OS
cannot open.lib/zip.js, a from-scratch writer of
the PKZIP format (CRC-32, central directory, ZIP64 records and deflate via the browser's native
CompressionStream); XLSX workbooks are produced by lib/xlsx.js (a ZIP of hand-written
spreadsheet XML); HLS streams that can't play natively are merged by lib/hls.js into a single
download. ZIP assembly runs in lib/zip-worker.js; Beautify, the content-search index, image
hashing and createImageBitmap decode run in a second worker (lib/jobs-worker.js) so a large
archive never stalls a format click. Files are saved with a standard <a download> click, so Chrome
keeps its normal download prompts and permissions..
├── manifest.json # MV3 manifest (permissions, entry points, icons)
├── background.js # Service worker — aggregates counts, drives the toolbar badge
├── content.js # Injected into pages — scans & reports resources
├── devtools.html / .js # Registers the "Source Download" DevTools panel
├── panel.html / .css / .js # The DevTools panel UI and all its logic
├── popup.html / .css / .js # Toolbar popup — tracking toggles + quick-start guide
├── lib/
│ ├── filetype.js # Byte sniffing + download extension repair — zero deps
│ ├── zip.js # Hand-written ZIP writer (CRC-32, deflate, ZIP64) — zero deps
│ ├── zip-worker.js # ZIP / XLSX off the UI thread — zero deps
│ ├── jobs-worker.js # Beautify, search index, image hash & decode — zero deps
│ ├── xlsx.js # Hand-written XLSX builder (ZIP of XML) — zero deps
│ ├── hls.js # Hand-written HLS (m3u8) merger — zero deps
│ └── beautify.js # Hand-written CSS/JS/HTML/JSON formatters — zero deps
├── icons/ # Generated PNG icons (16 / 32 / 48 / 128)
├── screenshots/ # Store your screenshots here (see the slots above)
├── tools/
│ ├── generate_icons.py # Icon generator (Python stdlib only)
│ ├── lib_test.js # Node test suite for lib/* (npm test)
│ └── sniff_test.js # Node tests for API detection & content sniffing
└── LICENSE # MIT
Zero third-party code. lib/ contains only seven files, all written for this project. The icon
generator uses the Python standard library. There is no node_modules, no bundler, no build
script — the extension you see in the repo is exactly what Chrome loads.
# Run the library test suite (ZIP writer, XLSX builder, HLS merger + formatters)
npm test
# Regenerate the PNG icons
npm run icons
The extension asks for the bare minimum it needs:
| Permission | Why |
|---|---|
devtools_page | Registers the panel inside Chrome DevTools. |
storage | Saves your tracking toggles and panel preferences locally. |
clipboardWrite | Copies resource URLs to the clipboard. |
host_permissions: <all_urls> | Lets the lightweight content script scan pages and lets the panel fetch resource bodies for previews/downloads. |
That's it — no tabs, no downloads API, no scripting abuse, no analytics. Files are saved
through a standard <a download> click, so Chrome keeps its normal download prompts and
permissions.
Nothing is uploaded anywhere. All scanning, fetching, previewing and archiving happens locally in your browser. The extension makes no network requests of its own beyond the ones you trigger by downloading a page's assets.
I know Source Download isn't perfect yet — there are rough edges I'm aware of, and I'll keep fixing them quickly. But here's where I want to take this next, and your feedback decides the order:
{domain}/{category}/{name}.{ext}.Open an issue with your ideas, or drop me a message on LinkedIn — I read everything.
Contributions are warmly welcome — bug reports, feature ideas and pull requests. If you're planning something substantial, open an issue first so we can align. Please keep the spirit: simple, dependency-free, readable code.
MIT © Turan Burak Yeşilyurt. Use it, fork it, learn from it, ship it — just keep the license notice.
Source Download is maintained by Turan Burak Yeşilyurt.
4 commits
JavaScript
74.4%
CSS
15.8%
HTML
8.3%
Python
1.6%
Browse, inspect and download every asset a web page loads — images, SVG, video, audio, JS, CSS, fonts, JSON, WASM and more — from inside Chrome DevTools, as individual files or a folder-structured ZIP. Zero dependencies, 100% hand-written code, no build step.
4
stars
4
commits
JavaScript
primary language
Aug 24, 2026
updated
The everything-downloader for web developers, QA engineers and researchers.
Browse, inspect and download every asset a web page loads — images, SVG, video, audio, JS, CSS, fonts, JSON, WASM, manifests and more — one by one or all at once as a tidy, folder-structured ZIP.
For years I built automations for web scraping, data analysis and QA workflows. Then SPAs took over the web — and I kept hitting the same wall: as an end user you can't easily grab the things you see on screen, and as a developer the Chrome DevTools area often feels either insufficient or overwhelming. That frustration is exactly why I built Source Download.
This is my first open-source project, so your feedback means the world to me — it's the single biggest driver for making this thing better. And please, don't forget to connect with me on LinkedIn — I'd love to hear how you use it and chat about what else we could build together. Enjoy!
Live on the Chrome Web Store: Install Source Download
A confession: almost every "download this page's assets" tool you'll find on the store is a wrapper around a pile of third-party libraries. This one is different. Every byte of Source Download — including the ZIP writer, the XLSX builder, the HLS merger and the code formatters — is hand-written from scratch. No frameworks, no dependencies, no build step, no telemetry. Just vanilla JavaScript, readable and auditable in a sitting.
| DevTools panel | Inspector & lightbox | Toolbar popup |
|---|---|---|
![]() | ![]() | ![]() |
F12) on any page and switch to the Source Download tab.git clone https://github.com/turanburakyesilyurt/source-download.git
cd source-download
chrome://extensions.The toolbar icon opens the extension popup, which shows a live per-category resource counter and the quick-start instructions. (Chrome doesn't let extensions programmatically open DevTools, so the icon leads you here instead.)
onRequestFinished events) and from scanning the live page DOM — <img>, <video>,
<audio>, <script>, <link>, <source>, <iframe>, <embed>, <object>, <track>,
srcset, Open Graph images, favicons and more.url(...) and @import rules inside stylesheets
(backgrounds, fonts, sprites) are parsed out and listed automatically — imported stylesheets are
followed recursively, so font @font-face sources buried two levels deep are still found.width and get every stylesheet that references it; wrap a
query in /…/ for regex, e.g. /\.svg$/.createImageBitmap). Images also
get duplicate detection and a Hide duplicates filter. Sort by name, size, type or time.<table> on the page (with snapshot history) and exports to Markdown, CSV, HTML or a real
multi-sheet XLSX workbook.This is where Source Download really shines. Each category below has its own dedicated view, filters and export options — and its own set of killer use cases.
What it captures. Every raster image on the page — <img>, srcset, background images inside
CSS, Open Graph thumbnails, favicons, blob: images created by the page, everything.
How the tools help.
Use cases.
images/ folder, ready for your competitive research board.Screenshot slot
What it captures. Every inline-rendered and linked SVG — logos, icons, charts, illustrations.
How the tools help.
/logo.*\.svg$/ finds every logo asset instantly.Use cases.
viewBoxes and strokes.Screenshot slot
What it captures. Video files from <video>/<source> tags, dynamically created players,
blob: streams and CDN URLs.
How the tools help.
blob: sources.m3u8, mpd, .ts,
unknown codecs) never leave you with a black box: a fallback explains why and offers
Merge segments & download (my hand-written lib/hls.js downloads the master/media playlists
and every segment in order, then concatenates them into a single .ts/.mp4 file) or
Download original for VLC. Encrypted (AES-128) streams are detected and reported instead of
failing silently.Use cases.
blob: or HLS streams — get
the real bytes, not screen recordings.Screenshot slot
What it captures. MP3, OGG, WAV, AAC, M4A and streamed audio from players and <audio> tags.
How the tools help.
Use cases.
Screenshot slot
What it captures. WebVTT, SRT, TTML and other caption files, including <track src> on video.
How the tools help.
Use cases.
.vtt on a course or news page in one ZIP.What it captures. .map files and JSON bodies that look like source maps (mappings +
sources), instead of dumping them into the JSON tab.
How the tools help.
Use cases.
What it captures. @font-face sources (woff, woff2, ttf, otf) referenced from stylesheets —
including fonts buried inside @import-ed stylesheets (e.g. Google Fonts' CSS2 responses).
How the tools help.
blob:.Use cases.
Screenshot slot
What it captures. Every stylesheet — <link rel="stylesheet">, dynamically injected styles,
inline <style> blocks, and stylesheets pulled in via @import.
How the tools help.
url(...) and @import references are followed recursively, so
background images, sprites, fonts and imported themes are all discovered and categorized.Use cases.
Screenshot slot
What it captures. Script files, module bundles, dynamic chunks and inlined scripts.
How the tools help.
Use cases.
Screenshot slot
What it captures. Every XHR/fetch request, extension-less GETs with query strings, and JSON responses — the "live table behind the dashboard" traffic that other tools bury.
How the tools help.
Use cases.
Screenshot slot
What it captures. PDFs, XML, and other text documents the page loads or links to.
How the tools help.
Use cases.
Screenshot slot
What it captures. Compiled WebAssembly modules and PWA/extension manifest.json / .webmanifest
files.
How the tools help.
.wasm-looking binaries are recognized even without a file extension.Use cases.
Screenshot slot
What it captures. Not a resource list — a live content viewer. Every element that carries text
(headings, paragraphs, list items, div, span, a, button, …) is captured in DOM order, plus
every real <table> / ARIA grid on the page.
How the tools help.
count(//a), //@href, string(//title). Whatever the page says about a broken query
is shown right under the box, so you are never guessing.8 snapshots · 124 unique rows. Press Show all rows to
merge every snapshot into one deduplicated table so you can see the full harvest instead of
trusting the export.text/table-N.csv inside a ZIP.<table> page inside a ZIP.lib/xlsx.js (an XLSX is just a ZIP of XML — no spreadsheet library involved).Use cases.
Screenshot slot
What it captures. Everything that doesn't fit a neat category yet — unknown extensions, no extension, exotic formats.
How the tools help.
Use case. Whenever you find an odd file in Other, click it — the inspector tells you what it really is, and it's one keystroke away from being re-categorized and downloaded correctly.
Screenshot slot
The panel ships with a built-in, searchable guide — click the ? button in the top-right
toolbar (it also opens automatically on first run). A quick orientation:
The extension cannot open DevTools by itself (Chrome restriction). Press F12 (or
Ctrl/Cmd+Shift+I) and pick the Source Download tab in the DevTools toolbar. The toolbar
icon's popup shows per-category counts and lets you choose which categories feed the icon badge.
/…/ for regex,
e.g. /\.(png|jpg)$/.Click a resource to open it in the inspector; each opened file becomes a tab, and the newest lands
on the left so you can compare several at once. Specialized viewers handle images (lightbox with
zoom/pan), video, audio, fonts, SVG, code (with line numbers + Beautify) and API calls (response
| request split view). Esc closes the current overlay.
The Text category swaps the pane for a live, readable copy of the page: everything that holds text is captured in DOM order and kept updated while Live is on. Query it with plain text, a regular expression, a CSS selector or an XPath expression, and narrow it further to a single element type. Dynamic tables store a bounded snapshot history — press Show all rows to merge every snapshot into one deduplicated view. Export as TXT or Markdown, or the tables as CSV, HTML, or a real multi-sheet XLSX workbook. Checked items win; otherwise everything currently visible is exported.
Streams the browser can't render natively (HLS .m3u8, DASH .mpd, unknown codecs) show a fallback
instead of a black player: Merge segments & download produces a single playable file for HLS, or
Download original saves the manifest for VLC.
┌────────────────────────────────────────────────────────────────────────┐
│ toolbar icon popup (per-category counts + toggles) │
│ │ ▲ │
│ ▼ │ counts (storage) │
│ background service worker ────┘ │
│ ▲ │
│ │ counts (Resource Timing + DOM scan) │
│ │ │
│ content script (injected into every page) │
│ │
│ DevTools panel (chrome.devtools.*) │
│ ├─ HAR + live network events ──► resource list │
│ ├─ DOM + CSS scan ► resource list │
│ └─ getContent() / fetch() / inspectedWindow.eval() ──► bytes ──► ZIP│
└────────────────────────────────────────────────────────────────────────┘
chrome.devtools.network events and scans the page DOM and
stylesheets.request.getContent()), which ignores CORS,
with fetch() and in-page blob: readback as fallbacks.lib/filetype.js checks the bytes and repairs the file
name. Extension-less CDN URLs (YouTube thumbnails and the like) and dynamic endpoints such as
/photo.aspx end up as .jpg, .webp or whatever they actually are, instead of a file the OS
cannot open.lib/zip.js, a from-scratch writer of
the PKZIP format (CRC-32, central directory, ZIP64 records and deflate via the browser's native
CompressionStream); XLSX workbooks are produced by lib/xlsx.js (a ZIP of hand-written
spreadsheet XML); HLS streams that can't play natively are merged by lib/hls.js into a single
download. ZIP assembly runs in lib/zip-worker.js; Beautify, the content-search index, image
hashing and createImageBitmap decode run in a second worker (lib/jobs-worker.js) so a large
archive never stalls a format click. Files are saved with a standard <a download> click, so Chrome
keeps its normal download prompts and permissions..
├── manifest.json # MV3 manifest (permissions, entry points, icons)
├── background.js # Service worker — aggregates counts, drives the toolbar badge
├── content.js # Injected into pages — scans & reports resources
├── devtools.html / .js # Registers the "Source Download" DevTools panel
├── panel.html / .css / .js # The DevTools panel UI and all its logic
├── popup.html / .css / .js # Toolbar popup — tracking toggles + quick-start guide
├── lib/
│ ├── filetype.js # Byte sniffing + download extension repair — zero deps
│ ├── zip.js # Hand-written ZIP writer (CRC-32, deflate, ZIP64) — zero deps
│ ├── zip-worker.js # ZIP / XLSX off the UI thread — zero deps
│ ├── jobs-worker.js # Beautify, search index, image hash & decode — zero deps
│ ├── xlsx.js # Hand-written XLSX builder (ZIP of XML) — zero deps
│ ├── hls.js # Hand-written HLS (m3u8) merger — zero deps
│ └── beautify.js # Hand-written CSS/JS/HTML/JSON formatters — zero deps
├── icons/ # Generated PNG icons (16 / 32 / 48 / 128)
├── screenshots/ # Store your screenshots here (see the slots above)
├── tools/
│ ├── generate_icons.py # Icon generator (Python stdlib only)
│ ├── lib_test.js # Node test suite for lib/* (npm test)
│ └── sniff_test.js # Node tests for API detection & content sniffing
└── LICENSE # MIT
Zero third-party code. lib/ contains only seven files, all written for this project. The icon
generator uses the Python standard library. There is no node_modules, no bundler, no build
script — the extension you see in the repo is exactly what Chrome loads.
# Run the library test suite (ZIP writer, XLSX builder, HLS merger + formatters)
npm test
# Regenerate the PNG icons
npm run icons
The extension asks for the bare minimum it needs:
| Permission | Why |
|---|---|
devtools_page | Registers the panel inside Chrome DevTools. |
storage | Saves your tracking toggles and panel preferences locally. |
clipboardWrite | Copies resource URLs to the clipboard. |
host_permissions: <all_urls> | Lets the lightweight content script scan pages and lets the panel fetch resource bodies for previews/downloads. |
That's it — no tabs, no downloads API, no scripting abuse, no analytics. Files are saved
through a standard <a download> click, so Chrome keeps its normal download prompts and
permissions.
Nothing is uploaded anywhere. All scanning, fetching, previewing and archiving happens locally in your browser. The extension makes no network requests of its own beyond the ones you trigger by downloading a page's assets.
I know Source Download isn't perfect yet — there are rough edges I'm aware of, and I'll keep fixing them quickly. But here's where I want to take this next, and your feedback decides the order:
{domain}/{category}/{name}.{ext}.Open an issue with your ideas, or drop me a message on LinkedIn — I read everything.
Contributions are warmly welcome — bug reports, feature ideas and pull requests. If you're planning something substantial, open an issue first so we can align. Please keep the spirit: simple, dependency-free, readable code.
MIT © Turan Burak Yeşilyurt. Use it, fork it, learn from it, ship it — just keep the license notice.
Source Download is maintained by Turan Burak Yeşilyurt.
4 commits
JavaScript
74.4%
CSS
15.8%
HTML
8.3%
Python
1.6%