Initial commit: Tonemark PWA
Some checks failed
Build & Push Docker Image / build-and-push (push) Failing after 11s

Tonemark is a SvelteKit PWA for transcribing YouTube videos, audio
and video files, and microphone recordings using a local Whisper backend.

Features:
- Dark glassmorphic UI with electric-lime accent (5 switchable themes)
- Rail nav (desktop) / tab bar (mobile) layout
- Drop zone, YouTube URL input, and live audio recording inputs
- Audio mode waveform cards (none / standard / aggressive / auto)
- Real-time transcription progress with animated waveform
- Job queue with SSE streaming updates
- Push notifications on job completion
- PWA with native SvelteKit service worker
- SRT / TXT / MD / JSON transcript downloads

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Giancarmine Salucci
2026-05-06 16:41:25 +02:00
commit 13a96b6efa
68 changed files with 9712 additions and 0 deletions

19
static/favicon.svg Normal file
View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffb18a"></stop>
<stop offset="55%" stop-color="#ff8a5c"></stop>
<stop offset="100%" stop-color="#e8612d"></stop>
</linearGradient>
<linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.35"></stop>
<stop offset="55%" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
</defs>
<rect x="0" y="0" width="32" height="32" rx="7.2" ry="7.2" fill="url(#bg)"></rect>
<rect x="0" y="0" width="32" height="19.2" rx="7.2" ry="7.2" fill="url(#sheen)"></rect>
<rect x="8.8" y="8.64" width="3.52" height="14.72" rx="1.76" ry="1.76" fill="#0c0d10"></rect>
<rect x="14.24" y="5.4399999999999995" width="3.52" height="21.12" rx="1.76" ry="1.76" fill="#0c0d10"></rect>
<rect x="19.68" y="10.559999999999999" width="3.52" height="10.88" rx="1.76" ry="1.76" fill="#0c0d10"></rect>
<circle cx="21.439999999999998" cy="28.96" r="1.12" fill="#0c0d10"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
static/icons/favicon-16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

