From f05661235c4d3fea9710fc89403efa0c215c9068 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:27:02 +0100 Subject: [PATCH 01/12] new Ahrefs success story --- data/success_stories/ahrefs.md | 68 +++++++++++++++++++++++------ src/ocamlorg_web/lib/redirection.ml | 1 + 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 667f3b4e8a..743764cdb8 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -1,30 +1,72 @@ --- -title: Peta-Byte Scale Web Crawler +title: Marketing Analysis Tools Powered by Big Data logo: success-stories/ahrefs.svg card_logo: success-stories/white/ahrefs.svg background: /success-stories/ahrefs-bg.jpg theme: blue -synopsis: "Ahrefs crawls the entire internet constantly to collect, process, and store data to build an all-in-one SEO toolkit." +synopsis: "Ahrefs leverags OCaml to achieve massive scalability, processing billions of daily frontend and backend requests, running a peta-byte scale web crawler, while maintaining a lean, efficient team." url: https://ahrefs.com/ priority: 2 +why_ocaml_reasons: +- Type Safety +- Unified Technology Stack +- Expressiveness and Reliability +- Integration with JavaScript Ecosystem +- Customizability +- Scalability --- -Ahrefs develops custom distributed petabyte-scale storage and runs an internet-wide crawler to index the entire Web. The company also builds various analytical services for end users. Ahrefs’s data processing system uses OCaml as its primary language, which currently processes up to 6 billion pages a day, and they also use OCaml for their website’s backend. Ahrefs has a multinational team with roots in the Ukraine, an office in Singapore, and remote collaborators all around the world. - ## Challenge -Ahrefs runs with a relatively small team compared to the size of the task at hand. Indexing the web is very expensive and requires considerable resources, both humans and machines. Turning petabytes of data into something intelligible on the fly is also a big challenge. It’s necessary to build processes running fast, 24/7, with as little maintenance as possible and scarce human resources. +Ahrefs has always been committed to operational efficiency and self-reliance, even as it grew to become a leader in the SEO industry. Unlike many VC-funded companies, Ahrefs has chosen to prioritize maintaining a small, focused team while achieving exceptional output. However, this approach came with its own set of challenges. + +In 2017, the state of technology presented significant limitations. JavaScript tooling was far from ideal, offering poor editor integration and limited safety features, which hindered developer productivity. Similarly, the PHP and jQuery stack being used lacked the structure and robustness of a modern frontend framework. This resulted in inefficiencies and created communication barriers between frontend and backend teams. + +Another challenge was scaling operations while keeping the team small. Ahrefs needed a cohesive and type-safe technology stack that worked seamlessly across the frontend and backend, ensuring confidence in the codebase and maintaining a high standard of output without the need to hire excessively. + +Finally, the lack of a direct connection between the frontend and backend often required backend engineers to manually create APIs, leading to delays and inefficiencies in delivering features. To address these challenges, Ahrefs sought a solution that could empower their lean team to work more effectively, with minimal friction and strong collaboration between all parts of the stack. + +## Result + +Adopting OCaml was a transformative decision for Ahrefs, enabling the company to overcome its challenges and significantly improve operations. By transitioning the entire frontend team from PHP and jQuery to OCaml, supported by Melange and React, Ahrefs achieved a full-stack evolution. + +One of the most impactful outcomes was the ability to share data types between the frontend and backend. This streamlined development processes, reduced friction, and allowed engineers to contribute meaningfully across the entire stack. With this new technology foundation, Ahrefs not only maintained but significantly scaled its operations. + +Today, Ahrefs’ systems handle **5 billion frontend requests per day** and process a staggering **500 billion backend requests per day**. The codebase powering this scale has grown to **1.5 million lines of OCaml code**, underscoring the robustness and scalability of their technology stack. These advancements have helped Ahrefs become a trusted industry leader, relied upon by **44% of Fortune 500 companies**. +For more up-to-date statistics, see [Ahrefs' statistics and metrics page](https://ahrefs.com/big-data). + +## Why OCaml + +Ahrefs chose OCaml as the backbone of its technology stack because of its unique ability to combine expressiveness and reliability. The language allowed developers to write concise, efficient code that remained stable over the long term, with systems often running for years without surprises. + +One of the key reasons for selecting OCaml was its versatility in enabling a unified technology stack. The ability to use shared types between frontend and backend eliminated redundant work, improved collaboration, and ensured consistency across the board. Additionally, OCaml’s robust type system provided engineers with a high degree of confidence in their code, significantly reducing errors and simplifying maintenance. + +OCaml’s ecosystem, especially with the introduction of Melange (formerly BuckleScript), allowed Ahrefs to bridge the gap between OCaml’s strong typing and the flexibility of the JavaScript ecosystem. Initially adopted for backend crawling, OCaml’s utility expanded to the frontend when Melange made it possible to compile OCaml to JavaScript. This pivotal decision empowered Ahrefs to create tools that made their vast datasets more accessible and actionable. ## Solution -Ahrefs went with OCaml for data processing at the scale of the Web. The company was in its infancy with a limited number of employees and little financial resources. The language provided a combination of qualities hard to find elsewhere: -- Native compilation -- High-level types for clear expression and compact code -- Solid and stable compiler -- Empathy for industrial users +OCaml addresses Ahrefs’ challenges, providing the tools needed to build a cohesive, scalable, and efficient technology stack. One of the most impactful features was its end-to-end type safety. Using tools like ATD, Ahrefs generated shared types for both frontend and backend development, ensuring consistency and reducing the likelihood of bugs. + +OCaml’s expressiveness allows Ahrefs to avoid relying on bloated, one-size-fits-all frameworks. Instead, the team could craft solutions tailored to their specific needs, resulting in more efficient and maintainable systems. This customization extended to their tech stack, which seamlessly integrated OCaml with complementary technologies like Melange, React, Clickhouse, MySQL, and Elasticsearch. + +The unified OCaml stack also fosters a more collaborative environment. By allowing all engineers to contribute across domains, Ahrefs broke down silos and improved overall productivity. The result was a streamlined development process that enabled the company to maintain high standards of output while keeping its team small and focused. + +## Lessons Learned + +Ahrefs’ journey with OCaml provides valuable insights for other companies considering a similar path: + +1. **Embrace Simplicity:** OCaml’s type system is intuitive yet powerful, enabling developers to build expressive and reliable applications without unnecessary complexity. +2. **Invest in Learning:** Training the team in OCaml is essential but rewarding. Tools like the Melange playground can make the onboarding process smoother and more approachable. +3. **Build Tailored Solutions:** By leveraging OCaml’s expressiveness, Ahrefs avoided generic frameworks in favor of custom-built solutions that addressed their unique needs. While this approach requires more ownership, it results in greater efficiency and precision. +4. **Anticipate Challenges with Bindings:** Writing bindings can be complex, but resources from the Melange community simplify this process. +5. **Adopt Gradually:** Starting with small contributions to libraries or limited integrations can help teams build confidence before transitioning fully to OCaml. -As the company grew and expanded its service offerings, they took the opportunity to write its website in OCaml (native OCaml for the backend, ReasonML for the frontend). This bold choice gave them a unique advantage. Thanks to the types shared across the entire stack, they can safely reason about data, from creation to final consumption. +## Open Source -## Results +Ahrefs is proud to support the OCaml ecosystem by contributing tools and libraries that benefit the broader community. These contributions include: -Ahrefs turns billions of websites into data, first stored into over 100PB of storage and then into valuable information for tens of thousands of customers worldwide. As the internet is becoming an increasingly competitive place, Ahrefs provides a vital service for companies running a business on the web. Ahrefs managed to face this challenge while keeping the company lean and efficient. +- **[Melange Recharts](https://github.com/ahrefs/melange-recharts):** Recharts bindings for Melange. +- **[Ahrefs DevKit](https://github.com/ahrefs/devkit):** A suite of internal tools and utilities. +- **[Melange Bindings](https://github.com/melange-community/bindings):** A community-driven resource for bindings. +- **[Melange JSON PPX](https://github.com/ahrefs/melange-json-ppx):** A replacement for the ATD runtime in BuckleScript. +- **[OCaml Community Tools](https://github.com/ocaml-community):** Contributions to widely used tools like `ocurl` and `ocaml-mariadb`. diff --git a/src/ocamlorg_web/lib/redirection.ml b/src/ocamlorg_web/lib/redirection.ml index e24294c4de..1a8c92b95a 100644 --- a/src/ocamlorg_web/lib/redirection.ml +++ b/src/ocamlorg_web/lib/redirection.ml @@ -327,6 +327,7 @@ let from_v2 = ("/docs/platform-principles", Url.tool_page "platform-principles"); ("/docs/platform-users", Url.tool_page "platform-users"); ("/docs/platform-roadmap", Url.tool_page "platform-roadmap"); + ("/success-stories/peta-byte-scale-web-crawler", Url.success_story "marketing-analysis-tools-powered-by-big-data"); ] let make ?(permanent = false) t = From 8ffff2aae86a8f1c04a7c3ce7aaa48c79669259e Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:42:01 +0100 Subject: [PATCH 02/12] fmt --- src/ocamlorg_web/lib/redirection.ml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ocamlorg_web/lib/redirection.ml b/src/ocamlorg_web/lib/redirection.ml index 1a8c92b95a..4dec52227b 100644 --- a/src/ocamlorg_web/lib/redirection.ml +++ b/src/ocamlorg_web/lib/redirection.ml @@ -327,7 +327,8 @@ let from_v2 = ("/docs/platform-principles", Url.tool_page "platform-principles"); ("/docs/platform-users", Url.tool_page "platform-users"); ("/docs/platform-roadmap", Url.tool_page "platform-roadmap"); - ("/success-stories/peta-byte-scale-web-crawler", Url.success_story "marketing-analysis-tools-powered-by-big-data"); + ( "/success-stories/peta-byte-scale-web-crawler", + Url.success_story "marketing-analysis-tools-powered-by-big-data" ); ] let make ?(permanent = false) t = From 379da4d287bbd76779d51f26dfd332999e06ebc0 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:02:35 +0100 Subject: [PATCH 03/12] Update data/success_stories/ahrefs.md Co-authored-by: Louis --- data/success_stories/ahrefs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 743764cdb8..ad4e932631 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -1,5 +1,5 @@ --- -title: Marketing Analysis Tools Powered by Big Data +title: Marketing Intelligence Tools Powered by Big Data logo: success-stories/ahrefs.svg card_logo: success-stories/white/ahrefs.svg background: /success-stories/ahrefs-bg.jpg From 443eb0fa5e9a5a98a04e9c9960d6e89c332bfeb1 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:02:50 +0100 Subject: [PATCH 04/12] Update data/success_stories/ahrefs.md Co-authored-by: Louis --- data/success_stories/ahrefs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index ad4e932631..c4609fa00e 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -4,7 +4,7 @@ logo: success-stories/ahrefs.svg card_logo: success-stories/white/ahrefs.svg background: /success-stories/ahrefs-bg.jpg theme: blue -synopsis: "Ahrefs leverags OCaml to achieve massive scalability, processing billions of daily frontend and backend requests, running a peta-byte scale web crawler, while maintaining a lean, efficient team." +synopsis: "Ahrefs leverages OCaml to achieve massive scalability, processing billions of daily requests, running a peta-byte scale web crawler, while maintaining a lean, efficient team." url: https://ahrefs.com/ priority: 2 why_ocaml_reasons: From 8c0a39be21d578ac2e05e15fa8a8582001b09c37 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:04:24 +0100 Subject: [PATCH 05/12] Update data/success_stories/ahrefs.md Co-authored-by: Louis --- data/success_stories/ahrefs.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index c4609fa00e..5ed25a114b 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -9,11 +9,12 @@ url: https://ahrefs.com/ priority: 2 why_ocaml_reasons: - Type Safety -- Unified Technology Stack - Expressiveness and Reliability +- Unified Technology Stack - Integration with JavaScript Ecosystem - Customizability - Scalability +- Performance --- ## Challenge From f627be1a2de41438ffe9328d94136aea5e8bf264 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:04:38 +0100 Subject: [PATCH 06/12] clarification --- data/success_stories/ahrefs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 5ed25a114b..34113edb73 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -4,7 +4,7 @@ logo: success-stories/ahrefs.svg card_logo: success-stories/white/ahrefs.svg background: /success-stories/ahrefs-bg.jpg theme: blue -synopsis: "Ahrefs leverages OCaml to achieve massive scalability, processing billions of daily requests, running a peta-byte scale web crawler, while maintaining a lean, efficient team." +synopsis: "Ahrefs leverages OCaml to achieve massive scalability, processing billions of daily requests, running the third biggest web crawler in the world, while maintaining a lean, efficient team." url: https://ahrefs.com/ priority: 2 why_ocaml_reasons: From a15508c53bb32f68c0117b79895a80ed224acd2f Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:06:08 +0100 Subject: [PATCH 07/12] Update data/success_stories/ahrefs.md Co-authored-by: Louis --- data/success_stories/ahrefs.md | 1 - 1 file changed, 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 34113edb73..86f56dfae4 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -21,7 +21,6 @@ why_ocaml_reasons: Ahrefs has always been committed to operational efficiency and self-reliance, even as it grew to become a leader in the SEO industry. Unlike many VC-funded companies, Ahrefs has chosen to prioritize maintaining a small, focused team while achieving exceptional output. However, this approach came with its own set of challenges. -In 2017, the state of technology presented significant limitations. JavaScript tooling was far from ideal, offering poor editor integration and limited safety features, which hindered developer productivity. Similarly, the PHP and jQuery stack being used lacked the structure and robustness of a modern frontend framework. This resulted in inefficiencies and created communication barriers between frontend and backend teams. Another challenge was scaling operations while keeping the team small. Ahrefs needed a cohesive and type-safe technology stack that worked seamlessly across the frontend and backend, ensuring confidence in the codebase and maintaining a high standard of output without the need to hire excessively. From ecc7aa2ed9c5d7a0f124b7b0362114754a6d2f73 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:06:18 +0100 Subject: [PATCH 08/12] Update data/success_stories/ahrefs.md Co-authored-by: Louis --- data/success_stories/ahrefs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 86f56dfae4..05e091f299 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -22,9 +22,9 @@ why_ocaml_reasons: Ahrefs has always been committed to operational efficiency and self-reliance, even as it grew to become a leader in the SEO industry. Unlike many VC-funded companies, Ahrefs has chosen to prioritize maintaining a small, focused team while achieving exceptional output. However, this approach came with its own set of challenges. -Another challenge was scaling operations while keeping the team small. Ahrefs needed a cohesive and type-safe technology stack that worked seamlessly across the frontend and backend, ensuring confidence in the codebase and maintaining a high standard of output without the need to hire excessively. +One major challenge was maintaining high-quality standards across the codebase. Ahrefs needed a cohesive and type-safe technology stack that worked seamlessly across the frontend and backend, enabling developers to write reliable code with confidence and ensuring a consistent, high-quality output. -Finally, the lack of a direct connection between the frontend and backend often required backend engineers to manually create APIs, leading to delays and inefficiencies in delivering features. To address these challenges, Ahrefs sought a solution that could empower their lean team to work more effectively, with minimal friction and strong collaboration between all parts of the stack. +Another challenge was scaling operations. The lack of a integration between the different bricks often required teams to wait on one another, needing collaboration to create APIs, leading to delays and inefficiencies in delivering features. The team was looking for a unified stack, empowering all engineers to contribute to any part of the stack, reducing bottlenecks, increasing ownership and business knowledge, while maintaining a high trust in the final result. ## Result From 997fc1cc0fb074e5b52a701b406418632144ea42 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:07:27 +0100 Subject: [PATCH 09/12] be more vague on number of requests frontend/backend --- data/success_stories/ahrefs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 05e091f299..0c611a9434 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -32,7 +32,7 @@ Adopting OCaml was a transformative decision for Ahrefs, enabling the company to One of the most impactful outcomes was the ability to share data types between the frontend and backend. This streamlined development processes, reduced friction, and allowed engineers to contribute meaningfully across the entire stack. With this new technology foundation, Ahrefs not only maintained but significantly scaled its operations. -Today, Ahrefs’ systems handle **5 billion frontend requests per day** and process a staggering **500 billion backend requests per day**. The codebase powering this scale has grown to **1.5 million lines of OCaml code**, underscoring the robustness and scalability of their technology stack. These advancements have helped Ahrefs become a trusted industry leader, relied upon by **44% of Fortune 500 companies**. +Today, Ahrefs’ systems handle **millions of frontend requests per day** and process **billions of backend requests per day**. The codebase powering this scale has grown to **1.5 million lines of OCaml code**, underscoring the robustness and scalability of their technology stack. These advancements have helped Ahrefs become a trusted industry leader, relied upon by **44% of Fortune 500 companies**. For more up-to-date statistics, see [Ahrefs' statistics and metrics page](https://ahrefs.com/big-data). ## Why OCaml From 4b010846f358bf897996fb8acb8329ef3c9b50e0 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:10:07 +0100 Subject: [PATCH 10/12] devkit / bindings --- data/success_stories/ahrefs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 0c611a9434..3f778aed48 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -58,7 +58,7 @@ Ahrefs’ journey with OCaml provides valuable insights for other companies cons 1. **Embrace Simplicity:** OCaml’s type system is intuitive yet powerful, enabling developers to build expressive and reliable applications without unnecessary complexity. 2. **Invest in Learning:** Training the team in OCaml is essential but rewarding. Tools like the Melange playground can make the onboarding process smoother and more approachable. 3. **Build Tailored Solutions:** By leveraging OCaml’s expressiveness, Ahrefs avoided generic frameworks in favor of custom-built solutions that addressed their unique needs. While this approach requires more ownership, it results in greater efficiency and precision. -4. **Anticipate Challenges with Bindings:** Writing bindings can be complex, but resources from the Melange community simplify this process. +4. **You Will need to Write Bindings:** Writing bindings can be complex, but resources from the community simplify this process. 5. **Adopt Gradually:** Starting with small contributions to libraries or limited integrations can help teams build confidence before transitioning fully to OCaml. ## Open Source @@ -66,7 +66,7 @@ Ahrefs’ journey with OCaml provides valuable insights for other companies cons Ahrefs is proud to support the OCaml ecosystem by contributing tools and libraries that benefit the broader community. These contributions include: - **[Melange Recharts](https://github.com/ahrefs/melange-recharts):** Recharts bindings for Melange. -- **[Ahrefs DevKit](https://github.com/ahrefs/devkit):** A suite of internal tools and utilities. +- **[Ahrefs DevKit](https://github.com/ahrefs/devkit):** Tools and utilities for writing applications. - **[Melange Bindings](https://github.com/melange-community/bindings):** A community-driven resource for bindings. - **[Melange JSON PPX](https://github.com/ahrefs/melange-json-ppx):** A replacement for the ATD runtime in BuckleScript. - **[OCaml Community Tools](https://github.com/ocaml-community):** Contributions to widely used tools like `ocurl` and `ocaml-mariadb`. From 299e13b1b66784ce08e995a50b8bb26accbc3bd8 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:10:40 +0100 Subject: [PATCH 11/12] Update data/success_stories/ahrefs.md Co-authored-by: Louis --- data/success_stories/ahrefs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/success_stories/ahrefs.md b/data/success_stories/ahrefs.md index 3f778aed48..bedfc5d11f 100644 --- a/data/success_stories/ahrefs.md +++ b/data/success_stories/ahrefs.md @@ -41,7 +41,7 @@ Ahrefs chose OCaml as the backbone of its technology stack because of its unique One of the key reasons for selecting OCaml was its versatility in enabling a unified technology stack. The ability to use shared types between frontend and backend eliminated redundant work, improved collaboration, and ensured consistency across the board. Additionally, OCaml’s robust type system provided engineers with a high degree of confidence in their code, significantly reducing errors and simplifying maintenance. -OCaml’s ecosystem, especially with the introduction of Melange (formerly BuckleScript), allowed Ahrefs to bridge the gap between OCaml’s strong typing and the flexibility of the JavaScript ecosystem. Initially adopted for backend crawling, OCaml’s utility expanded to the frontend when Melange made it possible to compile OCaml to JavaScript. This pivotal decision empowered Ahrefs to create tools that made their vast datasets more accessible and actionable. +OCaml’s ecosystem, especially with the introduction of Melange (formerly BuckleScript), allowed Ahrefs to bridge the gap between OCaml’s strong typing and the flexibility of the JavaScript ecosystem. Initially adopted for crawling and data processing, OCaml’s utility expanded to the frontend when Melange made it possible to compile OCaml to JavaScript. This decision empowered Ahrefs to create tools that made their vast datasets more accessible and actionable. ## Solution From 5dfae496e921fa416c15e4362ccefe8488ca0497 Mon Sep 17 00:00:00 2001 From: sabine <6594573+sabine@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:10:46 +0100 Subject: [PATCH 12/12] Update src/ocamlorg_web/lib/redirection.ml Co-authored-by: Louis --- src/ocamlorg_web/lib/redirection.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ocamlorg_web/lib/redirection.ml b/src/ocamlorg_web/lib/redirection.ml index 4dec52227b..82188fbf36 100644 --- a/src/ocamlorg_web/lib/redirection.ml +++ b/src/ocamlorg_web/lib/redirection.ml @@ -328,7 +328,7 @@ let from_v2 = ("/docs/platform-users", Url.tool_page "platform-users"); ("/docs/platform-roadmap", Url.tool_page "platform-roadmap"); ( "/success-stories/peta-byte-scale-web-crawler", - Url.success_story "marketing-analysis-tools-powered-by-big-data" ); + Url.success_story "marketing-intelligence-tools-powered-by-big-data" ); ] let make ?(permanent = false) t =