Executando verificação de segurança...
15

O problema das strings nas redes sociais, e como eu venci (Circle App)

🌐 Contexto

Hoje trago mais um capítulo da minha saga de construir uma rede social do zero: o Circle App.
Mas desta vez, não vou falar de servidores ou algoritmos.
Quero falar sobre algo aparentemente trivial que esconde uma complexidade traiçoeira.
Algo que por muitos anos foi, e ainda é o coração de qualquer rede social:

✍️ os textos.

🐘 O elefante branco na sala

Provavelmente você já precisou validar um nome de usuário ou senha com base em algumas regras simples.
Talvez tenha criado uma classe de validação, rodado alguns testes e pronto, problema resolvido, se foi só isso dificilmente enfrentou muitos problemas com texto.

Mesmo em casos mais complexos como produtos SaaS, o texto é apenas um meio:

  • O nome de usuário é só um identificador.
  • O texto é uma anotação qualquer do usuário, ou uma descrição simples de alguma funcionalidade por exemplo.
  • E se alguém escreve algo estranho, ou a reenzenização não é das melhores... bom, pouco importa, o foco está na funcionalidade, não na visualização de um campo de texto qualquer.

Mas em redes sociais… Isso muda completamente.

💬 Em redes sociais, texto é o produto

Em uma rede social, os textos não são um detalhe de UX. Eles são a experiência.
Eles definem identidades, transmitem emoções, criam conexões.
Cada comentário, cada descrição, cada nome de usuário — tudo é comunicação viva.

  • As regras de nomes de usuário modelam a identidade da rede. Elas dizem como as pessoas serão vistas e lembradas.
  • As descrições dos posts precisam de validações cuidadosas — não quero símbolos aleatórios prejudicando a leitura.
  • As transformações são constantes: validações, extrações, formatações, conversões… às vezes várias vezes por segundo, em cada renderização.

De repente, aquele “simples campo de texto” se transformou em um terreno minado.

🧠 Desafios e… teimosia

No começo, eu pensei como muitos pensariam:

“Ah, isso é só mais uma funçãozinha.”

Um usuário escreve:
"adorei a viagem para #disney"

Ok, preciso extrair a hashtag.
Crio uma função. Resolvido.

Mas depois… quero tornar isso clicável.
Crio um endpoint para procurar tags pelo nome.
Aí penso: “melhor usar ID” para ter indices.
Agora meu texto virou "adorei a viagem para a #disney:041413170424".
Só que não posso renderizar assim.
Então… mais uma função para remover IDs.

Datas?
Quero exibir "10 minutos atrás" em vez de 10/10/2025.
Fácil, crio um dateConversor com ChatGPT, ok novamente funciona, até que...
percebe que o servidor está em UTC (0) e o usuário em BRT (-3).
De repente, “publicado agora” vira “publicado há 5 horas atrás”.
Mais uma função.

Números?
Quero mostrar 1K em vez de 1000.
Mais uma função.

Análise de sentimento para moderação?
Importo um modelo do HuggingFace, escrevo um módulo, e… torço para que o servidor não exploda com milhares de requisições por segundo 😅

E assim, pouco a pouco, eu construía um castelo de funções espalhadas, testes duplicados e potenciais bugs escondidos.

🥲 O balde de água fria

Foi aí que caiu a ficha.
Não existe solução mágica.

Se quero validação X, conversão Y, análise Z…
Eu teria que escrever tudo isso.
Função por função.
Teste por teste.

E não, por mais fé que você tenha, um transformer não vai rodar milagrosamente no seu servidor de produção sob carga pesada.

Eu tinha duas opções:

  1. Continuar espalhando lógica textual pelo código, aumentando a complexidade e os bugs.
  2. Ou… encarar o problema de frente e organizar esse caos.

✨ A virada de chave

Foi nesse momento que me fiz uma pergunta simples:

“E se eu escrevesse uma biblioteca única para lidar com todos os problemas relacionados a texto?”

Uma biblioteca que:

  • Contivesse todas as regras de validação, extração, formatação, análise etc.
  • Fosse síncrona — nada de async/await para tarefas triviais.
  • Pudesse ser usada no frontend e no backend, garantindo 100% de consistência.
  • Ficasse isolada do core da aplicação, mantendo o repositório principal limpo e focado no negócio.

