From 7f0390b0525ad70b889096765c77b45277040a9e Mon Sep 17 00:00:00 2001 From: diogohudson Date: Tue, 10 Mar 2026 12:07:50 -0300 Subject: [PATCH 1/2] feat: add SEO, Open Graph, and i18n document head support - Open Graph and Twitter Card meta tags for social sharing previews - JSON-LD structured data (WebApplication schema) for rich snippets - Canonical URL, robots meta tag, keywords, and author - robots.txt (disallow /s/ secret paths) and sitemap.xml - OG image (1200x630) with branding - nginx cache headers for static assets and SEO files - Dynamic document title, description, and lang attribute synced to current i18n language via useEffect - Added meta.title and meta.description to all 6 locales - Fixed Portuguese diacritics (main branch had stripped accents) Co-Authored-By: Claude Opus 4.6 --- ui/index.html | 52 ++++++++++++++++++++++++++++++++ ui/nginx.conf | 16 ++++++++++ ui/public/og-image.png | Bin 0 -> 56319 bytes ui/public/og-image.svg | 26 ++++++++++++++++ ui/public/robots.txt | 5 ++++ ui/public/sitemap.xml | 8 +++++ ui/src/components/Layout.tsx | 11 ++++++- ui/src/i18n/locales/ar.json | 4 +++ ui/src/i18n/locales/en.json | 4 +++ ui/src/i18n/locales/es.json | 4 +++ ui/src/i18n/locales/hi.json | 4 +++ ui/src/i18n/locales/pt.json | 56 +++++++++++++++++++---------------- ui/src/i18n/locales/zh.json | 4 +++ 13 files changed, 167 insertions(+), 27 deletions(-) create mode 100644 ui/public/og-image.png create mode 100644 ui/public/og-image.svg create mode 100644 ui/public/robots.txt create mode 100644 ui/public/sitemap.xml diff --git a/ui/index.html b/ui/index.html index fa01d2f..36d826b 100644 --- a/ui/index.html +++ b/ui/index.html @@ -5,11 +5,63 @@ + + + + + + + + + + + + + + + + + + + + + + Only Once Share — Secure One-Time Secret Sharing + + +
diff --git a/ui/nginx.conf b/ui/nginx.conf index f749e02..c9c544c 100644 --- a/ui/nginx.conf +++ b/ui/nginx.conf @@ -3,6 +3,22 @@ server { root /usr/share/nginx/html; index index.html; + # Static assets — long cache + location ~* \.(js|css|png|jpg|jpeg|svg|ico|woff2?)$ { + expires 30d; + add_header Cache-Control "public, immutable"; + } + + # robots.txt and sitemap — short cache + location = /robots.txt { + expires 7d; + add_header Cache-Control "public"; + } + location = /sitemap.xml { + expires 7d; + add_header Cache-Control "public"; + } + location / { try_files $uri $uri/ /index.html; } diff --git a/ui/public/og-image.png b/ui/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..f74e912781d0eef59265b3281b813542027d8982 GIT binary patch literal 56319 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

X;!04fIrb*X!1cU53p8vm z^@s(MRx+4YV95x12!_anA*v`-=$9}egwec0H4tYW6yM;95NEKkB+LtgB%XMn!i4^# z#e^c{ThRYJ!k$vWRHJo?txX3?Hi5Nidikqztr@`Kb4-#VZF*FY4fr|GEwh0EzjvZ6 zXrl3dg!Fjd=N-oA^YXDXOH~c%m$ayX%497%DCr-VD!(bv^!FQlkM>jdGUoLnjR^d6 Mw0B;?Sw@fjAC}C*MF0Q* literal 0 HcmV?d00001 diff --git a/ui/public/og-image.svg b/ui/public/og-image.svg new file mode 100644 index 0000000..ebe44fc --- /dev/null +++ b/ui/public/og-image.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + Only Once Share + + Secure One-Time Secret Sharing + + End-to-End Encrypted · Zero-Knowledge · Self-Destructing Links + + ooshare.io + diff --git a/ui/public/robots.txt b/ui/public/robots.txt new file mode 100644 index 0000000..0345e3e --- /dev/null +++ b/ui/public/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Allow: / +Disallow: /s/ + +Sitemap: https://ooshare.io/sitemap.xml diff --git a/ui/public/sitemap.xml b/ui/public/sitemap.xml new file mode 100644 index 0000000..368ecfb --- /dev/null +++ b/ui/public/sitemap.xml @@ -0,0 +1,8 @@ + + + + https://ooshare.io/ + monthly + 1.0 + + diff --git a/ui/src/components/Layout.tsx b/ui/src/components/Layout.tsx index b22ad4e..ba1b6ed 100644 --- a/ui/src/components/Layout.tsx +++ b/ui/src/components/Layout.tsx @@ -1,10 +1,19 @@ +import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Shield, Lock, Eye, Trash2 } from "lucide-react"; import SecurityModal from "./SecurityModal"; import LanguageSelector from "./LanguageSelector"; export default function Layout({ children }: { children: React.ReactNode }) { - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); + + useEffect(() => { + document.documentElement.lang = i18n.language; + document.title = t("meta.title"); + document + .querySelector('meta[name="description"]') + ?.setAttribute("content", t("meta.description")); + }, [i18n.language, t]); return (

diff --git a/ui/src/i18n/locales/ar.json b/ui/src/i18n/locales/ar.json index 907662a..f8ed7ce 100644 --- a/ui/src/i18n/locales/ar.json +++ b/ui/src/i18n/locales/ar.json @@ -1,4 +1,8 @@ { + "meta": { + "title": "Only Once Share — مشاركة الأسرار الآمنة لمرة واحدة", + "description": "شارك كلمات المرور ومفاتيح API والبيانات الحساسة بتشفير من طرف إلى طرف. معرفة صفرية، روابط تُستخدم مرة واحدة وتتلف ذاتياً بعد المشاهدة." + }, "header": { "title": "Only Once Share" }, diff --git a/ui/src/i18n/locales/en.json b/ui/src/i18n/locales/en.json index 5f14ab5..9eee21d 100644 --- a/ui/src/i18n/locales/en.json +++ b/ui/src/i18n/locales/en.json @@ -1,4 +1,8 @@ { + "meta": { + "title": "Only Once Share — Secure One-Time Secret Sharing", + "description": "Share passwords, API keys, and sensitive data with end-to-end encryption. Zero-knowledge, single-use links that self-destruct after viewing." + }, "header": { "title": "Only Once Share" }, diff --git a/ui/src/i18n/locales/es.json b/ui/src/i18n/locales/es.json index 01dcef7..a003240 100644 --- a/ui/src/i18n/locales/es.json +++ b/ui/src/i18n/locales/es.json @@ -1,4 +1,8 @@ { + "meta": { + "title": "Only Once Share — Compartir secretos de forma segura", + "description": "Comparte contraseñas, claves API y datos sensibles con cifrado de extremo a extremo. Conocimiento cero, enlaces de un solo uso que se autodestruyen después de verlos." + }, "header": { "title": "Only Once Share" }, diff --git a/ui/src/i18n/locales/hi.json b/ui/src/i18n/locales/hi.json index dd744a2..1cb06b7 100644 --- a/ui/src/i18n/locales/hi.json +++ b/ui/src/i18n/locales/hi.json @@ -1,4 +1,8 @@ { + "meta": { + "title": "Only Once Share — सुरक्षित एक बार का गोपनीय साझाकरण", + "description": "एंड-टू-एंड एन्क्रिप्शन के साथ पासवर्ड, API कुंजियाँ और संवेदनशील डेटा साझा करें। शून्य ज्ञान, एक बार उपयोग लिंक जो देखने के बाद स्वतः नष्ट हो जाते हैं।" + }, "header": { "title": "Only Once Share" }, diff --git a/ui/src/i18n/locales/pt.json b/ui/src/i18n/locales/pt.json index 28527b7..6dbcb27 100644 --- a/ui/src/i18n/locales/pt.json +++ b/ui/src/i18n/locales/pt.json @@ -1,63 +1,67 @@ { + "meta": { + "title": "Only Once Share — Compartilhamento seguro de segredos", + "description": "Compartilhe senhas, chaves de API e dados sensíveis com criptografia ponta a ponta. Conhecimento zero, links de uso único que se autodestroem após a visualização." + }, "header": { "title": "Only Once Share" }, "hero": { - "title": "Compartilhe segredos com seguranca", - "subtitle": "Criptografia ponta a ponta no seu navegador. O servidor nunca ve seus dados. Links se autodestroem apos uma visualizacao." + "title": "Compartilhe segredos com segurança", + "subtitle": "Criptografia ponta a ponta no seu navegador. O servidor nunca vê seus dados. Links se autodestroem após uma visualização." }, "create": { - "label": "Conteudo secreto", + "label": "Conteúdo secreto", "placeholder": "Cole sua senha, chave de API ou mensagem privada...", "charCount": "{{count}} / 50,000", "expiresIn": "Expira em", "encrypting": "Criptografando...", "submit": "Criar link secreto", "linkCreated": "Link secreto criado", - "linkInfo": "Compartilhe este link com seu destinatario. Ele so pode ser aberto uma vez, depois e permanentemente destruido.", + "linkInfo": "Compartilhe este link com seu destinatário. Ele só pode ser aberto uma vez, depois é permanentemente destruído.", "shareVia": "Compartilhar via", "copy": "Copiar", "copied": "Copiado", "whatsapp": "WhatsApp", "email": "E-mail", "createAnother": "Criar outro", - "whatsappMsg": "Estou compartilhando um segredo com voce. Abra este link para ve-lo (apenas uma vez):\n\n{{link}}", - "emailSubject": "Aqui esta um segredo para voce", - "emailBody": "Estou compartilhando um segredo com voce. Abra este link para ve-lo — so pode ser aberto uma vez:\n\n{{link}}" + "whatsappMsg": "Estou compartilhando um segredo com você. Abra este link para vê-lo (apenas uma vez):\n\n{{link}}", + "emailSubject": "Aqui está um segredo para você", + "emailBody": "Estou compartilhando um segredo com você. Abra este link para vê-lo — só pode ser aberto uma vez:\n\n{{link}}" }, "view": { "loading": "Recuperando e descriptografando segredo...", - "destroyed": "Este segredo foi permanentemente destruido. Nao pode ser visualizado novamente.", + "destroyed": "Este segredo foi permanentemente destruído. Não pode ser visualizado novamente.", "copySecret": "Copiar segredo", - "copiedClipboard": "Copiado para a area de transferencia", - "notFoundTitle": "Segredo nao disponivel", - "notFoundMsg": "Este segredo ja foi visualizado ou expirou. Segredos so podem ser acessados uma vez.", + "copiedClipboard": "Copiado para a área de transferência", + "notFoundTitle": "Segredo não disponível", + "notFoundMsg": "Este segredo já foi visualizado ou expirou. Segredos só podem ser acessados uma vez.", "errorTitle": "Algo deu errado", - "errorMsg": "Nao foi possivel descriptografar o segredo. O link pode ser invalido.", - "invalidLink": "Link invalido — chave de descriptografia ausente", + "errorMsg": "Não foi possível descriptografar o segredo. O link pode ser inválido.", + "invalidLink": "Link inválido — chave de descriptografia ausente", "newSecret": "Compartilhar novo segredo", - "backHome": "Voltar ao inicio" + "backHome": "Voltar ao início" }, "footer": { "encryption": "AES-256-GCM", "zeroKnowledge": "Conhecimento zero", - "autoDelete": "Auto-exclusao" + "autoDelete": "Auto-exclusão" }, "security": { "title": "Como funciona", "e2eTitle": "Criptografia ponta a ponta", - "e2eDesc": "Seu segredo e criptografado no seu navegador usando AES-256-GCM com um IV aleatorio de 96 bits antes de sair do seu dispositivo. A chave de criptografia nunca e enviada ao nosso servidor.", - "hkdfTitle": "Derivacao de chave HKDF", - "hkdfDesc": "Uma chave de criptografia unica e derivada para cada segredo usando HKDF-SHA-256 com o ID do segredo como contexto. Mesmo com a chave mestra, cada segredo tem sua propria chave criptograficamente independente.", - "aadTitle": "Vinculacao de dados autenticados", - "aadDesc": "O ID do segredo e vinculado como Dados Autenticados Adicionais (AAD) durante a criptografia. Se alguem adulterar o ID ou trocar o texto cifrado entre segredos, a descriptografia falhara.", + "e2eDesc": "Seu segredo é criptografado no seu navegador usando AES-256-GCM com um IV aleatório de 96 bits antes de sair do seu dispositivo. A chave de criptografia nunca é enviada ao nosso servidor.", + "hkdfTitle": "Derivação de chave HKDF", + "hkdfDesc": "Uma chave de criptografia única é derivada para cada segredo usando HKDF-SHA-256 com o ID do segredo como contexto. Mesmo com a chave mestra, cada segredo tem sua própria chave criptograficamente independente.", + "aadTitle": "Vinculação de dados autenticados", + "aadDesc": "O ID do segredo é vinculado como Dados Autenticados Adicionais (AAD) durante a criptografia. Se alguém adulterar o ID ou trocar o texto cifrado entre segredos, a descriptografia falhará.", "zkTitle": "Conhecimento zero", - "zkDesc": "O servidor armazena apenas dados criptografados. Nao podemos ler, descriptografar ou acessar seus segredos de nenhuma forma.", + "zkDesc": "O servidor armazena apenas dados criptografados. Não podemos ler, descriptografar ou acessar seus segredos de nenhuma forma.", "keyTitle": "A chave nunca sai do navegador", - "keyDesc": "A chave de descriptografia e colocada apos o # na URL. Fragmentos de URL do navegador nunca sao enviados aos servidores.", - "oneTimeTitle": "Visualizacao unica", - "oneTimeDesc": "Quando um segredo e recuperado, ele e atomicamente excluido do armazenamento na mesma operacao.", - "expiryTitle": "Expiracao automatica", - "expiryDesc": "Segredos expiram automaticamente apos o TTL escolhido (1-72 horas), mesmo se nunca forem visualizados." + "keyDesc": "A chave de descriptografia é colocada após o # na URL. Fragmentos de URL do navegador nunca são enviados aos servidores.", + "oneTimeTitle": "Visualização única", + "oneTimeDesc": "Quando um segredo é recuperado, ele é atomicamente excluído do armazenamento na mesma operação.", + "expiryTitle": "Expiração automática", + "expiryDesc": "Segredos expiram automaticamente após o TTL escolhido (1-72 horas), mesmo se nunca forem visualizados." } } diff --git a/ui/src/i18n/locales/zh.json b/ui/src/i18n/locales/zh.json index 07b1bec..8ff82f8 100644 --- a/ui/src/i18n/locales/zh.json +++ b/ui/src/i18n/locales/zh.json @@ -1,4 +1,8 @@ { + "meta": { + "title": "Only Once Share — 安全一次性秘密分享", + "description": "通过端到端加密分享密码、API密钥和敏感数据。零知识架构,一次性自毁链接。" + }, "header": { "title": "Only Once Share" }, From 56924e461882c6349502bb93f2fa9eef2a59c65f Mon Sep 17 00:00:00 2001 From: diogohudson Date: Tue, 10 Mar 2026 12:08:53 -0300 Subject: [PATCH 2/2] chore: gitignore .env files, coverage reports, and tsbuildinfo Co-Authored-By: Claude Opus 4.6 --- .gitignore | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.gitignore b/.gitignore index b345356..303c324 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,14 @@ target/ # Ralph backup directories (created by migration) .ralph_backup_* + +# Coverage reports +ui/coverage/ +api/.coverage + +# TypeScript build info +*.tsbuildinfo + +# Environment variables (secrets) +.env +!.env.template