Guide to Platform Engineering
Category
Engineering tools

Guide to Platform Engineering

Siddarth Jain
Apr 2, 2024
10 min read
Do you have noise in your alerts? Install Doctor Droid’s Slack bot to instantly identify noisy alerts.
Read More

Introduction to Guide to Platform Engineering

Platform Engineering is a discipline of software engineering built upon DevOps principles. It aims to enhance each development team’s security, compliance, costs, and speed to business value by improving developer experiences and enabling self-service within a secure, governed framework.

Platform engineering represents both a shift in mindset toward product-based thinking and the adoption of tools and systems to support this approach.

Recently, there has been growing enthusiasm in the industry around platform engineering. Gartner predicts that by 2026, approximately 80% of engineering organizations will have a dedicated platform engineering team.

These teams are responsible for creating internal developer platforms, which, regardless of the domain—whether e-commerce (like Shopify, Magento), cloud services (like AWS, Google Cloud), or customer support (like Zendesk, Freshdesk)—are inherently designed to scale and accelerate the delivery of business value.

In this article, we will explore platform engineering's role in enhancing developer productivity and streamlining operations. This blog also offers practical insights for adopting these practices and staying current with industry trends.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Evolution of the Industry From Sys Admins to DevOps to Platform Engineering

The evolution from Sys Admins to DevOps and now to Platform Engineering reflects the growing complexity and demands of modern software development. Initially, Sys Admins were responsible for manually managing infrastructure, a process that was often slow and prone to human error.

As systems became more complex, the need for automation led to the rise of DevOps, which emphasized automating repetitive tasks, improving collaboration between development and operations teams, and speeding up deployment processes.

However, as automation became the norm, the next challenge emerged: enabling self-service for development teams. This is where Platform Engineering comes in.

Platform engineers focus on building and maintaining internal platforms that give developers easy access to the tools and infrastructure they need. By creating these self-service platforms, platform engineers empower development teams to deploy, test, and monitor applications independently, reducing bottlenecks and allowing for faster, more efficient workflows.

This transition marks a significant shift towards more scalable, developer-friendly environments in the tech industry.

What is the job of a Platform Engineer?

A Platform Engineer is responsible for designing, building, and maintaining the foundational technology infrastructure that supports the development and deployment of software applications.

They play a crucial role in ensuring that development teams have the tools, environments, and processes needed to deliver high-quality software efficiently and reliably.

Here's an overview of what a Platform Engineer, particularly an Infrastructure Platform Engineer, typically handles:

Part 1 — Infrastructure Platform Engineer

  1. Product Builds & Deployments

It refer to the processes involved in compiling, assembling, and releasing software products to various environments, such as development, staging, and production.

The aim is to automate and optimize these processes to ensure that code changes are deployed rapidly and safely, minimizing the risk of introducing errors into the live environment.

a. Canary Deployments

  • Definition: A canary deployment is a strategy where a new version of an application is gradually rolled out to a small subset of users before being released to the entire user base. This allows teams to monitor the performance and stability of the new release in a controlled environment.
  • Purpose: The primary purpose of canary deployments is to minimize the impact of potential issues in new releases. By initially exposing the new version to only a small group of users, teams can identify and fix problems before they affect all users.
  • Implementation: Typically, a small percentage of traffic is routed to the new version, while the majority of users continue to use the existing stable version. If no issues are detected, the deployment is gradually expanded to the entire user base.

b. Post-deployment Monitoring

  • Definition: Post-deployment monitoring involves tracking the performance, stability, and overall health of an application after it has been deployed to production. This includes monitoring key metrics such as response times, error rates, and resource usage.
  • Purpose: The goal is to quickly identify and resolve any issues that arise after deployment, ensuring that the application continues to meet performance and reliability standards.
  • Tools and Techniques: Common tools used for post-deployment monitoring include application performance monitoring (APM) solutions, log management systems, and alerting frameworks. These tools provide real-time insights into the application's behavior and help teams respond quickly to incidents.

2. Observability

