Open Source · Rede Local · Sem Nuvem

Gestão de tarefas
para sua equipe,
no seu servidor.

TaskFlow Corporate é um sistema completo de gerenciamento de tarefas em tempo real para equipes que trabalham no mesmo escritório ou rede local. Sem mensalidade, sem dados na nuvem.

0
Dependências externas
Usuários simultâneos
100%
Local & privado
2
Comandos para subir

Interface do sistema

http://192.168.1.100:3000
Dashboard
Todas as tarefas
Minhas tarefas
Kanban Board
Equipe
AD
Administrador
Tarefas recentes
Redesign do dashboard de relatórios Média Em progresso
Migração do banco para PostgreSQL Alta Pendente
Documentar API de autenticação Baixa Concluída
Análise de métricas Q1 2026 Alta Pendente
Setup do ambiente de staging Média Em progresso
Funcionalidades

Tudo que sua equipe
precisa, sem o supérfluo.

Desenvolvido pensando em pequenas e médias equipes que valorizam simplicidade, velocidade e privacidade de dados.

Tempo real com Socket.io
Alterações feitas por qualquer membro da equipe aparecem instantaneamente para todos os usuários conectados, sem precisar atualizar a página.
Kanban com arrastar e soltar
Board visual com colunas de Pendente, Em Progresso e Concluída. Arraste os cards entre as colunas e o status é atualizado para toda a equipe.
👥
Presença em tempo real
Veja quem está online agora e qual tarefa cada colega está editando neste momento — indicador visual ao vivo na sidebar.
💬
Comentários com @menções
Comente em tarefas e mencione colegas com @nome para notificá-los. Autocomplete integrado facilita encontrar os membros da equipe.
🔒
Autenticação com bcrypt
Login com email e senha. Senhas são armazenadas como hash bcrypt — nunca em texto puro. Tokens de sessão validam cada operação no servidor.
📋
Histórico completo
Cada tarefa registra todas as ações realizadas: quem criou, quem iniciou, quem concluiu, quem comentou — com timestamps precisos.
Tecnologias

Stack simples,
escolhas deliberadas.

Cada tecnologia foi escolhida por ter exatamente o que o sistema precisa — sem overhead, sem dependências desnecessárias.

Node.js LTS
Servidor HTTP e WebSocket. Roda o server.js e serve os arquivos estáticos para toda a rede local.
Back-end
Express 4.18
Framework HTTP minimalista. Gerencia as rotas de API (/api/login, /api/users) e serve o index.html.
Back-end
Socket.io 4.7
Comunicação bidirecional em tempo real. Propaga criação e edição de tarefas, presença online e edições ativas para todos os clientes.
Tempo real
bcrypt 5.1
Hash seguro de senhas com salt aleatório. Custo computacional configurável torna ataques de força bruta impraticáveis.
Segurança
HTML + CSS + JS puro
Interface completa sem frameworks. Todo o front-end está em um único index.html — sem build, sem bundler, sem dependências de cliente.
Front-end
JSON no disco
Persistência via tasks.json e users.json. Zero configuração de banco de dados. Backup é copiar dois arquivos.
Persistência
Arquitetura

Um servidor,
toda a rede.

Apenas um computador precisa ter o Node.js instalado. Os outros acessam pelo navegador, como qualquer site.

Fluxo de dados
💻
Computador Host
node server.js — porta 3000
Socket.io · HTTP
🖥
PC A
192.168.x.x:3000
🖥
PC B
192.168.x.x:3000
tasks.json · users.json
💾
Disco local
Persistência em JSON
Login via HTTP
O cliente envia email + senha via POST /api/login. O servidor valida com bcrypt e devolve um token de sessão.
Conexão Socket.io
Com o token em mãos, o cliente emite o evento join. O servidor valida o token antes de aceitar a conexão.
Estado inicial
O servidor responde com init — todas as tarefas, usuários, quem está online e quem está editando.
Sincronização em tempo real
Qualquer alteração (nova tarefa, status, comentário) é emitida para todos os clientes conectados via Socket.io broadcast.
Persistência automática
Após cada alteração, o servidor grava os arquivos tasks.json e users.json — dados nunca se perdem.
Como funciona

