{"id":3708,"date":"2017-06-07T04:57:03","date_gmt":"2017-06-07T11:57:03","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3708"},"modified":"2025-06-13T20:40:57","modified_gmt":"2025-06-14T03:40:57","slug":"build-photogallery-app-aws-rekognition-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/","title":{"rendered":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1"},"content":{"rendered":"<p><em><a href=\"https:\/\/www.linkedin.com\/in\/ratnopam-chakrabarti\" target=\"_blank\" rel=\"noopener noreferrer\">Ratnopam Chakrabarti<\/a>\u00a0is a software developer currently working for Ericsson Inc. He has been focused on IoT, machine-to-machine technologies, connected cars, and smart city domains for quite a while. He loves learning new technologies and putting them to work. When he\u2019s not working, he enjoys spending time with his 3-year-old son.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2542\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/ratnopamchakrabarti2.jpeg\" alt=\"Ratnopam Chakrabarti\" width=\"150\" height=\"200\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2.jpeg 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2-15x20.jpeg 15w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/p>\n<p>This is Part 1 of a series of posts where I\u2019ll introduce you to a photo gallery application which allows users to upload any image of their choice (in .png or .jpg format) and view all the images that have been uploaded by other users. The app lets users \u201clike\u201d a particular image. Once a user uploads an image, the app uses Amazon Web Services\u2019 <a href=\"\/\">Rekognition API<\/a> to scan and detect labels for that image. The labels returned with highest confidence are used to tag the images. The app also lets users click on a particular tag to view all images by that tag.<\/p>\n<h3>Demo<\/h3>\n<p>Here\u2019s a <u><a href=\"https:\/\/vimeo.com\/218099240\" target=\"_blank\" rel=\"noopener noreferrer\">link<\/a><\/u>\u00a0to the demo of the finished app.<\/p>\n<h3>The Tech Stack<\/h3>\n<p>Couchbase \u2013 For storing image metadata<\/p>\n<p>Express \u2013 For building the front\u00a0end with node<\/p>\n<p>AWS\u00a0SDK\u00a0and S3 \u2013 For storing the image files and also for image Rekognition<\/p>\n<p>Node.js \u2013 For building the app backend<\/p>\n<p>In addition, jQuery is used to make Ajax calls from the client side to server.js files.<\/p>\n<p>Node.js is used to build all the RESTful APIs\u00a0that the app leverages. It uses the following dependencies to get the job done:<\/p>\n<pre class=\"lang:default decode:true \">package.json\r\n\r\n\u00a0 \u00a0 \"aws-sdk\": \"*\",\r\n\r\n\u00a0 \u00a0 \"couchbase\": \"^2.3.3\",\r\n\r\n\u00a0 \u00a0 \"express\": \"4.13.0\",\r\n\r\n\u00a0 \u00a0 \"formidable\": \"1.0.17\",\r\n\r\n\u00a0 \u00a0 \"gm\": \"^1.20.0\",\r\n\r\n\u00a0 \u00a0 \"hogan-express\": \"^0.5.2\",\r\n\r\n\u00a0 \u00a0 \"knox\": \"^0.9.2\",\r\n\r\n\u00a0 \u00a0 \"socket.io\": \"1.0.5\",\r\n\r\n\u00a0 \u00a0 \"uuid\": \"^2.0.1\"\r\n\r\n<\/pre>\n<p>Here are what these modules are for:<\/p>\n<ul>\n<li>The aws-sdk \u2013 used to call AWS\u00a0Rekognition APIs<\/li>\n<li>knox \u2013 used to interact with Amazon S3<\/li>\n<li>gm \u2013 used for resizing the image (we don\u2019t want to store large-sized images onto S3, it has a price tag after all)<\/li>\n<li>formidable \u2013 used to process the input files<\/li>\n<li>hogan-express \u2013 provides <u><a href=\"https:\/\/mustache.github.io\/mustache.5.html\" target=\"_blank\" rel=\"noopener noreferrer\">Mustache<\/a><\/u>\u00a0template engine for the express framework<\/li>\n<li>socket.io \u2013 used to emit events from the server to client which can be acted upon<\/li>\n<li>couchbase \u2013 used to interact with the Couchbase database<\/li>\n<li>uuid \u2013 used to generate random document IDs for storing JSON\u00a0documents in Couchbase<\/li>\n<\/ul>\n<h3>Role of Couchbase<\/h3>\n<p>I am using Couchbase in this app to<\/p>\n<ol>\n<li>store image metadata such as filename<\/li>\n<li>store other useful information such as\u00a0number of \u201clikes\u201d\u00a0for an image and the tags assigned\u00a0to an image<\/li>\n<\/ol>\n<p>In this post (Part\u00a01), I\u2019ll\u00a0describe the steps required to use Couchbase with the photo gallery app. Full source code of the app is available at <u><a href=\"https:\/\/github.com\/ratchakr\/ImageTagger\/tree\/staging\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a><\/u>.<\/p>\n<h3>Install Couchbase and Other Node Modules<\/h3>\n<p>To install all the modules listed in package.json above, go to the app root directory and type:<\/p>\n<pre class=\"lang:default decode:true \">npm install\r\n\r\n<\/pre>\n<p>Once all the modules,\u00a0including Couchbase,\u00a0are\u00a0installed, your task now is to use it in the application.<\/p>\n<h4>Config.json<\/h4>\n<p>Define some of the configurable information in a .json file named config.json.<\/p>\n<pre class=\"lang:default decode:true \">{\r\n\r\n\u00a0 \u00a0 \"couchbase\": {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"server\": \"127.0.0.1:8091\",\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"bucket\": \"photogallery\"\r\n\r\n\u00a0 \u00a0 }\r\n\r\n}<\/pre>\n<p>Here, I have specified the Couchbase Server host and port and also the bucket where the image metadata information will be stored.<\/p>\n<p>server = 127.0.0.1:8091 (if you are running Couchbase locally)<\/p>\n<p>Once the config is defined, the next task is to import this configuration into the express app.<\/p>\n<p>Here\u2019s a\u00a0snippet of the code from the app:<\/p>\n<pre class=\"lang:default decode:true \">var couchbase = require(\"couchbase\");\r\n\r\nvar config = require(\".\/config\");\r\n\r\nmodule.exports.bucket = (new couchbase.Cluster(process.env.COUCHBASE_HOST || config.couchbase.server)).openBucket(\r\n\r\n\u00a0 \u00a0 process.env.COUCHBASE_BUCKET || config.couchbase.bucket);<\/pre>\n<p>We are making use of some environment variables here to identify the Couchbase host and the bucket. If these are not supplied at runtime, the values default to the config.json mentioned above.<\/p>\n<h3>Run and Configure Couchbase<\/h3>\n<p>As a prerequisite to run the app locally, one first needs to install and run Couchbase Server. Head over to the <u><a href=\"https:\/\/www.couchbase.com\/downloads\/\" target=\"_blank\" rel=\"noopener noreferrer\">COUCHBASE<\/a><\/u><u><a href=\"https:\/\/www.couchbase.com\/downloads\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00a0DOWNLOAD <\/a><\/u><u><a href=\"https:\/\/www.couchbase.com\/downloads\/\" target=\"_blank\" rel=\"noopener noreferrer\">PAGE<\/a><\/u>\u00a0and install as per your own OS. In my case, I\u2019m\u00a0running a Couchbase 4.6 installation on my Windows system. Once Couchbase is up and running, create a bucket called \u201cphotogallery.\u201d This bucket will store all the image meta information. One important thing to note, one must create an index on the bucket before using it. To create an index:<\/p>\n<pre class=\"lang:default decode:true \">CREATE PRIMARY INDEX ON &lt;bucketname&gt;\r\n\r\n<\/pre>\n<p>Once the index is created, head over to the Index tab and the index should be listed.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/06\/pasted-image-0.png\" alt=\"pasted image 0\" \/><\/p>\n<p>In a production environment, it\u2019s not recommended to have a global secondary index since it could cause performance degradation. However, for the scale of our app, it\u2019s ok to have it.<\/p>\n<h3>Save and Retrieve Document in Couchbase<\/h3>\n<p>The photogallery app does the following things:<\/p>\n<ul>\n<li>Once the user selects the file and clicks\u00a0upload the app stores the file in\u00a0an\u00a0Amazon S3 bucket.<\/li>\n<li>Once the file is saved to S3 successfully, it calls AWS\u00a0Rekognition API\u00a0to assign tags to the image.<\/li>\n<li>Once the tags are assigned, the app stores the metadata information of the image in the Couchbase <em>photogallery<\/em>\u00a0bucket.<\/li>\n<\/ul>\n<p>To save the data in Couchbase, we need the following snippet of code:<\/p>\n<pre class=\"lang:default decode:true \">\/\/ import variables\r\n\r\nvar uuid = require(\"uuid\");\r\n\r\nvar db = require(\"..\/upload\").bucket;\r\n\r\nvar config = require(\"..\/config\");\r\n\r\nvar N1qlQuery = require('couchbase').N1qlQuery;\r\n\r\n\/\/define a model\r\n\r\nfunction ImageModel() { };\r\n\r\n\/\/ define the save function\r\n\r\n\u00a0 \u00a0 ImageModel.save = function(data, callback) {\r\n\r\n\u00a0 \u00a0 var jsonObject = {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 filename: data.filename,\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 likes: data.likes,\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 tags: data.tags\r\n\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \/\/ If the document id doesn't exist create a unique id for inserting\r\n\r\n\u00a0 \u00a0 var documentId = data.id ? data.id : uuid.v4();\r\n\r\n\u00a0 \u00a0 db.upsert(documentId, jsonObject, function(error, result) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 if(error) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 callback(error, null);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return;\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 callback(null, {message: \"success\", data: result});\r\n\r\n\u00a0 \u00a0 });\r\n\r\n}<\/pre>\n<p>What the above code does is imports appropriate dependencies to interact with the Couchbase database and defines a function to save the data. A JSON\u00a0body is created with filename, likes,\u00a0and tags of an image and then the upsert() function is called to save the data. If a document doesn\u2019t have an \u201cid\u201d attribute assigned, the function creates one using uuid.v4().<\/p>\n<p>For retrieval of documents, take a look at the following code snippet:<\/p>\n<pre class=\"lang:default decode:true \">\/*\r\n\r\n\u00a0* Get all documents from Couchbase Server using N1QL\r\n\r\n\u00a0*\/\r\n\r\nImageModel.getAll = function(callback) {\r\n\r\n\u00a0 \u00a0 var statement = \"SELECT META(photos).id, filename, likes, tags \" +\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"FROM `\" + config.couchbase.bucket + \"` AS photos\";\r\n\r\n\u00a0 \u00a0 var query = N1qlQuery.fromString(statement).consistency(N1qlQuery.Consistency.REQUEST_PLUS);\r\n\r\n\u00a0 \u00a0 db.query(query, function(error, result) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 if(error) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return callback(error, null);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 callback(null, result);\r\n\r\n\u00a0 \u00a0 });\r\n\r\n};<\/pre>\n<p>The above code snippet returns all images from the bucket using N1QL querying. This comes in handy to list all images from the photogallery bucket. Note, that the Couchbase bucket stores only the filename, one part of Amazon s3 url part is static and the full url is created by appending the filename to the static s3 url of an image.<\/p>\n<p>Static part -&gt; <u><a href=\"https:\/\/s3.amazonaws.com\/la-image-tagger-chakrar27\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/s3.amazonaws.com\/la-image-tagger-chakrar27\/<\/a><\/u><\/p>\n<p>Dynamic part -&gt; filename<\/p>\n<p>Here, <a href=\"https:\/\/s3.amazonaws.com\/la-image-tagger-chakrar27\/\" target=\"_blank\" rel=\"noopener noreferrer\">la-image-tagger-chakrar27<\/a>\u00a0is the s3 bucket I created. To create this bucket, upload\u00a0<u><a href=\"https:\/\/github.com\/ratchakr\/ImageTagger\/blob\/staging\/CloudFormation_s3_bucket.json\" target=\"_blank\" rel=\"noopener noreferrer\">this<\/a><\/u>\u00a0cloudformation template to AWS\u00a0and create a stack. It will create the s3 bucket.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/community\/community-writers-program\/\"><em>This post is part of the Couchbase Community Writing Program<\/em><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post we&#8217;ll introduce you to a photo gallery application which allows users to upload any image of their choice (in .png or .jpg format) and view all the images that have been uploaded by other users. The app lets users \u201clike\u201d a particular image.<\/p>\n","protected":false},"author":53,"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,1816],"tags":[10124],"ppma_author":[9026],"class_list":["post-3708","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","category-couchbase-server","tag-amazon-web-services-aws"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building a photogallery app with auto tagging - Part 1<\/title>\n<meta name=\"description\" content=\"Learn the photo gallery application which allows users to upload any image of their choice and view all the images that have been uploaded by other users.\" \/>\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\/build-photogallery-app-aws-rekognition-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1\" \/>\n<meta property=\"og:description\" content=\"Learn the photo gallery application which allows users to upload any image of their choice and view all the images that have been uploaded by other users.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-06-07T11:57:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:40:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1\",\"datePublished\":\"2017-06-07T11:57:03+00:00\",\"dateModified\":\"2025-06-14T03:40:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\"},\"wordCount\":978,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Amazon Web Services (AWS)\"],\"articleSection\":[\"Couchbase Mobile\",\"Couchbase Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\",\"name\":\"Building a photogallery app with auto tagging - Part 1\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-06-07T11:57:03+00:00\",\"dateModified\":\"2025-06-14T03:40:57+00:00\",\"description\":\"Learn the photo gallery application which allows users to upload any image of their choice and view all the images that have been uploaded by other users.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#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\/build-photogallery-app-aws-rekognition-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1\"}]},{\"@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\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Building a photogallery app with auto tagging - Part 1","description":"Learn the photo gallery application which allows users to upload any image of their choice and view all the images that have been uploaded by other users.","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\/build-photogallery-app-aws-rekognition-couchbase\/","og_locale":"en_US","og_type":"article","og_title":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1","og_description":"Learn the photo gallery application which allows users to upload any image of their choice and view all the images that have been uploaded by other users.","og_url":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-06-07T11:57:03+00:00","article_modified_time":"2025-06-14T03:40:57+00:00","og_image":[{"width":150,"height":200,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2.jpeg","type":"image\/jpeg"}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1","datePublished":"2017-06-07T11:57:03+00:00","dateModified":"2025-06-14T03:40:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/"},"wordCount":978,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Amazon Web Services (AWS)"],"articleSection":["Couchbase Mobile","Couchbase Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/","name":"Building a photogallery app with auto tagging - Part 1","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-06-07T11:57:03+00:00","dateModified":"2025-06-14T03:40:57+00:00","description":"Learn the photo gallery application which allows users to upload any image of their choice and view all the images that have been uploaded by other users.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/#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\/build-photogallery-app-aws-rekognition-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 1"}]},{"@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\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Developer Community Manager, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.","url":"https:\/\/www.couchbase.com\/blog\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","author_category":"","last_name":"Czajkowski","first_name":"Laura","job_title":"","user_url":"","description":"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/3708","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\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=3708"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/3708\/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=3708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=3708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=3708"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=3708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}