DailyForge is an open-source fullstack MERN productivity app that lets you design, manage, and visualize your weekly routines β with drag-and-drop scheduling, a smart task library, and overlap protection built right in.
π Live Demo Β· β‘ Quick Start Β· π€ Contribute Β· πΈ Screenshots
- π Project Overview
- π Live Demo
- β¨ Features
- π Tech Stack
- π Project Structure
- β‘ Quick Start
- π Environment Variables
- π Google Authentication Setup
- β FAQ
- π Troubleshooting
- π€ Contribution Guidelines
- π· Issue Guidelines
- πΈ Screenshots
- π¬ Getting Help
- π¬ Contact & Community
Most productivity tools are either too bloated or too simple. DailyForge is a no-nonsense weekly planner that gives you total control over your schedule β built by students, for students and professionals alike.
What it does:
- Build a reusable task library with custom durations, colors, and categories
- Design weekly routines by dragging tasks into a visual time grid
- Save, update, and delete routines with one click
- Automatically detects and prevents scheduling conflicts for the same day
Why it matters:
Most people don't fail to plan β they fail to stick to a plan. DailyForge makes routines feel visual and deliberate, making habits easier to build and track.
Key highlights:
- β‘ Drag-and-drop weekly planner powered by
@dnd-kit - π Secure JWT authentication with bcrypt password hashing
- ποΈ Reusable routine templates to clone and reuse schedules
- π« Conflict detection β no overlapping tasks on the same day
- π± Clean, responsive UI built with React 19 + Tailwind CSS v4
| Service | URL |
|---|---|
| π₯οΈ Frontend | https://dailyforge-frontend-lhjq.onrender.com |
| βοΈ Backend API | https://dailyforge-backend.onrender.com |
β οΈ Deployed on Render's free tier β first load may take 30β60 seconds to spin up.
- Signup / Login with JWT-based session management
- Protected routes β unauthenticated users are redirected to login
- Passwords hashed with bcrypt
- Create tasks with: title, duration, color, and category
- Edit and delete tasks from your personal task library
- Tasks persist across sessions
- Drag tasks from your library onto a 7-day weekly grid
- Time-slot-based placement with visual feedback
- Overlap detection prevents conflicting task placement on the same day
-
Interactive Contribution Heatmap: A premium, GitHub-style 371-day productivity calendar that tracks consistency with stunning teal and glowing mint aesthetics.
-
4-Level Visual Scale: Cell intensities map to completed counts (1 task
$\rightarrow$ low, 2 tasks$\rightarrow$ medium, 3+ tasks$\rightarrow$ perfect glowing mint). - Streak & Productivity Tracking: Real-time calculations of current streaks, longest streaks, total productive days, and average day-wise completion rate.
-
Completing Date-Matching: Tracks contributions using the actual task completion timestamp (
completedAt), fully timezone-robust to your local browser. - Micro-Animations & Smart Tooltips: Staggered cell entry animations and edge-aware floating tooltips that slide horizontally to prevent bounding box clipping.
- Upcoming Days Protection: Future dates automatically render as hidden, transparent slots until they arrive.
-
4-Level Visual Scale: Cell intensities map to completed counts (1 task
- View all saved routines at a glance
- Quick access to edit or delete any routine
- Summary stats for your weekly schedule and completion progress
- Save any routine as a reusable template
- Re-apply templates to any week in seconds
| Technology | Purpose |
|---|---|
| React 19 | UI framework |
| Vite | Build tool & dev server |
| Tailwind CSS v4 | Utility-first styling |
@dnd-kit/core |
Drag-and-drop interactions |
| Axios | HTTP client for API calls |
| React Router DOM v7 | Client-side routing |
| Lucide React | Icon library |
| Context API | Global auth state management |
| Firebase Client | Google Sign-In authentication integration |
| Technology | Purpose |
|---|---|
| Node.js | Runtime environment |
| Express.js v5 | REST API framework |
| MongoDB Atlas | Cloud database |
| Mongoose v9 | ODM for MongoDB |
| JSON Web Token (JWT) | Stateless authentication |
| Bcrypt | Password hashing |
| Firebase token verification | RS256 Google ID token signature verification |
| dotenv | Environment variable management |
| Nodemon | Dev server with hot-reload |
DailyForge/
β
βββ backend/
β βββ config/ # DB connection config
β βββ controllers/
β β βββ authController.js # Signup, login logic
β β βββ routineController.js
β β βββ taskController.js
β βββ middlewares/
β β βββ authMiddleware.js # JWT verification
β βββ routes/
β β βββ authRoutes.js
β β βββ routineRoutes.js
β β βββ taskRoutes.js
β βββ src/
β β βββ models/ # Mongoose schemas
β β β βββ User.model.js
β β β βββ Task.model.js
β β β βββ Routine.model.js
β β βββ server.js # Express app entry point
β βββ .env # β You create this (see below)
β βββ package.json
β
βββ frontend/
βββ public/
βββ src/
β βββ api/
β β βββ axiosConfig.js # Axios base URL config
β βββ components/
β β βββ Dashboard/
β β βββ Routine/
β β βββ Task/
β β βββ Navbar.jsx
β β βββ ProtectedRoutes.jsx
β βββ context/
β β βββ AuthContext.jsx
β βββ hooks/
β β βββ useTasks.js
β βββ pages/
β β βββ Dashboard.jsx
β β βββ RoutineBuilder.jsx
β β βββ Tasks.jsx
β β βββ Login.jsx
β β βββ Signup.jsx
β βββ utils/
β βββ App.jsx
β βββ main.jsx
βββ index.html
βββ vite.config.js
βββ package.json
π Project Setup Flow
Understanding the application flow makes it much easier for new contributors to navigate the codebase, debug issues, and add new features. The diagram below illustrates how a request travels through the application.
π High-Level Architecture
flowchart LR A["π€ User"] --> B["βοΈ React Frontend"] B --> C["π Axios API Requests"] C --> D["π Express.js Backend"] D --> E["π§© Controllers"] E --> F["π¦ Mongoose Models"] F --> G["π MongoDB Atlas"] G --> H["π€ JSON Response"] H --> I["π React State Update"] I --> J["π₯οΈ Updated UI"]
βοΈ Request Lifecycle
Step| Description π€ 1. User Interaction| The user creates, edits, deletes, or schedules a task from the React frontend. π 2. API Communication| Axios sends an HTTP request to the Express backend API. π 3. Route Handling| Express routes forward the request to the appropriate controller. π§© 4. Business Logic| Controllers validate input, apply business rules, and prepare database operations. π¦ 5. Database Layer| Mongoose communicates with MongoDB Atlas to store or retrieve application data. π€ 6. Server Response| The backend returns a JSON response containing the requested or updated data. π 7. UI Update| React updates the application state and refreshes the interface instantly.
π Developer Workflow
Fork Repository β βΌ Clone Repository β βΌ Install Dependencies β βΌ Configure Environment Variables β βΌ Start Backend Server β βΌ Start Frontend Server β βΌ Build β’ Test β’ Contribute π
π‘ Why This Diagram?
- π Helps first-time contributors understand the project architecture.
- π Provides a clear overview of the frontend β backend β database workflow.
- π οΈ Makes debugging and feature development easier.
- π€ Improves onboarding for GSSoC and open-source contributors.
- π Serves as a quick reference for the application's request lifecycle.
Prerequisites: Node.js v18+, npm v9+, a free MongoDB Atlas account
git clone https://github.com/aryandas2911/DailyForge.git
cd DailyForgecd backend
npm installCreate your .env file from the given template (see the Environment Variables section below):
# macOS / Linux
cp .env.example .env
# Windows (Command Prompt)
copy .env.example .env
# Windows (PowerShell)
Copy-Item .env.example .envThen fill in your values (see the next section for what each variable means).
β οΈ Local dev note: The backend CORS origin is already configured for both the deployed frontend (https://dailyforge-frontend-lhjq.onrender.com) and local development (http://localhost:5173) inbackend/src/server.js. No changes are needed for local development.
Start the backend dev server:
npm run devβ Server should start at
http://localhost:5000
Open a new terminal, then:
cd frontend
npm installπ‘ Local dev note: To point the frontend to your local backend, copy
frontend/.env.exampletofrontend/.envand ensureVITE_API_URLis set tohttp://localhost:5000/api.
Start the frontend dev server:
npm run devβ App should open at
http://localhost:5173
Open http://localhost:5173, sign up for an account, and start building your routines.
Copy the provided template to get started. Never commit the .env to git.
PORT=5000
MONGO_URI=your_mongodb_atlas_connection_string
JWT_SECRET=your_super_secret_key_here
#CLIENT_ORIGIN=your_deployed_frontend_url| Variable | Required | Description |
|---|---|---|
PORT |
β | Port on which the Express server runs (default: 5000) |
MONGO_URI |
β | Full MongoDB Atlas connection string β get it from your Atlas cluster's "Connect" menu |
JWT_SECRET |
β | Secret key for signing JWTs β use any long, random string (e.g., openssl rand -hex 32) |
CLIENT_ORIGIN |
β¬ | (Optional) Allowed CORS origin for API requests. Set this to your production frontend URL (e.g., https://dailyforge-frontend-lhjq.onrender.com). If not set, it defaults to http://localhost:5173 for local development. |
How to get MONGO_URI:
- Log into MongoDB Atlas
- Create a free M0 cluster (if you haven't)
- Click Connect β Connect your application β Copy the connection string
- Replace
<password>with your DB user's password
Copy the provided .env.example to a new file named .env.
| Variable | Required | Description |
|---|---|---|
VITE_API_URL |
β | Base URL for frontend API requests, usually http://localhost:5000/api in local development. |
VITE_FIREBASE_API_KEY |
β | Firebase client API key used by Firebase SDK for authentication. |
VITE_FIREBASE_AUTH_DOMAIN |
β | Firebase Auth domain for your project (e.g. your-project.firebaseapp.com). |
VITE_FIREBASE_PROJECT_ID |
β | Firebase project identifier used by the frontend and backend. |
VITE_FIREBASE_STORAGE_BUCKET |
β | Firebase storage bucket name for your project (even if storage is not used directly). |
VITE_FIREBASE_MESSAGING_SENDER_ID |
β | Firebase messaging sender ID required for client configuration. |
VITE_FIREBASE_APP_ID |
β | Firebase app ID for the registered web app. |
Running locally? Update VITE_API_URL in your local .env file to http://localhost:5000/api/.
Note: For Firebase credential values, see the existing Google Authentication Setup section below.
DailyForge supports Google Authentication via Firebase. Follow these steps to configure and enable Google Sign-In:
- Go to the Firebase Console and click Add project to create a new project.
- Once the project is created, click the Web icon (
</>) on the Project Overview page to register a new Web App. - Copy the
firebaseConfigobject containing the API key, app ID, etc. - Go to Build β Authentication in the left sidebar and click Get Started.
- Under the Sign-in method tab, click Add new provider and select Google.
- Enable the provider, configure your support email, and click Save.
To enable the frontend and backend integration, copy the configuration values into your respective .env files:
Append your Firebase client configuration to your local .env file:
# Firebase Client configuration
VITE_FIREBASE_API_KEY=your_api_key
VITE_FIREBASE_AUTH_DOMAIN=your_auth_domain
VITE_FIREBASE_PROJECT_ID=your_project_id
VITE_FIREBASE_STORAGE_BUCKET=your_storage_bucket
VITE_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id
VITE_FIREBASE_APP_ID=your_app_idAdd your Firebase Project ID to secure RS256 token verification:
# Firebase verification configuration
FIREBASE_PROJECT_ID=your_project_idBase URL: /api
JWT Authorization header:
Authorization: Bearer <token>| Method | Endpoint | Auth Required | Description |
|---|---|---|---|
| POST | /api/auth/signup |
No | Register a new user |
| POST | /api/auth/login |
No | Login with email and password |
| POST | /api/auth/google-login |
No | Login using Google authentication |
| GET | /api/auth/user |
Yes | Get the current authenticated user |
| PUT | /api/auth/update-profile |
Yes | Update the current user's profile |
| POST | /api/auth/logout |
Yes | Log out the current user |
| Method | Endpoint | Auth Required | Description |
|---|---|---|---|
| POST | /api/tasks |
Yes | Create a new task |
| GET | /api/tasks |
Yes | Get all tasks for the authenticated user |
| PUT | /api/tasks/:id |
Yes | Update a task by ID |
| DELETE | /api/tasks/:id |
Yes | Delete a task by ID |
| Method | Endpoint | Auth Required | Description |
|---|---|---|---|
| POST | /api/routines |
Yes | Create a new routine |
| GET | /api/routines |
Yes | Get all routines for the authenticated user |
| PUT | /api/routines/:id |
Yes | Update a routine by ID |
| DELETE | /api/routines/:id |
Yes | Delete a routine by ID |
| Method | Endpoint | Auth Required | Description |
|---|---|---|---|
| GET | /api/analytics |
Yes | Get analytics/statistics for the authenticated user |
This section shows how the frontend, API requests, backend, and database interact during common actions like creating a task or scheduling a routine.
- The user creates a task or drags it into the routine grid.
- The React UI handles this using components in
frontend/src/components/(e.g. TaskCard, RoutineGrid). - State is managed via Context API / hooks.
- The frontend sends an HTTP request (Axios/fetch) to the backend:
POST /api/tasksfor new tasksPOST /api/routinesfor routine changes
- Requests include the necessary payload (task details, routine metadata, user ID).
- An Express route receives the request in
backend/routes/. - The corresponding controller (e.g.
taskController.js,routineController.js) validates and processes the data. - Business logic (conflicts, schedule rules, etc.) is handled here before hitting the database.
- Mongoose models (e.g.
Task.js,Routine.js,User.js) define the schema. - MongoDB stores tasks, routines, and user data.
- On success, the database returns the updated/created documents to the backend.
- The backend returns a JSON response with the latest task/routine state.
- The React app updates UI state (Context/hooks), so the grid and lists stay in sync with the backend.
- Helps new contributors see the full end-to-end flow quickly.
- Makes it easier to debug issues (know where to look: component β API β controller β model).
- Improves onboarding for new contributors (e.g. GSSoC participants).
The project is deployed on Renderβs free tier. Services may go to sleep after inactivity, so the first request can take around 30β60 seconds to respond.
Recommended versions:
- Node.js
v18+ - npm
v9+
Check your installed versions:
node -v
npm -vNo. DailyForge uses MongoDB Atlas, so you only need a free Atlas account and a valid connection string.
Make sure:
- Your backend is running on
http://localhost:5000. The server already allowshttp://localhost:5173by default β no code changes needed. - Your frontend
.envcontains:
VITE_API_URL=http://localhost:5000/api- If you are still seeing CORS errors, set
CORS_ORIGIN=http://localhost:5173in yourbackend/.envand restart the server.
Backend variables go inside:
/backend/.envFrontend variables go inside:
/frontend/.env| Issue | Common Cause | Quick Fix |
|---|---|---|
| CORS Errors | CLIENT_ORIGIN or FRONTEND_URL mismatch in backend .env. |
Ensure backend .env has correct origin (e.g., http://localhost:5173). Restart the server after changes. |
| MongoDB Connection Error | Incorrect MONGO_URI, wrong credentials, or IP not whitelisted. |
Verify MONGO_URI, replace <password> with correct DB password, and whitelist 0.0.0.0/0 in MongoDB Atlas Network Access. |
| Frontend Cannot Connect to Backend | Backend not running, wrong API URL, or port mismatch. | Set VITE_API_URL=http://localhost:5000/api and ensure backend is running on http://localhost:5000. |
| JWT Authentication Errors | Missing or incorrect JWT_SECRET. |
Add JWT_SECRET in backend/.env and restart the backend server. |
| Dependency Conflicts | React 19 / Tailwind v4 strict peer dependency issues. | Run npm install --legacy-peer-deps in both frontend and backend directories. |
| Glitchy Drag-and-Drop | Browser extensions interfering with DOM events. | Test the app in Incognito mode or disable extensions. |
| Port Already in Use | Another process is using the same port. | Stop the running process or change PORT in .env (e.g., PORT=5001). |
| Dependency Installation Issues | Corrupted node_modules or lock file conflicts. |
Run rm -rf node_modules package-lock.json && npm install. |
We love contributions! DailyForge is actively participating in GSSoC 2026 and welcomes contributors of all experience levels.
π Read the full guidelines: CONTRIBUTING.md
1. Pick an issue
- Browse open issues
- Look for
good first issueif you're new - Comment on the issue to get it assigned before starting work
2. Fork & branch
git clone https://github.com/<your-username>/DailyForge.git
cd DailyForge
git checkout -b <type>/<short-description>Branch naming convention:
| Type | Example |
|---|---|
| New feature | feature/add-dark-mode |
| Bug fix | fix/login-redirect-loop |
| Documentation | docs/update-readme |
| Refactor | refactor/task-hook-cleanup |
3. Make your changes
- Keep changes focused β one issue per PR
- Follow the existing code style
- Test your changes locally before pushing
4. Open a Pull Request
- Fill out the PR template completely
- Link the issue it resolves using
Closes #<issue-number> - Request a review from a maintainer
β οΈ PRs without a linked issue or description will not be reviewed.
We use labels to organize work. Here's what they mean:
| Label | Meaning |
|---|---|
good first issue |
Small, well-scoped tasks β perfect for first-time contributors |
bug |
Something is broken or behaving incorrectly |
feature |
New functionality to be added |
documentation |
Improvements to README, guides, or inline comments |
help wanted |
Maintainers need external input or assistance |
testing |
Adding or improving test coverage |
Tips for new contributors:
- Start with
good first issueβ they're designed to be approachable - Don't hesitate to ask questions in the issue comments
- One issue at a time β don't take on multiple issues until your first PR is merged
graph TD
A[User Opens App] --> B[React Frontend]
B --> C[API Request]
C --> D[Express Server]
D --> E[Controllers]
E --> F[MongoDB Database]
F --> G[JSON Response]
G --> H[React State Update]
H --> I[UI Re-render]
| Layer | Technology | Responsibility |
|---|---|---|
| Frontend | React + Vite | User Interface |
| Backend | Express.js | API Services |
| Database | MongoDB | Data Storage |
| Authentication | Firebase | User Login |
| State Management | Context API | UI State |
frontend/
βββ src/
β βββ components/
β βββ pages/
β βββ hooks/
β βββ context/
backend/
βββ controllers/
βββ routes/
βββ models/
βββ middleware/
- User performs an action.
- React captures the event.
- API request is sent.
- Express routes receive the request.
- Controller processes logic.
- Database is queried.
- Response is returned.
- React updates the interface.
graph LR
A[Fork Repository]
B[Create Branch]
C[Make Changes]
D[Commit Changes]
E[Push Branch]
F[Open Pull Request]
A --> B --> C --> D --> E --> F
git clone repository
npm install
npm run dev- Helps new contributors understand the codebase.
- Makes onboarding easier.
- Improves debugging.
- Explains frontend and backend interaction.
- Reduces confusion for first-time contributors.
- Improves GSSoC contributor experience.
Need help with setup or contributing?
- Open a GitHub Issue
- Comment on an existing issue for clarification
- Contact the maintainer through the email provided below
- Read the setup instructions carefully
- Check the FAQ and Troubleshooting sections
- Search existing GitHub issues first
We welcome contributors of all experience levels π
Thanks to all the amazing people who contribute to DailyForge π
Have questions, ideas, or want to connect with other contributors?
| Channel | Link |
|---|---|
| π§ Email | aryandas2911@gmail.com |
| π Issues | GitHub Issues |
Built with β€οΈ for GSSoC 2026
If DailyForge helped you, consider giving it a β β it helps more contributors find the project!



