Tech
Mock Service Worker (MSW) in 2026: The Ultimate Guide to Frontend Testing
Mock Service Worker (MSW) in 2026: The Ultimate Guide to Frontend Testing
Learn how to use Mock Service Worker (MSW) in 2026 to intercept network requests at the source. Build and test robust frontend applications without needing a live backend.
Learn how to use Mock Service Worker (MSW) in 2026 to intercept network requests at the source. Build and test robust frontend applications without needing a live backend.
08 min read

The maturity of frontend testing in 2026 involves more than just "happy path" testing. We now focus heavily on edge cases, race conditions, and performance degradation simulation.
Simulating Network Instability
One of the most critical aspects of frontend resilience is handling network failures. MSW makes this trivial. By adding a middleware or wrapping the response, you can easily simulate a 500 server error, a 429 rate limit, or a massive latency delay.
Testing State Synchronization
When testing React, Vue, or Svelte components that manage global state, MSW allows you to set the initial state of the world before the component mounts. You can orchestrate a sequence of API calls where the first call sets up data, and subsequent calls reflect changes to that data, effectively testing the lifecycle of state in your application.
Integration Table: MSW Across the Testing Pyramid
Testing Tier | Usage Strategy | Benefit |
Unit Testing | Mocking external services via Vitest | Isolation of business logic |
Integration Testing | Mocking entire API surface for component trees | Verification of data flow and state |
End-to-End Testing | Injecting MSW into Playwright/Cypress | Deterministic E2E suites |
Dev Environment | Using MSW browser worker as a dev server | Rapid prototyping without backend |
Handling Complex Authentication Flows
By 2026, security is no longer an afterthought. Modern applications often use complex OIDC (OpenID Connect) flows, refresh tokens, and granular permission checks. MSW allows you to mock the entire authentication layer.
Instead of authenticating against a real server, you can create a handler for your token endpoint that validates dummy credentials and returns a JWT that your application's auth provider accepts. This allows you to test the protected routes of your application without ever calling the real Auth0 or Okta backend.
The Future of Backend-Agnostic Development
As we look toward 2027 and beyond, the trend of frontend independence will only accelerate. With the rise of Edge Computing and Serverless functions, the boundary between "frontend" and "backend" is blurring. MSW is uniquely positioned because it treats the network as a controllable entity, not a chaotic external dependency.
Best Practices for Maintenance
Keep Handlers Modular: Avoid one massive
handlers.jsfile. Separate them by domain (e.g.,user.handlers.js,orders.handlers.js).Schema Synchronization: Use tools like OpenAPI/Swagger to generate MSW handlers automatically. This ensures your mocks never drift from the actual backend schema.
Use Explicit Mocks: Never rely on global defaults. Every test should be responsible for setting up the specific state it needs.
Scaling MSW for Enterprise Teams
In enterprise-grade applications with 50+ developers, managing mocks becomes a challenge in itself. The risk of having stale mocks that don't match the evolving backend is high.
Building a Mock Registry
For large organizations, we recommend creating a shared, versioned package of mock handlers. By centralizing the mocks, you ensure that the entire team is testing against the same "truth."
Versioned Mocks: Map mock versions to backend API versions.
Standardized Response Shapes: Use TypeScript interfaces shared between the backend repo and the mock registry.
Automated Validation: Run CI tests that check if the schema of your mocks matches the latest OpenAPI specification of your backend.
Debugging and Observability in MSW
One of the main fears developers have with network-level mocking is that it becomes a "black box." In 2026, MSW’s ecosystem has introduced robust observability tools.
Verbose Logging: MSW allows you to enable logging that shows every intercepted request in the console, clearly indicating whether it was handled by a mock or allowed to pass through to the real network.
The Browser Extension: The dedicated MSW browser extension provides a UI to inspect active handlers, view the request/response payloads in real-time, and toggle specific mocks on or off without changing code.
Error Tracking integration: You can hook your error tracking service (like Sentry) into your MSW handlers to capture issues that occur during mock execution, ensuring you can debug mock-related failures just like production ones.
The OpenAPI-to-MSW Pipeline
In 2026, manually writing handlers is discouraged for large APIs. The industry standard is to treat your OpenAPI (Swagger) documentation as the single source of truth.
Define Schema: Maintain an OpenAPI 3.1+ spec.
Code Generation: Use tools like
msw-openapi-generatoror custom CLI scripts to parse your JSON schema and generate the correspondinghttp.get,http.post, etc., handlers.Dynamic Response Faking: Integrate libraries like
faker.jsinto your generated handlers to ensure your tests use fresh, realistic-looking data every time they run.
Handling Streaming and WebSockets
With the rise of real-time applications, testing traditional HTTP request-response cycles is insufficient. MSW supports modern communication patterns:
Server-Sent Events (SSE): MSW provides a dedicated handler for streaming responses, allowing you to mock long-lived connections.
WebSockets: While more complex, MSW provides mechanisms to intercept WebSocket handshakes and simulate the stream of incoming and outgoing events. This is critical for testing chat applications, stock tickers, or collaborative editing tools.
Performance: MSW vs. Real Backend for Local Dev
Developers often ask: "Should I just use a local backend?"
Real backends in local development introduce complexity: environment variables, database setup, migrations, and service dependencies (Redis, Kafka).
The Performance Trade-off:
MSW: Near-instant initialization. Zero dependency on external databases.
Local Backend: Slow startup, high memory consumption, drift between local and production data.
For 95% of frontend development tasks, MSW provides a faster feedback loop. The remaining 5% of "Integration Testing" where you test against the real backend should be relegated to a dedicated CI step, not your daily development workflow.
Managing Data Persistence in Mocks
A common hurdle is when a user expects data they created in a POST request to be available in a subsequent GET request.
The solution is to use an in-memory database or a simple state store within your msw directory.
JavaScript
// A simple in-memory state store const userStore = new Map(); export const handlers = [ http.post('/api/users', async ({ request }) => { const user = await request.json(); userStore.set(user.id, user); return HttpResponse.json({ success: true }); }), http.get('/api/users/:id', ({ params }) => { const user = userStore.get(params.id); return user ? HttpResponse.json(user) : new HttpResponse(null, { status: 404 }); }) ];
// A simple in-memory state store const userStore = new Map(); export const handlers = [ http.post('/api/users', async ({ request }) => { const user = await request.json(); userStore.set(user.id, user); return HttpResponse.json({ success: true }); }), http.get('/api/users/:id', ({ params }) => { const user = userStore.get(params.id); return user ? HttpResponse.json(user) : new HttpResponse(null, { status: 404 }); }) ];
This pattern turns your mocks from static placeholders into dynamic, interactive simulations of your backend.
Advanced Techniques: Network Condition Simulation
Beyond basic status codes, MSW allows you to manipulate the environment at the protocol level.
Latency Simulation: Use
delay()to test how your UI handles slow connections. Does your loading state work? Does it handle timeouts gracefully?Sequence Interruption: Test how your application recovers if the first API call succeeds but the second one fails.
Concurrent Request Handling: Use MSW to test how your UI handles race conditions where an older request returns after a newer request.
The Cultural Aspect: Shift-Left Testing
The adoption of MSW is not just a technical choice; it's a cultural shift. It encourages "Shift-Left Testing," where frontend developers become more aware of API contracts and data structures. It removes the "backend is blocking me" excuse, empowering frontend teams to take ownership of their testing lifecycle.
In 2026, a frontend developer who understands how to mock their network layer effectively is a force multiplier for any engineering team.
Final Thoughts
The tools we use to build the web change, but the need for reliable, fast, and deterministic tests remains constant. MSW has proven itself over the years, and as we push into the future, its architecture remains relevant. Whether you're working on a simple dashboard or a complex enterprise portal, integrating MSW will help you build faster, break fewer things, and sleep better at night.
JavaScript
import { http, HttpResponse } from 'msw'; export const handlers = [ http.get('/api/v1/user/:id', ({ params }) => { const { id } = params; return HttpResponse.json({ id, name: 'John Doe', role: 'admin', updatedAt: new Date().toISOString() }); }), http.post('/api/v1/login', async ({ request }) => { const body = await request.json(); if (body.password === 'secret') { return new HttpResponse(null, { status: 200 }); } return new HttpResponse(null, { status: 401 }); }) ];
import { http, HttpResponse } from 'msw'; export const handlers = [ http.get('/api/v1/user/:id', ({ params }) => { const { id } = params; return HttpResponse.json({ id, name: 'John Doe', role: 'admin', updatedAt: new Date().toISOString() }); }), http.post('/api/v1/login', async ({ request }) => { const body = await request.json(); if (body.password === 'secret') { return new HttpResponse(null, { status: 200 }); } return new HttpResponse(null, { status: 401 }); }) ];
Advanced Testing Patterns for 2026
The maturity of frontend testing in 2026 involves more than just "happy path" testing. We now focus heavily on edge cases, race conditions, and performance degradation simulation.
Simulating Network Instability
One of the most critical aspects of frontend resilience is handling network failures. MSW makes this trivial. By adding a middleware or wrapping the response, you can easily simulate a 500 server error, a 429 rate limit, or a massive latency delay.
Testing State Synchronization
When testing React, Vue, or Svelte components that manage global state, MSW allows you to set the initial state of the world before the component mounts. You can orchestrate a sequence of API calls where the first call sets up data, and subsequent calls reflect changes to that data, effectively testing the lifecycle of state in your application.
Integration Table: MSW Across the Testing Pyramid
Testing Tier | Usage Strategy | Benefit |
Unit Testing | Mocking external services via Vitest | Isolation of business logic |
Integration Testing | Mocking entire API surface for component trees | Verification of data flow and state |
End-to-End Testing | Injecting MSW into Playwright/Cypress | Deterministic E2E suites |
Dev Environment | Using MSW browser worker as a dev server | Rapid prototyping without backend |
Handling Complex Authentication Flows
By 2026, security is no longer an afterthought. Modern applications often use complex OIDC (OpenID Connect) flows, refresh tokens, and granular permission checks. MSW allows you to mock the entire authentication layer.
Instead of authenticating against a real server, you can create a handler for your token endpoint that validates dummy credentials and returns a JWT that your application's auth provider accepts. This allows you to test the protected routes of your application without ever calling the real Auth0 or Okta backend.
The Future of Backend-Agnostic Development
As we look toward 2027 and beyond, the trend of frontend independence will only accelerate. With the rise of Edge Computing and Serverless functions, the boundary between "frontend" and "backend" is blurring. MSW is uniquely positioned because it treats the network as a controllable entity, not a chaotic external dependency.
Best Practices for Maintenance
Keep Handlers Modular: Avoid one massive
handlers.jsfile. Separate them by domain (e.g.,user.handlers.js,orders.handlers.js).Schema Synchronization: Use tools like OpenAPI/Swagger to generate MSW handlers automatically. This ensures your mocks never drift from the actual backend schema.
Use Explicit Mocks: Never rely on global defaults. Every test should be responsible for setting up the specific state it needs.
Mock Service Worker has transformed from a clever hack to an essential pillar of the modern frontend ecosystem. By allowing us to simulate real network behavior without the baggage of a real backend, it has enabled teams to write faster, more reliable, and significantly more maintainable test suites. As you prepare your projects for the challenges of 2026 and beyond, investing time in mastering MSW is one of the highest-leverage decisions you can make for your development workflow.
The maturity of frontend testing in 2026 involves more than just "happy path" testing. We now focus heavily on edge cases, race conditions, and performance degradation simulation.
Simulating Network Instability
One of the most critical aspects of frontend resilience is handling network failures. MSW makes this trivial. By adding a middleware or wrapping the response, you can easily simulate a 500 server error, a 429 rate limit, or a massive latency delay.
Testing State Synchronization
When testing React, Vue, or Svelte components that manage global state, MSW allows you to set the initial state of the world before the component mounts. You can orchestrate a sequence of API calls where the first call sets up data, and subsequent calls reflect changes to that data, effectively testing the lifecycle of state in your application.
Integration Table: MSW Across the Testing Pyramid
Testing Tier | Usage Strategy | Benefit |
Unit Testing | Mocking external services via Vitest | Isolation of business logic |
Integration Testing | Mocking entire API surface for component trees | Verification of data flow and state |
End-to-End Testing | Injecting MSW into Playwright/Cypress | Deterministic E2E suites |
Dev Environment | Using MSW browser worker as a dev server | Rapid prototyping without backend |
Handling Complex Authentication Flows
By 2026, security is no longer an afterthought. Modern applications often use complex OIDC (OpenID Connect) flows, refresh tokens, and granular permission checks. MSW allows you to mock the entire authentication layer.
Instead of authenticating against a real server, you can create a handler for your token endpoint that validates dummy credentials and returns a JWT that your application's auth provider accepts. This allows you to test the protected routes of your application without ever calling the real Auth0 or Okta backend.
The Future of Backend-Agnostic Development
As we look toward 2027 and beyond, the trend of frontend independence will only accelerate. With the rise of Edge Computing and Serverless functions, the boundary between "frontend" and "backend" is blurring. MSW is uniquely positioned because it treats the network as a controllable entity, not a chaotic external dependency.
Best Practices for Maintenance
Keep Handlers Modular: Avoid one massive
handlers.jsfile. Separate them by domain (e.g.,user.handlers.js,orders.handlers.js).Schema Synchronization: Use tools like OpenAPI/Swagger to generate MSW handlers automatically. This ensures your mocks never drift from the actual backend schema.
Use Explicit Mocks: Never rely on global defaults. Every test should be responsible for setting up the specific state it needs.
Scaling MSW for Enterprise Teams
In enterprise-grade applications with 50+ developers, managing mocks becomes a challenge in itself. The risk of having stale mocks that don't match the evolving backend is high.
Building a Mock Registry
For large organizations, we recommend creating a shared, versioned package of mock handlers. By centralizing the mocks, you ensure that the entire team is testing against the same "truth."
Versioned Mocks: Map mock versions to backend API versions.
Standardized Response Shapes: Use TypeScript interfaces shared between the backend repo and the mock registry.
Automated Validation: Run CI tests that check if the schema of your mocks matches the latest OpenAPI specification of your backend.
Debugging and Observability in MSW
One of the main fears developers have with network-level mocking is that it becomes a "black box." In 2026, MSW’s ecosystem has introduced robust observability tools.
Verbose Logging: MSW allows you to enable logging that shows every intercepted request in the console, clearly indicating whether it was handled by a mock or allowed to pass through to the real network.
The Browser Extension: The dedicated MSW browser extension provides a UI to inspect active handlers, view the request/response payloads in real-time, and toggle specific mocks on or off without changing code.
Error Tracking integration: You can hook your error tracking service (like Sentry) into your MSW handlers to capture issues that occur during mock execution, ensuring you can debug mock-related failures just like production ones.
The OpenAPI-to-MSW Pipeline
In 2026, manually writing handlers is discouraged for large APIs. The industry standard is to treat your OpenAPI (Swagger) documentation as the single source of truth.
Define Schema: Maintain an OpenAPI 3.1+ spec.
Code Generation: Use tools like
msw-openapi-generatoror custom CLI scripts to parse your JSON schema and generate the correspondinghttp.get,http.post, etc., handlers.Dynamic Response Faking: Integrate libraries like
faker.jsinto your generated handlers to ensure your tests use fresh, realistic-looking data every time they run.
Handling Streaming and WebSockets
With the rise of real-time applications, testing traditional HTTP request-response cycles is insufficient. MSW supports modern communication patterns:
Server-Sent Events (SSE): MSW provides a dedicated handler for streaming responses, allowing you to mock long-lived connections.
WebSockets: While more complex, MSW provides mechanisms to intercept WebSocket handshakes and simulate the stream of incoming and outgoing events. This is critical for testing chat applications, stock tickers, or collaborative editing tools.
Performance: MSW vs. Real Backend for Local Dev
Developers often ask: "Should I just use a local backend?"
Real backends in local development introduce complexity: environment variables, database setup, migrations, and service dependencies (Redis, Kafka).
The Performance Trade-off:
MSW: Near-instant initialization. Zero dependency on external databases.
Local Backend: Slow startup, high memory consumption, drift between local and production data.
For 95% of frontend development tasks, MSW provides a faster feedback loop. The remaining 5% of "Integration Testing" where you test against the real backend should be relegated to a dedicated CI step, not your daily development workflow.
Managing Data Persistence in Mocks
A common hurdle is when a user expects data they created in a POST request to be available in a subsequent GET request.
The solution is to use an in-memory database or a simple state store within your msw directory.
JavaScript
// A simple in-memory state store const userStore = new Map(); export const handlers = [ http.post('/api/users', async ({ request }) => { const user = await request.json(); userStore.set(user.id, user); return HttpResponse.json({ success: true }); }), http.get('/api/users/:id', ({ params }) => { const user = userStore.get(params.id); return user ? HttpResponse.json(user) : new HttpResponse(null, { status: 404 }); }) ];
This pattern turns your mocks from static placeholders into dynamic, interactive simulations of your backend.
Advanced Techniques: Network Condition Simulation
Beyond basic status codes, MSW allows you to manipulate the environment at the protocol level.
Latency Simulation: Use
delay()to test how your UI handles slow connections. Does your loading state work? Does it handle timeouts gracefully?Sequence Interruption: Test how your application recovers if the first API call succeeds but the second one fails.
Concurrent Request Handling: Use MSW to test how your UI handles race conditions where an older request returns after a newer request.
The Cultural Aspect: Shift-Left Testing
The adoption of MSW is not just a technical choice; it's a cultural shift. It encourages "Shift-Left Testing," where frontend developers become more aware of API contracts and data structures. It removes the "backend is blocking me" excuse, empowering frontend teams to take ownership of their testing lifecycle.
In 2026, a frontend developer who understands how to mock their network layer effectively is a force multiplier for any engineering team.
Final Thoughts
The tools we use to build the web change, but the need for reliable, fast, and deterministic tests remains constant. MSW has proven itself over the years, and as we push into the future, its architecture remains relevant. Whether you're working on a simple dashboard or a complex enterprise portal, integrating MSW will help you build faster, break fewer things, and sleep better at night.
JavaScript
import { http, HttpResponse } from 'msw'; export const handlers = [ http.get('/api/v1/user/:id', ({ params }) => { const { id } = params; return HttpResponse.json({ id, name: 'John Doe', role: 'admin', updatedAt: new Date().toISOString() }); }), http.post('/api/v1/login', async ({ request }) => { const body = await request.json(); if (body.password === 'secret') { return new HttpResponse(null, { status: 200 }); } return new HttpResponse(null, { status: 401 }); }) ];
Advanced Testing Patterns for 2026
The maturity of frontend testing in 2026 involves more than just "happy path" testing. We now focus heavily on edge cases, race conditions, and performance degradation simulation.
Simulating Network Instability
One of the most critical aspects of frontend resilience is handling network failures. MSW makes this trivial. By adding a middleware or wrapping the response, you can easily simulate a 500 server error, a 429 rate limit, or a massive latency delay.
Testing State Synchronization
When testing React, Vue, or Svelte components that manage global state, MSW allows you to set the initial state of the world before the component mounts. You can orchestrate a sequence of API calls where the first call sets up data, and subsequent calls reflect changes to that data, effectively testing the lifecycle of state in your application.
Integration Table: MSW Across the Testing Pyramid
Testing Tier | Usage Strategy | Benefit |
Unit Testing | Mocking external services via Vitest | Isolation of business logic |
Integration Testing | Mocking entire API surface for component trees | Verification of data flow and state |
End-to-End Testing | Injecting MSW into Playwright/Cypress | Deterministic E2E suites |
Dev Environment | Using MSW browser worker as a dev server | Rapid prototyping without backend |
Handling Complex Authentication Flows
By 2026, security is no longer an afterthought. Modern applications often use complex OIDC (OpenID Connect) flows, refresh tokens, and granular permission checks. MSW allows you to mock the entire authentication layer.
Instead of authenticating against a real server, you can create a handler for your token endpoint that validates dummy credentials and returns a JWT that your application's auth provider accepts. This allows you to test the protected routes of your application without ever calling the real Auth0 or Okta backend.
The Future of Backend-Agnostic Development
As we look toward 2027 and beyond, the trend of frontend independence will only accelerate. With the rise of Edge Computing and Serverless functions, the boundary between "frontend" and "backend" is blurring. MSW is uniquely positioned because it treats the network as a controllable entity, not a chaotic external dependency.
Best Practices for Maintenance
Keep Handlers Modular: Avoid one massive
handlers.jsfile. Separate them by domain (e.g.,user.handlers.js,orders.handlers.js).Schema Synchronization: Use tools like OpenAPI/Swagger to generate MSW handlers automatically. This ensures your mocks never drift from the actual backend schema.
Use Explicit Mocks: Never rely on global defaults. Every test should be responsible for setting up the specific state it needs.
Mock Service Worker has transformed from a clever hack to an essential pillar of the modern frontend ecosystem. By allowing us to simulate real network behavior without the baggage of a real backend, it has enabled teams to write faster, more reliable, and significantly more maintainable test suites. As you prepare your projects for the challenges of 2026 and beyond, investing time in mastering MSW is one of the highest-leverage decisions you can make for your development workflow.
FAQs
Why is MSW considered the "default" mocking strategy in 2026?
MSW is favored because it intercepts requests at the network level rather than patching internal HTTP libraries like fetch or axios. By registering a Service Worker in the browser and using an interceptor in Node.js, MSW ensures your application code makes the exact same requests it would in production. This approach eliminates the coupling of tests to implementation details and allows the same mock handlers to be reused across unit tests, integration tests, and local development environments.
How does MSW differ from standard library mocking (like vi.mock or jest.mock)?
Traditional mocking often involves monkey-patching your HTTP client (e.g., global.fetch = vi.fn()). This forces you to test the "plumbing" of your application rather than the actual data contract. If you switch libraries (e.g., from axios to fetch), your tests break even if the behavior remains the same. MSW sits at the network boundary, making it agnostic to which library you use. If it sends an HTTP request, MSW intercepts it, meaning your tests focus on how your app responds to API data, not how your code constructs the call.
Can I use MSW for both development and testing?
Yes, that is one of its primary strengths. During local development, you can use MSW to simulate a complete backend before the actual API is ready, which unblocks frontend work. You simply use the same handler files for your development server as you do for your automated test suite. This ensures consistency between what you see while building and what your tests verify.
Does MSW require a real browser to run?
No. While MSW utilizes the Service Worker API for browser environments, it also includes a powerful Node.js interceptor for test runners like Vitest or Jest. This allows you to run tests in a Node-based environment while still intercepting network requests. It effectively bridges the gap between browser behavior and Node-based testing, providing a realistic environment without needing to spin up a full browser instance.
How do I handle different scenarios, such as errors or loading states, with MSW?
MSW handlers are functions that return an HttpResponse. You can easily create multiple handlers for the same endpoint to simulate various outcomes. For example, you can write one handler that returns a 200 OK with valid data, and another that triggers a 404 Not Found or 500 Server Error. Because MSW supports standard Request and Response web APIs, you can mock specific headers, delay responses to simulate network latency, or even mock server-sent events (SSE).
insights
Explore more on AI, Design and Growth