BIN
static/icons/favicon-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
static/icons/favicon-64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffb18a"></stop>
<stop offset="55%" stop-color="#ff8a5c"></stop>
<stop offset="100%" stop-color="#e8612d"></stop>
</linearGradient>
<linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.35"></stop>
<stop offset="55%" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
</defs>
<rect x="0" y="0" width="1024" height="1024" rx="230.4" ry="230.4" fill="url(#bg)"></rect>
<rect x="0" y="0" width="1024" height="614.4" rx="230.4" ry="230.4" fill="url(#sheen)"></rect>
<rect x="281.6" y="276.48" width="112.64" height="471.04" rx="56.32" ry="56.32" fill="#0c0d10"></rect>
<rect x="455.68" y="174.07999999999998" width="112.64" height="675.84" rx="56.32" ry="56.32" fill="#0c0d10"></rect>
<rect x="629.76" y="337.91999999999996" width="112.64" height="348.16" rx="56.32" ry="56.32" fill="#0c0d10"></rect>
<circle cx="686.0799999999999" cy="926.72" r="35.84" fill="#0c0d10"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180" width="180" height="180">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffb18a"></stop>
<stop offset="55%" stop-color="#ff8a5c"></stop>
<stop offset="100%" stop-color="#e8612d"></stop>
</linearGradient>
<linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.35"></stop>
<stop offset="55%" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
</defs>
<rect x="0" y="0" width="180" height="180" rx="40.5" ry="40.5" fill="url(#bg)"></rect>
<rect x="0" y="0" width="180" height="108" rx="40.5" ry="40.5" fill="url(#sheen)"></rect>
<rect x="49.5" y="48.6" width="19.8" height="82.8" rx="9.9" ry="9.9" fill="#0c0d10"></rect>
<rect x="80.1" y="30.599999999999994" width="19.8" height="118.80000000000001" rx="9.9" ry="9.9" fill="#0c0d10"></rect>
<rect x="110.7" y="59.4" width="19.8" height="61.2" rx="9.9" ry="9.9" fill="#0c0d10"></rect>
<circle cx="120.6" cy="162.9" r="6.300000000000001" fill="#0c0d10"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffb18a"></stop>
<stop offset="55%" stop-color="#ff8a5c"></stop>
<stop offset="100%" stop-color="#e8612d"></stop>
</linearGradient>
<linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.35"></stop>
<stop offset="55%" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
</defs>
<rect x="0" y="0" width="32" height="32" rx="7.2" ry="7.2" fill="url(#bg)"></rect>
<rect x="0" y="0" width="32" height="19.2" rx="7.2" ry="7.2" fill="url(#sheen)"></rect>
<rect x="8.8" y="8.64" width="3.52" height="14.72" rx="1.76" ry="1.76" fill="#0c0d10"></rect>
<rect x="14.24" y="5.4399999999999995" width="3.52" height="21.12" rx="1.76" ry="1.76" fill="#0c0d10"></rect>
<rect x="19.68" y="10.559999999999999" width="3.52" height="10.88" rx="1.76" ry="1.76" fill="#0c0d10"></rect>
<circle cx="21.439999999999998" cy="28.96" r="1.12" fill="#0c0d10"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffb18a"></stop>
<stop offset="55%" stop-color="#ff8a5c"></stop>
<stop offset="100%" stop-color="#e8612d"></stop>
</linearGradient>
<linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.35"></stop>
<stop offset="55%" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
</defs>
<rect x="0" y="0" width="512" height="512" rx="115.2" ry="115.2" fill="url(#bg)"></rect>
<rect x="0" y="0" width="512" height="307.2" rx="115.2" ry="115.2" fill="url(#sheen)"></rect>
<rect x="140.8" y="138.24" width="56.32" height="235.52" rx="28.16" ry="28.16" fill="#0c0d10"></rect>
<rect x="227.84" y="87.03999999999999" width="56.32" height="337.92" rx="28.16" ry="28.16" fill="#0c0d10"></rect>
<rect x="314.88" y="168.95999999999998" width="56.32" height="174.08" rx="28.16" ry="28.16" fill="#0c0d10"></rect>
<circle cx="343.03999999999996" cy="463.36" r="17.92" fill="#0c0d10"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffb18a"></stop>
<stop offset="55%" stop-color="#ff8a5c"></stop>
<stop offset="100%" stop-color="#e8612d"></stop>
</linearGradient>
<linearGradient id="sheen" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#fff" stop-opacity="0.35"></stop>
<stop offset="55%" stop-color="#fff" stop-opacity="0"></stop>
</linearGradient>
</defs>
<rect x="0" y="0" width="512" height="512" fill="#ff8a5c"></rect>
<rect x="140.8" y="138.24" width="56.32" height="235.52" rx="28.16" ry="28.16" fill="#0c0d10"></rect>
<rect x="227.84" y="87.03999999999999" width="56.32" height="337.92" rx="28.16" ry="28.16" fill="#0c0d10"></rect>
<rect x="314.88" y="168.95999999999998" width="56.32" height="174.08" rx="28.16" ry="28.16" fill="#0c0d10"></rect>
<circle cx="343.03999999999996" cy="463.36" r="17.92" fill="#0c0d10"></circle>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

44
static/manifest.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "Tonemark",
"short_name": "Tonemark",
"description": "Fast audio and video transcription powered by Whisper",
"start_url": "/",
"display": "standalone",
"background_color": "#0c0d10",
"theme_color": "#0c0d10",
"orientation": "any",
"share_target": {
"action": "/share",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "file",
"accept": ["audio/*", "video/*"]
}
]
}
},
"icons": [
{
"src": "/icons/android-icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/android-icon-512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "/icons/tonemark-icon-android-fg.svg",
"sizes": "any",
"type": "image/svg+xml",
"purpose": "maskable"
}
]
}

3
static/robots.txt Normal file
View File

@@ -0,0 +1,3 @@
# allow crawling everything by default
User-agent: *
Disallow: