diff --git a/web/i18n/pt/a11y/dialog.json b/web/i18n/pt/a11y/dialog.json
new file mode 100644
index 00000000..04008f86
--- /dev/null
+++ b/web/i18n/pt/a11y/dialog.json
@@ -0,0 +1,5 @@
+{
+ "picker.item.video": "miniatura do vídeo",
+ "picker.item.gif": "miniatura do gif",
+ "picker.item.photo": "miniatura da foto"
+}
diff --git a/web/i18n/pt/a11y/donate.json b/web/i18n/pt/a11y/donate.json
new file mode 100644
index 00000000..047baab0
--- /dev/null
+++ b/web/i18n/pt/a11y/donate.json
@@ -0,0 +1,4 @@
+{
+ "share.qr.expand": "qr code. clique para expandir.",
+ "share.qr.collapse": "qr code expandido. pressione para fechar."
+}
diff --git a/web/i18n/pt/a11y/general.json b/web/i18n/pt/a11y/general.json
new file mode 100644
index 00000000..b8398e8b
--- /dev/null
+++ b/web/i18n/pt/a11y/general.json
@@ -0,0 +1,3 @@
+{
+ "back": "voltar"
+}
diff --git a/web/i18n/pt/a11y/queue.json b/web/i18n/pt/a11y/queue.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/a11y/queue.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/a11y/save.json b/web/i18n/pt/a11y/save.json
new file mode 100644
index 00000000..e741a6cf
--- /dev/null
+++ b/web/i18n/pt/a11y/save.json
@@ -0,0 +1,12 @@
+{
+ "clear_input": "limpar entrada",
+ "download.check": "verificando o download...",
+ "link_area.turnstile": "área de entrada de link. verificando se você não é um robô.",
+ "tutorial.shortcut.photos": "adicionar atalho para fotos",
+ "link_area": "área de entrada de link",
+ "download": "descarregar",
+ "download.think": "processando o link...",
+ "download.done": "download pronto",
+ "download.error": "erro ao fazer download",
+ "tutorial.shortcut.files": "adicionar atalho para arquivos"
+}
diff --git a/web/i18n/pt/a11y/tabs.json b/web/i18n/pt/a11y/tabs.json
new file mode 100644
index 00000000..2c96dfa5
--- /dev/null
+++ b/web/i18n/pt/a11y/tabs.json
@@ -0,0 +1,3 @@
+{
+ "tab_panel": "painel de abas"
+}
diff --git a/web/i18n/pt/about.json b/web/i18n/pt/about.json
new file mode 100644
index 00000000..cb0caf56
--- /dev/null
+++ b/web/i18n/pt/about.json
@@ -0,0 +1,35 @@
+{
+ "page.faq": "perguntas frequentes",
+ "page.privacy": "política de privacidade",
+ "page.credits": "agradecimento & licenças",
+ "community.discord": "servidor da comunidade no discord",
+ "community.twitter": "conta de novidades no twitter",
+ "community.email": "email de suporte",
+ "heading.general": "termos gerais",
+ "heading.licenses": "licenças",
+ "heading.summary": "o melhor jeito de salvar o que você ama",
+ "heading.privacy": "privacidade líder",
+ "heading.community": "comunidade aberta",
+ "heading.abuse": "denunciar abuso",
+ "heading.local": "processamento no dispositivo",
+ "heading.saving": "salvando",
+ "heading.encryption": "encriptação",
+ "heading.plausible": "análise de tráfego anônima",
+ "heading.cloudflare": "privacidade web & segurança",
+ "heading.responsibility": "responsabilidade do usuário",
+ "heading.motivation": "motivação",
+ "page.general": "o que é cobalt?",
+ "page.terms": "termos e ética",
+ "community.github": "repositório no github",
+ "community.telegram": "canal de novidades no telegram",
+ "page.community": "comunidade & suporte",
+ "heading.testers": "testadores beta",
+ "support.github": "confira o código-fonte do cobalt, contribua com alterações ou relate problemas",
+ "support.discord": "peça ajuda ou converse com a comunidade e os desenvolvedores sobre o cobalt",
+ "support.twitter": "acompanhe as atualizações e o desenvolvimento do cobalt no twitter",
+ "support.telegram": "mantenha-se atualizado das últimas atualizações do cobalt pelo telegram",
+ "support.description.issue": "se você quiser relatar um bug ou algum outro problema recorrente, por favor relate pelo github.",
+ "support.description.help": "Use o Discord para qualquer outra pergunta. Descreva o problema corretamente em #cobalt-support, caso contrário ninguém poderá ajudá-lo.",
+ "support.description.best-effort": "todo o suporte é feito com o máximo de esforço porém não é garantido; uma resposta pode levar algum tempo.",
+ "support.bluesky": "acompanhe as atualizações e o desenvolvimento do cobalt em seu feed do bluesky"
+}
diff --git a/web/i18n/pt/about/credits.md b/web/i18n/pt/about/credits.md
new file mode 100644
index 00000000..e6822b9a
--- /dev/null
+++ b/web/i18n/pt/about/credits.md
@@ -0,0 +1,89 @@
+
+
+
+
+
+cobalt is made with love and care by [imput](https://imput.net/) ❤️
+
+we're a small team of two guys, but we work really hard to make great software
+that benefits everyone. if you like our work, please consider supporting it on
+the [donate page](/donate)!
+
+
+
+
+
+huge shout-out to our testers for testing updates early and making sure they're
+stable. they also helped us ship cobalt 10!
+
+todos os links são externos e levam a seus sites pessoais ou redes sociais.
+
+
+
+
+
+a portion of cobalt's processing infrastructure is provided by our long-standing
+partner, [royalehosting.net]({partners.royalehosting})!
+
+
+
+
+
+meowbalt is cobalt's speedy mascot, a very expressive cat who loves fast
+internet.
+
+all amazing art of meowbalt that you see in cobalt was made by
+[GlitchyPSI](https://glitchypsi.xyz/). he's also the original creator of the
+character.
+
+imput holds legal rights to meowbalt's character design, but not specific
+artworks that were created by GlitchyPSI.
+
+we love meowbalt, so we have to set a few rules in place to protect him:
+- you cannot use meowbalt's character design in any form that isn't fan art.
+- you cannot use meowbalt's design or artworks commercially.
+- you cannot use meowbalt's design or artworks in your own projects.
+- you cannot use or modify GlitchyPSI's artworks of meowbalt in any form.
+
+if you create fan art of meowbalt, please share it in [our discord
+server](/about/community), we'd love to see it!
+
+
+
+
+
+cobalt api (processing server) code is open source and licensed under
+[AGPL-3.0]({docs.apiLicense}).
+
+cobalt frontend code is [source first](https://sourcefirst.com/) and is licensed
+under [CC-BY-NC-SA 4.0]({docs.webLicense}).
+
+we had to make frontend source first to stop grifters from profiting off our
+work & from creating malicious clones that deceive people and hurt our public
+identity. other than commercial use, it follows same principles as many open
+source licenses.
+
+we rely on many open source libraries, but also create & distribute our own. you
+can see the full list of dependencies on [github]({contacts.github})!
+
diff --git a/web/i18n/pt/about/general.md b/web/i18n/pt/about/general.md
new file mode 100644
index 00000000..082ad439
--- /dev/null
+++ b/web/i18n/pt/about/general.md
@@ -0,0 +1,75 @@
+
+
+
+
+
+o cobalt te ajuda a salvar qualquer coisa dos seus sites favoritos: vídeo,
+áudio, fotos ou gifs. é só colar o link e pronto!
+
+sem anúncios, rastreadores, assinaturas ou outras bobeiras. só um aplicativo da
+web conveniente que funciona em qualquer lugar, sempre que precisar.
+
+
+
+
+
+cobalt was created for public benefit, to protect people from ads and malware
+pushed by alternative downloaders. we believe that the best software is safe,
+open, and accessible. all imput project follow these basic principles.
+
+
+
+
+
+all requests to the backend are anonymous and all information about potential
+file tunnels is encrypted. we have a strict zero log policy and don't store or
+track *anything* about individual people.
+
+if a request requires additional processing, such as remuxing or transcoding,
+cobalt processes media directly on your device. this ensures best efficiency and
+privacy.
+
+if your device doesn't support local processing, then server-based live
+processing is used instead. in this scenario, processed media is streamed
+directly to client, without ever being stored on server's disk.
+
+you can [enable forced tunneling](/settings/privacy#tunnel) to boost privacy
+even further. when enabled, cobalt will tunnel all downloaded files, not just
+those that require it. no one will know where you download something from, even
+your network provider. all they'll see is that you're using a cobalt instance.
+
+
+
diff --git a/web/i18n/pt/about/privacy.md b/web/i18n/pt/about/privacy.md
new file mode 100644
index 00000000..d4cb2d84
--- /dev/null
+++ b/web/i18n/pt/about/privacy.md
@@ -0,0 +1,123 @@
+
+
+
+
+
+cobalt's privacy policy is simple: we don't collect or store anything about you.
+what you do is solely your business, not ours or anyone else's.
+
+these terms are applicable only when using the official cobalt instance. in
+other cases, you may need to contact the instance hoster for accurate info.
+
+
+
+
+
+tools that use on-device processing work offline, locally, and never send any
+processed data anywhere. they are explicitly marked as such whenever applicable.
+
+
+
+
+
+when using saving functionality, cobalt may need to proxy or remux/transcode
+files. if that's the case, then a temporary tunnel is created for this purpose
+and minimal required information about the media is stored for 90 seconds.
+
+on an unmodified & official cobalt instance, **all tunnel data is encrypted with
+a key that only the end user has access to**.
+
+encrypted tunnel data may include:
+- origin service's name.
+- original URLs for media files.
+- internal arguments needed to differentiate between types of processing.
+- minimal file metadata (generated filename, title, author, creation year,
+ copyright info).
+- minimal information about the original request that may be used in case of an
+ URL failure during the tunnelling process.
+
+this data is irreversibly purged from server's RAM after 90 seconds. no one has
+access to cached tunnel data, even instance owners, as long as cobalt's source
+code is not modified.
+
+media data from tunnels is never stored/cached anywhere. everything is processed
+live, even during remuxing and transcoding. cobalt tunnels function like an
+anonymous proxy.
+
+if your device supports local processing, then encrypted tunnel info includes
+way less info, because it's returned to client instead.
+
+see the [related source code on
+github](https://github.com/imputnet/cobalt/tree/main/api/src/stream) to learn
+more about how it works.
+
+
+
+
+
+temporarily stored tunnel data is encrypted using the AES-256 standard.
+decryption keys are only included in the access link and never
+logged/cached/stored anywhere. only the end user has access to the link &
+encryption keys. keys are generated uniquely for each requested tunnel.
+
+
+{#if env.PLAUSIBLE_ENABLED}
+
+
+
+we use [plausible](https://plausible.io/) to get an approximate number of active
+cobalt users, fully anonymously. no identifiable information about you or your
+requests is ever stored. all data is anonymized and aggregated. we self-host and
+manage the [plausible instance](https://{env.PLAUSIBLE_HOST}/) that cobalt uses.
+
+plausible doesn't use cookies and is fully compliant with GDPR, CCPA, and PECR.
+
+if you wish to opt out of anonymous analytics, you can do it in [privacy
+settings](/settings/privacy#analytics). if you opt out, the plausible script
+will not be loaded at all.
+
+[learn more about plausible's dedication to
+privacy](https://plausible.io/privacy-focused-web-analytics).
+
+{/if}
+
+
+
+
+we use cloudflare services for:
+- ddos & abuse protection.
+- bot protection (cloudflare turnstile).
+- hosting & deploying the statically rendered web app (cloudflare workers).
+
+all of these are required to provide the best experience for everyone.
+cloudflare is the most private & reliable provider for all mentioned solutions
+that we know of.
+
+cloudflare is fully compliant with GDPR and HIPAA.
+
+[learn more about cloudflare's dedication to
+privacy](https://www.cloudflare.com/trust-hub/privacy-and-data-protection/).
+
diff --git a/web/i18n/pt/about/terms.md b/web/i18n/pt/about/terms.md
new file mode 100644
index 00000000..39df9098
--- /dev/null
+++ b/web/i18n/pt/about/terms.md
@@ -0,0 +1,65 @@
+
+
+
+
+
+these terms are applicable only when using the official cobalt instance. in
+other cases, you may need to contact the instance hoster for accurate info.
+
+
+
+
+
+saving functionality simplifies downloading content from the internet and we
+take zero liability for what the saved content is used for.
+
+processing servers operate like advanced proxies and don't ever write any
+requested content to disk. everything is handled in RAM and permanently purged
+once the tunnel is completed. we have no downloading logs and cannot identify
+anyone.
+
+you can learn more about how tunnels work in [privacy policy](/about/privacy).
+
+
+
+
+
+you (end user) are responsible for what you do with our tools, how you use and
+distribute resulting content. please be mindful when using content of others and
+always credit original creators. make sure you don't violate any terms or
+licenses.
+
+when used in educational purposes, always cite sources and credit original
+creators.
+
+fair use and credits benefit everyone.
+
+
+
+
+
+we have no way of detecting abusive behavior automatically because cobalt is
+fully anonymous. however, you can report such activities to us via email and
+we'll do our best to comply manually: abuse[at]imput.net
+
+**this email is not intended for user support, you will not get a response if
+your concern is not related to abuse.**
+
+if you're experiencing issues, you can reach out for support via any preferred
+method on [the community page](/about/community).
+
diff --git a/web/i18n/pt/button.json b/web/i18n/pt/button.json
new file mode 100644
index 00000000..da2532f1
--- /dev/null
+++ b/web/i18n/pt/button.json
@@ -0,0 +1,20 @@
+{
+ "done": "pronto",
+ "download": "descarregar",
+ "gotit": "entendi",
+ "cancel": "cancelar",
+ "reset": "reiniciar",
+ "download.audio": "baixar aúdio",
+ "share": "compartilhar",
+ "copy": "copiar",
+ "copy.section": "copiar link da seção",
+ "copied": "copiado",
+ "import": "importar",
+ "continue": "continuar",
+ "star": "estrela",
+ "follow": "seguir",
+ "save": "salvar",
+ "export": "exportar",
+ "yes": "sim",
+ "no": "não"
+}
diff --git a/web/i18n/pt/dialog.json b/web/i18n/pt/dialog.json
new file mode 100644
index 00000000..27d176fc
--- /dev/null
+++ b/web/i18n/pt/dialog.json
@@ -0,0 +1,18 @@
+{
+ "safety.custom_instance.body": "instâncias personalizadas podem potencialmente representar riscos de privacidade e segurança.\n\ninstâncias ruins podem:\n1. redirecionar você para longe do cobalt e tentar enganá-lo.\n2. registrar todas as informações sobre suas solicitações, armazená-las para sempre e usá-las para rastreá-lo.\n3. fornecer arquivos maliciosos (como vírus).\n4. forçá-lo a assistir anúncios ou fazer você pagar pelo download.\n\ndepois desse ponto, não podemos protegê-lo. esteja atento a quais instâncias usar e sempre confie em seu instinto. se algo parecer estranho, volte a esta página, redefina a instância personalizada e nos informe no github.",
+ "reset.title": "apagar todas as configurações?",
+ "reset.body": "você tem certeza que quer apagar todas as configurações? essa ação é imediata e irreversível.",
+ "picker.title": "selecione o que salvar",
+ "picker.description.desktop": "clique em um item para salvar. imagens também podem ser salvas usando o menu do botão direito.",
+ "picker.description.ios": "pressione um item para salvar com o atalho. imagens também podem ser salvas com um toque longo.",
+ "saving.title": "escolha como salvar",
+ "saving.blocked": "cobalt tentou abrir o arquivo em uma nova guia, mas seu navegador bloqueou. você pode permitir pop-ups para evitar que isso aconteça novamente.",
+ "saving.timeout": "cobalt tentou baixar o arquivo automaticamente, mas seu navegador não permitiu. você precisa escolher uma maneira para salvar manualmente.",
+ "safety.title": "notícia importante de segurança",
+ "import.body": "importar arquivos desconhecidos ou corrompidos pode alterar ou quebrar inesperadamente a funcionalidade do cobalt. importe apenas arquivos que você exportou pessoalmente e não modificou. se alguém lhe pediu para importar este arquivo, não continue.\n\nnão somos responsáveis por nenhum dano causado pela importação de arquivos de configuração desconhecidos.",
+ "api.override.title": "substituir instância de processamento",
+ "api.override.body": "{{ value }} é a instância de processamento agora. se você não confia nela, aperte em \"cancelar\".\n\nvocê pode alterar isso depois nas configurações de processamento.",
+ "processing.ongoing": "cobalt está processando mídia nesta guia. se você sair, isso será abortado. tem certeza de que deseja fazer isso?",
+ "processing.title.ongoing": "o processamento será cancelado",
+ "picker.description.phone": "pressione em um item para salvar. imagens também podem ser salvas com um toque longo."
+}
diff --git a/web/i18n/pt/donate.json b/web/i18n/pt/donate.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/donate.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/error.json b/web/i18n/pt/error.json
new file mode 100644
index 00000000..bf550d83
--- /dev/null
+++ b/web/i18n/pt/error.json
@@ -0,0 +1,16 @@
+{
+ "captcha_ongoing": "ainda verificando se você não é um robô. espere o spinner desaparecer e tente novamente.\n\nse demorar muito, por favor nos avise! usamos o turnstile da cloudflare para proteção de bots e às vezes ele bloqueia as pessoas sem motivo.",
+ "api.auth.turnstile.missing": "não foi possível confirmar se você não é um robô porque o servidor não recebeu seu token de acesso humano. tente novamente em alguns segundos ou recarregue a página!",
+ "api.timed_out": "o servidor demorou muito para responder. talvez ele esteja sobrecarregado no momento, tente de novo mais tarde!",
+ "remux.out_of_resources": "cobalt ficou sem recursos e não pode continuar com o processamento no dispositivo. isso está relacionado a limitações no seu navegador. tente atualizar ou reabrir o aplicativo e tente novamente. alguns dispositivos só conseguem processar arquivos pequenos.",
+ "import.no_data": "não tem nada nesse arquivo. tem certeza que este é o certo?",
+ "import.invalid": "seu arquivo não parece ter configurações válidas para ser importado. tem certeza que é esse mesmo?",
+ "import.unknown": "não consegui carregar os dados do arquivo. ele pode estar corrompido ou está num formato inválido. mensagem de erro:\n\n{{ value }}",
+ "remux.corrupted": "não foi possível ler os metadados do arquivo, talvez ele esteja corrompido.",
+ "tunnel.probe": "não consegui ver se você pode baixar esse arquivo. tente novamente em alguns segundos!",
+ "api.auth.jwt.missing": "não foi possível confirmar se você não é um robô porque o servidor de processamento não recebeu o token de acesso humano. tente novamente em alguns segundos ou recarregue a página!",
+ "api.auth.jwt.invalid": "não foi possível confirmar se você não é um robô porque seu token de acesso humano expirou e não foi renovado. tente novamente em alguns segundos ou recarregue a página!",
+ "api.auth.turnstile.invalid": "não foi possível confirmar se você não é um robô porque seu token de acesso humano expirou e não foi renovado. tente novamente em alguns segundos ou recarregue a página!",
+ "api.unreachable": "não consegui conectar ao servidor de processamento. verifique sua conexão a internet e tenta de novo.",
+ "api.rate_exceeded": "você fez muitas requisições. tente novamente em {{ limit }} segundos!"
+}
diff --git a/web/i18n/pt/error/api.json b/web/i18n/pt/error/api.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/error/api.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/error/queue.json b/web/i18n/pt/error/queue.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/error/queue.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/general.json b/web/i18n/pt/general.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/general.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/notification.json b/web/i18n/pt/notification.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/notification.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/queue.json b/web/i18n/pt/queue.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/queue.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/receiver.json b/web/i18n/pt/receiver.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/receiver.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/remux.json b/web/i18n/pt/remux.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/remux.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/save.json b/web/i18n/pt/save.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/save.json
@@ -0,0 +1 @@
+{}
diff --git a/web/i18n/pt/settings.json b/web/i18n/pt/settings.json
new file mode 100644
index 00000000..936a0b08
--- /dev/null
+++ b/web/i18n/pt/settings.json
@@ -0,0 +1,3 @@
+{
+ "page.appearance": "aparência"
+}
diff --git a/web/i18n/pt/tabs.json b/web/i18n/pt/tabs.json
new file mode 100644
index 00000000..90d5b1b9
--- /dev/null
+++ b/web/i18n/pt/tabs.json
@@ -0,0 +1,3 @@
+{
+ "save": "salvar"
+}
diff --git a/web/i18n/pt/updates.json b/web/i18n/pt/updates.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/web/i18n/pt/updates.json
@@ -0,0 +1 @@
+{}