Observability is a critical aspect of platform engineering, focusing on providing insights into the internal state of a system by analyzing its outputs, such as logs, metrics, and traces.

Effective observability helps teams understand how their applications are performing, detect issues early, and maintain the overall health and reliability of their systems.

a. Auto-instrumentation

  • Definition: Auto-instrumentation refers to the automated process of collecting metrics, logs, and traces from applications without requiring developers to manually insert instrumentation code. This enables seamless observability across services without adding extra burden on the development teams.
  • Purpose: The primary purpose of auto-instrumentation is to ensure comprehensive coverage of observability data, allowing teams to monitor applications in real time and gain actionable insights with minimal manual effort.
  • Implementation: Tools like OpenTelemetry provide frameworks for auto-instrumentation, which can automatically capture relevant data across various components of an application, including HTTP requests, database queries, and service interactions.

b. Data Standardization

  • Definition: Data standardization in the context of observability involves creating consistent formats and schemas for the data collected from different parts of the system. This ensures that logs, metrics, and traces are structured uniformly, making it easier to aggregate, analyze, and interpret the data.
  • Purpose: Standardizing observability data is crucial for accurate monitoring and alerting. It allows different teams to speak the same "language" when it comes to analyzing system behavior, thereby improving collaboration and reducing errors in diagnosis.
  • Implementation: Data standardization can be achieved by adopting common data formats (like JSON or protobuf), using shared libraries for logging and metrics, and enforcing schema consistency across services.

c. Practice Standardization

  • Definition: Practice standardization refers to the establishment of uniform procedures and best practices for implementing observability across teams and services. This includes defining how and where to instrument code, setting thresholds for alerts, and determining the tools and processes for monitoring and incident response.
  • Purpose: The goal of practice standardization is to ensure consistency and reliability in how observability is applied across the organization. This reduces the variability in monitoring setups and enhances the ability to respond to issues systematically.
  • Implementation: To standardize observability practices, organizations might create playbooks, develop centralized guidelines, and provide training for teams. This can also involve integrating observability practices into CI/CD pipelines and establishing governance frameworks to ensure adherence to standards.

Together, Auto-instrumentation, Data Standardization, and Practice Standardization form the backbone of a robust observability strategy in platform engineering. These elements ensure that systems are monitored effectively, issues are detected early, and teams can maintain high levels of reliability and performance across their applications.

3. Tooling for On-call Teams

Tooling for On-call Teams refers to the set of tools and systems designed to support the engineers responsible for monitoring, responding to, and resolving incidents during their on-call shifts.

Effective tooling is crucial to ensure that on-call teams can act quickly and efficiently when issues arise, minimizing downtime and maintaining system reliability.

  • Incident Management Tools: Tools like PagerDuty, Opsgenie, or VictorOps are used to manage and automate alerting, ensuring that the right person is notified when an incident occurs. These tools often integrate with monitoring and observability systems to trigger alerts based on predefined conditions.
  • Runbooks and Playbooks: Providing on-call teams with standardized runbooks or playbooks helps them quickly respond to incidents. These documents typically outline the steps to troubleshoot and resolve common issues, ensuring a consistent response across different team members.
  • ChatOps: Integrating incident response tools with communication platforms like Slack or Microsoft Teams (ChatOps) allows on-call engineers to manage incidents directly from their chat interface, streamlining the coordination and response process.
  • Post-Incident Analysis: Tools that support post-incident reviews (e.g., Blameless or Jira) help teams analyze what went wrong and identify improvements for the future, ensuring continuous learning and improvement.

