I mean, let me give you a little bit of overview of what Dapr is and then we'll sort of dive in and answer that question.
And just to kind of continue my background, when I was at Microsoft, so six years ago, we started the Dapr project. And then left Microsoft three and a half years ago to form Diagrid because we sort of wanted to continue innovation with it. So today, you know, I'm the co-founder as well as the co-creator of Dapr.
But I mean, what Dapr is in essence is it's a set of developer APIs that allow developers to not reinvent the pattern, as we say, or not reinvent the wheel for common abstractions that they need. For example, decoupled messaging. So if you do event driven system, event driven application, you do Pub/Sub messaging, it allows you to provide an API for Pub/Sub messaging. Or if you want to kind of communicate a request reply semantics between two services, it has this thing called service invocation which does discovery, secure calls, and if an application fails and falls over to another machine, it will reconnect it all. Or things like secrets management.
So these common APIs are really what developers need in order to sort of be productive building their applications running on top of any different type of compute platform like Kubernetes for example.
So to go to your point of like, what do we see in platform engineering today? What we see a lot is platform engineering teams focus on, "Okay, I'm building a platform, it's got some services in it, like a database service, or a messaging service like Kafka or RabbitMQ, or you can get some secrets management from it as well like Hashicorp Vault or one of the secrets management for say from AWS or Azure." And they want to provide all these services, but they sort of somewhat ignore the actual contract to the developers themselves.
So what happens is you see like a developer goes, "Well, okay, I'm just going to use the Kafka SDK." And so they pull in the Kafka SDK.
Now if you want to do Pub/Sub messaging between services, first the Kafka SDK isn't very nice. You have to sort of build this sort of Pub/Sub semantics on top of it all - how I publish a message and how I subscribe - because it's a sort of streaming thing to begin with. So you have to sort of do that first.
Then you sort of bake the Kafka SDK into your code and then you start using it all. And then you know, lo and behold, kind of in about three months or four months time, someone says, "Oh, we have to move everything to AWS now" or some other cloud, and you have to rip out all that Kafka code and instead, you know, replace it with AWS SNS or Azure Service Bus or one of these other ones.
And all of a sudden you've got this huge pain point where developers have tightly coupled their code to the underlying platform. You know, you don't want to really do this.
One of the key benefits that Dapr provides is a very clean abstraction between a Pub/Sub behavior and semantics of an API and the ability to swap out the underlying infrastructure - which is called as components. So you can literally keep the code exactly the same with the right behaviors and swap between Kafka and say RabbitMQ or SNS literally within hours with a component that's been very well tuned for that particular message bus because all the right SDK has been wrapped in right behavior. It has a YAML metadata description... I know you're a YAML fan.
See, what developers want to be able to do is just say, "I want to talk to the order processing application and I want to call the order process on it. And that's it."
Invariably what you don't want is developers to say, "I have to look at this DNS location and open up a port and think about everything at the networking level." And all of that's just horrible for a developer. So instead, developers simply think in terms of identities of pieces of code.
So now I make my application, it has identity... like it has Mark's application, Cory's application. On Cory's application it has method A, B and C. And so from a developer's perspective I just say, "Go and call the order method on the order processing application wherever it's running in my Kubernetes cluster." I don't care where it is, it can be on a machine further away.
I'm not thinking about ports and endpoints and anything else like this, which is sort of the natural behavior of a platform team. And so all of a sudden you've got easy ways to send messages, communicate, discover things.
And that identity... going back to a SPIFFE identity that gets allocated... can be flown by federation because you can actually go into the underlying infrastructure itself and federate that back to the identity that was given to the actual process itself... it can now be federated to the underlying service, like for example in the case of AWS SNS service.
And now you can make sure that only this application with this SPIFFE identity... which is basically an X.509 certificate, SPIFFE is just a way of wrapping a piece of identity like an X.509 certificate or any other piece of identity credentials and then flowing that down to the infrastructure...
This concept of identity means that it's very easy for an application developer to call other services and to have security in the underlying services.
And it's something that, you know, just prevents application developers having to think of ports and networks and other sorts of horrible things like this, which is sort of not the natural base or knowledge of a platform engineering team as a whole.
Exactly. Well, there are three cross-cutting concerns.
So as well as APIs, there are three things that a platform team has to think about to service an application team. They are security, end to end and what that looks like. There's observability of how you track data and how it flows. And then there's resiliency in terms of what you do in the event of network failures.
And so this is another thing that becomes a burden on the application teams. So let's take an example of observability.
Now if you can get all your APIs flowing through Dapr, every single one of them is tracked with OpenTelemetry calls. So you can go call from... say to a secret store to get hold of a secret. You can send a message with Pub/Sub messaging and call to a database. And in that whole call flow, Dapr writes out OpenTelemetry events, which you can push into your OpenTelemetry store. OpenTelemetry is another CNCF protocol standard that's pretty much well adopted now in terms of events.
And then you can see the whole call graph of what that looks like inside your Datadog, New Relic, Azure CloudWatch, whatever you choose as the environment around these things.
That's beautiful as well, because without the observability, you can't run production applications. I mean, you have no idea what's happening because you can't see. And so now you can sort of pinpoint, "Oh, this happened here, this happened here, this happened here." You can see the latency between the calls and this sort of thing.
And invariably this is a thing that struggles a lot when developers pull in the Kafka SDK, and then they pull in some other SDK, and they're sort of disconnected and having to try and find a continuous way of doing diagnostics and observability across it. So it solves the observability problem as well.
Yeah, so you nailed one of the most important questions that people ask. It's like, "Oh, you know, do I not get the features of the underlying platform?" And the answer is you do, because although the API is consistent, you can still choose the features of the underlying provider that gets surfaced in the component itself.
Let's take an example around this. So Dapr has an API for saving status key value pairs. So you say, here's key value pairs and then you could plug in any underlying database for that. And there's like 30 different databases, but some of those databases support transactions and some of them don't support transactions. And so you can decide that when I'm using the key value API and I have a multi transaction database and I want to do sort of multi update writes I can, but this one, if I swap it out can't. And so the API will still stay the same - here's a set of key value pairs I want to store - but some databases can do a transaction, other ones can't. And so you do get all the behaviors.
Or, for example, another common one, more so, is with the Pub/Sub message providers. Some of them provide sort of different capabilities on their consumer groups or they might provide their own retry mechanisms. And so all the behaviors of the SDK itself for the particular infrastructure do get surfaced up in a YAML description in a component. But the interface itself, I should say the API itself is very clean. For Pub/Sub it's just publish and subscribe - literally, that's all it is. But you can choose the behaviors in a YAML format for the underlying message broker that you want.
So for example, Kafka has its own retry mechanism and you can choose that if you want, or you can choose its own security authentication mechanism, things like this. So you do get those behaviors of the underlying component to choose from as well.
And people often submit updates to the components for a particular SDK just to surface it in the component YAML to use. So to answer your question, yes, you can use a component... the underlying behaviors of the component or infrastructure.
It's a graduated project there, which is the highest level of endorsement that you get, which means that they did all their due diligence around it all.
And actually, myself and my co-founder, Yaron Schneider, we were the ones who actually started the Dapr project when we were at Microsoft and left to form Diagrid. And today at Diagrid, we are actually the primary maintainers of the Dapr open source project, along with lots of other companies - Microsoft and Nvidia and Alibaba and Intel all contribute to the project.
There's a number of contributing companies to the open source project, but what we do at Diagrid is that we sort of provide two things.
First, we provide Diagrid Enterprise, which is effectively enterprise support for organizations who've adopted Dapr but need sort of the core skills and things to be able to help not only with architecture guidance, but, you know, incident support and fixing things upstream. So we provide support.
We also provide a very cool tool called Diagrid Conductor that allows you to manage Dapr on top of Kubernetes. It allows you to do rollouts of new versions of Dapr Control Plane. It gives you great visualizations. It gives you this advisor tool that looks across all your components and your infrastructure and finds things that you may have misconfigured. Effectively it just makes an awesome experience for when you manage Dapr in a Kubernetes environment to kind of get all of this incredible data that's coming out of Dapr in terms of metrics, visualization, and behaviors, and just visualize it all and manage it.
Then we also provide our own version of Dapr Distribution which is just a more secure version of this that has some other features inside it all. But yeah, most of our engagement and efforts is kind of making Dapr Upstream an amazing product to use. So that's what we do there.
And then where we transitioned to recently... which also is about taking people down the journey... is that we've created a server product for Dapr which allows you to, rather than take the open source one and host and run it Kubernetes yourself and deploy DAPR on Kubernetes, our server product is called Diagrid Catalyst and you can deploy this into your environment.
And now you can run and deploy your application on any form of compute and call into Diagrid Catalyst as a Dapr server and use all the APIs there without you having to manage and upgrade and deploy Dapr itself, because we take care of all that for you.
When you really go down your journey, this really helps you kind of use Dapr in a multitude environment rather than just being bound to Kubernetes.
Yeah, I feel like one of the use cases that I'm kind of hearing that I think I'll get a lot of value out of Dapr - and I'm definitely going to be playing with it in the next couple of days - I see a lot of stuff in our code base where I'm like, this would have made moving so much easier. The question is, is there an Erlang and Elixir version? So that's what I'll have to... well, we have stuff in Go as well.
I feel like one of the things that can be difficult for a developer who's working in the cloud is like, I've gotten to the point where I'm like, "Oh, you know what? I realize that I need event services for this or I need Blob Store and my app right now just has Postgres... 13, 14, whatever. I need to add this new thing." But like, I don't know, just looking at AWS, like how many message services do they offer? There's a lot depending on how you decide you want to cut that thing up. Right? And so like, I'll sometimes spend some time, like, "Let me see if I can just do this with like SNS and SQS." It's like, "Okay, does it have the properties that I need?" Or maybe I had to go over and look at MSK, right? And I'm just trying to figure out like, which one of these services is going to give me the properties that I need so I can build my business logic.
And I feel like Dapr, if I'm building around this SDK, that makes the code part a lot easier. And now I'm just kind of switching out the config like, "Hey, let's see. Oh, you know what? This doesn't support first in, first out." Like if I need first in, first out for whatever reason in this app, that one's just gone. I don't have to rewrite my code. I just swap the config to something that supports FIFO, right?
I feel like a place where this might be an amazing use case to introduce in some greenfields for probably some pretty big companies is just around all the stuff that's happening in AI. Internally, we've built our own stuff on SageMaker, we've used some MCP stuff, we've used some Claude things, and we're trying to figure out which one's the right thing for it. And it's like every time we change what we're using, it's like, "Man, it's reflecting that in code."
Is Dapr doing anything in the LLM abstractions, like MCP abstractions?
Oh, yeah, yeah. I mean, we're big in this space and I think that there are two kind of very key trends that are happening.
So one is just the integration of LLMs into your code. And here's what I call an LLM. So we introduced, in the last release, a conversation API. And the conversation API is literally a prompt API - here's a prompt, and then you can plug in the different components for any one of the underlying language models. So you can, you know, plug in OpenAI or Hugging Face or Anthropic or DeepSeek or whatever else you want to behind it all.
I can just call the Conversation API, call a prompt, and just like we've told about swapping out message brokers, I can swap out underlying LLM API calls and just switch them all out without having to change my code.
Plus it provides additional capabilities on that. For example, it does obfuscation of any data that comes back and it actually does prompt caching generically across all of them, even if they don't have prompt caching. So it adds those sort of features. So you could do that, just add that.
I think the more interesting and exciting thing that's happening is this rise of agents. And I don't know how much you're getting in and hearing talk about agents generally, but, you know, agents now is where effectively we're trying to produce and automate human processes a lot more with language models to do those things on their behalf.
So we've always done lots of automation, we've liked to automate things and we have very deterministic automation. But now the automation of business processes using language models to make decisions is kind of becoming a hot thing around all this.
Let me give you an example. I was talking to a logistics company a couple of weeks ago and they have a warehouse manager that sits in a warehouse and his job is literally to go and query a database every hour and look at what orders haven't been sent and what needs to be sent for the rest of the day. He's doing a bunch of queries and looking these things up. And they're like, "Well, it would be so much easier if he could just have a little agent on his behalf who was like just doing all these things. Like, "What orders are critical or what do I need to do next because this order hasn't gone?", "You need to push this one to the top of the queue because if it doesn't go out tomorrow, they're going to be pissed."
And so they wanted to build a little agent that was basically a warehouse manager that's looking at all the orders and looking at their database and all these things. Working on their behalf with the language model, making those decisions and basically taking hold of that process or helping this warehouse manager. That's just one example.
The way I look at this is that all this talk about agents is really a Distributed Systems problem with LLMs. It's Distributed Systems, but everyone's made up lots of new names like "memory" and "agentic systems" and things like this. Dapr is very well grounded in key distributed systems principles like workflow and messaging and state management. And so back a couple of months ago, we introduced this framework in the Python SDK called Dapr Agents. And it really helps you build agents that are stateful, long-running and durable because it's built on workflow. That they communicate really well with Pub/Sub messaging. And they very much are sort of, I would say, enterprise ready.
To a large degree, I think a lot of the agent systems or frameworks out there today are still very immature in their enterprise readiness in terms of being durable and recoverable. And most of them are sort of like - as soon as the thing fails, I have no idea what I did before and I've got to start again.
So yeah, I see the rise of this agents thing as part of the continuation of distributed computing with models being the sort of decision makers amongst us all. And we're going to be plugging these things everywhere.
But you know, the Dapr agents introduction that builds on the core APIs of Dapr is an amazing piece of technology to help you build these sort of long-running, durable, stateful agents.