{"id":13817789,"url":"https://github.com/ibm-watson-data-lab/shopping-list","last_synced_at":"2026-05-17T07:47:31.310Z","repository":{"id":141886417,"uuid":"99363058","full_name":"ibm-watson-data-lab/shopping-list","owner":"ibm-watson-data-lab","description":"A series of Offline First shopping list demo apps, each built using a different stack.","archived":false,"fork":false,"pushed_at":"2018-01-26T16:24:59.000Z","size":1905,"stargazers_count":68,"open_issues_count":80,"forks_count":20,"subscribers_count":15,"default_branch":"master","last_synced_at":"2024-11-19T15:45:36.722Z","etag":null,"topics":["demo-apps","desktop-apps","hybrid-apps","native-apps","offline-first","progressive-web-apps"],"latest_commit_sha":null,"homepage":"https://ibm-watson-data-lab.github.io/shopping-list/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ibm-watson-data-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-08-04T16:54:15.000Z","updated_at":"2023-11-28T14:27:37.000Z","dependencies_parsed_at":"2024-01-18T03:47:26.033Z","dependency_job_id":null,"html_url":"https://github.com/ibm-watson-data-lab/shopping-list","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-watson-data-lab%2Fshopping-list","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-watson-data-lab%2Fshopping-list/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-watson-data-lab%2Fshopping-list/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-watson-data-lab%2Fshopping-list/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ibm-watson-data-lab","download_url":"https://codeload.github.com/ibm-watson-data-lab/shopping-list/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254418777,"owners_count":22068149,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["demo-apps","desktop-apps","hybrid-apps","native-apps","offline-first","progressive-web-apps"],"created_at":"2024-08-04T06:00:55.744Z","updated_at":"2026-05-17T07:47:31.262Z","avatar_url":"https://github.com/ibm-watson-data-lab.png","language":null,"funding_links":[],"categories":["Others"],"sub_categories":[],"readme":"# Shopping List\n\n**Note:** This is a work in progress.\n\n\u003cimg src=\"img/mockup-01.png\" alt=\"Mockup 01\" width=\"270\" /\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003cimg src=\"img/mockup-02.png\" alt=\"Mockup 02\" width=\"270\" /\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003cimg src=\"img/mockup-03.png\" alt=\"Mockup 03\" width=\"270\" /\u003e\n\nShopping List is a series of Offline First demo apps, each built using a different stack. These demo apps cover Progressive Web Apps, hybrid mobile apps, native mobile apps, and desktop apps.\n\nThe Shopping List demo apps are brought to you by:\n\n* [Va Barbosa](https://github.com/vabarbosa)\n* [Glynn Bird](https://github.com/glynnbird)\n* [Juan Camacho](https://github.com/jcamach2)\n* [Teri Chadbourne](https://github.com/terichadbourne)\n* [Bradley Holt](https://github.com/bradley-holt)\n* [Nick Kasten](https://github.com/kastentx)\n* [Maureen McElaney](https://github.com/mmcelaney)\n* [Lorna Jane Mitchell](https://github.com/lornajane)\n* [Raj Singh](https://github.com/rajrsingh)\n* [Mark Sturdevant](https://github.com/markstur)\n* [Patrick Titzler](https://github.com/ptitzler)\n* [Mark Watson](https://github.com/markwatsonatx)\n\n## Table of Contents\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [Purposes](#purposes)\n- [Features](#features)\n- [Implementations](#implementations)\n  - [Vanilla JS and PouchDB](#vanilla-js-and-pouchdb)\n  - [Polymer and PouchDB](#polymer-and-pouchdb)\n  - [React and PouchDB](#react-and-pouchdb)\n  - [Preact and PouchDB](#preact-and-pouchdb)\n  - [Vue.js and PouchDB](#vuejs-and-pouchdb)\n  - [Ember.js and PouchDB](#emberjs-and-pouchdb)\n  - [React Native and PouchDB](#react-native-and-pouchdb)\n  - [React Native and Cloudant Sync](#react-native-and-cloudant-sync)\n  - [Ionic and PouchDB](#ionic-and-pouchdb)\n  - [Ionic and Cloudant Sync](#ionic-and-cloudant-sync)\n  - [Cordova and PouchDB](#cordova-and-pouchdb)\n  - [Cordova and Cloudant Sync](#cordova-and-cloudant-sync)\n  - [Swift and Cloudant Sync](#swift-and-cloudant-sync)\n  - [Kotlin and Cloudant Sync](#kotlin-and-cloudant-sync)\n  - [Electron and PouchDB](#electron-and-pouchdb)\n- [Interoperability](#interoperability)\n  - [Shopping List Example](#shopping-list-example)\n  - [Shopping List Item Example](#shopping-list-item-example)\n  - [Geolocation Context Example](#geolocation-context-example)\n- [Domain Model Implementations](#domain-model-implementations)\n  - [JavaScript](#javascript)\n  - [Swift](#swift)\n  - [Kotlin](#kotlin)\n- [Style Guides](#style-guides)\n- [Templates](#templates)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n## Purposes\n\nThese demo apps will each serve multiple purposes:\n\n* Reference Implementations\n* Live Demos\n* Tutorials\n* Workshops\n* [Developer Journeys](https://developer.ibm.com/code/journey/)\n\n## Features\n\nShopping List is a simple demo app, with a limited feature set. Here is a list of features written as user stories grouped by Epic:\n\n* Planning\n  * As a \\\u003cperson planning to shop for groceries\\\u003e, I want to \\\u003ccreate a shopping list\\\u003e so that \\\u003cI can add items to this shopping list\\\u003e.\n  * As a \\\u003cperson planning to shop for groceries\\\u003e, I want to \\\u003cadd an item to my shopping list\\\u003e so that \\\u003cI can remember to buy that item when I am at the grocery store later\\\u003e.\n  * As a \\\u003cperson planning to shop for groceries\\\u003e, I want to \\\u003cremove an item from my shopping list\\\u003e so that \\\u003cI can change my mind on what to buy when I am at the grocery store later\\\u003e.\n* Shopping\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003cview items on my shopping list\\\u003e so that \\\u003cI can remember what items to buy\\\u003e.\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003cadd an item to my shopping list\\\u003e so that \\\u003cI can remember to buy that item\\\u003e.\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003cremove an item from my shopping list\\\u003e so that \\\u003cI can change my mind on what to buy\\\u003e.\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003ccheck off an item on my shopping list\\\u003e so that \\\u003cI can keep track of what items I have bought\\\u003e.\n* Offline First\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003chave the app installed on my device\\\u003e so that \\\u003cI can continue to utilize my shopping list when no internet connection is available\\\u003e.\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003chave my shopping list stored locally on my device\\\u003e so that \\\u003cI can continue to utilize my shopping list when no internet connection is available\\\u003e.\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003csync my shopping list with the cloud\\\u003e so that \\\u003cI can manage and utilize my shopping list on multiple devices\\\u003e.\n* Multi-User / Multi-Device\n  * As a \\\u003cnew user\\\u003e, I want to \\\u003csign up for the app\\\u003e so that \\\u003cI can use the app\\\u003e.\n  * As an \\\u003cexisting user\\\u003e, I want to \\\u003csign in to the app\\\u003e so that \\\u003cI can use the app\\\u003e.\n  * As an \\\u003cexisting user\\\u003e, I want to \\\u003csign out of the app\\\u003e so that \\\u003cI can protect my privacy\\\u003e.\n* Geolocation\n  * As a \\\u003cperson planning to shop for groceries\\\u003e, I want to \\\u003cassociate a shopping list with a grocery store\\\u003e so that \\\u003cI can be notified of this shopping list when I am physically at that grocery store\\\u003e.\n  * As a \\\u003cperson associating a shopping list with a physical store\\\u003e, I want to \\\u003caccess previously-used locations\\\u003e so that \\\u003cI can quickly find the physical store for which I am searching\\\u003e.\n  * As a \\\u003cperson shopping for groceries\\\u003e, I want to \\\u003cbe notified of a shopping list when I am physically at the grocery store associated with that shopping list\\\u003e so that \\\u003cI can quickly find the shopping list for my current context\\\u003e.\n\n## Implementations\n\n### Vanilla JS and PouchDB\n\n![Progressive Web App](img/pwa-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-vanillajs-pouchdb\n\n### Polymer and PouchDB\n\n![Progressive Web App](img/pwa-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Polymer](img/polymer-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-polymer-pouchdb\n\n### React and PouchDB\n\n![Progressive Web App](img/pwa-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![React](img/react-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-react-pouchdb\n\n### Preact and PouchDB\n\n![Progressive Web App](img/pwa-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Preact](img/preact-logo.jpg)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-preact-pouchdb\n\n### Vue.js and PouchDB\n\n![Progressive Web App](img/pwa-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Vue.js](img/vuejs-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-vuejs-pouchdb\n\n### Ember.js and PouchDB\n\n![Progressive Web App](img/pwa-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Ember.js](img/emberjs-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-emberjs-pouchdb\n\n### React Native and PouchDB\n\n![React Native](img/react-native-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-react-native-pouchdb\n\n### React Native and Cloudant Sync\n\n![React Native](img/react-native-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Cloudant Sync](img/cloudant-sync-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-react-native-cloudant-sync\n\n### Ionic and PouchDB\n\n![Ionic](img/ionic-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-ionic-pouchdb\n\n### Ionic and Cloudant Sync\n\n![Ionic](img/ionic-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Cloudant Sync](img/cloudant-sync-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-ionic-cloudant-sync\n\n### Cordova and PouchDB\n\n![Cordova](img/cordova-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-cordova-pouchdb\n\n### Cordova and Cloudant Sync\n\n![Cordova](img/cordova-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Cloudant Sync](img/cloudant-sync-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-cordova-cloudant-sync\n\n### Swift and Cloudant Sync\n\n![Swift](img/swift-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Cloudant Sync](img/cloudant-sync-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-swift-cloudant-sync\n\n### Kotlin and Cloudant Sync\n\n![Kotlin](img/kotlin-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![Cloudant Sync](img/cloudant-sync-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-kotlin-cloudant-sync\n\n### Electron and PouchDB\n\n![Electron](img/electron-logo.png)\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;![PouchDB](img/pouchdb-logo.png)\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-electron-pouchdb\n\n## Interoperability\n\nImplementations of the Shopping List demo app share a data model. This allows the demo apps to be interoperable with one another. For example, a user could plan a shopping trip with a desktop app built using Electron and PouchDB. The same user could then use a native app built using Kotlin and Cloudant Sync while shopping for groceries. Much of the design of this data model is inspired by the [CouchDB Best Practices](https://ehealthafrica.github.io/couchdb-best-practices/) collection from eHealth Africa.\n\n### Shopping List Example\n\n```javascript\n{\n  \"_id\": \"list:cj6mj1zfj000001n1ugjfkj33\",\n  \"type\": \"list\",\n  \"version\": 1,\n  \"title\": \"Groceries\",\n  \"checked\": false,\n  \"place\": {\n    \"title\": \"Healthy Living\",\n    \"license\": \"Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright\",\n    \"lat\": \"44.46282415\",\n    \"lon\": \"-73.1799710198028\",\n    \"address\": {\n      \"supermarket\": \"Healthy Living\",\n      \"road\": \"Dorset Street\",\n      \"city\": \"South Burlington\",\n      \"county\": \"Chittenden County\",\n      \"state\": \"Vermont\",\n      \"postcode\": \"05406\",\n      \"country\": \"United States of America\",\n      \"countryCode\": \"us\"\n    }\n  },\n  \"createdAt\": \"2017-08-21T18:40:00.000Z\",\n  \"updatedAt\": \"2017-08-21T18:40:00.000Z\"\n}\n```\n\nNotes:\n\n* `_id`: Unique identifier for the document. Generated from the following values, separated by colons:\n  * Document type (`list`).\n  * [Collision-resistant ID (cuid)](https://usecuid.org/).\n* `type`: Document type (will always have a value of `list` for a shopping list).\n* `version`: Document schema version.\n* `title`: User-generated title for the shopping list.\n* `checked`: Has this shopping list been fully checked off?\n* `place`: Associates the shopping list with a geolocation. Derived from OpenStreetMap's [Nominatim](http://wiki.openstreetmap.org/wiki/Nominatim) search tool. The example above is derived from the following search:  \n```\nhttp://nominatim.openstreetmap.org/search/Healthy%20Living%20Vermont?format=json\u0026addressdetails=1\u0026namedetails=1\n```\n* `createdAt`: Date and time at which the document was created. Expressed as a simplified extended ISO format in zero UTC offset (which can be generated in JavaScript with `new Date().toISOString()`).\n* `updatedAt`: Date and time at which the document was last updated. Expressed as a simplified extended ISO format in zero UTC offset.\n\n### Shopping List Item Example\n\n```javascript\n{\n  \"_id\": \"item:cj6mn7e36000001p9n14fgk6s\",\n  \"type\": \"item\",\n  \"version\": 1,\n  \"list\": \"list:cj6mj1zfj000001n1ugjfkj33\",\n  \"title\": \"Mangos\",\n  \"checked\": false,\n  \"createdAt\": \"2017-08-21T18:43:00.000Z\",\n  \"updatedAt\": \"2017-08-21T18:43:00.000Z\"\n}\n```\n\nNotes:\n\n* `_id`: Unique identifier for the document. Generated from the following values, separated by colons:\n  * Document type (`item`).\n  * [Collision-resistant ID (cuid)](https://usecuid.org/).\n* `type`: Document type (will always have a value of `item` for a shopping list item).\n* `version`: Document schema version.\n* `list`: The unique identifier of the parent shopping list\n* `title`: User-generated title for the shopping list item.\n* `checked`: Has this shopping list item been checked off?\n* `createdAt`: Date and time at which the document was created. Expressed as a simplified extended ISO format in zero UTC offset (which can be generated in JavaScript with `new Date().toISOString()`).\n* `updatedAt`: Date and time at which the document was last updated. Expressed as a simplified extended ISO format in zero UTC offset.\n\nHere is an example of a [Mango](http://docs.couchdb.org/en/2.1.0/api/database/find.html) / [`pouchdb-find`](https://pouchdb.com/guides/mango-queries.html) / [Cloudant Query](https://console.bluemix.net/docs/services/Cloudant/api/cloudant_query.html) selector that fetches a single shopping list's items:\n\n```javascript\n{\n  \"selector\": {\n    \"type\": \"item\",\n    \"list\": \"list:cj6mj1zfj000001n1ugjfkj33\"\n  }\n}\n```\n\nNote that the above query can also be used to get a count of items within a shopping list by simply using the `Array.length` property (or equivalent) and accounting for the shopping list document being included in the results. Since PouchDB just runs every reduce function in memory, there is no benefit to using a `_count` reduce function when using PouchDB. The Cloudant Sync libraries for iOS and Android do not support map/reduce (but do support Cloudant Query / Mango).\n\n### Geolocation Context Example\n\nA geolocation context is used to notify the user when the geolocation capability of their device has indicated that they are near a place associated with a shopping list. This provides the user with quick access to the shopping list for their current geographic context.\n\n```javascript\n{\n  \"_id\": \"geo:drguywpyxp4t:cj6mn7e36000001p1q02dlz5q\",\n  \"type\": \"geo\",\n  \"list\": \"list:cj6mj1zfj000001n1ugjfkj33\",\n  \"version\": 1,\n  \"notified\": false,\n  \"createdAt\": \"2017-08-21T18:57:00.000Z\",\n  \"updatedAt\": \"2017-08-21T18:57:00.000Z\"\n}\n```\n\nNotes:\n\n* `_id`: Unique identifier for the document. Generated from the following values, separated by colons:\n  * Document type (`geo`).\n  * Geohash of the `place.lat` and `place.lon` values from the associated shopping list at a precision of 12 (which can be generated in JavaScript using the [`latlon-geohash`](https://www.npmjs.com/package/latlon-geohash) module).\n  * [Collision-resistant ID (cuid)](https://usecuid.org/).\n* `type`: Document type (will always have a value of `geo` for a geolocation context item).\n* `list`: The unique identifier of the parent shopping list\n* `version`: Document schema version.\n* `notified`: Has a notification already been sent for this geolocation context? Note that the geolocation context document may be deleted after a notification has been sent and the corresponding shopping list has been fully checked off.\n* `createdAt`: Date and time at which the document was created. Expressed as a simplified extended ISO format in zero UTC offset (which can be generated in JavaScript with `new Date().toISOString()`).\n* `updatedAt`: Date and time at which the document was last updated. Expressed as a simplified extended ISO format in zero UTC offset.\n\nHere is an example of a [Mango](http://docs.couchdb.org/en/2.1.0/api/database/find.html) / [`pouchdb-find`](https://pouchdb.com/guides/mango-queries.html) / [Cloudant Query](https://console.bluemix.net/docs/services/Cloudant/api/cloudant_query.html) selector that utilizes the built-in `_all_docs` view to query for geolocation contexts near the current geolocation coordinates of the device (the value `drguyw` below is the geohash of the user's location at a precision of 6, or ±0.61 km):\n\n```javascript\n{\n  \"selector\": {\n    \"_id\": {\n      \"$gte\": \"geo:drguyw\",\n      \"$lte\": \"geo:drguyw\\uffff\"\n    }\n  }\n}\n```\n\n## Domain Model Implementations\n\n### JavaScript\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-model-js\n\n### Swift\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-model-swift\n\n### Kotlin\n\nGitHub Repository:  \nhttps://github.com/ibm-watson-data-lab/shopping-list-model-kotlin\n\n## Style Guides\n\nGeneral guidelines:\n\n* Where possible, a consistent style is maintained between the different demo app implementations.\n* Where there is a style that is common for a particular type of application we defer to that style.\n\nImplementations:\n\n* **Vanilla JS:** Material Design (using [MDC-Web](https://material.io/components/web/))\n* **Polymer:** Material Design (using [Polymer App Toolbox](https://www.polymer-project.org/2.0/toolbox/))\n* **React:** Material Design (using [Material-UI](http://www.material-ui.com/))\n* **Preact:** Material Design (using [preact-material-components](https://github.com/prateekbh/preact-material-components))\n* **Vue.js:** Material Design (using [Vue Material](http://vuematerial.io/))\n* **Ember.js:** Material Design (using [MDC-Web](https://material.io/components/web/))\n* **React Native:** iOS Design Themes or Material Design (depending on the target platform)\n* **Ionic:** iOS Design Themes or Material Design (depending on the target platform)\n* **Cordova:** iOS Design Themes or Material Design (depending on the target platform)\n* **Swift:** iOS Design Themes\n* **Kotlin:** Material Design\n* **Electron:** Material Design (using [MDC-Web](https://material.io/components/web/))\n\n## Templates\n\nSee the `templates` directory for templates that can be used for each demo app implementation. This includes the following files:\n\n* `LICENSE`\n* `README.md`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibm-watson-data-lab%2Fshopping-list","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fibm-watson-data-lab%2Fshopping-list","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibm-watson-data-lab%2Fshopping-list/lists"}