# Sete projetos com Zig e Lua Ideias para construir ferramentas úteis, espaços de convivência e experiências com personalidade. Este documento apresenta propostas, não programas já existentes. Os nomes são provisórios, as dificuldades são estimativas relativas e os exemplos mostram como cada sistema poderia funcionar. ## Antes das ideias: por que juntar Zig e Lua? Pense em um programa que tem uma estrutura estável, mas cujo comportamento você gosta de mudar. A estrutura pode ser escrita em Zig, enquanto as partes modificáveis ficam em Lua. No Zig, você implementaria o núcleo: leitura de arquivos, armazenamento, comunicação entre componentes e controle dos recursos. No Lua, escreveria regras, comandos e extensões. O programa carregaria os arquivos `.lua` e executaria as funções que você disponibilizasse para eles. Por exemplo: o Zig sabe encontrar um arquivo e movê-lo com segurança. O Lua decide quais arquivos devem ir para cada pasta. Assim, mudar a organização não exige recompilar o programa inteiro. Isso é tecnicamente possível porque Zig pode usar bibliotecas C e Lua oferece uma API para ser incorporada em aplicações. A documentação oficial descreve essas capacidades no [panorama do Zig](https://ziglang.org/learn/overview/) e na [apresentação do Lua](https://www.lua.org/about.html). Essa combinação não torna qualquer projeto automaticamente leve ou rápido. O resultado depende do que o programa faz, das bibliotecas escolhidas e da implementação. O benefício mais interessante aqui é poder construir um núcleo pequeno e expandir seu comportamento com scripts. Nos exemplos deste documento, funções como `sala`, `regra` e `arquivo:mover_para` seriam criadas por nós. Elas não fazem parte do Lua padrão. ## 1. Estação: uma BBS de terminal para uma pequena comunidade ### O que ela faz Uma BBS é um espaço de encontro acessado por uma interface de texto. Nesta proposta, a pessoa entra, escolhe um apelido e encontra murais de discussão, textos, perfis e pequenas atividades. O ambiente pode ter cores, desenhos feitos com caracteres e menus que funcionam pelo teclado. A ideia seria construir um clube pequeno, com identidade própria. Você poderia manter uma seção sobre cinema, outra sobre programação, um mural de novidades e uma coleção de links indicados pelos participantes. As conversas permaneceriam disponíveis para quem chegasse depois. ### Como seria usar Um visitante abre o terminal, conecta-se ao serviço e vê o nome da estação. Escolhe o mural de cinema, lê uma conversa sobre um filme e deixa uma resposta. Depois visita o perfil de outra pessoa e descobre um site pessoal interessante. Você, como administrador, poderia criar uma nova seção editando um script. Também poderia acrescentar um comando que sorteia uma frase ou um pequeno jogo de perguntas, sem alterar toda a aplicação. ### Onde cada linguagem entra | Zig | Lua | | --- | --- | | Controla sessões, entrada de texto e persistência das mensagens | Define menus e comandos personalizados | | Aplica permissões e limites de uso | Implementa jogos e atividades opcionais | | Desenha os componentes básicos da interface | Escolhe cores, textos de boas-vindas e organização das seções | ### Primeira versão viável Começaria com uma interface local, três murais, publicação de mensagens e perfis simples. O armazenamento poderia ficar em SQLite, um banco mantido em arquivo, adequado à proposta de uma instalação pequena. O acesso remoto entraria depois. Podemos aproveitar o OpenSSH como porta de entrada, mas ainda precisaríamos restringir a sessão ao aplicativo e decidir como os visitantes se identificam. Usar SSH não resolve automaticamente as contas e permissões da BBS. ### O que deixaria o projeto especial Cada comunidade poderia criar sua própria estação usando o mesmo núcleo. Uma estação literária teria citações e clubes de leitura; uma estação técnica teria diários de projetos e pequenos desafios. As diferenças ficariam principalmente nos scripts e no conteúdo. **Dificuldade estimada: média a alta.** O maior trabalho aparece quando várias pessoas usam o sistema ao mesmo tempo. Para você, o apelo está na mistura de convivência, terminal e internet artesanal. ## 2. Gabinete: um acervo pessoal que também pode virar exposição ### O que ele faz Um lugar para guardar referências que normalmente ficam espalhadas: uma frase de um livro, uma imagem, um link, uma anotação sobre um filme ou uma solução técnica. Cada item teria título, tipo, origem, etiquetas e um comentário seu. A melhoria em relação a uma pasta de favoritos seria a curadoria. Você poderia montar coleções como “interfaces de que gosto”, “fotografias para estudar” ou “ideias para escrever”. Um mesmo item poderia pertencer a várias coleções sem precisar duplicar o arquivo. ### Como seria usar Você encontra uma fotografia e registra a imagem, o autor, a fonte e uma observação sobre a luz. Semanas depois, procura pela etiqueta `noturno` e recupera aquela referência junto com outras relacionadas. Quando quiser compartilhar, escolhe alguns itens e gera uma exposição em HTML. O acervo completo continua privado; somente os itens explicitamente marcados para publicação aparecem na página. ### Onde cada linguagem entra O Zig cuidaria do cadastro, da busca, da leitura dos arquivos e da exportação. O Lua definiria seleções e regras de apresentação: quais itens entram em uma coleção automática, como ordenar as referências ou que campos aparecem em uma exposição. Uma regra poderia selecionar fotografias marcadas como públicas e classificadas como noturnas. Outra poderia montar uma página com os últimos livros comentados. ### Primeira versão viável Uma ferramenta de terminal com quatro operações: adicionar, buscar, listar e exportar. Começaria com notas, links e imagens, usando SQLite para os registros e uma pasta comum para os anexos. O primeiro tema HTML teria uma composição editorial simples, com boa tipografia e legendas. ### Como poderia crescer Mais adiante, caberiam relações manuais entre itens, importação de favoritos e uma interface local no navegador. Extrair texto de PDFs ou reconhecer conteúdo de imagens seria uma etapa separada, com dependências próprias. **Dificuldade estimada: média.** O desafio principal é tornar o cadastro rápido o bastante para virar hábito. É uma proposta útil para reunir seus interesses sem exigir que toda referência se transforme em um artigo. ## 3. Oficina: um motor de sites artesanais ### O que ele faz Transforma uma pasta de textos, imagens e modelos de página em um site pronto para publicar. Você escreve o conteúdo em Markdown, escolhe a aparência e executa um comando de construção. O resultado são arquivos HTML, CSS e os demais recursos do site. O diferencial proposto seria facilitar sites pessoais com formatos variados: blog, diário de desenvolvimento, diretório de links, galeria fotográfica ou coleção de resenhas. Lua permitiria definir comportamentos específicos sem aumentar indefinidamente o núcleo do gerador. ### Como seria usar Você escreve uma resenha em Markdown, informa o título do filme e coloca uma imagem na pasta de conteúdo. Ao gerar o site, o programa cria a página, atualiza a listagem de resenhas e acrescenta a publicação ao feed. Se depois quiser uma página que reúna todos os filmes comentados por década, poderia criar essa regra em Lua. O programa precisaria expor os dados das publicações para que o script montasse a seleção. ### Onde cada linguagem entra | Zig | Lua | | --- | --- | | Percorre pastas e organiza a construção do site | Define filtros e agrupamentos de conteúdo | | Integra o processamento de Markdown e os modelos HTML | Acrescenta transformações e páginas especiais | | Grava os arquivos finais e informa erros | Personaliza regras de URLs e apresentação | O processamento de Markdown deve usar uma biblioteca apropriada, em vez de tentarmos implementar todas as regras da linguagem na primeira versão. ### Primeira versão viável Um blog com página inicial, páginas individuais, arquivo cronológico e um tema. Feed RSS e modo de pré-visualização seriam os próximos passos. O site gerado poderia ser servido por um servidor de arquivos estáticos; ele não precisaria executar Zig ou Lua durante a visita. ### O motivo para construir Este projeto vale pelo aprendizado e pelo controle do formato. Para apenas colocar um blog no ar rapidamente, um gerador pronto tende a dar menos trabalho. A proposta fica interessante se você quiser desenvolver seu próprio jeito de publicar e oferecer esse motor a outras pessoas. **Dificuldade estimada: média.** É um bom exercício completo, com entrada, transformação e saída fáceis de observar. ## 4. Vigia: um centro de comando para o homelab ### O que ele faz Reúne em uma interface de terminal as verificações que você faz com frequência: um serviço está respondendo? O disco está enchendo? O backup terminou? Qual máquina precisa de atenção? Cada serviço apareceria com nome, resultado da última verificação e horário. O painel também mostraria quando a informação ficou antiga, para não apresentar um resultado de ontem como se fosse atual. ### Como seria usar Você abre o Vigia e encontra um serviço indisponível. Seleciona a entrada e vê a URL consultada, o erro recebido e o horário da tentativa. Em outra seção, percebe que um backup esperado não apareceu na pasta de destino. No começo, o programa apenas observaria. Depois, você poderia cadastrar ações específicas, como abrir os logs de um serviço ou solicitar sua reinicialização, sempre mostrando qual máquina seria afetada. ### Onde cada linguagem entra O Zig cuidaria do agendamento, dos limites de tempo, da execução das verificações e da interface. Lua descreveria o que verificar e como interpretar a resposta. Uma regra poderia considerar um serviço saudável somente quando a resposta HTTP tivesse determinado campo. Outra conferiria se um arquivo de backup foi atualizado dentro do intervalo esperado. Isso é mais flexível do que tratar todo serviço como uma simples página que responde “200”. ### Primeira versão viável Um painel para uma máquina, verificações HTTP e consulta de espaço em disco. Depois, a coleta poderia alcançar outras máquinas por SSH e pela rede privada já existente. Informações remotas exigiriam credenciais e comandos ou um agente de coleta; não apareceriam apenas porque as máquinas estão conectadas à mesma rede. ### Onde segurar o escopo Gráficos históricos, alertas e controle remoto podem esperar. O primeiro objetivo seria responder “o que precisa da minha atenção agora?” com informações confiáveis. **Dificuldade estimada: média no modo de observação; maior com administração remota.** Entre as sete ideias, é uma das que têm utilidade cotidiana mais imediata para quem mantém vários serviços. ## 5. Casa da Meia-Noite: um mundo compartilhado em texto ### O que ele faz Cria um lugar explorável pelo terminal, com salas, objetos, textos e pessoas conectadas. O visitante navega por comandos como `olhar`, `ir biblioteca`, `ler livro` e `conversar`. Enquanto a BBS organiza a experiência por menus e assuntos, aqui a organização é espacial. Você entra em uma casa, visita a biblioteca, passa pelo jardim e encontra alguém na sala do rádio. Cada ambiente pode conter conteúdo seu e pequenas interações. ### Como seria usar Uma pessoa entra na biblioteca e examina a estante. Encontra uma seleção de livros comentados por você. No jardim, há um livro de visitas. Na sala do rádio, um comando mostra a faixa atual e o endereço para ouvir no navegador. O texto pode mudar conforme o horário: luz da manhã pelas janelas, chuva à tarde ou uma luminária acesa à noite. Essas mudanças podem seguir regras escritas por você, sem depender de geração por IA. ### Onde cada linguagem entra O Zig manteria os visitantes, as posições, as mensagens e os dados persistentes. Lua definiria as salas, os objetos e os acontecimentos. Esta é uma das propostas em que a divisão entre as duas linguagens fica mais natural. Um arquivo de sala poderia ter esta forma: ```lua -- Exemplo de uma API que seria implementada no projeto. sala { id = "biblioteca", nome = "Biblioteca da meia-noite", descricao = "Uma luminária acesa. Livros pelas mesas. Chove lá fora.", saidas = { norte = "jardim", sul = "sala_do_radio" }, comandos = { ler = function(visitante) visitante:mostrar("Você abre o caderno de recomendações de leitura.") end } } ``` O Zig registraria a função `sala` no ambiente Lua. Ao carregar esse arquivo, receberia a descrição do cômodo. Quando alguém digitasse `ler`, chamaria a função correspondente, passando uma representação limitada do visitante. ### Primeira versão viável Três salas, navegação local, objetos examináveis e um livro de visitas. Depois viriam sessões simultâneas e conversa entre visitantes. Separar essas etapas permite testar o prazer de explorar o lugar antes de lidar com a complexidade de um servidor multiplayer. ### Como poderia crescer Novos autores poderiam contribuir com ambientes; pequenas histórias poderiam se revelar durante a exploração. Um personagem programado em Lua poderia sugerir leituras ou propor enigmas. Isso exigiria um conjunto limitado de ações disponíveis aos scripts, sobretudo se outras pessoas passassem a escrevê-los. **Dificuldade estimada: média no protótipo local, alta no mundo público compartilhado.** É minha favorita para um projeto autoral: a programação vira também uma forma de escrever e construir um espaço. ## 6. Arquivista: um organizador de arquivos com regras compreensíveis ### O que ele faz Examina uma pasta e propõe uma organização baseada em regras. Pode separar documentos, agrupar fotografias por data e padronizar nomes. Antes de alterar qualquer coisa, mostra o caminho atual e o destino proposto de cada arquivo. A característica central seria a explicação: cada proposta informa qual regra foi aplicada. Você consegue entender por que uma foto iria para determinada pasta e corrigir a regra antes da execução. ### Como seria usar Você aponta o programa para uma pasta de downloads. Ele apresenta uma lista: PDFs para documentos, instaladores para programas e imagens para revisão. Você ajusta uma regra, gera a prévia novamente e só então manda aplicar. Para fotografias, uma etapa posterior poderia usar a data de captura dos metadados. Quando ela não existisse, o programa deveria informar a ausência e usar uma alternativa configurada, sem confundir silenciosamente a data de modificação com a data em que a foto foi tirada. ### Onde cada linguagem entra O Zig percorreria as pastas, verificaria conflitos de nomes, prepararia o plano e executaria as operações. O Lua expressaria as condições de organização. ```lua -- Exemplo de uma API que seria implementada no projeto. regra { nome = "Separar documentos PDF", quando = function(arquivo) return arquivo.extensao == ".pdf" end, destino = function(arquivo) return "Documentos/PDF/" .. arquivo.nome end } ``` Nesse desenho, Lua devolve o destino desejado. O núcleo valida o caminho e decide como executar a mudança. A regra não move o arquivo diretamente, o que permite usar a mesma lógica na prévia e na aplicação. ### Primeira versão viável Organização por extensão, prévia obrigatória, aplicação explícita e registro das operações. Arquivos existentes nunca seriam sobrescritos automaticamente. Um recurso de desfazer poderia vir depois, respeitando a possibilidade de arquivos terem sido modificados desde a organização. ### Como poderia crescer Detecção de duplicatas por conteúdo, extração de metadados e regras por projeto. A detecção poderia começar apenas sugerindo grupos de arquivos iguais, mantendo a decisão de exclusão com o usuário. **Dificuldade estimada: baixa a média para o escopo inicial.** É minha escolha para aprender a integração entre Zig e Lua com um resultado útil e fácil de conferir. ## 7. Planetário: um pequeno estúdio de arte generativa ### O que ele faz Abre uma janela onde scripts criam imagens em movimento: estrelas, partículas, ondas, padrões geométricos ou paisagens abstratas. Você modifica parâmetros e vê a composição mudar. Arte generativa, aqui, significa desenhar por meio de regras e matemática. Por exemplo, mil pontos podem representar estrelas; cada ponto recebe posição, brilho e velocidade. Uma regra determina como eles se movem quando o mouse se aproxima. ### Como seria usar Você carrega uma cena de céu noturno. Ajusta a densidade de estrelas, a cor de fundo e a intensidade do brilho. Salva uma composição de que gostou e cria uma segunda versão com movimentos mais lentos. O resultado poderia servir como experiência visual independente, estudo de animação ou material para capturar e usar em outros projetos. Exportação de vídeo exigiria uma etapa própria de captura e codificação. ### Onde cada linguagem entra O Zig integraria uma biblioteca gráfica e cuidaria da janela, da entrada do usuário e da renderização. Lua definiria a cena, os parâmetros e os comportamentos. Não seria necessário escrever um motor gráfico inteiro do zero. Para cenas maiores, o Zig poderia processar lotes de partículas, enquanto Lua apenas definiria as regras e os parâmetros. Chamar Lua separadamente para cada ponto em cada quadro pode se tornar um gargalo; a divisão precisa ser medida conforme a cena cresce. ### Primeira versão viável Uma janela, uma cena de estrelas, controles de cor e velocidade e um comando para recarregar o script. Depois entrariam captura de imagem, novos tipos de cena e transições. Se um script tivesse erro, o programa deveria exibir a mensagem e preservar a última cena válida quando possível. ### A escolha que torna o projeto viável Eu começaria com desenho em duas dimensões. Profundidade aparente, camadas e paralaxe já permitem um céu interessante. Navegação 3D, iluminação e efeitos mais complexos seriam expansões posteriores. **Dificuldade estimada: média, aumentando com as ambições gráficas.** É a melhor proposta para experimentar algo visual e aprender com resultados imediatos na tela. ## Comparação para escolher o primeiro As avaliações abaixo são julgamentos de projeto, considerando as primeiras versões descritas, não benchmarks ou prazos de entrega. | Projeto | Principal resultado | Maior desafio | Quando eu escolheria | | --- | --- | --- | --- | | Estação | Uma comunidade de terminal | Sessões, permissões e moderação | Para reunir pessoas e conversas | | Gabinete | Um acervo pessoal pesquisável | Tornar o cadastro simples | Para organizar referências e publicar seleções | | Oficina | Sites feitos a partir de arquivos | Processamento e organização do conteúdo | Para explorar seu próprio sistema de publicação | | Vigia | Visibilidade sobre seus serviços | Coleta confiável entre máquinas | Para resolver uma necessidade do homelab | | Casa da Meia-Noite | Um espaço autoral explorável | Evoluir para vários visitantes simultâneos | Para criar algo excêntrico e social | | Arquivista | Organização de arquivos por regras | Evitar perdas e explicar as operações | Para começar com um escopo pequeno e útil | | Planetário | Arte programável em movimento | Renderização e fluidez | Para experimentar design e animação | ## Como começar sem transformar a ideia em um projeto interminável Escolha apenas um deles. Defina uma operação que demonstre a proposta inteira: organizar uma pasta em modo de prévia, entrar em uma sala ou desenhar uma cena. Implemente essa operação com Zig carregando um único script Lua. Esse primeiro passo já ensina a parte central da integração: como o Zig fornece funções ao Lua, como Lua devolve dados e como erros atravessam essa fronteira. Depois, acrescente persistência ou interface conforme o projeto precisar. Um sistema de plugins sofisticado pode esperar até existirem dois ou três usos reais que justifiquem sua estrutura. Para as primeiras versões, os scripts seriam seus e instalados por você. Executar scripts enviados por visitantes muda o problema: seria necessário limitar recursos e acesso ao sistema. Lua embutida não deve ser tratada automaticamente como um ambiente seguro para código de terceiros. Também convém escolher e registrar as versões das ferramentas no início da implementação. Os exemplos deste documento são conceituais; não prometem compatibilidade com uma versão específica do compilador ou com bibliotecas ainda não escolhidas. Minha recomendação tem duas opções claras: **Arquivista para aprender construindo algo útil; Casa da Meia-Noite para investir em uma criação pessoal mais ambiciosa.** O primeiro oferece um começo controlado. O segundo permite reunir escrita, programação e convivência em um lugar que você vai querer continuar inventando.