O código por trás
de cada funcionalidade.

Trechos reais do sistema explicados em detalhe — para quem quer entender ou contribuir.

server.js — rota POST /api/login JavaScript · Node.js
// Rota de login: recebe email + senha, valida e devolve token
app.post("/api/login", async (req, res) => {
  const { email, password } = req.body;

  // 1. Busca o usuário pelo email no array em memória
  const user = users.find(u =>
    u.email.toLowerCase() === email.trim().toLowerCase()
  );
  if (!user) return res.status(401).json({ error: "Email não encontrado" });

  // 2. Compara a senha com o hash salvo — bcrypt.compare é assíncrono
  //    e leva ~100ms intencionalmente para dificultar força bruta
  const ok = await bcrypt.compare(password, user.passwordHash);
  if (!ok) return res.status(401).json({ error: "Senha incorreta" });

  // 3. Gera um token aleatório de 256 bits e salva na memória
  const token = createSession(user.id);

  // 4. Devolve o token + dados públicos (sem o hash da senha)
  res.json({ ok: true, token, user: publicUser(user) });
});

Por que bcrypt? Diferente de MD5 ou SHA-256, o bcrypt foi projetado para ser lento — o custo computacional (BCRYPT_ROUNDS = 10) garante ~100ms por verificação, tornando ataques de dicionário inviáveis. O salt aleatório embutido garante que dois usuários com a mesma senha tenham hashes diferentes. A senha original nunca é armazenada — apenas o hash.

server.js — propagação de tarefas em tempo real JavaScript · Socket.io
// Quando um usuário cria uma tarefa, o servidor:
// 1. Valida a sessão  2. Salva  3. Propaga para todos
socket.on("task_create", (task) => {
  // Só aceita se o socket tiver sessão válida
  if (!authSocket(socket.id)) return;

  tasks.unshift(task);  // adiciona no topo da lista
  saveTasks();         // persiste no disco imediatamente

  // broadcast: envia para TODOS exceto o criador
  socket.broadcast.emit("task_created", task);
});

// No cliente (index.html), qualquer usuário recebe e atualiza a UI:
socket.on("task_created", (task) => {
  TASKS.unshift(task);     // atualiza o array local
  renderContent();       // re-renderiza a tela instantaneamente
  pushNotif(`Nova tarefa: ${task.title}`, "+");
});

socket.broadcast.emit vs io.emit: socket.broadcast.emit envia para todos exceto o remetente — o criador já atualizou sua UI localmente. io.emit envia para todos incluindo o remetente — usado em atualizações de presença, onde todos precisam da lista completa. O resultado é latência zero na visualização para quem criou e sincronização automática para o restante da equipe.

server.js — carga e salvamento de dados em JSON JavaScript · Node.js fs
const TASKS_FILE = path.join(__dirname, "tasks.json");
const USERS_FILE = path.join(__dirname, "users.json");

// Carrega tarefas do disco na inicialização do servidor
function loadTasks() {
  try {
    if (fs.existsSync(TASKS_FILE))
      return JSON.parse(fs.readFileSync(TASKS_FILE, "utf8"));
  } catch(e) { console.error("Erro ao carregar tasks.json:", e.message); }
  return []; // retorna vazio se arquivo não existir
}

// Salva no disco após cada alteração — síncrono para garantir consistência
function saveTasks() {
  try {
    fs.writeFileSync(
      TASKS_FILE,
      JSON.stringify(tasks, null, 2), // indentado para legibilidade
      "utf8"
    );
  } catch(e) { console.error("Erro ao salvar tasks.json:", e.message); }
}

// Estado em memória — carregado uma vez, mantido sincronizado
let tasks = loadTasks();
let users = loadUsers();