Foi assim que nasceu a…

🚀 Circle Text Library

Uma biblioteca TypeScript para domar o caos textual de redes sociais.
Tudo em um só lugar. Tudo tipado. Tudo síncrono.

import { TextLibrary } from "circle-text-library"

const textLib = new TextLibrary({
    validationRules: {
        username: {
            minLength: { enabled: true, value: 3, description: "Mínimo 3 caracteres" },
            maxLength: { enabled: true, value: 20, description: "Máximo 20 caracteres" }
        }
    }
})

// ✅ Validação
const validation = textLib.validator.username("john_doe")
// { isValid: true, errors: [] }

// 🕵️‍♂️ Extração
textLib.extractor.setText("Olá @user veja #tech em https://example.com")
const entities = textLib.extractor.entities({ mentions: true, hashtags: true })
// { mentions: ["@user"], hashtags: ["#tech"] }

// 🧠 Análise de Sentimento
const sentiment = textLib.sentiment.analyze("Estou muito feliz!")
// { sentiment: "positive", intensity: 0.85 }

// 🕓 Formatação de Datas
const relative = textLib.date.toRelativeTime(new Date(Date.now() - 300000))
// "5 minutos atrás"

// 🌍 Timezones
const brtTz = new Timezone(TimezoneCode.BRT)
brtTz.localToUTC(new Date("2024-01-15T12:00:00Z"))
// → 15:00 UTC

// 🔢 Conversões
textLib.conversor.convertNumToShort(1500) // "1.5 K"

// ✍️ Rich Text
richText.setText("Olá @alice veja #tech", {
    mentions: { alice: "user_123" },
    hashtags: { tech: "tag_456" }
})
const uiFormat = richText.formatToUI()
// ...

Isso aqui é só algo muito básico mas logo abaixo estou deixando link para a documentação completa e de exemplos práticos de uso

De repente, todas aquelas “funçõezinhas” caóticas estavam reunidas em um sistema coeso.
Eu não precisava mais me preocupar com bugs escondidos.
Bastava manter a biblioteca — com testes robustos — e usá-la em qualquer lugar do projeto.

🤨 Se é para mim mesmo, por que é pública?

Se todo o projeto é público, por que essa biblioteca seria diferente?
Além disso, eu realmente acredito que ela pode ajudar outras pessoas que enfrentam os mesmos desafios que eu.

E não, isso não é um pitch — na verdade, eu só perdi tempo escrevendo documentação 😄 (o vilão dos devs)

O verdadeiro motivo é simples:
Criei a biblioteca com regras totalmente customizáveis na inicialização, o que significa que você pode adaptar facilmente para as suas necessidades específicas — seja um app social, um sistema de mensagens ou uma ferramenta de análise de conteúdo.

Textos são o coração das redes sociais, mas também o maior vetor de complexidade que muitos ignoram.
Construir a Circle Text Library foi minha forma de trazer ordem a esse caos, e de quebra, acelerar radicalmente o desenvolvimento da minha rede social.

Não existe mágica.
Mas com organização, testes sólidos e modularidade, dá para transformar um problema invisível em uma solução elegante e reutilizável.

📚 Documentação

  • 📝 Visão geral
    Visão geral completa da biblioteca e seus principais módulos.

  • 🔌 Setup & configuração
    Guia de como customizar regras e adaptar a biblioteca ao seu contexto.

  • 🏃🏽 Exemplos práticos de utilização
    Aqui você encontra um índice sobre a documentação de cada módulo cada módulo da biblioteca.

  • 💬 API Reference
    Lista detalhada dos validadores, extratores e transformadores disponíveis para textos.

  • 👨🏾‍💻 Documentação completa
    Aqui você encontra um índice sobre a documentação de cada módulo da biblioteca.

Carregando publicação patrocinada...
1
1

Poxa que legal, nem pensei na possibilidade de fazer um framework, só enxerguei como o problema poderia ser resolvido e parti pro código quase sem pensar kkkk

Vou dar uma olhada no projeto com certeza e vou deixar minha estrela lá também.

1
1

Obrigado pela sugestão! No momento, priorizei apenas as funcionalidades essenciais para atender às necessidades imediatas do projeto. Porém, faz sentido o que você apontou, vou considerar essa implementação na próxima versão com certeza.