4. Developer ExperienceDeveloper Experience (DX) encompasses the overall experience that developers have when interacting with tools, platforms, and processes within an organization. A positive developer experience is key to improving productivity, reducing frustration, and retaining top engineering talent.Here are the key aspects that contribute to a positive and efficient environment for developers within an organization.

  • Self-Service Platforms: Providing developers with self-service capabilities (e.g., internal developer platforms) allows them to manage infrastructure, deploy applications, and access resources without needing to wait for other teams. This reduces friction and accelerates development cycles.
  • Integrated Development Environments (IDEs): IDEs that are well-integrated with the organization's tools and platforms can significantly enhance DX. Plugins and extensions that streamline tasks like debugging, testing, and deployment directly from the IDE contribute to a smoother workflow.
  • Documentation and Support: Comprehensive and accessible documentation, along with readily available support, is crucial for a positive DX. Developers need clear guidance on how to use tools and services effectively, reducing the learning curve and minimizing roadblocks.
  • Feedback Loops: Providing developers with quick and actionable feedback on their work, whether through automated testing, code reviews, or performance monitoring, helps them iterate faster and maintain high-quality standards.

5. Dev, Staging, and Prod EnvironmentsDev, Staging, and Prod Environments are the different stages of an application's lifecycle, each serving a distinct purpose in the development and deployment process.

  • Development Environment (Dev): The development environment is where developers write and test their code. This environment is typically local or isolated, allowing developers to experiment and make changes without affecting other environments. It’s critical to ensure that the dev environment is easy to set up and mirrors production as closely as possible to avoid discrepancies later in the process.
  • Staging Environment (Staging): The staging environment is a replica of the production environment where final testing occurs before deployment. It allows teams to catch any issues that might not have been detected in development, ensuring that the application will behave as expected in production. Staging is often used for user acceptance testing (UAT) and performance testing.
  • Production Environment (Prod): The production environment is the live environment where the application is accessible to end-users. It’s the most critical environment, requiring robust monitoring, security, and backup strategies to ensure high availability and reliability. Deployments to production are typically managed through automated pipelines that ensure only thoroughly tested code reaches this environment.

6. Testing AutomationTesting Automation involves using automated tools and scripts to perform various types of tests on software applications, ensuring that they meet quality standards without requiring manual intervention.

  • Unit Testing: Unit tests focus on individual components of the code, ensuring that each function or method works as expected. Automated unit testing is essential for catching issues early in the development process.
  • Integration Testing: Integration tests verify that different modules or services work together as intended. Automation tools can simulate interactions between components to ensure they integrate correctly.
  • End-to-End Testing: End-to-end (E2E) tests assess the entire application’s functionality from start to finish. Automation tools like Selenium or Cypress can simulate user interactions with the application, ensuring that all parts work together seamlessly.
  • Continuous Testing: As part of continuous integration/continuous deployment (CI/CD) pipelines, continuous testing ensures that tests are run automatically whenever new code is committed. This approach helps identify and fix issues quickly, maintaining a high standard of quality throughout the development lifecycle.

7. Internal Developer Platform (IDP)An Internal Developer Platform (IDP) is a set of tools, processes, and workflows that are designed to provide developers within an organization with the infrastructure and resources they need to build, deploy, and manage software efficiently.a. Self-service Infrastructure Management

  • Definition: Self-service infrastructure management allows developers to independently provision, configure, and manage the infrastructure resources they need, such as servers, databases, and networking components. This is done without requiring intervention from dedicated infrastructure or operations teams.
  • Purpose: The primary purpose is to reduce bottlenecks and delays in the development process by giving developers the autonomy to manage their own environments. This approach accelerates development cycles and allows teams to respond more quickly to changing requirements.
  • Implementation: Typically, self-service infrastructure management is implemented through user-friendly interfaces, APIs, or command-line tools that abstract the complexity of underlying infrastructure.

Examples include Kubernetes for container management or Terraform for infrastructure as code (IaC).b. Centralized Documentation & Navigation

  • Definition: Centralized documentation and navigation refer to the creation of a unified repository where all documentation, guides, and resources related to the internal developer platform are stored and easily accessible. This might include technical documentation, API references, usage guides, and architectural diagrams.
  • Purpose: The goal is to provide developers with a single source of truth that simplifies the process of finding and understanding the tools, systems, and processes they need to use. Centralized documentation reduces the time developers spend searching for information and ensures consistency across teams.
  • Implementation: This is often implemented using documentation platforms like Confluence, GitHub Pages, or custom-built portals that integrate with the internal developer platform. Navigation is enhanced by providing search capabilities, categorization, and intuitive interfaces.