Por que JSON em vez de banco de dados? Para equipes de até ~50 pessoas e centenas de tarefas, a diferença de performance é imperceptível. A vantagem é enorme: zero configuração, backup com dois arquivos, legibilidade humana, e sem servidor separado. O estado fica inteiramente em memória durante a execução — leitura é instantânea. A escrita síncrona (writeFileSync) garante que nenhuma alteração se perde se o servidor reiniciar.

server.js — sistema de tokens de sessão JavaScript · crypto
// Map em memória: token (hex 64 chars) → { userId }
const sessions = new Map();

// Cria sessão com token criptograficamente seguro
function createSession(userId) {
  // crypto.randomBytes(32) = 256 bits de entropia — impossível de adivinhar
  const token = crypto.randomBytes(32).toString("hex");
  sessions.set(token, { userId });
  return token;
}

// Valida token e retorna o usuário correspondente (ou null)
function getSessionUser(token) {
  if (!token) return null;
  const sess = sessions.get(token);
  if (!sess) return null;
  return users.find(u => u.id === sess.userId) || null;
}

// O evento "join" do Socket.io valida o token ANTES de aceitar
socket.on("join", (data) => {
  const sessionUser = getSessionUser(data.token);
  if (!sessionUser || sessionUser.id !== data.userId) {
    socket.emit("auth_error", { error: "Sessão inválida" });
    return; // rejeita a conexão
  }
  // ✓ Token válido — registra o socket e envia o estado inicial
  connectedUsers.set(socket.id, { ...data });
  socket.emit("init", { tasks, users: publicUsers(), ... });
});

Por que tokens em vez de apenas verificar o userId? Sem token, qualquer pessoa poderia abrir o console do navegador e emitir socket.emit("join", {"{"} userId: "u1" {"}"}) se passando pelo admin. O token de 256 bits gerado com crypto.randomBytes é computacionalmente impossível de forjar — e é invalidado automaticamente quando o servidor reinicia ou o usuário faz logout.

Instalação

Rodando em
dois comandos.

Qualquer pessoa com Node.js consegue subir o servidor em menos de 2 minutos.

1
Instale o Node.js
Baixe e instale o Node.js LTS em nodejs.org. Apenas o computador que vai ser o servidor precisa do Node.js.
2
Navegue até a pasta do projeto
Abra o Prompt de Comando (Win+R → cmd) e navegue até onde extraiu os arquivos.
cd C:\caminho\para\taskflow
3
Instale as dependências
Baixa Express, Socket.io e bcrypt automaticamente. Só precisa fazer uma vez.
npm install
4
Inicie o servidor
O servidor sobe na porta 3000 e fica disponível para toda a rede local.
node server.js
5
Acesse e compartilhe
Abra http://localhost:3000 no seu navegador. Para compartilhar com a equipe, descubra o IP com ipconfig e envie o link http://SEU_IP:3000 para os colegas. O login padrão do admin é admin@corp.com / admin123.
Para quem é

Feito para equipes
que valorizam simplicidade.

🏢
Pequenas empresas
Equipes de 2 a 50 pessoas que trabalham no mesmo escritório e querem coordenar tarefas sem pagar por ferramentas como Jira ou Asana.
Sem mensalidade Dados internos Fácil de usar
💡
Estudantes de programação
Código bem comentado com Node.js, Socket.io, bcrypt e JavaScript puro — uma aplicação completa para estudar arquitetura cliente-servidor.
Código aberto Bem comentado Stack real
🔧
Desenvolvedores
Base sólida para customizar: adicione novos campos, integre com ferramentas internas, troque JSON por banco de dados real quando precisar escalar.
Extensível Sem framework Fácil de modificar

Sua equipe merece
uma ferramenta simples.

Gratuito, privado, sem cadastro, sem nuvem. Só você e sua equipe.

100% gratuito
Código aberto
Seus dados ficam com você
Sem cadastro externo