SEO
Google AI & Local SEO: Rank in Both (2026 Guide)
Learn how to optimize content for Google AI search and local SEO simultaneously to rank in AI Overviews, maps, and organic search results.

SEO
Semantic Content Clusters for SEO & AEO (Templates)
Learn how to build semantic content clusters for SEO and AEO. Includes practical templates, internal linking structures, and examples for ranking in AI search.

SEO
How Google AI Search Works: RankBrain to Gemini (2026)
Discover how Google’s AI search evolved from RankBrain to Gemini and what it means for SEO, AI search results, and ranking strategies in 2026.

SEO
Google AI & Local SEO: Rank in Both (2026 Guide)
Learn how to optimize content for Google AI search and local SEO simultaneously to rank in AI Overviews, maps, and organic search results.

SEO
Semantic Content Clusters for SEO & AEO (Templates)
Learn how to build semantic content clusters for SEO and AEO. Includes practical templates, internal linking structures, and examples for ranking in AI search.
get in touch
Ready to Grow From Day One?
Strategy, execution, and digital experiences designed to move together. Fill out the form below and our team will contact you shortly.
get in touch
Ready to Grow From Day One?
Strategy, execution, and digital experiences designed to move together. Fill out the form below and our team will contact you shortly.
get in touch
Ready to Grow From Day One?
Strategy, execution, and digital experiences designed to move together. Fill out the form below and our team will contact you shortly.
Services
We'd love to hear from you.
Tell us what you're building and where you need support.
© 2026 projectsupply AI, Data and Digital Engineering
Company. Pune, India. All rights reserved.
Part of Tangle
Services
We'd love to hear from you.
Tell us what you're building and where you need support.
© 2026 projectsupply AI, Data and Digital Engineering
Company. Pune, India. All rights reserved.
Part of Tangle
Services
We'd love to hear from you.
Tell us what you're building and where you need support.
© 2026 projectsupply AI, Data and Digital Engineering
Company. Pune, India. All rights reserved.
Part of Tangle