c. Service Catalogs & Scorecards

  • Definition: Service catalogs and scorecards provide developers with an overview of the services, APIs, and resources available within the organization.

Backstage, an open-source platform developed by Spotify is a popular choice for implementing these catalogs.

  • Purpose: The purpose of service catalogs is to help developers discover, access, and utilize internal services efficiently. Scorecards provide metrics and feedback on the health, performance, and compliance of these services, helping teams maintain quality and reliability.
  • Implementation: Backstage serves as a platform where service catalogs and scorecards are centrally managed, allowing developers to explore available services, view documentation, and track key metrics. This helps in maintaining transparency and governance across all deployed services within the platform.

An Internal Developer Platform that integrates self-service infrastructure management, centralized documentation, and service catalogs like Backstage provides a comprehensive ecosystem that not only enhances developer productivity but also ensures alignment with organizational standards and goals.

Part 2 — Data Platform Engineer

A Data Platform Engineer is responsible for building and maintaining the data infrastructure that powers analytics, reporting, and data-driven decision-making across an organization.

This role is crucial in ensuring that data is accessible, reliable, and usable for various teams, including those requiring real-time analytics, low-latency processing, and handling long-running jobs.

Here’s an overview of the key responsibilities and considerations for a Data Platform Engineer:

1. Data Infrastructure and Operations

  • Responsibility: Develops and manages the complex infrastructure required for storing, processing, and analyzing large volumes of data. This includes databases, data lakes, ETL pipelines, and data warehouses.
  • Goal: To ensure that the organization’s data infrastructure is robust, scalable, and capable of supporting current and future data needs.
  • Complexity: Data infrastructure is often more complex than general infrastructure due to the unique challenges associated with managing and processing large-scale data, necessitating specialized knowledge and dedicated teams.

2. Architectural Decisions

  • Responsibility: Makes critical architectural decisions regarding the tools, technologies, and frameworks that will form the backbone of the data platform. These decisions require a deep understanding of both the current technology landscape and the specific needs of the organization.
  • Goal: To design a data platform that is both efficient and adaptable, capable of handling a wide range of data-related tasks, from low-latency needs to long-running analytics jobs.
  • Maturity Gap: Unlike infrastructure teams, where technology choices are often well-established, data platform teams face a rapidly evolving landscape with many nascent technologies. Making informed decisions requires a balance of experimentation and risk management.

3. Requirements Gathering and Analysis

  • Responsibility: Collaborates with other engineering teams to understand their data-related needs, such as low latency, real-time analytics, and long-running jobs. These requirements often dictate the choice of technology and architectural patterns.
  • Goal: To gather a comprehensive understanding of the organization’s data needs, ensuring that the chosen solutions are aligned with these requirements.
  • Decision-Making: The team must evaluate various technologies (e.g., ClickHouse, DBx) to determine the most optimal solutions for specific use cases. This involves weighing factors like performance, scalability, and ease of use.

4. Technology Evaluation and Implementation

  • Responsibility: Evaluate emerging technologies to determine their suitability for the organization’s needs. This may involve running pilot projects, conducting performance benchmarks, and assessing the long-term viability of new tools.
  • Goal: To stay ahead of technological advancements and integrate the most effective tools into the data platform, ensuring that it remains competitive and capable of meeting evolving demands.

For instance, deciding between technologies like ClickHouse for low-latency analytics or DBx for broader data management needs, considering factors like speed, cost, and ease of integration.

5. Enabling Seamless Access to Technologies

  • Responsibility: Ensures that other teams within the organization have easy access to the data platform and the technologies it comprises. This involves creating self-service tools, APIs, and documentation that make it easy for teams to leverage the data infrastructure.
  • Goal: To democratize data access across the organization, enabling teams to build data-driven applications and insights without needing deep expertise in data infrastructure.
  • Self-Service Model: Similar to the Infrastructure Platform Engineer, the Data Platform Engineer focuses on creating a self-service model where teams can independently manage their data needs, reducing dependencies and increasing agility.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Planning Projects for Platform Engineering Teams

