{"id":25641,"date":"2026-07-03T11:53:55","date_gmt":"2026-07-03T09:53:55","guid":{"rendered":"https:\/\/whiteduck.de\/?p=25641"},"modified":"2026-07-03T19:39:36","modified_gmt":"2026-07-03T17:39:36","slug":"flock-dapr-resilient-cloud-native-agent-swarms","status":"publish","type":"post","link":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/","title":{"rendered":"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><\/div><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1170px + 0px );margin-left: calc(-0px \/ 2 );margin-right: calc(-0px \/ 2 );\"><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last\" style=\"--awb-bg-size:cover;width:100%;\"><div class=\"fusion-column-wrapper fusion-flex-column-wrapper-legacy\"><div class=\"fusion-clearfix\"><\/div><\/div><\/div><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-one\" style=\"--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;\"><h1 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:32;line-height:1.31;\"><\/p>\n<p>Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms<\/p>\n<p><\/h1><\/div><div class=\"fusion-text fusion-text-1\"><\/div><\/p>\n\n\n<p class=\"wp-block-paragraph\">Contents<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#WhatisDapr\" type=\"internal\" id=\"#WhatisDapr\">What is Dapr?<\/a><\/li>\n\n\n\n<li><a href=\"#Whywebuiltthisintegration\" type=\"internal\" id=\"#Whywebuiltthisintegration\">Why we built this integration<\/a><\/li>\n\n\n\n<li><a href=\"#Theintegrationsurfaceissmall\" type=\"internal\" id=\"#Theintegrationsurfaceissmall\">The integration surface is small<\/a><\/li>\n\n\n\n<li><a href=\"#Oneworkflow,threebackends\" type=\"internal\" id=\"#Oneworkflow,threebackends\">One workflow, three backends<\/a><\/li>\n\n\n\n<li><a href=\"#One-timesetup\" type=\"internal\" id=\"#One-timesetup\">One-time setup<\/a><\/li>\n\n\n\n<li><a href=\"#In-memory:thelocalbaseline\" type=\"internal\" id=\"#In-memory:thelocalbaseline\">In-memory: the local baseline<\/a><\/li>\n\n\n\n<li><a href=\"#PostgreSQL:durableandtransactional\" type=\"internal\" id=\"#PostgreSQL:durableandtransactional\">PostgreSQL: durable and transactional<\/a><\/li>\n\n\n\n<li><a href=\"#Redisencrypted:hardenedforcloud-nativedeployment\" type=\"internal\" id=\"#Redisencrypted:hardenedforcloud-nativedeployment\">Redis encrypted: hardened for cloud-native deployment<\/a><\/li>\n\n\n\n<li><a href=\"#Capabilities,notpromises\" type=\"internal\" id=\"#Capabilities,notpromises\">Capabilities, not promises<\/a><\/li>\n\n\n\n<li><a href=\"#Whythismatters\" type=\"internal\" id=\"#Whythismatters\">Why this matters<\/a><\/li>\n\n\n\n<li><a href=\"#DaprorSQLiteAquickdecisionguide\" type=\"internal\" id=\"#DaprorSQLiteAquickdecisionguide\">Dapr or SQLite? A quick decision guide<\/a><\/li>\n\n\n\n<li><a href=\"#Buildingproductionagentsystems\" type=\"internal\" id=\"#Buildingproductionagentsystems\">Building production agent systems?<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Anyone who has pushed agent workflows past a demo runs into the same wall: building the agents is the easy part. Running them reliably in production is not. Shared state needs to survive restarts, there needs to be a clean path to distributed execution, retries and failures need to be handled without bespoke adapter code for every backend, and the storage story needs to evolve from local development to production without a rewrite. That is exactly the wall we hit as we pushed <a href=\"https:\/\/github.com\/whiteducksoftware\/flock\" target=\"_blank\" rel=\"noreferrer noopener\">Flock<\/a> toward more serious workflows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flock is built around a <a href=\"https:\/\/whiteducksoftware.github.io\/flock\/guides\/blackboard\/\" target=\"_blank\" rel=\"noreferrer noopener\">blackboard model<\/a>. Agents publish and consume typed artifacts, and the orchestration layer decides what should run next. That design already aligns with cloud-native thinking: low coupling, clear contracts, and small pieces that can be swapped independently. What it was missing was a production-grade home for the blackboard itself. That is exactly where Dapr fits, and it is what we shipped in <a href=\"https:\/\/github.com\/whiteducksoftware\/flock\/releases\/tag\/0.5.600\" target=\"_blank\" rel=\"noreferrer noopener\">Flock 0.5.600<\/a>, a Dapr integration, available as an optional <code>flock-core[dapr]<\/code> extra.<\/p>\n\n\n\n<h3 id=\"WhatisDapr\" class=\"wp-block-heading\">What is Dapr?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dapr.io\" target=\"_blank\" rel=\"noreferrer noopener\">Dapr<\/a> is a portable, event-driven runtime that exposes cross-cutting building blocks, things like state management, pub\/sub, secrets, and resiliency, over a local sidecar. Your application talks to a stable Dapr API, and Dapr talks to the actual backend, so the application code never learns which database, key-value store, or secret manager sits underneath. It is a CNCF-graduated project with a large component ecosystem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More recently, Dapr has grown a set of first-class <a href=\"https:\/\/docs.dapr.io\/developing-ai\/agent-integrations\/\" target=\"_blank\" rel=\"noreferrer noopener\">agent integrations<\/a> aimed squarely at agentic frameworks. They add the production concerns those frameworks tend to skip: durable execution, portable agent context and memory through the <a href=\"https:\/\/docs.dapr.io\/developing-applications\/building-blocks\/state-management\/state-management-overview\/\" target=\"_blank\" rel=\"noreferrer noopener\">State Management API<\/a>, secure agent-to-agent communication, and secure agent identity. Flock uses one of those building blocks, the state store, as an optional distributed backend for the blackboard.<\/p>\n\n\n\n<h3 id=\"Whywebuiltthisintegration\" class=\"wp-block-heading\"><strong>Why we built this integration<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Agent systems look simple until the first production requirement shows up. Then the list starts growing quickly: shared state must survive restarts, multiple instances may need to see the same blackboard, secrets should not live in code, writes should be resilient, and different environments may prefer different storage backends.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At that point, you have two options. You can write a bespoke storage adapter for every backend you want to support and own all of the retry logic, encryption, and secret handling that comes with each one. Or you can delegate that operational layer to something purpose-built. We chose the second because those are exactly the problems Dapr already solves for cloud-native systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The result is a much cleaner boundary. Flock owns agent logic, typed artifacts, routing, and orchestration. Dapr owns state-store access, backend portability, retries, encryption, and backend-specific capabilities such as transactions, ETags, query support, or TTL where the chosen store supports them. Your application code stays mostly unchanged while the infrastructure underneath becomes more capable.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-scaled.png\"><img decoding=\"async\" width=\"1024\" height=\"819\" src=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-1024x819.png\" data-orig-src=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-1024x819.png\" alt=\"\" class=\"lazyload wp-image-25661\" style=\"aspect-ratio:1.2503100257559858;width:773px;height:auto\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271024%27%20height%3D%27819%27%20viewBox%3D%270%200%201024%20819%27%3E%3Crect%20width%3D%271024%27%20height%3D%27819%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-177x142.png 177w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-200x160.png 200w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-300x240.png 300w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-400x320.png 400w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-600x480.png 600w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-768x614.png 768w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-800x640.png 800w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-1024x819.png 1024w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-1200x960.png 1200w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-1-1536x1229.png 1536w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">From agent output to durable storage: Flock&#8217;s Blackboard over Dapr<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">For the teams building on Flock, that boundary turns into concrete benefits. You can start on a local sandbox and grow to production without rewriting the swarm. You do not have to pick a storage backend on day one and live with that decision forever. Secrets and resilience policies live in infrastructure instead of glue code. And the same workflow runs on an in-memory store, on PostgreSQL, or on encrypted Redis with almost no code churn. If your team is not ready for a distributed backend at all, Flock still ships a <a href=\"https:\/\/whiteducksoftware.github.io\/flock\/guides\/persistent-blackboard\/\" target=\"_blank\" rel=\"noreferrer noopener\">single-node persistent blackboard<\/a>, and we come back to when to use which at the end.<\/p>\n\n\n\n<h3 id=\"Theintegrationsurfaceissmall\" class=\"wp-block-heading\"><strong>The integration surface is small<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The best sign that an integration is healthy is that it stays small. In Flock, the Dapr integration is intentionally thin. The core pieces are <code>DaprStateBlackboardConfig<\/code>, <code>DaprStateBlackboardStoreClientConfig<\/code>, and <code>DaprStateBlackboardStore<\/code>. The swap point is the <code>store=<\/code> argument when you create <code>Flock<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nfrom flock import Flock\n\nfrom flock.storage.dapr import (\n\nDaprStateBlackboardConfig,\n\nDaprStateBlackboardStore,\n\nDaprStateBlackboardStoreClientConfig,\n\n)\n\nclient_config = DaprStateBlackboardStoreClientConfig(\n\ndapr_grpc_endpoint=\"localhost:50001\",\n\n)\n\nstore_config = DaprStateBlackboardConfig(\n\nstore_name=\"flockstate\",\n\nsupports_transactions=True,\n\nsupports_etag=True,\n\nconsistency=\"strong\",\n\nclient_config=client_config,\n\n)\n\nstore = DaprStateBlackboardStore(config=store_config)\n\nflock = Flock(\n\nmodel=\"openai\/gpt-4.1\",\n\nstore=store,\n\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That is the architectural win in one snippet. The agents do not know which backend is underneath them. The blackboard contract stays the same. Only the Dapr component definition and a few capability flags change. You can read the full setup in the <a href=\"https:\/\/whiteducksoftware.github.io\/flock\/guides\/dapr-state-store\/#quick-start\" target=\"_blank\" rel=\"noreferrer noopener\">Dapr State Store guide<\/a>.<\/p>\n\n\n\n<h3 id=\"Oneworkflow,threebackends\" class=\"wp-block-heading\"><strong>One workflow, multiple backends<\/strong><\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-scaled.png\"><img decoding=\"async\" width=\"1024\" height=\"614\" src=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-1024x614.png\" data-orig-src=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-1024x614.png\" alt=\"\" class=\"lazyload wp-image-25664\" style=\"aspect-ratio:1.6677694363150528;width:852px;height:auto\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271024%27%20height%3D%27614%27%20viewBox%3D%270%200%201024%20614%27%3E%3Crect%20width%3D%271024%27%20height%3D%27614%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-200x120.png 200w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-300x180.png 300w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-400x240.png 400w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-600x360.png 600w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-768x461.png 768w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-800x480.png 800w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-1024x614.png 1024w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-1200x720.png 1200w, https:\/\/whiteduck.de\/wp-content\/uploads\/flock-dapr-2-1536x922.png 1536w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">One codebase, three interchangeable backends: In-Memory, PostgreSQL, or encrypted Redis<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">To make the portability claim concrete, we run one small agent team across three different backends without touching the application logic. The team is deliberately playful:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <code>talent_scout<\/code> looks for promising musicians based on a <code>BandConcept<\/code> and produces a cohesive <code>BandLineup<\/code>.<\/li>\n\n\n\n<li>A <code>music_producer<\/code> takes that <code>BandLineup<\/code> and designs an <code>Album<\/code> around it.<\/li>\n\n\n\n<li>A <code>marketing_guru<\/code> turns the <code>Album<\/code> into <code>MarketingCopy<\/code> and handles the PR side of things.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Here are the typed artifacts that pass through the blackboard as these three agents interact:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n@flock_type\nclass BandConcept(BaseModel):\n    genre: str = Field(description=\"Musical genre (rock, jazz, metal, pop, etc.)\")\n    vibe: str = Field(description=\"The band's vibe or aesthetic\")\n    target_audience: str = Field(description=\"Who should love this band?\")\n\n\n@flock_type\nclass BandLineup(BaseModel):\n    band_name: str = Field(description=\"Cool band name\")\n    members: list&#091;dict&#091;str, str]] = Field(description=\"Members with their roles\")\n    origin_story: str = Field(description=\"How the band formed\", min_length=100)\n    signature_sound: str = Field(description=\"What makes their sound unique\")\n\n\n@flock_type\nclass Album(BaseModel):\n    title: str = Field(description=\"Album title in ALL CAPS\")\n    tracklist: list&#091;dict&#091;str, str]] = Field(\n        description=\"Songs with titles and brief descriptions\",\n        min_length=8, max_length=12,\n    )\n    genre_fusion: str = Field(description=\"How this album blends genres\")\n    standout_track: str = Field(description=\"The track that'll be a hit\")\n    production_notes: str = Field(description=\"Special production techniques\")\n\n\n@flock_type\nclass MarketingCopy(BaseModel):\n    press_release: str = Field(description=\"Press release for the album\", min_length=200)\n    social_media_hook: str = Field(description=\"Catchy social post\", max_length=280)\n    billboard_tagline: str = Field(description=\"10-word tagline\", max_length=100)\n    target_playlists: list&#091;str] = Field(\n        description=\"Playlists to pitch to\", min_length=3, max_length=5,\n    )\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The three agents are just as declarative:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ntalent_scout = (\n    flock.agent(\"talent_scout\")\n    .description(\"A legendary talent scout who assembles perfect band lineups\")\n    .consumes(BandConcept)\n    .publishes(BandLineup, visibility=PublicVisibility())\n)\nmusic_producer = (\n    flock.agent(\"music_producer\")\n    .description(\"A visionary music producer who creates debut album concepts\")\n    .consumes(BandLineup)\n    .publishes(Album, visibility=PublicVisibility())\n)\nmarketing_guru = (\n    flock.agent(\"marketing_guru\")\n    .description(\"A marketing genius who writes compelling promotional material\")\n    .consumes(Album)\n    .publishes(MarketingCopy, visibility=PublicVisibility())\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is the whole agent. From here on, nothing in this code changes. The only thing that changes is the infrastructure Dapr sits on top of. We move through three backends: in-memory for fast local development, PostgreSQL for a durable test deployment, and encrypted Redis for a hardened production profile. As your swarm evolves, you can start small and swap the backend depending on your needs, without locking yourself into one path early.<\/p>\n\n\n\n<h3 id=\"One-timesetup\" class=\"wp-block-heading\"><strong>One-time setup<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Everything below runs through the Dapr CLI, so the local setup is two commands:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\npip install \"flock-core&#091;dapr]\"\ndapr init\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first command pulls in Flock plus the optional Dapr dependencies. <code>dapr init<\/code> then installs the Dapr runtime and its local control plane, the background services (placement and scheduler) that the sidecar relies on. From here, each backend is a small component file plus a couple of Flock capability flags. If you would rather wire the sidecar, placement, and scheduler yourself, the repository&#8217;s <a href=\"https:\/\/github.com\/whiteducksoftware\/flock\/tree\/main\/examples\/12-dapr\" target=\"_blank\" rel=\"noreferrer noopener\">examples\/12-dapr<\/a> ships full Docker Compose stacks. We use the CLI here to keep the moving parts visible.<\/p>\n\n\n\n<h3 id=\"In-memory:thelocalbaseline\" class=\"wp-block-heading\"><strong>In-memory: the local baseline<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The in-memory backend is the simplest version, and we use it here to establish the Dapr code path before attaching a real store. For actual single-node development, you would normally reach for Flock&#8217;s built-in SQLite blackboard instead, which we cover in the decision guide at the end; in-memory earns its place only as the smallest possible wiring example. The story is intentionally boring in the best way: no encryption, no transactions, no TTL, and no query API, with state living inside the Dapr sidecar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The component is only a few lines. Save it as `.\/components\/statestore.yaml`:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\napiVersion: dapr.io\/v1alpha1\nkind: Component\nmetadata:\n  name: flockstate\nspec:\n  type: state.in-memory\n  version: v1\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Flock application loads its configuration through Dapr and passes it to the blackboard store, so nothing is hardcoded in the source.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nfrom flock import Flock, PublicVisibility, flock_type\nfrom flock.storage.dapr import (\n    DaprStateBlackboardConfig,\n    DaprStateBlackboardStore,\n)\n\n# Load config and secrets from the Dapr secret store.\nsecrets = load_dapr_secrets(\"http:\/\/localhost:50001\")\n\nstore_config = DaprStateBlackboardConfig(\n    store_name=secrets&#091;\"store_name\"],\n    supports_transactions=secrets&#091;\"supports_transactions\"],\n    supports_etag=secrets&#091;\"supports_etag\"],\n    supports_ttl=secrets&#091;\"supports_ttl\"],\n    supports_dapr_query_lang=secrets&#091;\"supports_dapr_query_lang\"],\n    encrypted_backend=secrets&#091;\"encrypted_backend\"],\n    backend_encryption_key=secrets&#091;\"backend_encryption_key\"],\n    consistency=secrets&#091;\"consistency\"],\n)\ndapr_store = DaprStateBlackboardStore(config=store_config)\n\nflock = Flock(\n    model=secrets&#091;\"default_model\"],\n    store=dapr_store,  # Dapr-backed blackboard\n)\n\n# ... define artifacts and agents exactly as above ...\n\nawait flock.serve(dashboard=True)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Start the app with a Dapr sidecar in a single command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ndapr run --app-id flock-dev --dapr-grpc-port 50001 \\\n  --resources-path .\/components -- python app.py\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This launches the Dapr sidecar next to your process, loads every component from <code>.\/components<\/code> (the <code>flockstate<\/code> store you just defined), and then runs <code>app.py<\/code>. Flock talks to that sidecar over gRPC on port 50001, which is the endpoint the store client connects to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dapr now defines what the environment looks like and how it behaves. The application does not really know what kind of backend it is going to get, and it does not have to. All it does is ask Dapr what the store looks like. Flock adapts to the environment it is deployed to, not the other way around. Secrets, by the way, live where they belong: in a <a href=\"https:\/\/docs.dapr.io\/developing-applications\/building-blocks\/secrets\/secrets-overview\/\" target=\"_blank\" rel=\"noreferrer noopener\">Dapr secret store<\/a>, not the source tree.<\/p>\n\n\n\n<h3 id=\"PostgreSQL:durableandtransactional\" class=\"wp-block-heading\"><strong>PostgreSQL: durable and transactional<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The PostgreSQL backend is where the example starts to feel like production. The blackboard state is backed by a durable database, and the component enables transactional writes and ETags with strong consistency. Point a local PostgreSQL instance at Dapr with a one-line container:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ndocker run -d --name flock-postgres -p 5432:5432 \\\n  -e POSTGRES_PASSWORD=your-password \\\n  -e POSTGRES_DB=flock_dapr postgres:17\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This starts a PostgreSQL container in the background, exposed on the standard port 5432, with an empty <code>flock_dapr<\/code> database ready for Dapr to use. The password and database name here have to match the connection string in the component below.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then swap the component. Only the <code>spec<\/code> block changes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\napiVersion: dapr.io\/v1alpha1\nkind: Component\nmetadata:\n  name: flockstate\nspec:\n  type: state.postgresql\n  version: v2\n  metadata:\n    - name: connectionString\n      value: \"host=localhost port=5432 user=postgres password=your-password dbname=flock_dapr\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now the infrastructure is a little more capable. Does the Flock application need to change? Not at all, and this is exactly where Dapr shows its value. The Python is byte-for-byte identical to the in-memory version: the same artifacts, the same agents, the same <code>flock.serve(dashboard=True)<\/code>. Only the component file and a handful of capability flags in the secret store moved, and this time the application got transactions, ETags, and a durable database. You start it with the same <code>dapr run<\/code> command as before.<\/p>\n\n\n\n<h3 id=\"Redisencrypted:hardenedforcloud-nativedeployment\" class=\"wp-block-heading\"><strong>Redis encrypted: hardened for cloud-native deployment<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The encrypted Redis profile is the most security-oriented one in the set. The state is encrypted at rest through the Flock configuration, which is a strong fit for environments where the blackboard holds real operational data. Run a Redis Stack container, which enables the query API out of the box, with a password:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ndocker run -d --name flock-redis -p 6379:6379 \\\n  -e REDIS_ARGS=\"--requirepass your-password\" \\\n  redis\/redis-stack:latest\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This starts a Redis Stack container, which is Redis plus the RediSearch and RedisJSON modules, so the Dapr query API works without any extra setup. The `REDIS_ARGS` value sets a password on the instance, which the component then uses to authenticate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then point the component at it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\napiVersion: dapr.io\/v1alpha1\nkind: Component\nmetadata:\n  name: flockstate\nspec:\n  type: state.redis\n  version: v1\n  metadata:\n    - name: redisHost\n      value: localhost:6379\n    - name: redisPassword\n      value: \"your-password\"   # in production, reference a Dapr secret store instead\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Encryption is turned on through the Flock capability flags the app already reads from its secret store, <code>encrypted_backend<\/code> and <code>backend_encryption_key<\/code>. The application code, again, does not change.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is one important detail to call out clearly. Encrypted backends disable transactions in this integration because of a Dapr runtime serialization limitation. That is not a flaw in the Flock design; it is exactly the kind of infrastructure boundary that Dapr is meant to absorb. The application still gets a resilient, encrypted blackboard, but the integration is honest about what the backend can safely guarantee rather than pretending otherwise.<\/p>\n\n\n\n<h3 id=\"Whythismatters\" class=\"wp-block-heading\">Why this matters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The real win is not that Flock can talk to Dapr. The real win is that Flock and Dapr share the same philosophy. Flock already treats the blackboard as the center of the system. Dapr gives that blackboard a production-grade runtime boundary. Put together, agents stay declarative, state is externalized, secrets stay out of source control, resilience is handled consistently by infrastructure, and the backend can evolve without rewriting the swarm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is the cloud-native story we wanted from the start. It removes friction from future development, keeps the agent implementation focused on domain logic, and lets the underlying state layer become someone else&#8217;s problem in the best possible way. If you are building Flock agents and you already think in terms of distributed systems, Dapr is a very natural fit. It gives the blackboard the infrastructure it deserves, while the agents stay small, declarative, and easy to reason about.<\/p>\n\n\n\n<h3 id=\"DaprorSQLiteAquickdecisionguide\" class=\"wp-block-heading\"><strong>Dapr or SQLite? A quick decision guide<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Not every project needs a distributed backend, and Flock ships a built-in SQLite-backed persistent blackboard for exactly that reason. Here is how we decide:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>You need<\/th><th>Reach for<\/th><\/tr><\/thead><tbody><tr><td>Single-node durable history, simple local operations<\/td><td>SQLite persistent blackboard<\/td><\/tr><tr><td>Shared state across multiple Flock instances<\/td><td>Dapr state store<\/td><\/tr><tr><td>Pluggable backend infrastructure without code changes<\/td><td>Dapr state store<\/td><\/tr><tr><td>Encryption at rest, TTL, or backend query support<\/td><td>Dapr state store<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The short version: if you are single-process, start with SQLite. The day you need a second instance, encryption at rest, or a backend swap without touching application code, move to Dapr and change nothing in your agents. The full comparison lives in the guide under <a href=\"https:\/\/whiteducksoftware.github.io\/flock\/guides\/dapr-state-store\/#choosing-sqlite-vs-dapr\" target=\"_blank\" rel=\"noreferrer noopener\">choosing SQLite vs Dapr<\/a>.<\/p>\n\n\n\n<h3 id=\"Buildingproductionagentsystems\" class=\"wp-block-heading\"><strong>Building production agent systems?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you are taking agent workflows toward production and want the operational layer to hold up under real load, <a href=\"https:\/\/bookings.cloud.microsoft\/book\/WDWebsiteBuchungsanfrage@whiteduck.de\" target=\"_blank\" rel=\"noreferrer noopener\">schedule a call to talk about how Flock could help your agents<\/a>. We build cloud-native, agentic systems on this kind of foundation every day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Further reading<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/whiteducksoftware\/flock\/releases\/tag\/0.5.600\">Flock 0.5.600 release notes<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/whiteducksoftware.github.io\/flock\/guides\/dapr-state-store\/\" target=\"_blank\" rel=\"noreferrer noopener\">Flock Dapr State Store guide<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/whiteducksoftware.github.io\/flock\/\" target=\"_blank\" rel=\"noreferrer noopener\">Flock documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/whiteducksoftware\/flock\/tree\/main\/examples\/12-dapr\" target=\"_blank\" rel=\"noreferrer noopener\">Flock Dapr examples (examples\/12-dapr)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.dapr.io\/developing-ai\/agent-integrations\/\" target=\"_blank\" rel=\"noreferrer noopener\">Dapr agent integrations<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contents Anyone who has pushed agent workflows past a demo runs into the same wall: building the agents is the easy part. Running them reliably in production is not. Shared state needs to survive restarts, there needs to be a clean path to distributed execution, retries and failures need to be handled without bespoke adapter <a href=\"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/\"> <\/p>\n<div style=\"color:#ff9900\">[&#8230;]<\/div>\n<p><\/a><\/p>\n","protected":false},"author":33,"featured_media":24559,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_tribe_events_control_status":"","_tribe_events_control_status_canceled_reason":"","_tribe_events_control_status_postponed_reason":"","_tribe_events_control_online":"","_tribe_events_control_online_url":"","footnotes":""},"categories":[578],"tags":[694,570,316,382,656,571,629],"class_list":["post-25641","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","tag-agenticai","tag-ai","tag-cloudnative","tag-dapr","tag-flock","tag-ki","tag-open-source"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms - white duck<\/title>\n<meta name=\"description\" content=\"See how the Flock and Dapr integration makes AI agent swarms production-ready: durable state, distributed execution, resilience, and swappable backends.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms - white duck\" \/>\n<meta property=\"og:description\" content=\"See how the Flock and Dapr integration makes AI agent swarms production-ready: durable state, distributed execution, resilience, and swappable backends.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/\" \/>\n<meta property=\"og:site_name\" content=\"white duck\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/whiteduckgmbh\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-03T09:53:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-03T17:39:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/whiteduck.de\/wp-content\/uploads\/DB-WD-FlockBlogHeader-2560x1702px@2x.png\" \/>\n\t<meta property=\"og:image:width\" content=\"5120\" \/>\n\t<meta property=\"og:image:height\" content=\"3404\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tilman Sattler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@whiteduck_gmbh\" \/>\n<meta name=\"twitter:site\" content=\"@whiteduck_gmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tilman Sattler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/\"},\"author\":{\"name\":\"Tilman Sattler\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/#\\\/schema\\\/person\\\/5dc957c92b0ade6666f825304cada170\"},\"headline\":\"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms\",\"datePublished\":\"2026-07-03T09:53:55+00:00\",\"dateModified\":\"2026-07-03T17:39:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/\"},\"wordCount\":2185,\"image\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/whiteduck.de\\\/wp-content\\\/uploads\\\/DB-WD-FlockBlogHeader-2560x1702px.png\",\"keywords\":[\"AgenticAI\",\"AI\",\"cloudnative\",\"Dapr\",\"Flock\",\"KI\",\"Open Source\"],\"articleSection\":[\"AI\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/\",\"url\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/\",\"name\":\"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms - white duck\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/whiteduck.de\\\/wp-content\\\/uploads\\\/DB-WD-FlockBlogHeader-2560x1702px.png\",\"datePublished\":\"2026-07-03T09:53:55+00:00\",\"dateModified\":\"2026-07-03T17:39:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/#\\\/schema\\\/person\\\/5dc957c92b0ade6666f825304cada170\"},\"description\":\"See how the Flock and Dapr integration makes AI agent swarms production-ready: durable state, distributed execution, resilience, and swappable backends.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#primaryimage\",\"url\":\"https:\\\/\\\/whiteduck.de\\\/wp-content\\\/uploads\\\/DB-WD-FlockBlogHeader-2560x1702px.png\",\"contentUrl\":\"https:\\\/\\\/whiteduck.de\\\/wp-content\\\/uploads\\\/DB-WD-FlockBlogHeader-2560x1702px.png\",\"width\":2560,\"height\":1702,\"caption\":\"Flock\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/flock-dapr-resilient-cloud-native-agent-swarms\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/\",\"name\":\"white duck\",\"description\":\"Your Partner for Microsoft Azure &amp; AI\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/#\\\/schema\\\/person\\\/5dc957c92b0ade6666f825304cada170\",\"name\":\"Tilman Sattler\",\"url\":\"https:\\\/\\\/whiteduck.de\\\/en\\\/author\\\/til\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms - white duck","description":"See how the Flock and Dapr integration makes AI agent swarms production-ready: durable state, distributed execution, resilience, and swappable backends.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/","og_locale":"en_US","og_type":"article","og_title":"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms - white duck","og_description":"See how the Flock and Dapr integration makes AI agent swarms production-ready: durable state, distributed execution, resilience, and swappable backends.","og_url":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/","og_site_name":"white duck","article_publisher":"https:\/\/www.facebook.com\/whiteduckgmbh","article_published_time":"2026-07-03T09:53:55+00:00","article_modified_time":"2026-07-03T17:39:36+00:00","og_image":[{"width":5120,"height":3404,"url":"https:\/\/whiteduck.de\/wp-content\/uploads\/DB-WD-FlockBlogHeader-2560x1702px@2x.png","type":"image\/png"}],"author":"Tilman Sattler","twitter_card":"summary_large_image","twitter_creator":"@whiteduck_gmbh","twitter_site":"@whiteduck_gmbh","twitter_misc":{"Written by":"Tilman Sattler","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#article","isPartOf":{"@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/"},"author":{"name":"Tilman Sattler","@id":"https:\/\/whiteduck.de\/en\/#\/schema\/person\/5dc957c92b0ade6666f825304cada170"},"headline":"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms","datePublished":"2026-07-03T09:53:55+00:00","dateModified":"2026-07-03T17:39:36+00:00","mainEntityOfPage":{"@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/"},"wordCount":2185,"image":{"@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#primaryimage"},"thumbnailUrl":"https:\/\/whiteduck.de\/wp-content\/uploads\/DB-WD-FlockBlogHeader-2560x1702px.png","keywords":["AgenticAI","AI","cloudnative","Dapr","Flock","KI","Open Source"],"articleSection":["AI"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/","url":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/","name":"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms - white duck","isPartOf":{"@id":"https:\/\/whiteduck.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#primaryimage"},"image":{"@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#primaryimage"},"thumbnailUrl":"https:\/\/whiteduck.de\/wp-content\/uploads\/DB-WD-FlockBlogHeader-2560x1702px.png","datePublished":"2026-07-03T09:53:55+00:00","dateModified":"2026-07-03T17:39:36+00:00","author":{"@id":"https:\/\/whiteduck.de\/en\/#\/schema\/person\/5dc957c92b0ade6666f825304cada170"},"description":"See how the Flock and Dapr integration makes AI agent swarms production-ready: durable state, distributed execution, resilience, and swappable backends.","breadcrumb":{"@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#primaryimage","url":"https:\/\/whiteduck.de\/wp-content\/uploads\/DB-WD-FlockBlogHeader-2560x1702px.png","contentUrl":"https:\/\/whiteduck.de\/wp-content\/uploads\/DB-WD-FlockBlogHeader-2560x1702px.png","width":2560,"height":1702,"caption":"Flock"},{"@type":"BreadcrumbList","@id":"https:\/\/whiteduck.de\/en\/flock-dapr-resilient-cloud-native-agent-swarms\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/whiteduck.de\/en\/"},{"@type":"ListItem","position":2,"name":"Flock &amp; Dapr: Resilient Cloud-Native Agent Swarms"}]},{"@type":"WebSite","@id":"https:\/\/whiteduck.de\/en\/#website","url":"https:\/\/whiteduck.de\/en\/","name":"white duck","description":"Your Partner for Microsoft Azure &amp; AI","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/whiteduck.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/whiteduck.de\/en\/#\/schema\/person\/5dc957c92b0ade6666f825304cada170","name":"Tilman Sattler","url":"https:\/\/whiteduck.de\/en\/author\/til\/"}]}},"_links":{"self":[{"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/posts\/25641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/comments?post=25641"}],"version-history":[{"count":6,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/posts\/25641\/revisions"}],"predecessor-version":[{"id":25666,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/posts\/25641\/revisions\/25666"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/media\/24559"}],"wp:attachment":[{"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/media?parent=25641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/categories?post=25641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/whiteduck.de\/en\/wp-json\/wp\/v2\/tags?post=25641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}