mirror of https://github.com/knative/docs.git
Case studies (#4406)
* add logos to home page Signed-off-by: Carlos Santana <csantana23@gmail.com> * working on about Signed-off-by: Carlos Santana <csantana23@gmail.com> * change title to case studies Signed-off-by: Carlos Santana <csantana23@gmail.com> * add links to home page Signed-off-by: Carlos Santana <csantana23@gmail.com> * add deepc Signed-off-by: Carlos Santana <csantana23@gmail.com> * add outfit7 Signed-off-by: Carlos Santana <csantana23@gmail.com> * adding puppet Signed-off-by: Carlos Santana <csantana23@gmail.com> * add the links for tekton Signed-off-by: Carlos Santana <csantana23@gmail.com> * add EOL Signed-off-by: Carlos Santana <csantana23@gmail.com> * add logo and quote for deepc Signed-off-by: Carlos Santana <csantana23@gmail.com> * add outfit logo and quote Signed-off-by: Carlos Santana <csantana23@gmail.com> * add puppet Signed-off-by: Carlos Santana <csantana23@gmail.com> * replace vendor with projects Signed-off-by: Carlos Santana <csantana23@gmail.com> * move tab case study tab to right Signed-off-by: Carlos Santana <csantana23@gmail.com> * update quotes for outfit7 Signed-off-by: Carlos Santana <csantana23@gmail.com> * fix broken links in puppet Signed-off-by: Carlos Santana <csantana23@gmail.com> * fix quotes for puppet Signed-off-by: Carlos Santana <csantana23@gmail.com> * oh you EOL Signed-off-by: Carlos Santana <csantana23@gmail.com> * fix background color fo case studies Signed-off-by: Carlos Santana <csantana23@gmail.com> * adding case studies to Blog nav * fixing broken link Co-authored-by: Omer Bensaadon <obensaadon@vmware.com>
This commit is contained in:
parent
ee1fb669ef
commit
d812f13aa1
|
@ -14,6 +14,7 @@ nav:
|
|||
# Reference docs
|
||||
- Reference: /docs/reference/
|
||||
- "Join the Community ➠": /community/
|
||||
- Case Studies: /docs/about/case-studies/deepc
|
||||
# Blog
|
||||
- Blog:
|
||||
- index.md
|
||||
|
|
|
@ -273,4 +273,8 @@ nav:
|
|||
- Concepts:
|
||||
- Duck types: reference/concepts/duck-typing.md
|
||||
- "Join the Community ➠": /community/
|
||||
- Case Studies:
|
||||
- deepc: about/case-studies/deepc.md
|
||||
- Outfit7: about/case-studies/outfit7.md
|
||||
- Puppet: about/case-studies/puppet.md
|
||||
- Blog: /blog/
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
---
|
||||
hide:
|
||||
- toc
|
||||
---
|
||||
<table style="border: 0;">
|
||||
<tr style="background-color: var(--md-default-bg-color);">
|
||||
<td style="border: 0;">
|
||||
<div style="min-width: 20mm;">
|
||||
<img src="../../../images/case-studies/deepc.png" alt="" draggable="false" />
|
||||
</div>
|
||||
<div>
|
||||
<em style="color:#0071c7;font-size: 1em;">“It should be possible for somebody with an algorithm to have it on the platform in an hour”</em>
|
||||
</div>
|
||||
<div>
|
||||
<p style="color:#0071c7;font-size: 1em;">-- Andrew Webber, Senior Software Engineer for deepc</p>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
|
||||
<td style="border: 0;">
|
||||
<h1 style="color:#0071c7;font-size: 3em;">deepc Case Study</h1>
|
||||
<h2 style="font-weight: bold;">AI Startup deepc Connects Researchers to Radiologists with Knative Eventing</h2>
|
||||
|
||||
deepc is a startup at the cutting edge, bringing advanced data techniques and artificial intelligence to healthcare. The German company helps radiologists access better diagnostics and resources through cloud-based technology. Their goal is to elevate treatment quality across the board while creating more efficiency and improvement in medical settings.
|
||||
This revolution in technology comes with hefty challenges. Care systems are highly regulated, making patient privacy and safety a top priority for deepc. Doctors and medical staff also demand that new technologies be reliable and stable when lives are on the line.
|
||||
|
||||
|
||||
|
||||
<h2 style="color:#0071c7;">Rising to the challenge</h2>
|
||||
|
||||
deepc has risen to meet these challenges through carefully architected solutions, using tools like Knative Eventing to their full potential. Their product helps radiologists access a wide selection of artificial intelligence (AI) programs that analyze imaging, like x-rays and MRIs. The data generated from these AI programs help radiologists make more accurate diagnoses.
|
||||
|
||||
<h2 style="color:#0071c7;">The deepc workflow</h2>
|
||||
|
||||
The radiologist uploads the image into deepcOS, initially to a virtual machine within the hospital IT infrastructure containing the deepcOS client application. After making a series of selections, deepcOS identifies the proper AI to use. It then removes the patient information from the scans before encrypting the data.
|
||||
deepcOS sends that data to the cloud-based deepc AI platform. This platform does the heavy lifting in providing the computing power the AI algorithms need to do their work. After the program finishes, the results are sent back. Finally, the data is reassociated with the patient, and the radiologist can take action based on the results. Critically, patient information always remains on-premises in the hospital and is not transmitted to deepc servers.
|
||||
|
||||
<h2 style="color:#0071c7;">A Knative-powered process</h2>
|
||||
|
||||
The deepcOS workflow builds on a sophisticated implementation of Knative Eventing. Knative Eventing allows teams to deploy event-driven architecture with serverless applications quickly. In conjunction with Knative Serving, deepc resources and programs scale up and down automatically based on specific event triggers laid out by the developers. Knative takes care of the management, so the process does not need to wait for a person to take action.
|
||||
When data is sent to deepc's cloud-based platform, Knative emits an event that triggers a specific AI. After one is selected, Knative starts a container environment for the program to run. Some AI programs may only need one container. Others may require multiple, running parallel or in sequence. In the case of multiple containers, the deepc team created workflows using Knative Eventing to coordinate the complex processes. After the process finishes and provides the output for the radiologist, Knative triggers stopping the active containers.
|
||||
|
||||
<h2 style="color:#0071c7;"><em>"Knative gives us a foundation of consistency,"</em> said Andrew Webber, Senior Software Engineer.</h2>
|
||||
|
||||
<h2 style="color:#0071c7;">Bridging between legacy and advanced systems</h2>
|
||||
|
||||
The platform makes available AIs developed by leading global companies and researchers.. Knative has also allowed integration with the work of independent researchers through an SDK implementation to radiologists. They don’t need to be Kubernetes experts or take days to bring their work to patients through deepc’s platform.
|
||||
|
||||
<h2 style="color:#0071c7;"><em>“It should be possible for somebody with an algorithm to have it on the platform in an hour”</em> said Webber.</h2>
|
||||
|
||||
Some implementations are more complex. They use legacy technology that does not fit into a standard container or they have unique architectures that require OS-level configuration. deepc has built out APIs and virtual machines that connect those technologies to their own cloud-based platform and still integrate with the Knative Eventing workflow. This approach ensures those programs work flawlessly within the system.
|
||||
|
||||
<h2 style="color:#0071c7;">The case for business</h2>
|
||||
|
||||
The choice to develop their platform around Knative has had several business benefits for the startup. One of the most complicated aspects of growing a company is scaling. Many technology companies find their developers start scrambling when more customers are onboarded, uncovering new bugs and other issues. However, because of the nature of Knative, this is less of a problem for deepc. Knative's combination of automation and serverless methods means as more customers are onboarded, deepc will not need to build out more resources - it will all happen automatically.
|
||||
Knative has also allowed the startup to add real value to customers using their technology. For example, because many applications used by radiologists are built by different companies, medical professionals have had to interact with disparate systems and procedures. deepc provides access to the work of many researchers on one platform, ending complicated processes for professionals on the ground. Healthcare systems get simple, unified billing. Knative has helped deepc create a robust case for customers to use their platform.
|
||||
|
||||
<h2 style="color:#0071c7;">Looking forward</h2>
|
||||
|
||||
deepc has already done amazing things as a company, with many more features planned. The company is a model for how Knative can help any organization build an impressive technical architecture capable of addressing some of today's most complex problems. Using features provided by Knative has enabled them to pioneer what is possible.
|
||||
|
||||
<h2 style="color:#0071c7;">Find out more</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="../../../getting-started/">Getting started with Knative</a></li>
|
||||
<li><a href="../../../serving/">Knative Serving</a></li>
|
||||
<li><a href="../../../eventing/">Knative Eventing</a></li>
|
||||
</ul>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
|
@ -0,0 +1,76 @@
|
|||
---
|
||||
hide:
|
||||
- toc
|
||||
---
|
||||
<table style="border: 0;">
|
||||
<tr style="background-color: var(--md-default-bg-color);">
|
||||
<td style="border: 0;">
|
||||
<div style="min-width: 20mm;">
|
||||
<img src="../../../images/case-studies/outfit7.png" alt="" draggable="false" />
|
||||
</div>
|
||||
<div>
|
||||
<em style="color:#0071c7;font-size: 1em;">"The community support is really great. The hands-on experience with Knative was so impressive. On the Slack channel, we got actual engineers to answer our questions"</em>
|
||||
</div>
|
||||
<div>
|
||||
<p style="color:#0071c7;font-size: 1em;">-- Tilen Kavčič, Software Engineer for outfit7</p>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
|
||||
<td style="border: 0;">
|
||||
<h1 style="color:#0071c7;font-size: 3em;">Outfit7 Case Study</h1>
|
||||
|
||||
<h2 style="font-weight: bold;">Game maker Outfit7 automates high-performance ad bidding with Knative Serving</h2>
|
||||
|
||||
|
||||
Since its founding in 2009, the mobile gaming company Outfit7 has seen astronomical growth—garnering over 17 billion downloads and over 85 billion video views last year.
|
||||
|
||||
Outfit7 was in the Top 5 game publishers list on iOS and Google Play worldwide by the number of game downloads for 6 consecutive years (2015 - 2020). With their latest launch, My Talking Angela 2, they were number 1 by global games downloads in July, August, and September (more than 120 million downloads).
|
||||
|
||||
The success of the well-known game developer behind massive hits like the Talking Tom & Friends franchise and stand-alone titles like Mythic Legends created large-scale challenges.
|
||||
|
||||
With up to 470 million monthly active users, 20 thousand server requests per second, and terabytes of data generated daily, they needed a stable, high-performance solution. They turned to a Knative and Kubernetes solution to optimize real-time bidding ad sales in a way that can automatically scale up and down as needed. They were able to develop a system so easy to maintain that it freed up two software engineers who are now able to work on more important tasks, like optimizing backend costs and adding new game features.
|
||||
|
||||
<h2 style="color:#0071c7;">High performance in-app bidding</h2>
|
||||
|
||||
Ad sales are an important revenue stream of Outfit7. The team needed to walk a careful balance: sell the space for the highest bid, use technical resources efficiently, and make sure ads are served to players quickly. To achieve this they decided to adopt an in-app bidding approach.
|
||||
|
||||
The Outfit7 user base generates around 8,000 ad-related requests per second. With so many users spread worldwide, the amount of these requests can drop or surge depending on all sorts of factors. Not just predictable things like the time of day, but current events can suddenly create traffic. The pandemic saw their usage soar, for instance.
|
||||
|
||||
To manage the process in-house, the team needed to be able to test and deploy very efficiently. "There were two specific use-cases we wanted to cover," explained Luka Draksler, backend engineer in the ad technology department at Outfit7. "One was to have the ability to do zero downtime canary deployments using an automatic gradual rollout process. This works in a way that the new version of the software is deployed using a continuous deployment pipeline with a small amount of traffic first. If everything checks out, all production traffic is migrated to the new version. In the worst case scenario (if requests start failing) traffic can be quickly migrated to the old version. The second use-case was the ability to have developers deploy versions to specific groups of users for instances of A/B testing and other use cases."
|
||||
|
||||
The team decided to adopt Knative Serving as the backbone of their solution. Knative allowed Outfit7 to streamline deployments and cut down on development time. After being surprised at how easily they generated an internal proof of concept, the team saw that it could craft custom solutions tuned for their internal workflows—without consuming valuable developer time. In addition, they could quickly configure A/B testing and deploy multiple versions of code simultaneously.
|
||||
|
||||
<h2 style="color:#0071c7;">Serverless solution</h2>
|
||||
|
||||
Knative Serving gave Outfit7 access to a robust set of tools and features that allows their team to automate and monitor the deployment of applications to handle ad requests. When more requests are coming in, their system automatically spins up more containers that house the workers and tools. When these requests drop, unneeded containers shut down. Outfit7 only pays for the resources they require for the current load.
|
||||
|
||||
Knative works as a layer installed on the top of Kubernetes. It brings the power of serverless workloads to the scalable capabilities of Kubernetes. Teams quickly spin up container-based applications without needing to consider the details of Kubernetes.
|
||||
|
||||
Knative also simplifies project deployments to Kubernetes. Mitja Bezenšek, Lead Developer on Outfit7's backend team, estimated that the traditional development that Knative replaced would have required three full time engineers to maintain. Their new platform operates with minimal work and allows the developers to deploy updates at will.
|
||||
|
||||
<h2 style="color:#0071c7;">The open source community</h2>
|
||||
|
||||
Outfit7's team was blown away by the supportive and helpful community around Knative. After discovering a problem with network scaling, the team was surprised by how easy it was to find answers and solutions.
|
||||
|
||||
<h2 style="color:#0071c7;"><em>"The community support is really great. The hands-on experience with Knative was so impressive. On the Slack channel, we got actual engineers to answer our questions"</em> -- Tilen Kavčič, Software Engineer for outfit7</h2>
|
||||
|
||||
<h2 style="color:#0071c7;">Sharing their story</h2>
|
||||
|
||||
The great experience with Knative encouraged their team to share their experience with fellow companies and engineers at a local meetup. The presentation which included several live demos was a success, helping spawn another meet-up focused on the technology. "Tilen showed them the demo and what it's all about," said Bezenšek. "I hope we got them engaged going forward."
|
||||
|
||||
<h2 style="color:#0071c7;">Looking forward</h2>
|
||||
|
||||
Outfit7 shows no signs of slowing down. “As we want to support our vision in expanding our games portfolio, we are always looking for new strategic partners who can accompany us on this path,” added Helder Lopes, Head of R&D in Cyprus headquarters. The company plans to incorporate and adopt Knative into other back-end systems – taking advantage of the easier workflows that Knative offers.
|
||||
|
||||
<h2 style="color:#0071c7;">Find out more</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="../../../getting-started/">Getting started with Knative</a></li>
|
||||
<li><a href="../../../serving/">Knative Serving</a></li>
|
||||
<li><a href="../../../eventing/">Knative Eventing</a></li>
|
||||
</ul>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
|
@ -0,0 +1,83 @@
|
|||
---
|
||||
hide:
|
||||
- toc
|
||||
---
|
||||
<table style="border: 0;">
|
||||
<tr style="background-color: var(--md-default-bg-color);">
|
||||
<td style="border: 0;">
|
||||
<div style="min-width: 20mm;">
|
||||
<img src="../../../images/case-studies/puppet.png" alt="" draggable="false" />
|
||||
</div>
|
||||
<div>
|
||||
<em style="color:#0071c7;font-size: 1em;">"I'm a strong believer in working with open source projects. We've made contributions to numerous projects, including Tekton, Knative, Ambassador, and gVisor, all of which we depend on to make our product functional"</em>
|
||||
</div>
|
||||
<div>
|
||||
<p style="color:#0071c7;font-size: 1em;">-- Noah Fontes, Senior Principal Software Engineer for Puppet</p>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
|
||||
<td style="border: 0;">
|
||||
<h1 style="color:#0071c7;font-size: 3em;">Puppet Case Study</h1>
|
||||
|
||||
<h2 style="font-weight: bold;">Relay by Puppet Brings Workflows to Everything using Knative</h2>
|
||||
|
||||
<a href=https://puppet.com>Puppet</a> is a software company specializing in infrastructure automation. The company was founded in 2009 to solve some of the most complex problems for those who work in operations. Around 2019, the team noticed that cloud operations teams weren’t able to effectively manage modern cloud-native applications because they were relying on manual workflow processes. The group saw an opportunity here to build out a platform to connect events triggered by modern architectures to ensure cloud environments remained secure, compliant, and cost effective.
|
||||
|
||||
This is the story of how <a href=https://puppet.com/products/relay>Relay</a>, a cloud-native workflow automation platform, was created, and how Knative and Kubernetes modernize and super-charge business process automation.
|
||||
|
||||
<h2 style="color:#0071c7;"> The glue for DevOps</h2>
|
||||
|
||||
When Puppet first began exploring the power and flexibility of Knative to trigger their Tekton-based workflow execution engine, they weren't quite sure where their journey was going to take them. Knative offered an attractive feature set, so they began building and experimenting. They wanted to build an event-driven DevOps tool; they weren't interested in building just another continuous integration product. In addition, as they continued to explore, they realized that they wanted something flexible and not tied to just one vertical. Whatever they were building, it was not going to focus on just one market.
|
||||
|
||||
As their target came into focus, they realized that the serverless applications and functions enabled by <a href="../../../serving/">Knative Serving</a> would be perfect for a cloud-based business process automation service. Out of this realization, they built <a href=https://relay.sh>Relay</a>, a cloud workflow automation product that helps Cloud Ops teams solve the integration and eventing issues that arise as organizations adopt multiple clouds and SaaS products alongside legacy solutions.
|
||||
|
||||
<h2 style="color:#0071c7;"> Containers and webhooks</h2>
|
||||
|
||||
Containers and webhooks are key elements in the Relay architecture. Containers allow Puppet to offer a cloud-based solution where businesses can configure and deploy workflows as discrete business units. Since the containers provide self-contained environments, even legacy services and packages can be included. This proved to be an essential feature for business customers. Anything that can be contained in a Docker image, for example, can be part of a Relay workflow.
|
||||
|
||||
"We focused on containers because they provide isolation," explains Noah Fontes, Senior Principal Software Engineer for Puppet, "Containers provide discrete units of execution, where users can decrease maintenance burden of complex systems."
|
||||
|
||||
|
||||
Allowing fully-configurable webhooks gives users the flexibility needed to incorporate business processes of all kinds. With webhooks, Relay can interact with nearly any web-based API to trigger rich, fully featured workflows across third party SaaS products, cloud services, web applications, and even system utilities.
|
||||
|
||||
Knative Serving provides important infrastructure for Relay. It allows webhooks and services to scale automatically, <a href="../../../serving/autoscaling/scale-to-zero/">even down to zero</a>. This allows Relay to support pretty much any integration, including those used by only a small number of users. With autoscaling, those services don't consume resources while they are not being used.
|
||||
|
||||
<h2 style="color:#0071c7;"> What is Knative Serving?</h2>
|
||||
|
||||
Modern cloud-based applications deal with massive scaling challenges through several approaches. At the core of most of these is the use of containers: discrete computing units that run single applications, single services, or even just single functions. This approach is incredibly powerful, allowing services to scale the amount of resources they consume as demand dictates.
|
||||
|
||||
However, while all of this sounds amazing, it can be difficult to manage and configure. One of the most successful solutions for delivering this advanced architecture is Knative Serving. This framework builds on top of Kubernetes to support the deploying and management of serverless applications, services, and functions. In particular, Knative Services focuses on being easy to configure, deploy, and manage.
|
||||
|
||||
<h2 style="color:#0071c7;"> Workflow integrations</h2>
|
||||
|
||||
The open architecture allows Relay to integrate dozens of different services and platforms into workflows. A look at the <a href="https://github.com/relay-integrations">Relay integrations GitHub page</a> provides a list of these integrations and demonstrates their commitment to the open source community.
|
||||
|
||||
"I'm a strong believer in working with open source projects. We've made contributions to numerous projects, including Tekton, Knative, Ambassador, and gVisor, all of which we depend on to make our product functional," says Fontes.
|
||||
|
||||
<h2 style="color:#0071c7;"> Results: automated infrastructure management</h2>
|
||||
|
||||
While Relay's infrastructure runs on Google Cloud Platform, its <a href="https://relay.sh/library/">library of workflows, integrations, steps, and triggers</a> includes services across all major cloud service providers. Relay customers can integrate across Microsoft Azure, AWS, and Oracle Cloud Infrastructure among others. By combining these integrations with SaaS offerings, it truly is becoming the <a href=https://zapier.com/">Zapier</a> of infrastructure management.
|
||||
|
||||
“Our customers have diverse needs for managing their workloads that are often best implemented as web APIs. Our product provides a serverless microservice environment powered by Knative that allows them to build this complex tooling without the management and maintenance overhead of traditional deployment architectures. We pass the cost savings on to them, and everyone is happier," said Fontes.
|
||||
|
||||
Building and deploying Relay would not have been possible without the existing infrastructure offered by systems such as Knative and <a href="https://tekton.dev">Tekton</a>. Remarkably, Fontes' team never grew above eight engineers. Once they solidified their plan for Relay, they were able to bring it to production in just three months.
|
||||
|
||||
says Fontes.
|
||||
|
||||
<h2 style="color:#0071c7;"><em>"Thanks to Knative, getting Relay out the door was easier than we thought it would be."</em> said Noah Fontes, Senior Principal Software Engineer.</h2>
|
||||
|
||||
Knative aims to make scalable, secure, stateless architectures available quickly by abstracting away the complex details of a Kubernetes installation and enabling developers to focus on what matters.
|
||||
|
||||
<h2 style="color:#0071c7;">Find out more</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="../../../getting-started/">Getting started with Knative</a></li>
|
||||
<li><a href="../../../serving/">Knative Serving</a></li>
|
||||
<li><a href="../../../eventing/">Knative Eventing</a></li>
|
||||
<li><a href="https://www.markheath.net/post/basic-introduction-webhooks">A Basic Introduction to Webhooks</a></li>
|
||||
</ul>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
Binary file not shown.
After Width: | Height: | Size: 172 KiB |
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
|
@ -40,7 +40,8 @@
|
|||
}
|
||||
|
||||
.md-tabs__list li:nth-last-child(1),
|
||||
.md-tabs__list li:nth-last-child(2) {
|
||||
.md-tabs__list li:nth-last-child(2),
|
||||
.md-tabs__list li:nth-last-child(3){
|
||||
background: var(--home-color);
|
||||
float: right;
|
||||
}
|
||||
|
|
|
@ -97,6 +97,7 @@ body {
|
|||
.home-container,
|
||||
.features-container,
|
||||
.intro-container,
|
||||
.case-studies-container,
|
||||
.components-container {
|
||||
margin: 0;
|
||||
border: 0;
|
||||
|
@ -167,12 +168,50 @@ body {
|
|||
margin: 0 0 0 2em;
|
||||
}
|
||||
|
||||
.usedby-container {
|
||||
.case-studies-container {
|
||||
background: #fff;
|
||||
color: #000;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.case-studies-container #case-studies-title {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.case-studies-container #case-studies {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.case-studies-container #case-studies-more {
|
||||
font-style: italic;
|
||||
font-size: smaller;
|
||||
color: #aaa;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.case-studies-container .logo {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 3em 1em;
|
||||
width: 150pt;
|
||||
height: 36pt;
|
||||
}
|
||||
|
||||
.case-studies-container .logo img {
|
||||
max-width: 150pt;
|
||||
max-height: 36pt;
|
||||
}
|
||||
|
||||
.usedby-container {
|
||||
background: #d6e1f3;
|
||||
color: #000;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.usedby-container #usedby-title {
|
||||
display: flex;
|
||||
|
|
|
@ -75,6 +75,35 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="case-studies-container">
|
||||
<div class="md-grid md-typeset" style="width: 100%">
|
||||
<div id="case-studies-title">
|
||||
<h3>Case Studies:</h3>
|
||||
</div>
|
||||
<div id="case-studies">
|
||||
|
||||
<a href="{{ 'about/case-studies/deepc/' | url }}">
|
||||
<div class="logo">
|
||||
<img src="images/case-studies/deepc.png" alt="" draggable="false" />
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="{{ 'about/case-studies/outfit7/' | url }}">
|
||||
<div class="logo">
|
||||
<img src="images/case-studies/outfit7.png" alt="" draggable="false" />
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="{{ 'about/case-studies/puppet/' | url }}">
|
||||
<div class="logo">
|
||||
<img src="images/case-studies/puppet.png" alt="" draggable="false" />
|
||||
</div>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="usedby-container">
|
||||
<div class="md-grid md-typeset" style="width: 100%">
|
||||
<div id="usedby-title">
|
||||
|
|
Loading…
Reference in New Issue