When planning projects for Platform Engineering teams, it’s essential to focus on the needs of your internal customers—primarily the developers within your organization.

Unlike consumer-facing teams, the goal of a Platform Engineering team is to create and maintain tools, services, and infrastructure that streamline and enhance the development process.

Here’s a structured approach to planning these projects:

1. Identify Your Customer

  • Who Are They?: Your primary customers are the developers and engineers within your organization. They rely on the platform team to provide the infrastructure, tools, and services they need to build, test, and deploy software efficiently.
  • Understanding Their Role: These internal customers are focused on delivering features, improving product quality, and reducing time to market. Your role is to remove friction from their workflows and empower them to achieve their goals.

2. Understand Their Needs

  • Engage Directly with Developers: Regularly communicate with developers to understand their pain points. This could be through surveys, one-on-one meetings, or informal conversations.

Ask specific questions like:

  • Where did you get stuck most last week?
  • What tasks are taking up most of your time?
  • Are there any tools or processes that you find particularly frustrating or slow?
  • Example Problems:
    • Observability Improvement: Developers may struggle with monitoring and debugging their applications due to inadequate observability tools. They might need better logging, tracing, or alerting systems to quickly diagnose issues.
    • Kafka Topic Management: Developers working with event-driven architectures might find it difficult to spin up and manage Kafka topics efficiently. They may need tools that simplify this process, allowing them to focus on application logic rather than infrastructure management.
    • Environment Consistency: Developers might face challenges with inconsistent development, staging, and production environments, leading to “it works on my machine” issues. They might need automated tools to ensure environmental consistency.

3. Prioritize Based on Impact

  • Assess the Impact: Evaluate the potential impact of solving each identified problem. Consider how many developers are affected, how much time is wasted, and how critical the problem is to the overall development process.
  • Cost-Benefit Analysis: Analyze the cost of implementing a solution against the benefits it will bring. Consider not only the financial cost but also the time and effort required. Ensure that the investment is justified by the improvements in developer productivity and satisfaction.
  • Budget Considerations: Understand the budget available for these projects. Determine if the solutions you are considering are cost-effective and whether they can be implemented within the financial constraints of your organization.

4. Develop a Project Plan

  • Define Objectives: Clearly outline the goals of the project. What specific problems are you solving, and what outcomes do you expect? How will you measure success?
  • Scope of the Project: Determine the scope of the project, including the features and functionality that will be delivered. Ensure that the project is manageable and that the scope is aligned with the available resources and timelines.
  • Resource Allocation: Assign the necessary resources, including team members, tools, and budget. Ensure that the team has the skills and knowledge required to successfully complete the project.
  • Timeline and Milestones: Establish a timeline for the project with key milestones. This helps in tracking progress and ensuring that the project stays on schedule.

5. Implementation and Feedback Loop

  • Iterative Development: Adopt an iterative approach to project development. Start with a minimum viable product (MVP) and gradually build out additional features based on feedback from developers.
  • Continuous Feedback: Establish a feedback loop with your internal customers. After each release or iteration, gather feedback to understand if the solution is meeting their needs and where further improvements can be made.
  • Adjust and Improve: Use the feedback to make adjustments and improvements to the project. This ensures that the final product is well-aligned with the developers’ needs and effectively solves their problems.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Identify Your Customer

  • Who Are They?: Your primary customers are the developers and engineers within your organization. They rely on the platform team to provide the infrastructure, tools, and services they need to build, test, and deploy software efficiently.
  • Understanding Their Role: These internal customers are focused on delivering features, improving product quality, and reducing time to market. Your role is to remove friction from their workflows and empower them to achieve their goals.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Understand Their Needs

  • Engage Directly with Developers: Regularly communicate with developers to understand their pain points. This could be through surveys, one-on-one meetings, or informal conversations.

