diff --git a/src/lib/translations/en-US/viewer.json b/src/lib/translations/en-US/viewer.json
index 86401ae..e5aca5d 100644
--- a/src/lib/translations/en-US/viewer.json
+++ b/src/lib/translations/en-US/viewer.json
@@ -10,5 +10,10 @@
"stitches": "Stitches",
"dimensions": "Dimensions (x, y)",
"download": "Download image",
- "warning.copyright": "Do not upload copyrighted material you do not own or have rights to."
+ "warning.copyright": "Do not upload copyrighted material you do not own or have rights to.",
+ "seo.title": "🧵 Free Online Embroidery File Viewer – Fast, Private & No Signup",
+ "seo.description": "Upload and preview your embroidery files instantly with Embroidery Viewer. Supports DST, PES, JEF, EXP, VP3, and more. No installs, no uploads – 100% browser-based and free.",
+ "seo.keywords": "embroidery viewer, online embroidery viewer, embroidery file preview, DST viewer, PES viewer, free embroidery tool, JEF viewer, EXP embroidery, VP3 embroidery viewer, embroidery preview tool, browser embroidery renderer, convert embroidery to PNG",
+ "seo.url": "https://embroideryviewer.xyz/viewer",
+ "seo.image": "https://embroideryviewer.xyz/og/viewer.png"
}
diff --git a/src/lib/translations/pt-BR/viewer.json b/src/lib/translations/pt-BR/viewer.json
index e1c3f61..8571678 100644
--- a/src/lib/translations/pt-BR/viewer.json
+++ b/src/lib/translations/pt-BR/viewer.json
@@ -10,5 +10,10 @@
"rejected": "Arquivos recusados",
"stitches": "Pontos",
"download": "Baixar imagem",
- "warning.copyright": "Não carregue material protegido por direitos autorais que você não possui ou sobre os quais não tenha direitos."
+ "warning.copyright": "Não carregue material protegido por direitos autorais que você não possui ou sobre os quais não tenha direitos.",
+ "seo.title": "🧵 Visualizador Online Gratuito de Arquivos de Bordado – Rápido, Privado e Sem Cadastro",
+ "seo.description": "Faça upload e visualize seus arquivos de bordado instantaneamente com o Embroidery Viewer. Suporta DST, PES, JEF, EXP, VP3 e muito mais. Sem instalações, sem upload para servidor – 100% baseado no navegador e gratuito.",
+ "seo.keywords": "visualizador de bordado, visualizador online de bordado, pré-visualização de arquivos de bordado, visualizador DST, visualizador PES, ferramenta gratuita de bordado, visualizador JEF, bordado EXP, visualizador VP3, ferramenta de pré-visualização de bordado, renderizador de bordado no navegador, converter bordado para PNG",
+ "seo.url": "https://embroideryviewer.xyz/viewer",
+ "seo.image": "https://embroideryviewer.xyz/og/viewer.png"
}
diff --git a/src/routes/viewer/+page.js b/src/routes/viewer/+page.js
new file mode 100644
index 0000000..c66de4f
--- /dev/null
+++ b/src/routes/viewer/+page.js
@@ -0,0 +1,12 @@
+/** @type {import('./$types').PageLoad} */
+export function load() {
+ return {
+ metadata: {
+ title: 'viewer.seo.title',
+ description: 'viewer.seo.description',
+ keywords: 'viewer.seo.keywords',
+ url: 'viewer.seo.url',
+ image: 'viewer.seo.image',
+ },
+ };
+}
diff --git a/src/routes/viewer/+page.svelte b/src/routes/viewer/+page.svelte
index a59bf6d..405e6ed 100644
--- a/src/routes/viewer/+page.svelte
+++ b/src/routes/viewer/+page.svelte
@@ -4,10 +4,16 @@
import CardList from '$lib/components/CardList.svelte';
import Dropzone from '$lib/components/Dropzone.svelte';
import FileList from '$lib/components/FileList.svelte';
+ import Seo from '$lib/components/Seo.svelte';
import { filterFiles } from '$lib/utils/filterFiles';
import { supportedFormats } from '$lib/format-readers';
+ /** @type {import('./$types').PageProps} */
+ let { data } = $props();
+
+ const metadata = data.metadata;
+
/** @type {File[] | []} */
let acceptedFiles = [];
/** @type {File[] | []} */
@@ -67,6 +73,8 @@
}
+