{"id":30732771,"url":"https://github.com/ashedfox/erremor-task-manager","last_synced_at":"2026-04-15T10:34:41.939Z","repository":{"id":311177407,"uuid":"1042761085","full_name":"AshedFox/erremor-task-manager","owner":"AshedFox","description":"Task manager built with Next.js and NestJS","archived":false,"fork":false,"pushed_at":"2025-08-30T11:32:45.000Z","size":449,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-30T13:21:15.557Z","etag":null,"topics":["javascript","jwt","jwt-authorization","nestjs","nextjs","react","rest-api","shadcn-ui","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"","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/AshedFox.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}},"created_at":"2025-08-22T14:30:34.000Z","updated_at":"2025-08-30T11:32:48.000Z","dependencies_parsed_at":"2025-08-22T16:50:30.353Z","dependency_job_id":"86f2ba44-accc-4c0d-8d62-e615cdc7fb66","html_url":"https://github.com/AshedFox/erremor-task-manager","commit_stats":null,"previous_names":["ashedfox/erremor-task-manager"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AshedFox/erremor-task-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AshedFox%2Ferremor-task-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AshedFox%2Ferremor-task-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AshedFox%2Ferremor-task-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AshedFox%2Ferremor-task-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AshedFox","download_url":"https://codeload.github.com/AshedFox/erremor-task-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AshedFox%2Ferremor-task-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273485243,"owners_count":25114125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"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":["javascript","jwt","jwt-authorization","nestjs","nextjs","react","rest-api","shadcn-ui","tailwindcss","typescript"],"created_at":"2025-09-03T17:50:47.295Z","updated_at":"2026-04-15T10:34:41.931Z","avatar_url":"https://github.com/AshedFox.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://nextjs.org\"\u003e\n    \u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/95b669a7-0b25-4380-8b6d-d4c1411e88cc\"\u003e\n      \u003cimg alt=\"Erremor logo\" src=\"https://github.com/user-attachments/assets/95b669a7-0b25-4380-8b6d-d4c1411e88cc\" height=\"128\"\u003e\n    \u003c/picture\u003e\n  \u003c/a\u003e\n  \u003ch1\u003eErremore Task Manager\u003c/h1\u003e\n\u003c/div\u003e\n\n![Last Commit](https://img.shields.io/github/last-commit/AshedFox/erremor-task-manager?logo=github\u0026logoColor=white)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n\n## Description\n\nBuilt with Next.js and NestJS. This application combines scalable architecture, secure auth, comfortable UX/UI, and good performance.\n\nErremor implements full task management cycle - from user registration to projects and tasks management. It supports collaboration in shared projects, multiple task views (kanban and list), advanced task content and many-many other. This task manager focuses on stability, UX/UI, and security: authentication via JWT tokens with refresh tokens stored in Redis, email verification, HTTP-only cookies, data validation.\n\nThe client side uses server components, streaming, virtualization, optimized data fetching, making sure that there is good responsiveness as well as seamless user expirience. Thanks to application modular architecture and monorepo setup, Erremore is easy to extend and integrate with external systems.\n\n## Tech Stack\n\n| Layer         | Key technologies                                                       |\n|---------------|------------------------------------------------------------------------|\n| Frontend      | Next.js 15, React 19, TypeScript, tanstack-query, zod, react-hook-form |\n| UI            | shadcn/ui, TailwindCSS                                                 |\n| Backend       | NestJS, Prisma, PostgreSQL, Redis, BullMQ, nodemailer                  |\n| Auth          | JWT, Argon2, Redis                                                     |\n| Storage       | S3-compatible (MinIO)                                                  |\n\n\n## Project Structure\n\n```bash\napps/\n  web/                  # Next.js frontend\n  api/                  # NestJS backend\npackages/\n  ui/                   # Shared UI components\n  eslint-config/        # Shared eslint configs\n  typescript-confing    # Shared typescript configs\n```\n\n## Features\n\n- User registration with email verification.\n- User login with JWT tokens (access and refresh tokens (in Redis)), background tokens refresh when access token expired.\n- Secure password hashing (argon2), http-only cookies, auth guard.\n- Password reset with token or old password (only api for now).\n- User profiles with avatar, birth date and display name change.\n- Username generation with predefined set of nouns, adjectives and random string.\n- Projects with basic CRUD operations and search (with sort, filters and includes) for them.\n- Recent projects tracking (based on when last viewed by user).\n- Shared projects with different users participation (support different participant roles with different rights and roles checks).\n- Participants management: invite (email or in-app), kick, ban, leave.\n- Files upload with presigned urls to s3-compatible storage, different file types, unused files cleanup.\n- Tasks with different priorities, statuses, tags and other information. Basic CRUD operations and search (filters, sort, includes) for them.\n- Two tasks view modes: kanban (grouped by task status, with drag-and-drop support) and list, has pagination and infinite scroll.\n- Task attachments of different types with special UI for each.\n- User-friendly forms and requests validation and success and error messages (with toast notifications).\n- Performance optimizations with server components, virtual lists, debounce.\n- Better UX with initial data prefetching (e.g. first page of tasks), streaming and smooth UI updates.\n- Support different color modes (light, dark and system).\n\n## TODO\n\n- [ ] Password reset (client-side).\n- [ ] Notification system (in-app, email).\n- [ ] User preferences to configure future notifications, possible invitations and so on.\n- [ ] Checklist in tasks.\n- [ ] Assign task to participant.\n- [ ] Relations between tasks (e.g. \"Task A\" depends on \"Task B\" or vice versa).\n- [ ] Tasks calendar.\n- [ ] Analytics.\n\n## Usage\n\n- Install dependencies:\n\n```bash\npnpm install\n```\n\n- Run (dev):\n\n```bash\npnpm run dev\n```\n\n- Build:\n\n```bash\npnpm run build\n```\n\n- Lint:\n\n```bash\npnpm run lint\n```\n\n## Gallery\n\n#### Profile page\n\n\u003cimg alt=\"profile\" src=\"https://github.com/user-attachments/assets/13359e6c-25b9-4700-aaaf-21fb88f0a9e4\" /\u003e\n\n#### Projects page\n\n\u003cimg alt=\"projects\" src=\"https://github.com/user-attachments/assets/02fe5fe7-6859-46c4-a8ca-577950905510\" /\u003e\n\n#### Create project dialog\n\n\u003cimg alt=\"projects_create\" src=\"https://github.com/user-attachments/assets/c0ab9509-655e-4dfc-9459-7421de7d8225\" /\u003e\n\n#### Project page (kanban view mode)\n\n\u003cimg alt=\"project_viewMode_kanban\" src=\"https://github.com/user-attachments/assets/bc274dd4-6ba9-4e4f-9be8-26db736837b4\" /\u003e\n\n#### Project page (list view mode)\n\n\u003cimg alt=\"project_viewMode_list\" src=\"https://github.com/user-attachments/assets/b51dac2c-fa7b-406c-9146-1312c7a53245\" /\u003e\n\n#### Task page\n\n\u003cimg alt=\"project_task\" src=\"https://github.com/user-attachments/assets/a2153426-8591-42a1-aabe-70163888476b\" /\u003e\n\n#### Task dialog\n\n\u003cimg alt=\"project_task_dialog\"  src=\"https://github.com/user-attachments/assets/7ea14154-9964-4a74-a932-d6d12bf341f5\" /\u003e\n\n#### Task edit page\n\n\u003cimg alt=\"project_task_edit\" src=\"https://github.com/user-attachments/assets/87bef960-0eb0-4318-b71f-f00a7073d643\" /\u003e\n\n#### Task edit dialog\n\n\u003cimg alt=\"project_task_edit_dialog\" src=\"https://github.com/user-attachments/assets/70fe9d4c-3320-430e-9147-9292ebbd4e81\" /\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fashedfox%2Ferremor-task-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fashedfox%2Ferremor-task-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fashedfox%2Ferremor-task-manager/lists"}