{"id":51523473,"url":"https://github.com/xonoxc/task-tracker","last_synced_at":"2026-07-08T18:02:11.793Z","repository":{"id":367901822,"uuid":"1282747982","full_name":"xonoxc/task-tracker","owner":"xonoxc","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-28T07:19:33.000Z","size":90,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T08:15:24.284Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xonoxc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-28T06:37:20.000Z","updated_at":"2026-06-28T07:19:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/xonoxc/task-tracker","commit_stats":null,"previous_names":["xonoxc/task-tracker"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/xonoxc/task-tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xonoxc%2Ftask-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xonoxc%2Ftask-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xonoxc%2Ftask-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xonoxc%2Ftask-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xonoxc","download_url":"https://codeload.github.com/xonoxc/task-tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xonoxc%2Ftask-tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35273524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-08T18:02:10.318Z","updated_at":"2026-07-08T18:02:11.784Z","avatar_url":"https://github.com/xonoxc.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Task Tracker\n\nFull-stack task management application.\n\n## Tech Stack\n\n- **Frontend:** React 19, TypeScript, Vite, Tailwind CSS 4\n- **Backend:** Node.js, Express 5, TypeScript, Mongoose, Zod, neverthrow\n- **Database:** MongoDB 7\n- **Package Manager:** Bun\n\n## Architecture\n\n### Backend\n\nLayered architecture following a strict data flow:\n\n```\nClient -\u003e Router -\u003e Handler -\u003e Service -\u003e Repository -\u003e Database\n```\n\n- **Router** maps HTTP endpoints to handlers and attaches validation middleware\n- **Handler** extracts request data, calls the service layer, formats the HTTP response\n- **Service** contains business logic, orchestrates repository calls\n- **Repository** abstracts database access with Mongoose\n- All layers communicate via `neverthrow` `Result` types — no try-catch blocks\n\n### Frontend\n\n- **React 19** with TypeScript\n- **@tanstack/react-query** for server state (queries, mutations, cache invalidation)\n- **Zustand** for client-only UI state (filters, notifications, modal state)\n- Reusable UI primitives under `components/ui/`\n- Feature components under `components/task/`\n\n## Project Structure\n\n```\ntask-tracker/\n├── docker-compose.yml\n├── backend/\n│   ├── Dockerfile\n│   └── src/\n│       ├── index.ts              # Express app entry\n│       ├── config/               # env, db, logger\n│       ├── errors/               # AppError classes\n│       ├── models/               # Mongoose schemas\n│       ├── repositories/         # Data access (interface + class)\n│       ├── services/             # Business logic (interface + class)\n│       ├── handlers/             # HTTP request handlers (class)\n│       ├── routes/               # Express router definitions\n│       ├── schemas/              # Zod validation schemas\n│       ├── middleware/            # validate, error-handler, request-id, request-logger\n│       └── types/                # Shared types\n└── frontend/\n    ├── Dockerfile\n    └── src/\n        ├── main.tsx / App.tsx\n        ├── config/               # API base URL\n        ├── types/                # Task types\n        ├── lib/                  # Typed API client\n        ├── store/                # Zustand UI store\n        ├── hooks/                # React-query hooks\n        ├── components/\n        │   ├── ui/               # Button, Input, Select, Modal, Badge, Toast\n        │   ├── task/             # TaskCard, TaskList, TaskForm, TaskFilter\n        │   └── layout/           # Header, Container\n        └── pages/                # Home\n```\n\n## API Endpoints\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | `/api/tasks` | List all tasks (supports `?status=`, `?priority=`, `?search=`) |\n| GET | `/api/tasks/:id` | Get a single task |\n| POST | `/api/tasks` | Create a task |\n| PUT | `/api/tasks/:id` | Update a task |\n| DELETE | `/api/tasks/:id` | Delete a task |\n\nError responses follow `{ error: { code, message, details? } }`.\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 22+\n- Bun\n- MongoDB (local or remote)\n\n### Local Development\n\n```bash\n# Backend\ncd backend\ncp .env.example .env\nbun install\nbun run dev\n\n# Frontend\ncd frontend\nbun install\nbun run dev\n```\n\nThe frontend runs on port 5173, the backend on port 3000.\n\n### Docker\n\n```bash\ndocker compose up --build\n```\n\nStarts MongoDB 7, the backend on port 3000, and the frontend on port 5173.\n\n### Testing\n\n```bash\ncd backend\nbun test          # vitest\nbun test:coverage # with coverage report\n```\n\n## Deployment\n\nThe backend is deployed on Render's free tier. Render free services spin down after 15 minutes of inactivity — the first request after idle time may take **20-40 seconds** to spin back up. This is expected behavior on the free tier.\n\nThe project is containerized. Each service has its own Dockerfile for independent deployment:\n\n- **Backend:** Deploy to Fly.io, Railway, Koyeb, or any container platform\n- **Frontend:** Deploy to Vercel, Netlify, or serve from the Docker image\n- **Database:** MongoDB Atlas offers a free 512MB tier\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxonoxc%2Ftask-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxonoxc%2Ftask-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxonoxc%2Ftask-tracker/lists"}