Aplicação web para registro e acompanhamento de tarefas, com autenticação JWT e banco PostgreSQL gerenciado (Supabase) — ou SQLite para desenvolvimento local.
- Cadastro, login (JWT) e alteração de senha autenticada
- CRUD de tarefas: título, descrição, prioridade, categoria, status e prazo
- Concluir / reabrir tarefas
- Filtros por status, prioridade e categoria; busca por título; ordenação por prazo, prioridade, status, título ou data
- Dashboard com indicadores: total, pendentes, em andamento, concluídas, atrasadas e taxa de conclusão
- Tema claro/escuro, responsivo a partir de 360px, datas/horas em formato brasileiro (pt-BR, fuso America/Sao_Paulo)
- Backend: Python 3.12+, FastAPI, SQLAlchemy 2 (async), Alembic, JWT (pyjwt), bcrypt, slowapi (rate limit)
- Frontend: React 18, Vite, TypeScript, Tailwind CSS 4, React Router
- Banco: SQLite (dev, via
aiosqlite) ou PostgreSQL (produção/Supabase, viaasyncpg)
- Python 3.12+
- Node.js 22+
- (Opcional) Docker e Docker Compose
| Variável | Descrição | Padrão |
|---|---|---|
DATABASE_URL |
URL do banco. SQLite local ou postgresql+asyncpg:// (Supabase). Sem a variável, o app usa SQLite em storage/app.db na raiz do projeto |
sqlite+aiosqlite:///…/storage/app.db |
JWT_SECRET |
Chave de assinatura dos tokens — obrigatória | — |
JWT_ALGORITHM |
Algoritmo de assinatura | HS256 |
JWT_EXPIRY |
Expiração do token em segundos | 3600 |
CORS_ORIGINS |
Origens permitidas, separadas por vírgula | http://localhost:8080,http://localhost:5173 |
STORAGE_PATH |
Pasta de dados de runtime | ./storage |
RATE_LIMIT_LOGIN / RATE_LIMIT_REGISTER / RATE_LIMIT_PASSWORD |
Limites anti-abuso | 10/minute, 5/minute, 5/minute |
| Variável | Descrição | Padrão |
|---|---|---|
VITE_API_BASE_URL |
URL base da API, incluindo o prefixo /api |
http://localhost:8000/api |
Segurança: nunca coloque segredos (chaves, senhas,
JWT_SECRET, connection strings) em variáveisVITE_*nem no código do frontend. O frontend se comunica exclusivamente com o backend via REST.
cp backend/.env.example backend/.env
# edite backend/.env e defina um JWT_SECRET forte
docker compose up --build- Frontend: http://localhost:8080
- Backend/API: http://localhost:8000/api (health: http://localhost:8000/api/health)
O compose cria a pasta storage/ no host como bind mount, executa as migrações Alembic no boot do backend e só sobe o frontend após o healthcheck da API.
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # edite e defina JWT_SECRET
alembic upgrade head
uvicorn src.main:app --reload --port 8000cd frontend
npm install
cp .env.example .env
npm run devFrontend de desenvolvimento: http://localhost:5173
cd backend
python -m pytest- Crie o projeto no Supabase e copie a connection string.
- No
backend/.env, definaDATABASE_URL=postgresql+asyncpg://usuario:senha@host:5432/postgres. - Execute
alembic upgrade headpara criar as tabelas no banco remoto.
O Supabase é usado apenas como PostgreSQL gerenciado: o frontend nunca se conecta a ele e nenhum SDK/anon key é utilizado. Toda comunicação passa pelo backend.
backend/
alembic/ # migrações de banco
src/
api/ # rotas FastAPI (health, auth, tasks)
application/ # schemas e serviços (casos de uso)
core/ # configuração e segurança
domain/ # entidades e regras de negócio
infrastructure/ # banco, modelos e repositórios
frontend/
src/
components/ # modais, sidebar, formulários
pages/ # login, cadastro, dashboard, tarefas, configurações
services/ # cliente REST (api, auth, tasks)
hooks/ # AuthContext, tema
storage/ # dados de runtime (banco local) — não edite manualmente