diff --git a/backend/app/core/config.py b/backend/app/core/config.py
index 70b521b..ae5a23e 100644
--- a/backend/app/core/config.py
+++ b/backend/app/core/config.py
@@ -73,6 +73,7 @@ class UIConfig(BaseModel):
"""UI preferences."""
default_theme: str = "dark"
+ welcome_message: str = "Paste any video or audio URL. We rip it, you download it. No accounts, no tracking."
class AdminConfig(BaseModel):
diff --git a/backend/app/routers/system.py b/backend/app/routers/system.py
index f1b50c7..8aa6004 100644
--- a/backend/app/routers/system.py
+++ b/backend/app/routers/system.py
@@ -23,6 +23,7 @@ async def public_config(request: Request) -> dict:
return {
"session_mode": config.session.mode,
"default_theme": config.ui.default_theme,
+ "welcome_message": config.ui.welcome_message,
"purge_enabled": config.purge.enabled,
"max_concurrent_downloads": config.downloads.max_concurrent,
}
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index 3a8b4e4..e8926ff 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -4,10 +4,11 @@ import { useSSE } from '@/composables/useSSE'
import { useConfigStore } from '@/stores/config'
import { useThemeStore } from '@/stores/theme'
import AppHeader from '@/components/AppHeader.vue'
+import AppFooter from '@/components/AppFooter.vue'
const configStore = useConfigStore()
const themeStore = useThemeStore()
-const { connectionStatus, connect } = useSSE()
+const { connect } = useSSE()
onMounted(async () => {
themeStore.init()
@@ -18,34 +19,7 @@ onMounted(async () => {
-
-
+
+
-
-
diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts
index 8901605..6ad99c3 100644
--- a/frontend/src/api/types.ts
+++ b/frontend/src/api/types.ts
@@ -67,6 +67,7 @@ export interface FormatInfo {
export interface PublicConfig {
session_mode: string
default_theme: string
+ welcome_message: string
purge_enabled: boolean
max_concurrent_downloads: number
}
diff --git a/frontend/src/components/AppFooter.vue b/frontend/src/components/AppFooter.vue
new file mode 100644
index 0000000..cd49d8e
--- /dev/null
+++ b/frontend/src/components/AppFooter.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue
index 31b9ab6..bb9b215 100644
--- a/frontend/src/components/AppHeader.vue
+++ b/frontend/src/components/AppHeader.vue
@@ -1,17 +1,5 @@
@@ -21,13 +9,7 @@ const statusColor: Record = {
media.rip()
@@ -72,17 +54,4 @@ const statusColor: Record = {
align-items: center;
gap: var(--space-md);
}
-
-.header-status {
- display: flex;
- align-items: center;
- gap: var(--space-xs);
-}
-
-.status-dot {
- width: 10px;
- height: 10px;
- border-radius: 50%;
- transition: background-color 0.3s ease;
-}
diff --git a/frontend/src/components/AppLayout.vue b/frontend/src/components/AppLayout.vue
index 1684684..6f4f684 100644
--- a/frontend/src/components/AppLayout.vue
+++ b/frontend/src/components/AppLayout.vue
@@ -1,10 +1,5 @@
+
+
+
+
+
+
diff --git a/frontend/src/components/DownloadItem.vue b/frontend/src/components/DownloadItem.vue
index fcfec83..3ff9c0b 100644
--- a/frontend/src/components/DownloadItem.vue
+++ b/frontend/src/components/DownloadItem.vue
@@ -1,5 +1,5 @@
@@ -74,10 +80,12 @@ async function cancel(): Promise {
diff --git a/frontend/src/components/MainView.vue b/frontend/src/components/MainView.vue
index ce92833..83b7fb9 100644
--- a/frontend/src/components/MainView.vue
+++ b/frontend/src/components/MainView.vue
@@ -1,12 +1,14 @@
-
+
+
diff --git a/frontend/src/components/WelcomeMessage.vue b/frontend/src/components/WelcomeMessage.vue
new file mode 100644
index 0000000..db09288
--- /dev/null
+++ b/frontend/src/components/WelcomeMessage.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/stores/theme.ts b/frontend/src/stores/theme.ts
index 4934e58..7a4fe6b 100644
--- a/frontend/src/stores/theme.ts
+++ b/frontend/src/stores/theme.ts
@@ -33,6 +33,9 @@ export const useThemeStore = defineStore('theme', () => {
const customThemes = ref([])
const customThemeCSS = ref