Ask specific questions like:

  • Where did you get stuck most last week?
  • What tasks are taking up most of your time?
  • Are there any tools or processes that you find particularly frustrating or slow?
  • Example Problems:
    • Observability Improvement: Developers may struggle with monitoring and debugging their applications due to inadequate observability tools. They might need better logging, tracing, or alerting systems to quickly diagnose issues.
    • Kafka Topic Management: Developers working with event-driven architectures might find it difficult to spin up and manage Kafka topics efficiently. They may need tools that simplify this process, allowing them to focus on application logic rather than infrastructure management.
    • Environment Consistency: Developers might face challenges with inconsistent development, staging, and production environments, leading to “it works on my machine” issues. They might need automated tools to ensure environmental consistency.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Prioritize Based on Impact

  • Assess the Impact: Evaluate the potential impact of solving each identified problem. Consider how many developers are affected, how much time is wasted, and how critical the problem is to the overall development process.
  • Cost-Benefit Analysis: Analyze the cost of implementing a solution against the benefits it will bring. Consider not only the financial cost but also the time and effort required. Ensure that the investment is justified by the improvements in developer productivity and satisfaction.
  • Budget Considerations: Understand the budget available for these projects. Determine if the solutions you are considering are cost-effective and whether they can be implemented within the financial constraints of your organization.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

AI-Based Recommendations To Fix

  • Proactive Problem Solving: AI-driven insights can forecast potential issues before they escalate, allowing for preemptive action that can conserve resources.
  • Learning and Adaptation: AI models learn from past incidents and refine their predictions and suggestions over time, providing increasingly relevant insights tailored to your environment.
  • Reduced Error Rates: With AI recommendations, teams resolve errors faster and enhance their coding by understanding and addressing underlying issues. This leads to fewer errors, improving overall code quality and reliability.

Focusing on these essential features can help you choose a tool that fits your current requirements and grows with your development needs. This will ensure your applications run smoothly and continue to meet user expectations effectively.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Develop a Project Plan

  • Define Objectives: Clearly outline the goals of the project. What specific problems are you solving, and what outcomes do you expect? How will you measure success?
  • Scope of the Project: Determine the scope of the project, including the features and functionality that will be delivered. Ensure that the project is manageable and that the scope is aligned with the available resources and timelines.
  • Resource Allocation: Assign the necessary resources, including team members, tools, and budget. Ensure that the team has the skills and knowledge required to successfully complete the project.
  • Timeline and Milestones: Establish a timeline for the project with key milestones. This helps in tracking progress and ensuring that the project stays on schedule.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Implementation and Feedback Loop

  • Iterative Development: Adopt an iterative approach to project development. Start with a minimum viable product (MVP) and gradually build out additional features based on feedback from developers.
  • Continuous Feedback: Establish a feedback loop with your internal customers. After each release or iteration, gather feedback to understand if the solution is meeting their needs and where further improvements can be made.
  • Adjust and Improve: Use the feedback to make adjustments and improvements to the project. This ensures that the final product is well-aligned with the developers’ needs and effectively solves their problems.

💡 Pro Tip

While choosing the right monitoring tools is crucial, managing alerts across multiple tools can become overwhelming. Modern teams are using AI-powered platforms like Dr. Droid to automate cross-tool investigation and reduce alert fatigue.

Ready to simplify your observability stack?

Dr. Droid works with your existing tools to automate alert investigation and diagnosis.
Start Free POC →

Conclusion

When planning projects for Platform Engineering teams, the focus should always be on understanding and addressing the needs of your developers.

By engaging with them directly, prioritizing based on impact, conducting a thorough cost-benefit analysis, and continuously iterating based on feedback, you can deliver solutions that significantly enhance their productivity and satisfaction.

Remember, the success of a Platform Engineering team is measured by how effectively it empowers the development teams to build and deploy high-quality software.

Want to reduce alerts and fix issues faster?
Managing multiple tools? See how Dr. Droid automates alert investigation across your stack

Table of Contents

Made with ❤️ in Bangalore & San Francisco 🏢

Doctor Droid