HUB_STATUS: OPERATIONAL // 20_YRS_OF_KNOWLEDGE · FREE_ACCESS
Two Decades of Engineering Knowledge,Given Back. For Free.
Thousands of interview questions, real-world errors with root-cause solutions, reusable code archives, and structured learning paths — built through 20 years of actual engineering.
One lamp can light a hundred more without losing its own flame. This knowledge hub is not a product. It is not a funnel. It is a contribution — to every developer who once searched alone at 2 AM for an answer that did not exist anywhere on the internet. It exists now. Here.
— Debasis Bhattacharjee
Across 18 languages & frameworks
Real errors. Root-cause fixes.
Copy-paste ready. Production tested.
Beginner → Advanced, structured
SEARCH_INDEX: READY // FULL_TEXT · INSTANT_RESULTS
Find Anything. Instantly.
DOMAINS_MAPPED // PHP · JS · PYTHON · AI · SECURITY · ARCHITECTURE
Explore the Ecosystem
Categorized by language, role, and difficulty. From junior to architect-level. With curated model answers built from real hiring experience.
Searchable archive of real runtime errors, stack traces, and exceptions — each with root cause analysis and tested fix. Like Stack Overflow, but curated.
Reusable, production-tested code patterns across PHP, Python, JavaScript, VB.NET, SQL and more. No fluff — just working implementations.
Architecture patterns, design principles, scalability thinking, and real-world system breakdowns explained from an engineer who has built them.
Structured progression from beginner to professional — curriculum-style roadmaps with sequenced topics, milestones, and recommended resources.
Penetration testing concepts, vulnerability patterns, OWASP deep dives, and defensive coding practices drawn from real security consulting work.
INTERVIEW_PREP: ACTIVE // JUNIOR · MID · SENIOR · ARCHITECT
Questions & Answers
Common techniques for optimizing Ruby on Rails applications include eager loading associations to reduce N+1 queries, using caching strategies like fragment caching and low-level caching, and optimizing database queries with proper indexing. Monitoring with tools like New Relic can also help identify bottlenecks.
Deep Dive: Optimizing a Ruby on Rails application often requires a multifaceted approach. Eager loading associations by using methods like includes can prevent N+1 query problems, which occur when the application makes excessive database calls, slowing down performance. Caching is another key strategy; fragment caching allows for reusing rendered views, while low-level caching can store results of expensive computations or database queries. Additionally, ensuring that your database queries are optimized with proper indexing can drastically reduce response times by allowing the database to find data more efficiently.
It's also vital to monitor the application in production to identify performance bottlenecks. Tools like New Relic or Skylight can provide insight into slow queries, memory bloat, and other performance metrics. For instance, if the application has a specific action that's noticeably slow, profiling that action can reveal whether the issue lies in the database, the Ruby code, or elsewhere, allowing for targeted optimization efforts.
Real-World: In a recent project for an e-commerce platform built with Ruby on Rails, we faced performance issues during peak traffic times. By implementing eager loading on user and order associations, we reduced the number of database queries significantly. Additionally, we introduced fragment caching on product pages, which improved load times for frequently accessed items. This combination of optimization not only enhanced user experience but also reduced server load, allowing us to handle higher traffic without scaling hardware immediately.
⚠ Common Mistakes: A common mistake developers make is neglecting to profile their applications before optimizing, leading to premature optimization that doesn't address real performance issues. Another mistake is using caching without a proper invalidation strategy, which can cause users to see stale data. Developers sometimes also overlook database optimizations, such as creating necessary indexes, assuming Rails will handle all query optimization passively.
🏭 Production Scenario: In a high-traffic Rails application, performance optimization becomes critical during events like holiday sales. We observed that user experience suffered due to slow page loads caused by excessive database queries. After implementing eager loading and caching, we noticed not only increased speed but also improved user satisfaction and conversion rates, showcasing how performance tweaks can have a direct impact on business outcomes.
Cache-aside caching allows the application to load data into the cache on demand and is beneficial for read-heavy workloads. Write-through caching, on the other hand, immediately writes data to the cache and the database simultaneously, ensuring data consistency at the cost of write performance.
Deep Dive: In cache-aside caching, the application is responsible for managing the cache lifecycle. When an application requests data, it first checks the cache; if the data isn't there, it fetches it from the database and places it in the cache for future use. This is effective in scenarios where reads are much more frequent than writes, as it minimizes the load on the database. However, it doesn't guarantee data consistency since there could be a delay between data being written to the database and it being reflected in the cache.
Write-through caching offers a more consistent approach, where every time data is changed, it's written to both the cache and the database at the same time. This ensures that the cache always has the most current data, making it suitable for applications that require high data integrity, such as financial systems. The trade-off, however, is that it can slow down write operations since each write involves two steps. Depending on the application, it may make sense to use a combination of both strategies to balance read performance and data integrity.
Real-World: In a high-traffic e-commerce application, using cache-aside could allow users to quickly retrieve product details from the cache after the first request hits the database. If the product catalog is updated only occasionally, this would minimize database load. Conversely, in a banking application that requires up-to-the-second balance information, a write-through strategy would ensure that all transactions are instantaneously reflected in both the cache and the database, preventing scenarios where a user sees outdated information.
⚠ Common Mistakes: One common mistake developers make is over-relying on cache-aside caching without implementing cache invalidation strategies. If the underlying data changes but the cache isn’t updated, users may receive stale data, leading to inconsistencies. Another mistake is using write-through caching indiscriminately for all data, as it can significantly impact performance. It's important to assess the read-write ratio and decide if the added consistency is worth the potential slowdown in write operations.
🏭 Production Scenario: In a recent project, we developed a news aggregation service that relied heavily on cache-aside caching to manage content updates. We noticed that caching articles reduced database load significantly during peak hours. However, implementing a proper invalidation strategy became crucial as we had to ensure users always received the latest updates, especially during breaking news events.
To implement a machine learning model using ML.NET, I would start by defining a data class for the housing data, then load the data into an IDataView. Next, I'd configure the pipeline with data transformations and choose a regression algorithm. Finally, I'd train the model and evaluate it using the test data set.
Deep Dive: Implementing a simple machine learning model in C# using ML.NET involves several steps, starting with the creation of a class to represent the data points, which includes features such as size and location as well as the target variable, which in this case is the price. After defining the data schema, loading the data into an IDataView is essential, as this is the primary data structure used by ML.NET for data operations. The next step is to set up a learning pipeline, which typically involves data normalization, feature selection, and choosing an appropriate algorithm for regression, such as Stochastic Dual Coordinate Ascent or FastTree. After the training phase, it's critical to evaluate the model using proper metrics like R-squared or Mean Absolute Error to understand its performance and make necessary adjustments for better accuracy. This process showcases the importance of understanding both the data and the algorithm selection to yield meaningful predictions.
Real-World: In a real estate company, we developed a pricing model using ML.NET to predict property prices based on various attributes like square footage, number of bedrooms, and average neighborhood price. We gathered historical data, processed it into an IDataView, and built a regression pipeline using the FastTree algorithm. After training and validating the model, it was integrated into our web application to provide real-time pricing advice for clients, significantly improving both user experience and decision-making efficiency.
⚠ Common Mistakes: One common mistake is neglecting data preprocessing, such as not handling missing values or normalizing feature scales, which can lead to poor model performance. Another error is selecting an inappropriate algorithm without considering the characteristics of the data, which can result in overfitting or underfitting. Lastly, failing to evaluate the model using validation sets may lead to overly optimistic performance metrics and inadequate real-world utility.
🏭 Production Scenario: While working on a project for a real estate application, I encountered a situation where our initial model was providing inaccurate price predictions. After analyzing the data, I realized we had not properly normalized the input features, leading to skewed results. Correcting this allowed us to significantly enhance our model's performance, demonstrating the direct impact of proper data handling and model evaluation on production outcomes.
I would implement a time-based caching strategy with a cache invalidation mechanism. Using a caching layer like Redis, I would keep user profiles cached for a reasonable duration, but also update the cache whenever the underlying data changes to ensure consistency.
Deep Dive: Implementing a caching strategy requires balancing performance and data consistency, especially for frequently accessed APIs like user profiles. A time-based cache using tools like Redis allows for rapid retrieval of profiles, reducing load on the database. However, stale data can lead to inconsistencies, so it's imperative to implement an invalidation strategy. This could be achieved through webhooks to invalidate cache entries on data updates or using an 'update' method that refreshes the cache after changes. It's also beneficial to analyze request patterns to adjust cache duration dynamically based on usage spikes or patterns.
Considerations might include handling cache misses gracefully and ensuring that your cache layer scales appropriately with traffic. You may also want to implement a fallback mechanism to retrieve data directly from the database in case of cache failures, ensuring the API remains resilient.
Real-World: In a project where I worked with a social media platform, we used Redis to cache user profiles to reduce the load on our PostgreSQL database. Profiles were cached for 5 minutes, but we also set up a mechanism to invalidate the cache whenever a user updated their profile. This approach allowed us to serve requests quickly while ensuring that users always received the most up-to-date information about their connections and followers.
⚠ Common Mistakes: A common mistake is over-reliance on cache without proper invalidation strategies, which can lead to serving stale data and user frustration. Developers often assume that cache is always up-to-date after writes, which is not the case when updates happen frequently. Another mistake is failing to monitor cache performance, which can lead to cache thrashing and increased latency, negating the caching benefits altogether. Proper logging and monitoring are crucial to understand cache hit ratios and ensure optimal performance.
🏭 Production Scenario: In a recent project at a mid-sized e-commerce company, we faced performance issues while retrieving product details during peak shopping seasons. Implementing a caching strategy helped mitigate the load on our database and improved response times significantly. It became evident that understanding how to effectively manage cache lifespan and ensure data consistency was crucial as we scaled our services.
Agentic workflows enable automation in the deployment process by allowing AI agents to make decisions based on predefined rules and real-time data. This enhances efficiency by reducing manual intervention, speeding up deployment cycles, and enabling continuous integration and delivery.
Deep Dive: Agentic workflows involve AI agents that leverage machine learning and rule-based systems to make autonomous decisions in processes like deployment. By assessing the current state of the environment, monitoring application performance, and analyzing failure rates, these agents can determine optimal deployment windows or rollback actions without human oversight. This reduces the risk of human error and allows for rapid iterations, essential in today's fast-paced development environments. Additionally, incorporating such workflows requires careful consideration of the decision-making criteria to avoid unintended consequences, such as deploying untested code during high traffic periods. Proper monitoring and feedback loops must be in place to continually refine the agent's decision-making processes.
Furthermore, supporting infrastructures, like CI/CD pipelines, must be integrated with these workflows to ensure seamless communication between systems. Also, it’s crucial to strike a balance between automation and human oversight to prevent complete reliance on AI agents, which could lead to major issues if unforeseen circumstances arise that the agent is not trained to handle.
Real-World: In a mid-sized SaaS company, an AI agent was integrated into the CI/CD pipeline to automate deployment decisions based on application performance metrics. The agent monitored key performance indicators like response times and error rates. When a deployment was pushed, the agent could automatically assess whether to proceed or roll back based on real-time data. This significantly reduced deployment failures and improved overall service reliability. Over time, the system adapted and improved its decision-making, leading to a more resilient deployment process.
⚠ Common Mistakes: One common mistake is over-relying on AI agents to make critical deployment decisions without adequate human oversight. This could lead to a situation where an agent makes a harmful decision based on flawed data. Another mistake is failing to provide the agent with comprehensive and relevant data, which can result in poor decision-making. Lastly, not implementing effective monitoring can cause undetected failures, as the agent may continue to operate under incorrect assumptions without alerting the team to potential issues.
🏭 Production Scenario: In a recent project, our team faced challenges with deployment frequency and reliability. By introducing agentic workflows, we were able to automate many of the deployment decisions. During high-pressure periods, the AI agent efficiently determined the best times to deploy based on application load and user activity patterns. This not only improved our turnaround time but also significantly reduced incidents related to faulty releases.
To manage PHP application deployments in a cloud environment with minimal downtime, I implement blue-green deployments. This involves maintaining two identical environments, where one is live while the other is idle. When deploying a new version, I switch traffic to the updated environment after testing it thoroughly, allowing for quick rollbacks if issues arise.
Deep Dive: Effective deployment management is crucial for maintaining application availability. Blue-green deployments reduce downtime by allowing seamless traffic shifting between two environments. This strategy mitigates risks since you can validate the new deployment before exposing it to users. Additionally, it allows for instant rollback if any issues arise post-deployment, improving reliability compared to traditional approaches that may result in downtime during updates. Other strategies, such as canary deployments, can be used as well, where a small percentage of traffic is directed to the new version first, but blue-green is often preferred for its simplicity and robustness in PHP applications that require high availability.
Real-World: In a recent project where I managed a high-traffic e-commerce site, we implemented blue-green deployments. During a significant product update, we set up a staging environment with the new PHP code. After thorough testing, we redirected user traffic to this new environment while keeping the old one intact. This allowed us to monitor user interactions and performance metrics in real-time, and we quickly rolled back to the previous version when a minor issue was detected, all without end-users experiencing any downtime.
⚠ Common Mistakes: A common mistake is failing to adequately test the new deployment in the staging environment before switching traffic. This can lead to unexpected issues in production that impact user experience. Another mistake is not monitoring the new version closely post-deployment, which can prevent the team from responding quickly to any emerging problems. Both of these can significantly increase the risk of downtime and degrade service quality.
🏭 Production Scenario: In a production environment, I encountered a situation where a new feature caused unexpected database performance issues after deployment. Since we had utilized blue-green deployments, we quickly redirected the traffic back to the previous version while we resolved the underlying issue. This experience underscored the importance of having robust deployment strategies in place to ensure service continuity.
To handle high traffic during sales, I would implement a load balancer to distribute traffic across multiple servers and use caching mechanisms for product data. Additionally, optimizing the database queries and leveraging asynchronous processing for order management would enhance performance.
Deep Dive: When designing for scalability and performance in WooCommerce, it’s crucial to anticipate traffic surges and prepare the architecture accordingly. Implementing a load balancer can evenly distribute incoming traffic across multiple web servers, ensuring no single server becomes a bottleneck. Caching strategies, such as using object caching with Redis or Varnish, can significantly reduce database load by serving frequently accessed data without hitting the database each time. Moreover, optimizing database queries and indexing can enhance data retrieval speed, which is vital during peak times. Asynchronous processing for tasks like order confirmation emails and inventory updates can offload work from the checkout process, keeping it responsive.
Real-World: In a previous project for an e-commerce company, we prepared for a Black Friday sale by implementing a robust caching layer with Redis. We also set up a Kubernetes cluster to dynamically scale our application servers based on the traffic load. This reduced our average checkout time by 40%, even under heavy load, as we efficiently managed server resources and could handle a five-fold increase in traffic without downtime.
⚠ Common Mistakes: A common mistake developers make is underestimating the need for a content delivery network (CDN) for serving static assets, which can lead to slow loading times during traffic spikes. Others may neglect to test the load capacity of their system, assuming it will handle increased requests without issues, resulting in crashes or degraded performance. Additionally, failing to optimize database queries can lead to slowdowns during peak periods, as a poorly designed database can become overwhelmed.
🏭 Production Scenario: In a high-traffic production scenario, I once observed a site crash during a holiday sale because the database couldn't handle the volume of simultaneous requests. The lack of a load balancer and adequate caching strategy forced customers to abandon their carts, leading to significant lost revenue. This experience underscored the importance of having a scalable architecture in place before major events.
To optimize performance in an Express.js application, especially with large datasets, consider using efficient middleware, enabling compression, and implementing pagination. It's also crucial to cache responses where feasible and minimize the number of middleware layers in the request handling pipeline.
Deep Dive: Performance optimization in Express.js applications primarily revolves around efficient middleware usage and effective data handling. For large datasets, pagination allows you to load and process only a subset of data in each request, which significantly reduces response times and memory consumption. Utilizing middleware like compression can minimize the size of the response payload, enhancing the speed of data transfer between the server and the client. Additionally, caching strategies can store frequently requested data in memory, which eliminates redundant database calls and improves overall response time. However, careful management of this cache is necessary to avoid serving stale data, especially in dynamic applications where data changes frequently.
Another crucial point is minimizing the number of middleware layers. Each middleware adds overhead to request processing time. By combining related middleware functions or using more efficient alternatives, you can reduce this overhead. Monitoring the performance of individual middleware and taking advantage of asynchronous processing can further streamline request-handling efficiency. A holistic approach that combines these strategies will lead to noticeable performance improvements in handling large datasets.
Real-World: In a recent project, we faced performance issues when serving an API that returned user data from a database with millions of entries. By implementing pagination, we allowed clients to request data in smaller chunks, reducing the load times significantly. Additionally, we introduced middleware for response compression, which decreased the size of the responses sent over the network. Caching frequently accessed endpoints in memory further enhanced response times, as the application could serve requests directly from the cache without hitting the database for every single request.
⚠ Common Mistakes: A common mistake developers make is neglecting to implement pagination when dealing with large datasets, which can lead to overwhelming server load and slow response times. Additionally, some developers may fail to enable response compression, which is a simple yet effective way to minimize the size of data transferred, resulting in performance lags. Lastly, improperly managing the order of middleware can introduce unnecessary latency in handling requests, where heavier processing middleware is placed before lighter ones, thus slowing down the overall request-handling pipeline.
🏭 Production Scenario: In a production setting, you might encounter a situation where the API performance worsens as user traffic grows. Users complain about slow response times when retrieving data for complex queries. You would need to analyze the middleware stack and data handling methods, leading to implementing pagination and caching strategies to enhance performance. Such issues highlight the need for proactive optimization in scenarios where data volume and user load increase dramatically.
Embeddings are generated using algorithms like Word2Vec, FastText, or transformer-based models like BERT, which convert words or documents into high-dimensional vectors. In vector databases, these embeddings enable efficient similarity searches by allowing queries to retrieve the nearest vectors based on a defined distance metric, such as cosine similarity.
Deep Dive: Generating embeddings involves training a model on a corpus of text, which learns to represent words or phrases as dense vectors in a continuous vector space. The dimensionality of these embeddings can vary, but common sizes are between 100 to 300 dimensions for word-level embeddings and can be much higher for document-level embeddings. Once embeddings are created, they can be stored in a vector database that indexes these high-dimensional vectors for fast retrieval.
When a similarity search is performed, the database calculates the distance between the query vector and the stored vectors, often using cosine similarity or Euclidean distance. This allows the system to find the most similar entries quickly, making it useful for applications like recommendation systems, semantic search, or information retrieval, where finding contextually relevant items is crucial. Edge cases may include handling out-of-vocabulary words or ensuring embeddings are normalized, which could affect similarity calculations.
Real-World: In a real-world application, consider a news aggregation service that uses embeddings to recommend articles. The service generates embeddings for each article based on their content using a transformer model. When a user reads a specific article, the system retrieves the embeddings of this article, queries the vector database, and retrieves the top N most similar articles based on their embeddings. This enables the service to provide relevant recommendations, enhancing user engagement.
⚠ Common Mistakes: A common mistake developers make is not normalizing embeddings, which can lead to inaccurate similarity calculations, especially when using cosine similarity. Additionally, some might oversimplify the generation process by only using basic models, neglecting the advances offered by transformer-based models which capture contextual information better. Finally, failing to update embeddings as new data arrives can lead to outdated results, impacting the usefulness of the similarity search over time.
🏭 Production Scenario: In a recent project, our team was tasked with enhancing a chatbot's ability to understand user queries and provide relevant responses. We decided to use a vector database to store user intents as embeddings. By regularly updating these embeddings and ensuring our vector search was optimized for performance, we significantly improved the chatbot's accuracy and responsiveness over time. This experience highlighted the importance of embedding management in production systems.
Indexing in MongoDB is crucial for improving query performance by allowing the database to quickly locate and retrieve documents without scanning the entire collection. To implement indexing, you can use the createIndex method, specifying the fields you want to index. Properly chosen indexes can greatly enhance read performance, especially for large datasets.
Deep Dive: Indexing in MongoDB works by creating a data structure that holds a small portion of the data in a sorted order according to the specified fields. This allows the database engine to perform queries much more efficiently because it can use the index to jump directly to the relevant documents instead of having to scan through each document in the collection. One common type of index is the single-field index, but composite indexes can also be created for multiple fields, which can greatly optimize complex queries. However, creating too many indexes can negatively impact write performance, as each index must be updated with every write operation. It’s essential to regularly analyze query performance and adjust indexes as necessary to keep the database optimized.
Real-World: In a recent project, we developed an e-commerce platform where we needed to query product listings based on categories and price ranges. Initially, our queries were slow because they were not indexed, leading to poor performance as the dataset grew. We decided to create compound indexes on both the category and price fields. After implementing these indexes, we observed our query response times reduced significantly, enhancing the overall user experience on the platform and making it easier for users to filter products efficiently.
⚠ Common Mistakes: A common mistake developers make is creating too many indexes without understanding their impact on performance. While indexes can speed up read operations, they can also slow down write operations due to the overhead of maintaining them. Another mistake is not analyzing query patterns before creating indexes, leading to suboptimal indexing strategies that do not significantly improve performance. Developers may also overlook the importance of index maintenance; without regular assessment and adjustments, indexes can become outdated as data access patterns evolve.
🏭 Production Scenario: In a real-world setting, I once encountered a situation where a reporting tool querying a large dataset was timing out due to poor indexing strategies. The queries relied on multiple fields for filtering, but without the right indexes, the database was overloaded with collection scans. This led to delays in generating reports that were critical for business decisions. After implementing the appropriate indexing strategy, our reporting performance improved considerably, allowing the team to access data in real-time.
Showing 10 of 351 questions
DEBUG_ARCHIVE: LIVE // REAL_ERRORS · ANNOTATED_FIXES
Real Errors. Root-Cause Fixes.
Undefined variable: $conn — PDO connection not persisted across scope
Connection object passed by value. Fix: pass by reference or use dependency injection through constructor.
Cannot read properties of undefined — React state not yet populated on first render
State initialized as undefined, not empty array. Fix: initialize with useState([]) and guard with optional chaining.
Foreign key constraint fails on INSERT — parent row not found in referenced table
Insertion order violation. Fix: insert parent record first, or disable FK checks during bulk migration with SET FOREIGN_KEY_CHECKS=0.
ModuleNotFoundError in virtual environment — pip installed globally but not inside venv
Package installed to system Python, not active venv. Fix: activate venv first, then pip install. Verify with which python.
NullReferenceException on DataGridView load — DataSource bound before data fetched
Binding fires before async fetch completes. Fix: await the data load, then set DataSource. Use BindingSource for dynamic updates.
White Screen of Death after plugin activation — memory limit exhausted on init hook
Plugin loading heavy library on every request. Fix: lazy-load on relevant admin pages only. Increase WP_MEMORY_LIMIT in wp-config as temporary measure.
Copy. Adapt. Ship.
Singleton Database Connection
Thread-safe PDO connection with single instance guarantee. Works with MySQL, PostgreSQL, SQLite.
Rate-Limited API Client
Async HTTP client with automatic retry, exponential backoff, and per-domain rate limiting.
Recursive CTE Hierarchy
Self-referencing table traversal for category trees, org charts, and menu structures using Common Table Expressions.
Custom useDebounce Hook
React hook for debouncing search inputs, form fields, and resize events. Prevents excessive API calls.
LEARNING_PATHS: READY // 4_TRACKS · STRUCTURED · MENTOR_GUIDED
Learning Paths
PHP Developer: Zero to Production
BeginnerFrom syntax fundamentals to building RESTful APIs and WordPress plugins. Designed for complete beginners with no prior programming background.
Full-Stack JavaScript: React + Node
Mid-LevelModern full-stack development with React, Node.js, Express, and PostgreSQL. Includes deployment, auth, and real project builds.
Software Architecture Mastery
AdvancedDesign patterns, SOLID principles, microservices, event-driven architecture, and real-world system design interview preparation.
AI Integration for Developers
Mid-LevelPractical AI integration using Claude API, OpenAI, and MCP. Build real AI-powered applications, tools, and automation workflows.
"The best engineering knowledge is not found in textbooks — it is extracted from late nights, broken builds, angry clients, and the stubborn refusal to stop until the problem is solved."
— Debasis Bhattacharjee · Software Architect · 20 Years in Production
ARCHIVE_GROWING // CONTRIBUTIONS_OPEN · LIVING_DOCUMENT
This Is a Living Archive. Not a Static Library.
Every week, new errors are documented, new interview patterns are added, and new solutions are tested in production. The knowledge hub grows because real problems keep appearing — and every answer earns its place here by actually working.
If you found a fix that saved your project, or spotted an answer that could be better — the door is always open. This ecosystem belongs to everyone who uses it.
Knowledge is Free.
Mentorship is Personal.
The hub is open to everyone — but if you need structured guidance, 1-on-1 mentorship, or corporate training, that's a different conversation. Let's have it.
hello@debasisbhattacharjee.com · +91 8777088548 · Mon–Fri, 9AM–6PM IST