{"id":1980,"date":"2015-10-06T14:55:47","date_gmt":"2015-10-06T14:55:47","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1980"},"modified":"2025-06-13T23:54:05","modified_gmt":"2025-06-14T06:54:05","slug":"let-your-devices-talk-to-each-other-p2p","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/","title":{"rendered":"Let your Devices talk to each other"},"content":{"rendered":"<p>Last week I was speaking at\u00a0<a href=\"https:\/\/2015.webcampzg.org\/\">WebCamp Zagreb<\/a>, a great conference for developers and designers. I gave a presentation entitled \u2018Let your devices talk to each other\u2019. For the demo part I did a very simple message app that syncs automatically with anyone else who is running it on the same network. Slides and demo code are on <a href=\"https:\/\/github.com\/ldoguin\/couchbase-messages-p2p-sample\">github<\/a>. The presentation has been filmed and should be online fairly soon.<\/p>\n<p>The topic of this presentation is IoT (Internet of Things), M2M (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_to_machine\">Machine to Machine<\/a>) and decentralisation. All these things of the internet are usually sending their data (most of the time very private data, yes I am looking at you Quantified self movement) to a server somewhere in the cloud. That basically means it\u2019s not your (private) data anymore. This is very sad. This is the main idea that drove me to do this talk. But there are plenty of other good reasons to let your devices talk to each other. And this is not a new thing. What we call M2M now has been very common in the industry for years.<\/p>\n<p>But let\u2019s go back to the original topic. One way to avoid this centralisation would be that your things of the internet stop being things of the internet and start being things of your home network instead. They should start communicating with each others and send their data where you decide, like a Couchbase Lite instance running on a RaspberryPI or any other small device supporting the JVM.<\/p>\n<p>And of course one way of making devices talk to each other can be to install Couchbase Lite on these and use P2P sync. We already have <a href=\"https:\/\/www.couchbase.com\/blog\/photodrop\/\">several<\/a> <a href=\"https:\/\/www.couchbase.com\/blog\/how-to-use-sync-gateway-and-peer-to-peer-sync-on-android\/\">blog post<\/a> on the matter. So to bring something new to this I\u2019ll tell you how to make that sync automatic.<\/p>\n<p>Syncing is based on replication links. They usually requires an address and credentials. As I want as less friction as possible, I have skipped the credential\/security part. Which is bad but made my presentation demo so much easier. So if all you need is an address, how do you get it automatically?<\/p>\n<p>For P2P sync to work, devices syncing have to be on the same network. And the good news is there are several network protocol existing to do automatic service discovery. You might have heard of thinks like Bonjour, RendezVous, ZeroConf, Android NSD, mDNS, DLNA, UPnP and more. Most of them are based on the DNS service registry. Because yes the DNS can do more than map IPs to hosts. It can also store a list of service with their address, name and description.<\/p>\n<p>This is what I have been using in my demo. I have chosen a simple Java implementation based on the <a href=\"https:\/\/github.com\/openhab\/jmdns\">JmDNS library<\/a>. This way I have almost the same impl on my Java native app and on Android. It works by doing UDP broadcasting. It sends packet to other connected things on the network<\/p>\n<p>Here\u2019s a short look at the most relevant bits of code.<\/p>\n<p>Starting Couchbase Lite Listener on the device to make it able to receive connections.<\/p>\n<pre><code>\r\n    public int startCBLiteListener(int port) {\r\n        LiteListener ls = new LiteListener(database.getManager(), port, null);\r\n\r\n        Thread thread = new Thread(ls);\r\n        thread.start();\r\n        return ls.getListenPort();\r\n    }\r\n<\/code><\/pre>\n<p>Exposing a new service using JmDNS<\/p>\n<pre><code>\r\n    public void exposeService(int port) throws IOException {\r\n        ServiceInfo sInfos = ServiceInfo.create(SERVICE_TYPE, serviceName, port, SERVICE_DESCRIPTION);\r\n        jmdns.registerService(sInfos);\r\n    }\r\n<\/code><\/pre>\n<p>Listening to a particular service using JmDNS. The DiscoveryListener listener is important because it&#8217;s where you can actually setup the sync.<\/p>\n<pre><code>\r\n    public void listenForService(){\r\n        jmdns.addServiceListener(SERVICE_TYPE, new DiscoveryListener(database, jmdns, serviceName));\r\n    }\r\n<\/code><\/pre>\n<p>This is not the cleanest implementation there is but you\u2019ll get the idea. Take a particular look at the serviceResolved method. It\u2019s the one that is called when a new Service has been discovered on the network. It gives us the URL of the service thus allowing us to configure the classic replication link.<\/p>\n<pre><code>\r\npackage org.couchbase.devex;\r\n\r\nimport com.couchbase.lite.Database;\r\nimport com.couchbase.lite.listener.LiteListener;\r\nimport com.couchbase.lite.replicator.Replication;\r\n\r\nimport javax.jmdns.JmDNS;\r\nimport javax.jmdns.ServiceEvent;\r\nimport javax.jmdns.ServiceListener;\r\nimport java.io.IOException;\r\nimport java.net.URL;\r\n\r\n\/**\r\n * Created by ldoguin on 13\/02\/15.\r\n *\/\r\npublic class DiscoveryListener implements ServiceListener {\r\n\r\n    private Database database;\r\n    private JmDNS jmdns;\r\n    private String serviceName;\r\n\r\n    public DiscoveryListener(Database database, JmDNS jmdns, String serviceName) {\r\n        this.database = database;\r\n        this.jmdns = jmdns;\r\n        this.serviceName = serviceName;\r\n    }\r\n\r\n    @Override\r\n    public void serviceAdded(ServiceEvent event) {\r\n        if (! serviceName.equals(event.getName())){\r\n            jmdns.requestServiceInfo(event.getType(), event.getName(), 10);\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public void serviceRemoved(ServiceEvent event) {\r\n        System.out.println(event.getName() + \" removed\");\r\n    }\r\n\r\n    @Override\r\n    public void serviceResolved(ServiceEvent event) {\r\n        System.out.println(\"RESOLVED\");\r\n        String[] serviceUrls = event.getInfo().getURLs();\r\n        for (String url : serviceUrls) {\r\n            System.out.println(url);\r\n            setupSync(database, url + \"\/messages\");\r\n        }\r\n\r\n    }\r\n\r\n    public void setupSync(Database database, String syncUrl) {\r\n        try {\r\n            URL url = new URL(syncUrl);\r\n            Replication pullReplication = database.createPullReplication(url);\r\n\r\n            pullReplication.setContinuous(true);\r\n            pullReplication.start();\r\n\r\n            Replication pushReplication = database.createPushReplication(url);\r\n            pushReplication.setContinuous(true);\r\n            pushReplication.start();\r\n        } catch (IOException e){\r\n            throw new RuntimeException(e);\r\n        }\r\n    }\r\n}\r\n\r\n<\/code><\/pre>\n<p>And that is a fun experimental project, easy to implement, to make sure all your Couchbase Lite devices can sync easily. There is of course much more that can be done. Like adding the security part. You could imagine having a first manual sync that exchanges credentials once and then do everything else automatically. I hope you\u2019ll find this useful. Don\u2019t hesitate to comment and give us feedback!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last week I was speaking at\u00a0WebCamp Zagreb, a great conference for developers and designers. I gave a presentation entitled \u2018Let your devices talk to each other\u2019. For the demo part I did a very simple message app that syncs automatically [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[1337,1338,1475],"ppma_author":[9023],"class_list":["post-1980","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","tag-iot","tag-m2m","tag-p2p"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Let your Devices talk to each other - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Let your Devices talk to each other\" \/>\n<meta property=\"og:description\" content=\"Last week I was speaking at\u00a0WebCamp Zagreb, a great conference for developers and designers. I gave a presentation entitled \u2018Let your devices talk to each other\u2019. For the demo part I did a very simple message app that syncs automatically [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-06T14:55:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:54:05+00:00\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Let your Devices talk to each other\",\"datePublished\":\"2015-10-06T14:55:47+00:00\",\"dateModified\":\"2025-06-14T06:54:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\"},\"wordCount\":683,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"IoT\",\"M2M\",\"p2p\"],\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\",\"name\":\"Let your Devices talk to each other - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-10-06T14:55:47+00:00\",\"dateModified\":\"2025-06-14T06:54:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Let your Devices talk to each other\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Let your Devices talk to each other - The Couchbase Blog","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:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/","og_locale":"en_US","og_type":"article","og_title":"Let your Devices talk to each other","og_description":"Last week I was speaking at\u00a0WebCamp Zagreb, a great conference for developers and designers. I gave a presentation entitled \u2018Let your devices talk to each other\u2019. For the demo part I did a very simple message app that syncs automatically [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-10-06T14:55:47+00:00","article_modified_time":"2025-06-14T06:54:05+00:00","author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Let your Devices talk to each other","datePublished":"2015-10-06T14:55:47+00:00","dateModified":"2025-06-14T06:54:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/"},"wordCount":683,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["IoT","M2M","p2p"],"articleSection":["Couchbase Mobile"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/","url":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/","name":"Let your Devices talk to each other - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-10-06T14:55:47+00:00","dateModified":"2025-06-14T06:54:05+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/let-your-devices-talk-to-each-other-p2p\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Let your Devices talk to each other"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1980","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1980"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1980\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1980"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}